mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-12 06:55:58 +08:00
🎨 调整文件结构、支持以command_start
开头的命令
This commit is contained in:
parent
70723a94ed
commit
24e1729958
@ -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,
|
||||
)
|
||||
|
||||
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:
|
||||
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']
|
||||
else:
|
||||
sp_user_type = 'direct'
|
||||
group_id = None
|
||||
user_id = raw_data['author_id']
|
||||
msg_id = raw_data['message_id']
|
||||
# onebot
|
||||
elif 'sender' in raw_data:
|
||||
if raw_data['sender'].role == 'owner':
|
||||
# 私聊
|
||||
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 raw_data['sender'].role == 'admin':
|
||||
elif 2 in ev.member.roles:
|
||||
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
|
||||
elif 5 in ev.member.roles:
|
||||
pm = 5
|
||||
msg_id = ev.id
|
||||
else:
|
||||
logger.debug('[gsuid] 不支持该 QQ Guild 事件...')
|
||||
return
|
||||
# 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:
|
||||
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 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:
|
||||
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']
|
||||
if raw_data['event'].message.chat_type == 'group':
|
||||
sp_user_type = 'group'
|
||||
group_id = raw_data['event'].message.chat_id
|
||||
user_id = ev.get_user_id()
|
||||
msg_id = ev.message_id
|
||||
if isinstance(ev, GroupEventMessage):
|
||||
user_type = 'group'
|
||||
group_id = ev.chat_id
|
||||
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)
|
||||
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']
|
||||
):
|
||||
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'<svrid>(\d+)</svrid>', raw_data['data']['raw_msg']
|
||||
r'<svrid>(\d+)</svrid>', ev.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]
|
||||
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
|
||||
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']:
|
||||
if '[文件]' in ev.alt_message:
|
||||
file_id = messages[0].data.get('file_id')
|
||||
print('[OB12文件ID]', file_id)
|
||||
if file_id in messages[0].data.values():
|
||||
logger.info('[OB12文件ID]', file_id)
|
||||
if file_id and file_id in messages[0].data.values():
|
||||
data = await get_file(bot, file_id)
|
||||
print('[OB12文件]', data)
|
||||
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_id = raw_data['user_id']
|
||||
sp_user_type = 'direct'
|
||||
user_type = 'direct'
|
||||
else:
|
||||
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
|
||||
|
1
poetry.lock
generated
1
poetry.lock
generated
@ -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"},
|
||||
|
Loading…
x
Reference in New Issue
Block a user