import json
from pathlib import Path
import time
from window_handler import WindowHandler
from kaitu import Kaitu
from qinghuo import Qinghuo
from zhonghe import Zhonghe
from caiji import Caiji
from datetime import datetime
import os # 添加这行导入os模块
from PyQt6.QtWidgets import QTextEdit # 添加这行导入QTextEdit
from logger import Logger
from delay_system import DelaySystem
from assist import Assist
import sys
class BusinessLogic:
def __init__(self, 日志=None, settings_file="settings.json"):
self.日志输出 = 日志
self.settings_file = Path(settings_file)
self.delay_system = DelaySystem() # 创建延时系统实例
self.settings = {
'kaitusetting': None,
'qinghuosetting': None,
'zonghesetting': None,
'caijisetting': None,
'duilie': [{},{},{},{},{},{},{}] # 改为7个空字典
}
self.kaitudata = {
'kaitu': None, #开图功能
'tandong': None,#探洞
}
self.设置页面 ={
'duanxinchonglian': None, #断线重连是否开启
'chongliantime': None, #断线重连时间
'gameaddress': None, #游戏地址
}
self.zhonghedata ={
'bangzhu': None,
'bangzhutime': None,
'caijizengchan': None,
'suiji': None,
'zhaomu': None,
'shouhuo': None,
'jiance': None, #检测
'jiancetime': None, #检测时间
'lianmengliwu': None, #联盟礼物
}
self.qinghuodata ={
'openzhaizi': None, #开启打寨子功能功能
'followzhaizi': None, #开启寨子跟车功能
'duoduiyeren': None, #开启多队快速清活力功能
'yangyerenlaye': None, #开启养野人拉野1-17级功能
'ditulaye': [], #开启地图寻找野怪密集地方拉野
}
self.caijidata ={
'BasicSettings': {
'caiji_tiandengji': None,
'caiji_beisaotiantime': None,
'Findhuadong': None,
'cundang': None,
'bszhuzha': None, #是否开启宝石驻扎
#读取morenwj
'morenwj': None, #是否开启默认武器
},
'duilie': [
{ # 第1队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
},
{ # 第2队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
},
{ # 第3队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
},
{ # 第4队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
},
{ # 第5队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
},
{ # 第6队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
},
{ # 第7队
'zhu': None,
'fu': None,
'tian': None,
'kj': None
}
]
}
def load_settings(self):
"""从settings.json文件加载设置"""
try:
if not self.settings_file.exists():
#print(f"设置文件 {self.settings_file} 不存在")
self.日志输出.info(f"设置文件 {self.settings_file} 不存在")
return False
with open(self.settings_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# 读取设置参数
self.settings['kaitusetting'] = data.get('kaitusetting', False)
self.settings['qinghuosetting'] = data.get('qinghuosetting', False)
self.settings['zonghesetting'] = data.get('zonghesetting', False)
self.settings['caijisetting'] = data.get('caijisetting', False)
# 读取并设置延时系统参数
yanshi = data.get('yanshi', 60) # 默认为60
liucangdu = data.get('liucangdu', 20) # 默认为20
suiji = data.get('suiji', 30) # 默认为30
# 转换参数并应用到延时系统
yanshi_value = yanshi / 100 # 转换为0.00-1.00范围
self.delay_system.set_base_delay(yanshi_value)
# 计算并设置帧率
fps = 5 + 55 * (liucangdu / 100) ** 1.5
self.delay_system.set_target_fps(int(round(fps)))
# 设置随机因子
suiji_value = suiji / 100
self.delay_system.set_random_factor(min(5.0, max(0.0, suiji_value)))
# 确保caijidata字段存在,如果不存在则初始化
if self.settings['kaitusetting'] == False and self.settings['qinghuosetting'] == False and self.settings['zonghesetting'] == False and self.settings['caijisetting'] == False:
#print("请至少开启一个功能")
self.日志输出.info("请至少开启一个功能")
return False
if self.settings['kaitusetting'] == True:
#print("开图功能已开启")
self.日志输出.info("开图功能已开启")
self.kaitudata['kaitu'] = data.get('kaitu', False)
self.kaitudata['tandong'] = data.get('tandong', False)
if self.kaitudata['kaitu'] == False and self.kaitudata['tandong'] == False:
#print("开图和探洞功能都未开启,请至少开启一个功能")
self.日志输出.info("开图和探洞功能都未开启,请至少开启一个功能")
return False
#判断是否开启了综合
if self.settings['zonghesetting'] == True:
#print("综合功能已开启")
self.日志输出.info("综合功能已开启")
#读取综合里面帮助是否开启
self.zhonghedata['bangzhu'] = data.get('bangzhu', False)
#读取综合里面采集提升是否开启
self.zhonghedata['caijizengchan'] = data.get('caijizengchan', False)
#读取综合里面随机是否开启
self.zhonghedata['suiji'] = data.get('suiji', False)
#读取综合里面开图时间是否开启
self.zhonghedata['bangzhutime'] = data.get('bangzhutime', False)
#读取综合里面采集是否开启
self.zhonghedata['zhaomu'] = data.get('zhaomu', False)
#读取综合里面采集是否开启
self.zhonghedata['shouhuo'] = data.get('shouhuo', False)
#读取综合里面采集是否开启
self.zhonghedata['jiance'] = data.get('jiance', False)
#读取综合里面检测时间是否开启
self.zhonghedata['jiancetime'] = data.get('jiancetime', '15')
#读取综合里面采集是否开启
self.zhonghedata['zhaomu'] = data.get('zhaomu', False)
self.zhonghedata['lianmengliwu'] = data.get('lianmengliwu', False)
self.设置页面['duanxinchonglian'] = data.get('duanxinchonglian', False) #断线重连是否开启
self.设置页面['chongliantime'] = data.get('chongliantime', 0) #断线重连时间
self.设置页面['gameaddress'] = data.get('gameaddress','') #游戏地址
#读取采集设置
self.get_caijidata(data)
#读取主页队列设置
self.get_index_duilie(data)
self.日志输出.info(self.settings['duilie'])
return True
except Exception as e:
#print(f"加载设置文件失败: {str(e)}")
self.日志输出.info(f"加载设置文件失败: {str(e)}")
return False
def get_caijidata(self,data=None):
"""获取采集设置参数"""
if data == None:
return False
if self.settings['caijisetting'] == False:
#print("采集功能未开启")
self.日志输出.info("采集功能未开启")
return False
#print("读取采集设置参数")
self.日志输出.info("读取采集设置参数")
if self.settings['caijisetting'] == True:
#print("采集功能已开启")
self.日志输出.info("采集功能已开启")
#随机因子
# 确保BasicSettings字典已初始化
if 'BasicSettings' not in self.caijidata:
self.caijidata['BasicSettings'] = {}
self.caijidata['BasicSettings']['随机因子'] = data.get('suiji', 0) # 默认值设为0而非False,更适合数值类型
self.caijidata['BasicSettings']['caiji_beisaotiantime'] = data.get('caiji_beisaotiantime', False)
self.caijidata['BasicSettings']['Findhuadong'] = data.get('Findhuadong', 40)/100
#读取huncundang 和bszhuzha
self.caijidata['BasicSettings']['cundang'] = data.get('cundang', False)
self.caijidata['BasicSettings']['bszhuzha'] = data.get('bszhuzha', False)
#读取morenwj
self.caijidata['BasicSettings']['morenwj'] = data.get('morenwj', False)
#self.caijidata['BasicSettings']['kuaijiecz'] = data.get('kuaijiecz', False)
for i in range(7):
self.caijidata['duilie'][i]['zhu'] = data.get(f'caijidl{i+1}zhu', False) # 根据您的json文件
self.caijidata['duilie'][i]['fu'] = data.get(f'caijidl{i+1}fu', False) # 根据您的json文件
self.caijidata['duilie'][i]['tian'] = data.get(f'caijidl{i+1}tian', False) # 根据您的json文件
self.caijidata['duilie'][i]['kj'] = data.get(f'caijidl{i+1}kj', False) # 根据您的json文件
return True
#获取主页队列设置
def get_index_duilie(self,data=None):
"""获取主页队列设置"""
#如果采集或者清活开启任意一个 则读取队列设置
if self.settings['caijisetting'] == False and self.settings['qinghuosetting'] == False:
#print("采集或者清活未开启")
self.日志输出.info("采集或者清活未开启")
return False
#print("采集或者清活开启任意一个 开始读取队列设置")
self.日志输出.info("采集或者清活开启任意一个 开始读取队列设置")
# 初始化duilie为包含5个空字典的列表
for i in range(7):
self.settings['duilie'][i] = data.get(f'index_duilie{i+1}', False) # 根据您的json文件
return True
def get_setting(self, name):
"""获取指定设置的值"""
return self.settings.get(name)
def execute(self):
"""执行业务逻辑"""
# 创建WindowHandler实例
#return True
if self.日志输出 is None:
print("错误: 未找到findPicLog控件")
return False
if not self.load_settings():
return False
self.日志输出.info(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 当前设置状态:")
self.日志输出.info(f"开图设置: {'已启用' if self.settings['kaitusetting'] else '未启用'}")
self.日志输出.info(f"清货设置: {'已启用' if self.settings['qinghuosetting'] else '未启用'}")
self.日志输出.info(f"综合设置: {'已启用' if self.settings['zonghesetting'] else '未启用'}")
self.日志输出.info(f"采集设置: {'已启用' if self.settings['caijisetting'] else '未启用'}")
self.日志输出.info(f"准备查找窗口")
#hwnd = window_handler.find_window()
#window_handler.启动游戏()
#self.日志输出.info(f"窗口已经找到")
timen =time.time()
#self.日志输出.info(f"定时器已经开启,时间戳: {timen}")
#self.日志输出.info(f"找到窗口句柄: {hwnd}")
# 🔥 初始化前检查停止信号
if hasattr(self, 'should_stop') and self.should_stop:
print("[ULTIMATE] business_logic 在创建assist前收到停止信号")
self.日志输出.info("🛑 程序执行已终止")
return True
assist = Assist(设置页面 =self.设置页面,日志输出=self.日志输出,延时=self.delay_system)
# 🔥 设置assist的主线程关闭函数回调(最重要!让assist能够真正关闭线程)
if hasattr(self, 'main_thread_closer') and callable(self.main_thread_closer):
assist.main_thread_closer = self.main_thread_closer
#self.日志输出.info("已设置assist主线程关闭函数回调")
# 🔥 窗口查找前检查停止信号
if hasattr(self, 'should_stop') and self.should_stop:
print("[ULTIMATE] business_logic 在查找窗口前收到停止信号")
self.日志输出.info("🛑 程序执行已终止")
return True
assist.window_handler.find_window()
assist.hwnd = assist.window_handler.hwnd
# 🔥 游戏检测前检查停止信号
if hasattr(self, 'should_stop') and self.should_stop:
print("[ULTIMATE] business_logic 在游戏检测前收到停止信号")
self.日志输出.info("🛑 程序执行已终止")
return True
#检测是否开启短线重连
assist.检测游戏是否掉线()
# 🔥 创建子类前检查停止信号
if hasattr(self, 'should_stop') and self.should_stop:
print("[ULTIMATE] business_logic 在创建子类前收到停止信号")
self.日志输出.info("🛑 程序执行已终止")
return True
zhonghe_instance = Zhonghe(assist, self.日志输出, self.zhonghedata,延时=self.delay_system) # 修改变量名
# 传递停止信号引用
zhonghe_instance.should_stop_ref = lambda: hasattr(self, 'should_stop') and self.should_stop
self.日志输出.info(f"综合任务已经创建")
kaitu = Kaitu(assist,self.日志输出, settings =self.kaitudata,延时=self.delay_system)
# 传递停止信号引用
kaitu.should_stop_ref = lambda: hasattr(self, 'should_stop') and self.should_stop
self.日志输出.info(f"开图任务已经创建")
qinghuo = Qinghuo(assist, settings =self.qinghuodata,延时=self.delay_system)
# 传递停止信号引用
qinghuo.should_stop_ref = lambda: hasattr(self, 'should_stop') and self.should_stop
self.日志输出.info(f"清货任务已经创建")
caiji = Caiji(assist, settings =self.caijidata,duilie=self.settings['duilie'],日志输出=self.日志输出,延时=self.delay_system)
# 传递停止信号引用
caiji.should_stop_ref = lambda: hasattr(self, 'should_stop') and self.should_stop
self.日志输出.info(f"采集任务已经创建")
#return True
while True:
# 🔥 EMERGENCY PATCH: 终极停止检查 - 最高优先级 🔥
if hasattr(self, 'should_stop') and self.should_stop:
print("[ULTIMATE] business_logic 主循环收到终极停止信号")
self.日志输出.info("🛑 程序执行已终止")
break
# 调试断点支持 - 在循环开始处添加断点支持
import sys
if hasattr(sys, 'gettrace') and sys.gettrace() is not None:
# 调试模式下,允许断点中断
pass
# UI事件处理 - 确保界面控件响应
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents() # 处理UI事件,让界面保持响应
except Exception as e:
pass # 忽略UI处理错误
# 检查线程是否应该终止 - 优先级最高
if hasattr(self, 'should_stop') and self.should_stop:
print("[DEBUG] business_logic 收到停止信号")
self.日志输出.info("📋 任务执行已终止")
break
# 检查是否应该暂停 - 增强版暂停逻辑,包含网络状态监控
if hasattr(self, 'pause_event') and self.pause_event:
# 如果pause_event被清除(网络断开时会清除),线程会在这里等待
if not self.pause_event.is_set():
# 不显示详细的暂停消息,避免刷屏
# 记录暂停开始时间
pause_start_time = time.time()
last_log_time = pause_start_time
log_interval = 60 # 每60秒记录一次状态,减少日志频率
while not self.pause_event.is_set():
# 在暂停等待期间也要检查终止信号
if hasattr(self, 'should_stop') and self.should_stop:
self.日志输出.info("📋 任务执行已终止")
return True # 优雅退出
# UI事件处理 - 确保在暂停期间界面依然响应
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents() # 处理UI事件
except Exception as e:
pass # 忽略UI处理错误
# 等待网络恢复信号,每5秒检查一次
if self.pause_event.wait(timeout=5):
break
# 定期记录暂停状态
current_time = time.time()
if current_time - last_log_time >= log_interval:
pause_duration = int(current_time - pause_start_time)
self.日志输出.info(f"⏳ 等待网络连接中... (已等待 {pause_duration // 60} 分钟)")
last_log_time = current_time
# 记录恢复信息(如果不是因为终止信号退出)
if not (hasattr(self, 'should_stop') and self.should_stop):
# 不显示恢复消息,避免与心跳日志重复
pass
# 再次检查终止信号
if hasattr(self, 'should_stop') and self.should_stop:
print("[DEBUG] business_logic 在主循环中收到停止信号")
self.日志输出.info("📋 任务执行已终止")
break
# 原有循环内容
#清理对话框
assist.清理对话框()
# 更新所有实例的窗口句柄
self.日志输出.info("进入循环",show_in_ui=False)
# 调试断点支持 - 在任务执行前添加断点支持
# 添加短暂休眠,避免CPU占用过高
time.sleep(1)
#self.日志输出.info(f"循环执行中,时间戳: {time.time()}")
#判断kaitusetting qinghuosetting zonghesetting caijisetting 是否为True 如果为True 则执行
if self.settings['zonghesetting']:
#print("执行综合")
self.日志输出.info("执行综合任务")
# 调试断点支持 - 在综合任务执行前
import sys
if hasattr(sys, 'gettrace') and sys.gettrace() is not None:
pass
# 设置任务超时检查
import threading
task_start_time = time.time()
try:
zhonghe_instance.execute()
except Exception as e:
print(f"[ERROR] 综合任务执行异常: {e}")
self.日志输出.error(f"综合任务执行异常: {e}")
# 检查任务是否被停止信号中断
if hasattr(self, 'should_stop') and self.should_stop:
print("[DEBUG] 综合任务被停止信号中断")
break
# UI事件处理 - 在任务执行后处理UI事件
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents()
except:
pass
if self.settings['kaitusetting']:
#print("进入开图")
self.日志输出.info("进入开图")
# 调试断点支持 - 在开图任务执行前
import sys
if hasattr(sys, 'gettrace') and sys.gettrace() is not None:
pass
try:
kaitu.execute()
except Exception as e:
print(f"[ERROR] 开图任务执行异常: {e}")
self.日志输出.error(f"开图任务执行异常: {e}")
# 检查任务是否被停止信号中断
if hasattr(self, 'should_stop') and self.should_stop:
print("[DEBUG] 开图任务被停止信号中断")
break
# UI事件处理 - 在任务执行后处理UI事件
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents()
except:
pass
if self.settings['qinghuosetting']:
#print("执行清活力")
self.日志输出.info("执行清活力")
# 调试断点支持 - 在清活力任务执行前
import sys
if hasattr(sys, 'gettrace') and sys.gettrace() is not None:
pass
try:
qinghuo.execute()
except Exception as e:
print(f"[ERROR] 清活力任务执行异常: {e}")
self.日志输出.error(f"清活力任务执行异常: {e}")
# 检查任务是否被停止信号中断
if hasattr(self, 'should_stop') and self.should_stop:
print("[DEBUG] 清活力任务被停止信号中断")
break
# UI事件处理 - 在任务执行后处理UI事件
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents()
except:
pass
if self.settings['caijisetting']:
#print("执行采集")
self.日志输出.info("执行采集")
# 调试断点支持 - 在采集任务执行前
if hasattr(sys, 'gettrace') and sys.gettrace() is not None:
pass
try:
caiji.execute()
except Exception as e:
print(f"[ERROR] 采集任务执行异常: {e}")
self.日志输出.error(f"采集任务执行异常: {e}")
# 检查任务是否被停止信号中断
if hasattr(self, 'should_stop') and self.should_stop:
print("[DEBUG] 采集任务被停止信号中断")
break
# UI事件处理 - 在任务执行后处理UI事件
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents()
except:
pass
# 等待1秒
time.sleep(1)
# UI事件处理 - 在循环末尾再次处理UI事件
try:
from PyQt6.QtWidgets import QApplication
app = QApplication.instance()
if app:
app.processEvents()
except:
pass
#判断是否到5分钟, 5分钟清除一下日志
if time.time() - timen > 300:
#print("清空print打印的内容")
self.日志输出.info("清空日志的内容")
#清空日志
self.日志输出.clear()
timen =time.time()
# 循环结束,说明收到了终止信号
self.日志输出.info("✅ 所有任务已停止")
return True