global_manager.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import atexit
  2. import os
  3. import psutil
  4. import random
  5. import sys
  6. import threading
  7. import time
  8. from collections import defaultdict
  9. from model.custom_struct import PcConfig
  10. from net.task_api import task_api
  11. from tools.emulator.ld_operate import LD
  12. from tools.emulator.ys_operate import YS
  13. from tools.dm_operate import Dm
  14. from tools.log import logger
  15. from tools.utils import Utils
  16. from tools.wuyouip import WyIP
  17. from server import log_server
  18. from update.update import Updater
  19. class GlobalManager:
  20. """全局管理器类,用于管理配置文件、线程、设备信息和模拟器实例。"""
  21. def __init__(self):
  22. """初始化 GlobalManager 实例。"""
  23. self._lock = threading.Lock()
  24. # 初始化全局控制标志
  25. self.global_control = True
  26. self.device_info: PcConfig | None = None
  27. self.device_mac = ''
  28. self.script_path = ''
  29. self.image_path = ''
  30. self.share_path = ''
  31. self.updater = None
  32. self.script_log_port = 0
  33. self.httpd = None
  34. self.wy_ip: WyIP | None = None
  35. self.window_status = None
  36. self.emulator_status = None
  37. self.emulators = None
  38. def init(self):
  39. self.device_info = self._initialize_device_info()
  40. self.device_mac = Utils.get_mac_address()
  41. self.script_path = self._initialize_script_path()
  42. self.image_path = self._initialize_image_path()
  43. self.share_path = self._initialize_share_path()
  44. self.updater = Updater(self.script_path, self.image_path)
  45. threading.Thread(target=self.updater.run).start()
  46. self._initialize_emulators()
  47. self.script_log_port = random.randint(10000, 32767)
  48. self.httpd = log_server.start_http(handler_class=log_server.SimpleHTTPRequestHandler,
  49. port=self.script_log_port)
  50. atexit.register(log_server.stop_http, self.httpd)
  51. if self.device_info.use_wuyouip == '1':
  52. self.wy_ip = WyIP()
  53. self.window_status = defaultdict(int)
  54. self.emulator_status = defaultdict(int)
  55. # 免注册加载大漠
  56. if hasattr(sys, '_MEIPASS'):
  57. # 程序运行在打包状态
  58. ret, msg = Dm.reg_free(os.path.join(sys._MEIPASS, 'dm'))
  59. else:
  60. ret, msg = Dm.reg_free(os.path.join(os.getcwd(), 'dm'))
  61. if ret:
  62. logger.info(f'大漠插件注册成功,版本号:{msg}')
  63. else:
  64. logger.error(f'大漠插件注册失败,错误信息:{msg}')
  65. @staticmethod
  66. def _initialize_device_info() -> PcConfig:
  67. """初始化并返回设备信息。"""
  68. while True:
  69. result, device_info = task_api.get_device_info()
  70. if result:
  71. logger.info(f'当前设备名称:{device_info.pc_name},负责人:{device_info.officer}')
  72. return device_info
  73. logger.exception(f'未获取到设备信息:{device_info}')
  74. time.sleep(3)
  75. @staticmethod
  76. def _initialize_script_path():
  77. """初始化并返回脚本文件夹路径。"""
  78. script_path = os.path.join(os.getcwd(), '脚本代码')
  79. os.makedirs(script_path, exist_ok=True)
  80. return script_path
  81. @staticmethod
  82. def _initialize_image_path():
  83. """初始化并返回镜像文件夹路径。"""
  84. image_path = os.path.join(os.getcwd(), '游戏母镜像')
  85. os.makedirs(image_path, exist_ok=True)
  86. return image_path
  87. @staticmethod
  88. def _initialize_share_path():
  89. """初始化并返回共享文件夹路径。"""
  90. share_path = os.path.join(os.getcwd(), 'share')
  91. os.makedirs(share_path, exist_ok=True)
  92. return share_path
  93. def set_global_control(self, control):
  94. """设置全局控制标志。"""
  95. with self._lock:
  96. self.global_control = control
  97. def get_global_control(self):
  98. """获取全局控制标志,如果传入线程 ID,则根据线程控制标志决定是否继续等待。"""
  99. return self.global_control
  100. def get_script_path(self):
  101. """获取脚本文件夹路径。"""
  102. return self.script_path
  103. def set_script_path(self, path):
  104. """设置脚本文件夹路径。"""
  105. self.script_path = path
  106. def get_image_path(self):
  107. """获取镜像文件夹路径。"""
  108. return self.image_path
  109. def set_device_officer(self, officer):
  110. """设置设备管理员。"""
  111. self.device_officer = officer
  112. def get_share_path(self):
  113. """获取共享文件夹路径。"""
  114. return self.share_path
  115. def set_share_path(self, path):
  116. """设置共享文件夹路径。"""
  117. self.share_path = path
  118. @staticmethod
  119. def _initialize_emulators():
  120. """初始化所有模拟器。"""
  121. emulators = [
  122. lambda: LD(4),
  123. lambda: LD(64),
  124. lambda: LD(9),
  125. lambda: YS()
  126. ]
  127. for emulator in emulators:
  128. try:
  129. emu = emulator()
  130. emu.close_all()
  131. emu_list = emu.get_list()
  132. for emu_info in emu_list:
  133. if emu_info.index != 0:
  134. emu.remove(emu_info.index)
  135. time.sleep(0.1)
  136. except Exception as e:
  137. logger.info(e)
  138. def set_emulator_status(self, emulator_key, status):
  139. """设置模拟器状态。"""
  140. with self._lock:
  141. self.emulator_status[emulator_key] = status
  142. def get_emulator_status(self, emulator_key):
  143. """获取模拟器状态。"""
  144. with self._lock:
  145. return self.emulator_status.get(emulator_key, 0)
  146. def set_window_status(self, window_id, status):
  147. """设置窗口状态。"""
  148. with self._lock:
  149. self.window_status[window_id] = status
  150. def get_window_status(self, window_id):
  151. """获取窗口状态。"""
  152. with self._lock:
  153. return self.window_status.get(window_id, 0)
  154. @staticmethod
  155. def is_self_running():
  156. """检查当前进程是否已经在运行"""
  157. current_process = os.path.basename(sys.argv[0]) # 获取当前脚本名
  158. for proc in psutil.process_iter(attrs=['pid', 'name']):
  159. if proc.info['name'] == current_process and proc.info['pid'] != os.getpid():
  160. return True
  161. return False
  162. # 实例化全局管理器
  163. GM = GlobalManager()