120 lines
4.8 KiB
Python
120 lines
4.8 KiB
Python
import asyncio
|
|
import os
|
|
|
|
|
|
async def command_handler_flow(client):
|
|
"""命令行交互。"""
|
|
client.logger.info("\n命令帮助:")
|
|
client.logger.info(" reply <内容> - 回复最后一条消息")
|
|
client.logger.info(" text <id> <平台> <内容> - 发送文本消息")
|
|
client.logger.info(" img <id> <平台> <路径> - 发送图片")
|
|
client.logger.info(" setid <id> - 设置回复ID")
|
|
client.logger.info(" agent on/off - 开启/关闭 Agent")
|
|
client.logger.info(" exit/quit - 退出\n")
|
|
|
|
while client.running:
|
|
try:
|
|
loop = asyncio.get_running_loop()
|
|
user_input = await loop.run_in_executor(None, input, "")
|
|
|
|
parts = user_input.strip().split(maxsplit=1)
|
|
if not parts:
|
|
continue
|
|
|
|
cmd = parts[0].lower()
|
|
|
|
if cmd in ["exit", "quit", "q"]:
|
|
client.logger.info(f"[{client.get_time()}] 正在关闭...")
|
|
client.running = False
|
|
if client.websocket:
|
|
await client.websocket.close()
|
|
break
|
|
|
|
if cmd == "setid" and len(parts) > 1:
|
|
client.reply_id = parts[1]
|
|
client.logger.info(f"[{client.get_time()}] 回复ID已设置为: {client.reply_id}")
|
|
continue
|
|
|
|
if cmd == "agent" and len(parts) > 1:
|
|
if parts[1].lower() == "on":
|
|
client.enable_agent = True
|
|
client.logger.info(f"[{client.get_time()}] Agent 已开启")
|
|
elif parts[1].lower() == "off":
|
|
client.enable_agent = False
|
|
client.logger.info(f"[{client.get_time()}] Agent 已关闭")
|
|
continue
|
|
|
|
if cmd == "reply" and len(parts) > 1:
|
|
if client.last_msg:
|
|
await client.send_reply(client.last_msg, parts[1])
|
|
else:
|
|
client.logger.info(f"[{client.get_time()}] 错误: 还没有收到任何消息")
|
|
continue
|
|
|
|
if cmd == "text" and len(parts) > 1:
|
|
args = parts[1].split(maxsplit=2)
|
|
if len(args) >= 3:
|
|
await client.send_text(args[0], args[1], args[2])
|
|
else:
|
|
client.logger.info(f"[{client.get_time()}] 格式: text <cy_id> <acc_type> <内容>")
|
|
continue
|
|
|
|
if cmd == "img" and len(parts) > 1:
|
|
args = parts[1].split(maxsplit=2)
|
|
if len(args) >= 3:
|
|
await client.send_image(args[0], args[1], args[2])
|
|
else:
|
|
client.logger.info(f"[{client.get_time()}] 格式: img <cy_id> <acc_type> <图片路径>")
|
|
continue
|
|
|
|
client.logger.info(f"[{client.get_time()}] 未知命令: {cmd}")
|
|
|
|
except Exception as e:
|
|
client.logger.info(f"[{client.get_time()}] 命令错误: {e}")
|
|
|
|
|
|
async def run_client_flow(client):
|
|
"""运行客户端。"""
|
|
tasks = [client.connect(), client.command_handler()]
|
|
|
|
try:
|
|
from mail.email_receiver import email_receiver
|
|
if email_receiver.username:
|
|
client.logger.info(f"[{client.get_time()}] 邮件接收已启动,监控: {email_receiver.username}")
|
|
tasks.append(email_receiver.start())
|
|
else:
|
|
client.logger.info(f"[{client.get_time()}] 未配置邮件账号,跳过邮件接收")
|
|
except Exception as e:
|
|
client.logger.info(f"[{client.get_time()}] 邮件接收模块加载失败: {e}")
|
|
|
|
try:
|
|
from utils.daily_summary import scheduler as daily_scheduler
|
|
tasks.append(daily_scheduler())
|
|
client.logger.info(f"[{client.get_time()}] 每日日报定时任务已启动")
|
|
except Exception as e:
|
|
client.logger.info(f"[{client.get_time()}] 日报模块加载失败: {e}")
|
|
|
|
try:
|
|
from utils.health_check import health_check_loop
|
|
|
|
def _qingjian_ok():
|
|
return client.websocket is not None and not getattr(client.websocket, "closed", True)
|
|
|
|
tasks.append(health_check_loop(_qingjian_ok))
|
|
client.logger.info(f"[{client.get_time()}] 健康检查已启动")
|
|
except Exception as e:
|
|
client.logger.info(f"[{client.get_time()}] 健康检查模块加载失败: {e}")
|
|
|
|
try:
|
|
from utils.wechat_chat_log import morning_startup_scheduler
|
|
tasks.append(morning_startup_scheduler())
|
|
client.logger.info(f"[{client.get_time()}] 早8点企微启动消息已启动")
|
|
except Exception as e:
|
|
client.logger.info(f"[{client.get_time()}] 企微启动消息模块加载失败: {e}")
|
|
|
|
if os.getenv("UNREPLIED_FOLLOWUP_ENABLED", "true").lower() in ("1", "true", "yes"):
|
|
tasks.append(client._unreplied_followup_loop())
|
|
client.logger.info(f"[{client.get_time()}] 未回复会话补偿任务已启动")
|
|
|
|
await asyncio.gather(*tasks)
|