diff --git a/.gitignore b/.gitignore index 7618c6b..e938843 100644 --- a/.gitignore +++ b/.gitignore @@ -668,3 +668,4 @@ GsData.db GenshinUID data plugins +logs diff --git a/gsuid_core/bot.py b/gsuid_core/bot.py index ee083df..8465212 100644 --- a/gsuid_core/bot.py +++ b/gsuid_core/bot.py @@ -56,12 +56,8 @@ class _Bot: async def _process(self): while True: data = await self.queue.get() - task = asyncio.create_task(data) - self.bg_tasks.add(task) - try: - task.add_done_callback(lambda _: self.bg_tasks.discard(task)) - except Exception as e: - logger.error(e) + asyncio.create_task(data) + self.queue.task_done() class Bot: diff --git a/gsuid_core/client.py b/gsuid_core/client.py index 3ece7df..14f9936 100644 --- a/gsuid_core/client.py +++ b/gsuid_core/client.py @@ -34,17 +34,22 @@ class GsClient: async def send_msg(self): while True: intent = await self._input() - if intent == '全匹配测试': - user_id = '55551111' + if intent == '图片测试': + content = [ + Message( + type='file', + data='xxx.json|XAclpWfLF5d66dtrHx8cqq8E+', + ) + ] else: - user_id = '51' + content = [Message(type='text', data=intent)] msg = MessageReceive( bot_id='Nonebot', user_type='direct', user_pm=2, group_id=None, - user_id=user_id, - content=[Message(type='text', data=intent)], + user_id='51', + content=content, ) msg_send = msgjson.encode(msg) await self.ws.send(msg_send) diff --git a/gsuid_core/data_store.py b/gsuid_core/data_store.py index 5901ec5..1e45bfa 100644 --- a/gsuid_core/data_store.py +++ b/gsuid_core/data_store.py @@ -1,9 +1,16 @@ from pathlib import Path +from typing import Optional gs_data_path = Path(__file__).parents[1] / 'data' -def get_res_path() -> Path: - if not gs_data_path.exists(): - gs_data_path.mkdir() - return gs_data_path +def get_res_path(_path: Optional[str] = None) -> Path: + if _path: + path = gs_data_path / _path + else: + path = gs_data_path + + if not path.exists(): + path.mkdir() + + return path diff --git a/gsuid_core/handler.py b/gsuid_core/handler.py index 9648cbb..908f53e 100644 --- a/gsuid_core/handler.py +++ b/gsuid_core/handler.py @@ -65,7 +65,7 @@ async def handle_event(ws: _Bot, msg: MessageReceive): # 获取用户权限,越小越高 user_pm = await get_user_pml(msg) event = await msg_process(msg) - logger.info(f'[收到事件] {event}') + logger.info('[收到事件]', event=event) valid_event: Dict[Trigger, int] = {} pending = [ _check_command( diff --git a/gsuid_core/logger.py b/gsuid_core/logger.py index 9fd2a56..99092bb 100644 --- a/gsuid_core/logger.py +++ b/gsuid_core/logger.py @@ -6,13 +6,15 @@ from typing import TYPE_CHECKING import loguru from gsuid_core.config import core_config +from gsuid_core.models import Event, Message +from gsuid_core.data_store import get_res_path if TYPE_CHECKING: # avoid sphinx autodoc resolve annotation failed # because loguru module do not have `Logger` class actually from loguru import Logger -logger: "Logger" = loguru.logger +logger: 'Logger' = loguru.logger # https://loguru.readthedocs.io/en/stable/overview.html#entirely-compatible-with-standard-logging @@ -33,23 +35,59 @@ class LoguruHandler(logging.Handler): # pragma: no cover ) -FORMAT = ( - "{time:MM-DD HH:mm:ss} " - "[{level}] " - "{name} | " - # "{function}:{line}| " - "{message}" -) +def format_event(record): + if 'event' in record['extra']: + event: Event = record['extra']['event'] + if event.file and event.file_type != 'url': + file = f'{event.file[:20]}...(base64)' + content = [Message('file', f'{event.file_name}|{file}')] + else: + file = event.file + content = event.content + message = ( + f'[Event] ' + f'raw_text={event.raw_text}, ' + f'command={event.command}, ' + f'text={event.text}, ' + f'image={event.image}, ' + f'at={event.at}, ' + f'image_list={event.image}, ' + f'at_list={event.at_list}, ' + f'is_tome={event.is_tome}, ' + f'reply={event.reply}, ' + f'file_name={event.file_name}, ' + f'file_type={event.file_type}, ' + f'file={file}' + f' | [Receive] ' + f'bot_id={event.bot_id}, ' + f'bot_self_id={event.bot_self_id}, ' + f'msg_id={event.msg_id}, ' + f'user_type={event.user_type}, ' + f'group_id={event.group_id}, ' + f'user_id={event.user_id}, ' + f'user_pm={event.user_pm}, ' + f'content={content}, ' + ) + else: + message = '{message}' -LEVEL: str = core_config.get_config("log").get("level", "INFO") + time = '{time:MM-DD HH:mm:ss}' + level = '[{level}]' + def_name = '{name}' + return f'{time} {level} {def_name} | {message} \n' + + +LEVEL: str = core_config.get_config('log').get('level', 'INFO') logger.remove() -logger_id = logger.add(sys.stdout, level=LEVEL, diagnose=False, format=FORMAT) +logger_id = logger.add( + sys.stdout, level=LEVEL, diagnose=False, format=format_event +) logger.add( - "logs/{time:YYYY-MM-DD}.log", + sink=get_res_path() / 'logs/{time:YYYY-MM-DD}.log', + format=format_event, rotation=datetime.time(), level=LEVEL, diagnose=False, - format=FORMAT, )