From 24e1729958a1980007764f3c1fecf0679c2316f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wuyi=E6=97=A0=E7=96=91?= <444835641@qq.com> Date: Fri, 7 Apr 2023 00:15:18 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E8=B0=83=E6=95=B4=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=BB=93=E6=9E=84=E3=80=81=E6=94=AF=E6=8C=81=E4=BB=A5?= =?UTF-8?q?`command=5Fstart`=E5=BC=80=E5=A4=B4=E7=9A=84=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenshinUID/__init__.py | 346 +++++++++++++++++++++++++---------------- poetry.lock | 1 + 2 files changed, 211 insertions(+), 136 deletions(-) diff --git a/GenshinUID/__init__.py b/GenshinUID/__init__.py index 07569711..6427a61f 100644 --- a/GenshinUID/__init__.py +++ b/GenshinUID/__init__.py @@ -3,7 +3,7 @@ import re import asyncio from pathlib import Path from base64 import b64encode -from typing import Any, List, Union, Literal, Optional +from typing import Any, List, Union, Optional import aiofiles from nonebot.log import logger @@ -27,6 +27,8 @@ connect_core = on_fullmatch( driver = get_driver() gsclient: Optional[GsClient] = None +command_start = driver.config.command_start + @get_notice.handle() async def get_notice_message(bot: Bot, ev: Event): @@ -90,186 +92,258 @@ async def get_notice_message(bot: Bot, ev: Event): @get_message.handle() -async def send_char_adv(bot: Bot, ev: Event): +async def get_all_message(bot: Bot, ev: Event): if gsclient is None or not gsclient.is_alive: return await connect() # 通用字段获取 - sessions = ev.get_session_id().split('_') - user_id = str(ev.get_user_id()) + group_id = None + user_id = ev.get_user_id() messages = ev.get_message() - raw_data = ev.__dict__ - logger.debug(raw_data) - group_id = sessions[-2] if len(sessions) >= 2 else None + logger.debug(ev) + self_id = str(bot.self_id) message: List[Message] = [] - msg_id = '' sp_bot_id: Optional[str] = None - sp_user_type: Optional[ - Literal['group', 'direct', 'channel', 'sub_channel'] - ] = None + pm = 6 + msg_id = '' # qqguild - if '_message' in raw_data: - messages = raw_data['_message'] - if 'direct_message' in raw_data and raw_data['direct_message']: - sp_user_type = 'direct' - group_id = str(raw_data['guild_id']) - else: - group_id = str(raw_data['channel_id']) - if 4 in raw_data['member'].roles: - pm = 2 - elif 2 in raw_data['member'].roles: - pm = 3 - elif 5 in raw_data['member'].roles: - pm = 5 - msg_id = raw_data['id'] - # telegram - elif 'telegram_model' in raw_data: - # 如果发送者是个Bot,不响应 - if raw_data['from_'].is_bot: - return - messages = raw_data['message'] - # message.append(Message(type='text', data=text)) - if raw_data['chat'].type == 'group': - sp_user_type = 'group' - group_id = str(raw_data['chat'].id) + if bot.adapter.get_name() == 'QQ Guild': + from nonebot.adapters.qqguild.event import ( + MessageEvent, + DirectMessageCreateEvent, + ) + # 私聊 + if isinstance(ev, DirectMessageCreateEvent): + user_type = 'direct' + group_id = str(ev.guild_id) + msg_id = ev.id + # 群聊 + elif isinstance(ev, MessageEvent): + user_type = 'group' + group_id = str(ev.channel_id) + if ev.member and ev.member.roles: + if 4 in ev.member.roles: + pm = 2 + elif 2 in ev.member.roles: + pm = 3 + elif 5 in ev.member.roles: + pm = 5 + msg_id = ev.id else: - sp_user_type = 'direct' - group_id = None - user_id = str(raw_data['from_'].id) - msg_id = str(raw_data['message_id']) - # kaiheila - elif 'channel_type' in raw_data: - # 如果发送者是个Bot,不响应 - if raw_data['event'].author.bot: + logger.debug('[gsuid] 不支持该 QQ Guild 事件...') return - sp_bot_id = 'kaiheila' - messages = raw_data['event'].content - if raw_data['channel_type'] == 'GROUP': - sp_user_type = 'group' - group_id = raw_data['target_id'] + # telegram + elif bot.adapter.get_name() == 'Telegram': + from nonebot.adapters.telegram.event import ( + GroupMessageEvent, + PrivateMessageEvent, + ) + + if isinstance(ev, GroupMessageEvent) or isinstance( + ev, PrivateMessageEvent + ): + if ev.from_.is_bot: + return + + user_id = str(ev.from_.id) + msg_id = str(ev.message_id) + if isinstance(ev, GroupMessageEvent): + user_type = 'group' + group_id = str(ev.chat.id) + else: + user_type = 'direct' else: - sp_user_type = 'direct' - group_id = None - user_id = raw_data['author_id'] - msg_id = raw_data['message_id'] + logger.debug('[gsuid] 不支持该 Telegram 事件...') + return + # kaiheila + elif bot.adapter.get_name() == 'Kaiheila': + from nonebot.adapters.kaiheila.event import ( + ChannelMessageEvent, + PrivateMessageEvent, + ) + + if isinstance(ev, ChannelMessageEvent) or isinstance( + ev, PrivateMessageEvent + ): + if ev.event.author.bot: + return + + user_id = ev.author_id + msg_id = ev.msg_id + if isinstance(ev, ChannelMessageEvent): + user_type = 'group' + group_id = ev.target_id + else: + user_type = 'direct' + else: + logger.debug('[gsuid] 不支持该 kaiheila 事件...') + return # onebot - elif 'sender' in raw_data: - if raw_data['sender'].role == 'owner': - pm = 2 - elif raw_data['sender'].role == 'admin': - pm = 3 - messages = raw_data['original_message'] - msg_id = str(raw_data['message_id']) - # feishu - elif 'schema_' in raw_data: - messages = raw_data['event'].message.content - for feishu_msg in messages: - if 'image_key' in feishu_msg.data: - feishu_msg.data['url'] = feishu_msg.data['image_key'] - if raw_data['event'].message.chat_type == 'group': - sp_user_type = 'group' - group_id = raw_data['event'].message.chat_id + elif bot.adapter.get_name() == 'OneBot V11': + from nonebot.adapters.onebot.v11.event import ( + GroupMessageEvent, + PrivateMessageEvent, + ) + + if isinstance(ev, GroupMessageEvent) or isinstance( + ev, PrivateMessageEvent + ): + messages = ev.original_message + msg_id = str(ev.message_id) + if ev.sender.role == 'owner': + pm = 2 + elif ev.sender.role == 'admin': + pm = 3 + + if isinstance(ev, GroupMessageEvent): + user_type = 'group' + group_id = str(ev.group_id) + else: + user_type = 'direct' else: - sp_user_type = 'direct' - group_id = None - user_id = raw_data['event'].sender.sender_id.union_id - msg_id = str(raw_data['event'].message.message_id) + logger.debug('[gsuid] 不支持该 onebotv11 事件...') + return + elif bot.adapter.get_name() == 'Feishu': + from nonebot.adapters.feishu.event import ( + GroupEventMessage, + PrivateEventMessage, + ) + + if isinstance(ev, GroupEventMessage) or isinstance( + ev, PrivateEventMessage + ): + for feishu_msg in messages: + if 'image_key' in feishu_msg.data: + feishu_msg.data['url'] = feishu_msg.data['image_key'] + user_id = ev.get_user_id() + msg_id = ev.message_id + if isinstance(ev, GroupEventMessage): + user_type = 'group' + group_id = ev.chat_id + else: + user_type = 'direct' + else: + logger.debug('[gsuid] 不支持该 Feishu 事件...') + return # ntchat - elif 'data' in raw_data: - if 'chatroom' in raw_data['data']['to_wxid']: - group_id = raw_data['data']['to_wxid'] - if 'image' in raw_data['data']: - message.append(Message('image', raw_data['data']['image'])) - if 'from_wxid' in raw_data['data']: - user_id = raw_data['data']['from_wxid'] - messages = raw_data['message'] - msg_id = str(raw_data['data']['msgid']) - if ( - 'raw_msg' in raw_data['data'] - and 'xml' in raw_data['data']['raw_msg'] - ): - match = re.search( - r'(\d+)', raw_data['data']['raw_msg'] - ) - if match: - message.append(Message('reply', match.group(1))) - if 'at_user_list' in raw_data['data']: - _at_list = raw_data['data']['at_user_list'] - if _at_list: - at_list = [Message('at', i) for i in _at_list] + elif bot.adapter.get_name() == 'ntchat': + from nonebot.adapters.ntchat.event import ( + FileMessageEvent, + TextMessageEvent, + ) + + if isinstance(ev, TextMessageEvent): + user_id = ev.from_wxid + msg_id = ev.msgid + if 'chatroom' in ev.to_wxid: + user_type = 'group' + group_id = ev.to_wxid + else: + user_type = 'direct' + if 'image' in ev.data: + message.append(Message('image', ev.data['image'])) + if 'from_wxid' in ev.data: + if 'raw_msg' in ev.data and 'xml' in ev.data['raw_msg']: + match = re.search( + r'(\d+)', ev.data['raw_msg'] + ) + if match: + message.append(Message('reply', match.group(1))) + if ev.at_user_list: + at_list = [Message('at', i) for i in ev.at_user_list] at_list.pop(0) message.extend(at_list) - if 'type' in raw_data and raw_data['type'] == 11055: - val = raw_data['file'] - name = raw_data['file_name'] + elif isinstance(ev, FileMessageEvent): + if 'chatroom' in ev.to_wxid: + group_id = ev.to_wxid + user_type = 'group' + else: + user_type = 'direct' + val = ev.file + name = ev.file_name await asyncio.sleep(2) if ( os.path.exists(val) and os.path.getsize(val) <= 5 * 1024 * 1024 - and str(name).endswith(".json") + and str(name).endswith('.json') ): - message.append(await convert_file(val, name)) # type: ignore + message.append(await convert_file(val, name)) + else: + logger.debug('[gsuid] 不支持该 ntchat 事件...') + return # OneBot V12 (仅在 ComWechatClient 测试) - if bot.adapter.get_name() == 'OneBot V12': + elif bot.adapter.get_name() == 'OneBot V12': + from nonebot.adapters.onebot.v12.event import ( + GroupMessageEvent, + PrivateMessageEvent, + ) + # v12msgid = raw_data['id'] # V12的消息id # self = raw_data['self'] # 返回 platform='xxx' user_id='wxid_xxxxx' # platform = self.platform # 机器人平台 # V12还支持频道等其他平台,速速Pr! - messages = raw_data['original_message'] # 消息 - self_id = bot.self_id # 机器人账号ID - msg_id = raw_data['message_id'] # 消息ID - sp_bot_id = 'onebot_v12' + if isinstance(ev, GroupMessageEvent) or isinstance( + ev, PrivateMessageEvent + ): + messages = ev.original_message + msg_id = ev.message_id + sp_bot_id = 'onebot_v12' - if 'alt_message' in raw_data and '[文件]' in raw_data['alt_message']: - file_id = messages[0].data.get('file_id') - print('[OB12文件ID]', file_id) - if file_id in messages[0].data.values(): - data = await get_file(bot, file_id) - print('[OB12文件]', data) - name = data['name'] - path = data['path'] - message.append(await convert_file(path, name)) + if '[文件]' in ev.alt_message: + file_id = messages[0].data.get('file_id') + logger.info('[OB12文件ID]', file_id) + if file_id and file_id in messages[0].data.values(): + data = await get_file(bot, file_id) + logger.info('[OB12文件]', data) + name = data['name'] + path = data['path'] + message.append(await convert_file(path, name)) - if 'group_id' in raw_data: - group_id = raw_data['group_id'] - user_id = raw_data['user_id'] - sp_user_type = 'group' + if isinstance(ev, GroupMessageEvent): + user_type = 'group' + group_id = ev.group_id + else: + user_type = 'direct' else: - user_id = raw_data['user_id'] - sp_user_type = 'direct' + logger.debug('[gsuid] 不支持该 onebotv12 事件...') + return + else: + logger.debug(f'[gsuid] 不支持该 {bot.adapter.get_name()} 事件...') + return if sp_bot_id: bot_id = sp_bot_id else: bot_id = messages.__class__.__module__.split('.')[2] + # 确认超管权限 if await SUPERUSER(bot, ev): pm = 1 + # 如果有at提及,增加AT if ev.is_tome(): message.append(Message('at', self_id)) # 处理消息 - for _msg in messages: - message = convert_message(_msg, message) + for index, _msg in enumerate(messages): + message = convert_message(_msg, message, index) if not message: return - user_type = 'group' if group_id else 'direct' msg = MessageReceive( bot_id=bot_id, bot_self_id=self_id, - user_type=sp_user_type if sp_user_type else user_type, + user_type=user_type, group_id=group_id, user_id=user_id, content=message, - msg_id=msg_id, + msg_id=msg_id if msg_id else '', user_pm=pm, ) logger.info(f'【发送】[gsuid-core]: {msg.bot_id}') @@ -308,21 +382,21 @@ async def connect(): logger.error('Core服务器连接失败...请稍后使用[启动core]命令启动...') -def convert_message(_msg: Any, message: List[Message]): +def convert_message(_msg: Any, message: List[Message], index: int): if _msg.type == 'text': - message.append( - Message( - 'text', - _msg.data['text'] - if 'text' in _msg.data - else _msg.data['content'], - ) + data: str = ( + _msg.data['text'] if 'text' in _msg.data else _msg.data['content'] ) + if index == 0: + if data.startswith(tuple(command_start)): + for word in command_start: + data = data.replace(word, '', 1) + message.append(Message('text', data)) elif _msg.type == 'image': file_id = _msg.data.get('file_id') if file_id in _msg.data.values(): message.append(Message('image', _msg.data['file_id'])) - logger.debug('[OB12图片]', _msg.data["file_id"]) + logger.debug('[OB12图片]', _msg.data['file_id']) else: message.append(Message('image', _msg.data['url'])) elif _msg.type == 'at': @@ -361,8 +435,8 @@ async def convert_file( # 获取文件 async def get_file(bot: Bot, file_id: str): data = await bot.call_api( - api="get_file", - file_id=f"{file_id}", - type="path", + api='get_file', + file_id=f'{file_id}', + type='path', ) return data diff --git a/poetry.lock b/poetry.lock index 3ef57d13..e578a3ce 100644 --- a/poetry.lock +++ b/poetry.lock @@ -501,6 +501,7 @@ files = [ {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"},