delete_all_roles.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. # -*- coding: utf-8 -*-
  2. """delete_all_roles.py —— 删除指定区账号下全部角色(循环: 拉列表→删last=1→重拉)。
  3. 用法:
  4. .venv/bin/python delete_all_roles.py --zone 14504561 -u longwu988 -p Longwu1988 [--dry-run]
  5. 协议: CS102 删角色(仅受理 last=1 当前选中角色), 523=成功/524=失败。
  6. 删后服务器将剩余角色置为新的选中(last=1), 重拉 SC520 确认后再删下一个。
  7. """
  8. import argparse
  9. import json
  10. import sys
  11. import time
  12. HERE = __file__.rsplit("/", 1)[0]
  13. sys.path.insert(0, HERE)
  14. ROOT = HERE.rsplit("/", 1)[0]
  15. sys.path.insert(0, ROOT)
  16. from apilot.host import Host, LOGIN_PORTS # noqa: E402
  17. from reset_role import list_roles # noqa: E402
  18. from combat_bot import log # noqa: E402
  19. def delete_all(zone, user, pwd, dry_run=False):
  20. h = Host(zone, user, pwd, state_dir="/tmp/zone19_reset")
  21. h.http_login()
  22. h.boot_lua()
  23. deleted = []
  24. # 外层循环: 每删一个角色重连重拉(服务器选中态会变化)
  25. for round_i in range(6):
  26. roles = None
  27. for port in LOGIN_PORTS:
  28. try:
  29. h.connect_login_gate(port)
  30. roles, sid = list_roles(h, zone, port)
  31. break
  32. except SystemExit as e:
  33. log(f" 端口{port}: {e}")
  34. h.nc.disconnect()
  35. except Exception as e:
  36. log(f" 端口{port}: {str(e)[:60]}")
  37. h.nc.disconnect()
  38. if roles is None:
  39. raise SystemExit("[!] 登录链失败")
  40. lst = roles.get("list") or []
  41. log(f"[round {round_i}] 角色列表({len(lst)}): "
  42. f"{[(c.get('chr'), 'last=' + str(c.get('last'))) for c in lst]}")
  43. if not lst:
  44. log("[OK] 角色已全部删除")
  45. h.nc.disconnect()
  46. return deleted
  47. # 优先删 last=1; 若无 last 标志则删第一个(实测删第一个不受理时换下一个)
  48. target = next((c for c in lst if c.get("last") == 1), lst[0])
  49. name = target.get("chr")
  50. if dry_run:
  51. log(f" [dry-run] 将删除 {name}(UserID={target['UserID']})")
  52. h.nc.disconnect()
  53. return [c.get("chr") for c in lst]
  54. h._tail = 2
  55. ok = h._delete_role(target["UserID"], 15)
  56. log(f" 删角 {name}: {'523 成功' if ok else '失败/超时'}")
  57. h.nc.disconnect()
  58. if not ok:
  59. # 服务器不受理(非选中角色) — 把它标记后尝试列表中下一个
  60. raise SystemExit(f"[!] 删角失败: {name}")
  61. deleted.append(name)
  62. time.sleep(1.0)
  63. raise SystemExit("[!] 超出最大删除轮数")
  64. def main():
  65. ap = argparse.ArgumentParser()
  66. ap.add_argument("--zone", type=int, required=True)
  67. ap.add_argument("-u", "--user", default="longwu988")
  68. ap.add_argument("-p", "--password", default="Longwu1988")
  69. ap.add_argument("--dry-run", action="store_true")
  70. args = ap.parse_args()
  71. deleted = delete_all(args.zone, args.user, args.password, args.dry_run)
  72. log(f"[完成] 已删除角色: {json.dumps(deleted, ensure_ascii=False)}")
  73. if __name__ == "__main__":
  74. main()