From 2b572b9abf7b997e7807213588b10b17dc301314 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Tue, 24 Jun 2025 22:17:59 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E4=B8=8D=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E7=9A=84=E6=8E=A7=E5=88=B6=E5=8F=B0=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/bot.py b/bot.py index 78904c29c..213d580bf 100644 --- a/bot.py +++ b/bot.py @@ -9,6 +9,11 @@ from pathlib import Path from dotenv import load_dotenv from rich.traceback import install +# maim_message imports for console input +from maim_message import Seg, UserInfo, GroupInfo, BaseMessageInfo, MessageBase +from src.chat.message_receive.bot import chat_bot +from src.config.config import global_config + # 最早期初始化日志系统,确保所有后续模块都使用正确的日志格式 from src.common.logger import initialize_logging, get_logger, shutdown_logging from src.main import MainSystem @@ -232,6 +237,72 @@ def raw_main(): return MainSystem() +async def _create_console_message_dict(text: str) -> dict: + """使用配置创建消息字典""" + timestamp = time.time() + + # --- User & Group Info (hardcoded for console) --- + user_info = UserInfo( + platform="console", + user_id="console_user", + user_nickname="ConsoleUser", + user_cardname="", + ) + # Console input is private chat + group_info = None + + # --- Base Message Info --- + message_info = BaseMessageInfo( + platform="console", + message_id=f"console_{int(timestamp * 1000)}_{hash(text) % 10000}", + time=timestamp, + user_info=user_info, + group_info=group_info, + # Other infos can be added here if needed, e.g., FormatInfo + ) + + # --- Message Segment --- + message_segment = Seg(type="text", data=text) + + # --- Final MessageBase object to convert to dict --- + message = MessageBase( + message_info=message_info, + message_segment=message_segment, + raw_message=text + ) + + return message.to_dict() + + +async def console_input_loop(main_system: MainSystem): + """异步循环以读取控制台输入并模拟接收消息""" + logger.info("控制台输入已准备就绪 (模拟接收消息)。输入 'exit()' 来停止。") + loop = asyncio.get_event_loop() + while True: + try: + line = await loop.run_in_executor(None, sys.stdin.readline) + text = line.strip() + + if not text: + continue + if text.lower() == "exit()": + logger.info("收到 'exit()' 命令,正在停止...") + break + + # Create message dict and pass to the processor + message_dict = await _create_console_message_dict(text) + await chat_bot.message_process(message_dict) + logger.info(f"已将控制台消息 '{text}' 作为接收消息处理。") + + except asyncio.CancelledError: + logger.info("控制台输入循环被取消。") + break + except Exception as e: + logger.error(f"控制台输入循环出错: {e}", exc_info=True) + await asyncio.sleep(1) + logger.info("控制台输入循环结束。") + + if __name__ == "__main__": exit_code = 0 # 用于记录程序最终的退出状态 try: @@ -245,7 +316,14 @@ if __name__ == "__main__": try: # 执行初始化和任务调度 loop.run_until_complete(main_system.initialize()) - loop.run_until_complete(main_system.schedule_tasks()) + # Schedule tasks returns a future that runs forever. + # We can run console_input_loop concurrently. + main_tasks = loop.create_task(main_system.schedule_tasks()) + console_task = loop.create_task(console_input_loop(main_system)) + + # Wait for all tasks to complete (which they won't, normally) + loop.run_until_complete(asyncio.gather(main_tasks, console_task)) + except KeyboardInterrupt: # loop.run_until_complete(get_global_api().stop()) logger.warning("收到中断信号,正在优雅关闭...")