|
@@ -12,6 +12,7 @@ import requests
|
|
|
|
|
|
|
|
from pbot.codec.bitbuf import decode6, encode6
|
|
from pbot.codec.bitbuf import decode6, encode6
|
|
|
from pbot.config import Account, RoleSpec
|
|
from pbot.config import Account, RoleSpec
|
|
|
|
|
+from pbot.errors import PbotError
|
|
|
from pbot.game.session import enter_world
|
|
from pbot.game.session import enter_world
|
|
|
from pbot.login.box_client import enter_game_client, login
|
|
from pbot.login.box_client import enter_game_client, login
|
|
|
from pbot.login.zone_ports import fetch_zone_ports
|
|
from pbot.login.zone_ports import fetch_zone_ports
|
|
@@ -46,7 +47,7 @@ def _pick_latest_zone_tuple() -> tuple[float, str, int]:
|
|
|
r = s.get(SERVERLIST_URL, timeout=20)
|
|
r = s.get(SERVERLIST_URL, timeout=20)
|
|
|
m = re.search(r"\{.*\}", r.text, re.DOTALL)
|
|
m = re.search(r"\{.*\}", r.text, re.DOTALL)
|
|
|
if not m:
|
|
if not m:
|
|
|
- raise RuntimeError("区列表拉取失败")
|
|
|
|
|
|
|
+ raise PbotError(detail="区列表拉取失败")
|
|
|
data = typed_json(json.loads(m.group(0))) # pyright: ignore[reportAny]
|
|
data = typed_json(json.loads(m.group(0))) # pyright: ignore[reportAny]
|
|
|
best: list[tuple[float, str, int]] = []
|
|
best: list[tuple[float, str, int]] = []
|
|
|
|
|
|
|
@@ -67,7 +68,7 @@ def _pick_latest_zone_tuple() -> tuple[float, str, int]:
|
|
|
|
|
|
|
|
walk(data)
|
|
walk(data)
|
|
|
if not best:
|
|
if not best:
|
|
|
- raise RuntimeError("无已开新区")
|
|
|
|
|
|
|
+ raise PbotError(detail="无已开新区")
|
|
|
return max(best)
|
|
return max(best)
|
|
|
|
|
|
|
|
|
|
|
|
@@ -128,7 +129,7 @@ def _delete_all_roles(zone: ZoneId, jwt: str, uid: int,
|
|
|
except TransportError as e:
|
|
except TransportError as e:
|
|
|
_LOG.warning("端口 %d 连接失败: %s", port, e)
|
|
_LOG.warning("端口 %d 连接失败: %s", port, e)
|
|
|
if conn is None:
|
|
if conn is None:
|
|
|
- raise RuntimeError("删角: 登录服全端口连接失败")
|
|
|
|
|
|
|
+ raise PbotError(detail="删角: 登录服全端口连接失败")
|
|
|
try:
|
|
try:
|
|
|
roles = _fetch_role_list(conn, zone, jwt, uid)
|
|
roles = _fetch_role_list(conn, zone, jwt, uid)
|
|
|
lst = roles if isinstance(roles, list) else []
|
|
lst = roles if isinstance(roles, list) else []
|
|
@@ -166,7 +167,7 @@ def _fetch_role_list(conn: GatewayConnection, zone: ZoneId, jwt: str,
|
|
|
if f.msg_id == 529:
|
|
if f.msg_id == 529:
|
|
|
key32 = decode6(f.body).split(b"/")[0]
|
|
key32 = decode6(f.body).split(b"/")[0]
|
|
|
if not key32:
|
|
if not key32:
|
|
|
- raise RuntimeError("拉列表: 无 SC529")
|
|
|
|
|
|
|
+ raise PbotError(detail="拉列表: 无 SC529")
|
|
|
_ = conn.send_frame(104, 0, 0, 0, 0, encode6(key32), tail=1)
|
|
_ = conn.send_frame(104, 0, 0, 0, 0, encode6(key32), tail=1)
|
|
|
sid = 0
|
|
sid = 0
|
|
|
for f in conn.recv_frames(4):
|
|
for f in conn.recv_frames(4):
|
|
@@ -226,7 +227,7 @@ def bootstrap_session(user: str, password: str, woma_minutes: float,
|
|
|
# 的旧角色) — 新手流水线要求全新角色, 静默换角属错误会话, 交操作员裁决
|
|
# 的旧角色) — 新手流水线要求全新角色, 静默换角属错误会话, 交操作员裁决
|
|
|
msg = (f"角色不符: 请求={role} 实际={real_name} — 账号在该区已有其他角色,"
|
|
msg = (f"角色不符: 请求={role} 实际={real_name} — 账号在该区已有其他角色,"
|
|
|
f"请先删角(--reset 流程)或指定该角色名")
|
|
f"请先删角(--reset 流程)或指定该角色名")
|
|
|
- raise RuntimeError(msg)
|
|
|
|
|
|
|
+ raise PbotError(detail=msg)
|
|
|
|
|
|
|
|
stop: list[bool] = [False]
|
|
stop: list[bool] = [False]
|
|
|
conn, world, updater = enter_world(zone, real_name, ticket_key,
|
|
conn, world, updater = enter_world(zone, real_name, ticket_key,
|