main.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import os
  2. import sys
  3. import time
  4. from model.custom_struct import GameConfig
  5. from model.global_manager import GM
  6. from model.helper import MyHelper
  7. from net.task_api import task_api
  8. from task.task import Task
  9. from tools.log import logger
  10. from tools.thread_pool import MyThreadPoolExecutor
  11. from tools.utils import Utils
  12. # 这些库都是打包需要的
  13. import keyboard
  14. import filelock
  15. import cv2
  16. import aiofiles
  17. import aiopytesseract
  18. import altgraph
  19. import annotated
  20. import annotated_types
  21. import anyio
  22. import attrs
  23. import cattrs
  24. import certifi
  25. import chardet
  26. import charset_normalizer
  27. import colorama
  28. import comtypes
  29. import distro
  30. import h11
  31. import httpcore
  32. import httpx
  33. import idna
  34. import jiter
  35. import mss
  36. import numpy
  37. import openai
  38. import packaging
  39. import pefile
  40. from PIL import Image
  41. import pydantic
  42. import pydantic_core
  43. import pygetwindow as gw
  44. import requests
  45. import sniffio
  46. import tqdm
  47. import typing
  48. import urllib3
  49. import winshell
  50. import tzdata
  51. import tn
  52. import dateutil
  53. def main():
  54. try:
  55. # 初始化全局管理
  56. GM.init()
  57. # 创建线程池
  58. executor = MyThreadPoolExecutor(max_workers=GM.device_info.window_nums)
  59. timer = Utils.Timer()
  60. while GM.get_global_control():
  61. if timer.timer('heartbeat', 60):
  62. result,message = task_api.heartbeat(GM.device_info.officer)
  63. logger.info(f'心跳:{message}')
  64. idle_worker_count = executor.get_idle_worker_count()
  65. # 只有当有空闲工作线程时才继续
  66. if idle_worker_count > 0:
  67. window_list = task_api.get_window_list()
  68. for window in window_list:
  69. window_id = window.window_id
  70. # 只处理状态为 0 的窗口
  71. if GM.get_window_status(window_id) == 0:
  72. # 检查更新
  73. GM.updater.check_updates(GM.device_info, window.game_list)
  74. # 检查是否有任务需要执行
  75. for game in window.game_list:
  76. game_info = GameConfig.dict_to_GameConfig(game)
  77. if GM.updater.get_is_updating(game_info.task_id): # 检查是否正在更新
  78. continue
  79. if not game_info.is_execute:
  80. continue
  81. # 取账号信息
  82. result, account_info = task_api.get_account(game_info.task_id,GM.device_info.only_new,GM.device_info.only_retained)
  83. logger.info(f'[窗口-{window_id}]{game_info.task_id}-获取账号:{account_info}',window_id)
  84. if result:
  85. task_api.up_log_profession(account_info.account, game_info.task_id, '拉取账号', '成功')
  86. helper = MyHelper(window_id, game_info, account_info)
  87. # 设置窗口状态为正在执行
  88. GM.set_window_status(window_id, 1)
  89. # 提交任务给线程池异步执行
  90. executor.submit(Task(helper).run)
  91. break # 处理完一个窗口任务后,跳出当前循环,避免重复提交任务
  92. time.sleep(3)
  93. time.sleep(10) # 等待一定时间后重新检查
  94. except Exception as e:
  95. logger.exception(f'主线程异常:{e}')
  96. if __name__ == '__main__':
  97. if Utils.is_admin():
  98. main()
  99. sys.exit()
  100. else:
  101. Utils.run_as_admin()