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"},