🎨 调整文件结构、支持以command_start开头的命令

This commit is contained in:
Wuyi无疑 2023-04-07 00:15:18 +08:00
parent 70723a94ed
commit 24e1729958
2 changed files with 211 additions and 136 deletions

View File

@ -3,7 +3,7 @@ import re
import asyncio import asyncio
from pathlib import Path from pathlib import Path
from base64 import b64encode from base64 import b64encode
from typing import Any, List, Union, Literal, Optional from typing import Any, List, Union, Optional
import aiofiles import aiofiles
from nonebot.log import logger from nonebot.log import logger
@ -27,6 +27,8 @@ connect_core = on_fullmatch(
driver = get_driver() driver = get_driver()
gsclient: Optional[GsClient] = None gsclient: Optional[GsClient] = None
command_start = driver.config.command_start
@get_notice.handle() @get_notice.handle()
async def get_notice_message(bot: Bot, ev: Event): 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() @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: if gsclient is None or not gsclient.is_alive:
return await connect() return await connect()
# 通用字段获取 # 通用字段获取
sessions = ev.get_session_id().split('_') group_id = None
user_id = str(ev.get_user_id()) user_id = ev.get_user_id()
messages = ev.get_message() messages = ev.get_message()
raw_data = ev.__dict__ logger.debug(ev)
logger.debug(raw_data)
group_id = sessions[-2] if len(sessions) >= 2 else None
self_id = str(bot.self_id) self_id = str(bot.self_id)
message: List[Message] = [] message: List[Message] = []
msg_id = ''
sp_bot_id: Optional[str] = None sp_bot_id: Optional[str] = None
sp_user_type: Optional[
Literal['group', 'direct', 'channel', 'sub_channel']
] = None
pm = 6 pm = 6
msg_id = ''
# qqguild # qqguild
if '_message' in raw_data: if bot.adapter.get_name() == 'QQ Guild':
messages = raw_data['_message'] from nonebot.adapters.qqguild.event import (
if 'direct_message' in raw_data and raw_data['direct_message']: MessageEvent,
sp_user_type = 'direct' DirectMessageCreateEvent,
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)
else: # 私聊
sp_user_type = 'direct' if isinstance(ev, DirectMessageCreateEvent):
group_id = None user_type = 'direct'
user_id = str(raw_data['from_'].id) group_id = str(ev.guild_id)
msg_id = str(raw_data['message_id']) msg_id = ev.id
# kaiheila # 群聊
elif 'channel_type' in raw_data: elif isinstance(ev, MessageEvent):
# 如果发送者是个Bot不响应 user_type = 'group'
if raw_data['event'].author.bot: group_id = str(ev.channel_id)
return if ev.member and ev.member.roles:
sp_bot_id = 'kaiheila' if 4 in ev.member.roles:
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':
pm = 2 pm = 2
elif raw_data['sender'].role == 'admin': elif 2 in ev.member.roles:
pm = 3 pm = 3
messages = raw_data['original_message'] elif 5 in ev.member.roles:
msg_id = str(raw_data['message_id']) pm = 5
# feishu msg_id = ev.id
elif 'schema_' in raw_data: else:
messages = raw_data['event'].message.content 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: for feishu_msg in messages:
if 'image_key' in feishu_msg.data: if 'image_key' in feishu_msg.data:
feishu_msg.data['url'] = feishu_msg.data['image_key'] feishu_msg.data['url'] = feishu_msg.data['image_key']
if raw_data['event'].message.chat_type == 'group': user_id = ev.get_user_id()
sp_user_type = 'group' msg_id = ev.message_id
group_id = raw_data['event'].message.chat_id if isinstance(ev, GroupEventMessage):
user_type = 'group'
group_id = ev.chat_id
else: else:
sp_user_type = 'direct' user_type = 'direct'
group_id = None else:
user_id = raw_data['event'].sender.sender_id.union_id logger.debug('[gsuid] 不支持该 Feishu 事件...')
msg_id = str(raw_data['event'].message.message_id) return
# ntchat # ntchat
elif 'data' in raw_data: elif bot.adapter.get_name() == 'ntchat':
if 'chatroom' in raw_data['data']['to_wxid']: from nonebot.adapters.ntchat.event import (
group_id = raw_data['data']['to_wxid'] FileMessageEvent,
if 'image' in raw_data['data']: TextMessageEvent,
message.append(Message('image', raw_data['data']['image'])) )
if 'from_wxid' in raw_data['data']:
user_id = raw_data['data']['from_wxid'] if isinstance(ev, TextMessageEvent):
messages = raw_data['message'] user_id = ev.from_wxid
msg_id = str(raw_data['data']['msgid']) msg_id = ev.msgid
if ( if 'chatroom' in ev.to_wxid:
'raw_msg' in raw_data['data'] user_type = 'group'
and 'xml' in raw_data['data']['raw_msg'] 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( match = re.search(
r'<svrid>(\d+)</svrid>', raw_data['data']['raw_msg'] r'<svrid>(\d+)</svrid>', ev.data['raw_msg']
) )
if match: if match:
message.append(Message('reply', match.group(1))) message.append(Message('reply', match.group(1)))
if 'at_user_list' in raw_data['data']: if ev.at_user_list:
_at_list = raw_data['data']['at_user_list'] at_list = [Message('at', i) for i in ev.at_user_list]
if _at_list:
at_list = [Message('at', i) for i in _at_list]
at_list.pop(0) at_list.pop(0)
message.extend(at_list) message.extend(at_list)
if 'type' in raw_data and raw_data['type'] == 11055: elif isinstance(ev, FileMessageEvent):
val = raw_data['file'] if 'chatroom' in ev.to_wxid:
name = raw_data['file_name'] group_id = ev.to_wxid
user_type = 'group'
else:
user_type = 'direct'
val = ev.file
name = ev.file_name
await asyncio.sleep(2) await asyncio.sleep(2)
if ( if (
os.path.exists(val) os.path.exists(val)
and os.path.getsize(val) <= 5 * 1024 * 1024 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 测试) # 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 # v12msgid = raw_data['id'] # V12的消息id
# self = raw_data['self'] # 返回 platform='xxx' user_id='wxid_xxxxx' # self = raw_data['self'] # 返回 platform='xxx' user_id='wxid_xxxxx'
# platform = self.platform # 机器人平台 # platform = self.platform # 机器人平台
# V12还支持频道等其他平台速速Pr # V12还支持频道等其他平台速速Pr
messages = raw_data['original_message'] # 消息 if isinstance(ev, GroupMessageEvent) or isinstance(
self_id = bot.self_id # 机器人账号ID ev, PrivateMessageEvent
msg_id = raw_data['message_id'] # 消息ID ):
messages = ev.original_message
msg_id = ev.message_id
sp_bot_id = 'onebot_v12' 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') file_id = messages[0].data.get('file_id')
print('[OB12文件ID]', file_id) logger.info('[OB12文件ID]', file_id)
if file_id in messages[0].data.values(): if file_id and file_id in messages[0].data.values():
data = await get_file(bot, file_id) data = await get_file(bot, file_id)
print('[OB12文件]', data) logger.info('[OB12文件]', data)
name = data['name'] name = data['name']
path = data['path'] path = data['path']
message.append(await convert_file(path, name)) message.append(await convert_file(path, name))
if 'group_id' in raw_data: if isinstance(ev, GroupMessageEvent):
group_id = raw_data['group_id'] user_type = 'group'
user_id = raw_data['user_id'] group_id = ev.group_id
sp_user_type = 'group'
else: else:
user_id = raw_data['user_id'] user_type = 'direct'
sp_user_type = 'direct' else:
logger.debug('[gsuid] 不支持该 onebotv12 事件...')
return
else:
logger.debug(f'[gsuid] 不支持该 {bot.adapter.get_name()} 事件...')
return
if sp_bot_id: if sp_bot_id:
bot_id = sp_bot_id bot_id = sp_bot_id
else: else:
bot_id = messages.__class__.__module__.split('.')[2] bot_id = messages.__class__.__module__.split('.')[2]
# 确认超管权限
if await SUPERUSER(bot, ev): if await SUPERUSER(bot, ev):
pm = 1 pm = 1
# 如果有at提及增加AT
if ev.is_tome(): if ev.is_tome():
message.append(Message('at', self_id)) message.append(Message('at', self_id))
# 处理消息 # 处理消息
for _msg in messages: for index, _msg in enumerate(messages):
message = convert_message(_msg, message) message = convert_message(_msg, message, index)
if not message: if not message:
return return
user_type = 'group' if group_id else 'direct'
msg = MessageReceive( msg = MessageReceive(
bot_id=bot_id, bot_id=bot_id,
bot_self_id=self_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, group_id=group_id,
user_id=user_id, user_id=user_id,
content=message, content=message,
msg_id=msg_id, msg_id=msg_id if msg_id else '',
user_pm=pm, user_pm=pm,
) )
logger.info(f'【发送】[gsuid-core]: {msg.bot_id}') logger.info(f'【发送】[gsuid-core]: {msg.bot_id}')
@ -308,21 +382,21 @@ async def connect():
logger.error('Core服务器连接失败...请稍后使用[启动core]命令启动...') 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': if _msg.type == 'text':
message.append( data: str = (
Message( _msg.data['text'] if 'text' in _msg.data else _msg.data['content']
'text',
_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': elif _msg.type == 'image':
file_id = _msg.data.get('file_id') file_id = _msg.data.get('file_id')
if file_id in _msg.data.values(): if file_id in _msg.data.values():
message.append(Message('image', _msg.data['file_id'])) message.append(Message('image', _msg.data['file_id']))
logger.debug('[OB12图片]', _msg.data["file_id"]) logger.debug('[OB12图片]', _msg.data['file_id'])
else: else:
message.append(Message('image', _msg.data['url'])) message.append(Message('image', _msg.data['url']))
elif _msg.type == 'at': elif _msg.type == 'at':
@ -361,8 +435,8 @@ async def convert_file(
# 获取文件 # 获取文件
async def get_file(bot: Bot, file_id: str): async def get_file(bot: Bot, file_id: str):
data = await bot.call_api( data = await bot.call_api(
api="get_file", api='get_file',
file_id=f"{file_id}", file_id=f'{file_id}',
type="path", type='path',
) )
return data return data

1
poetry.lock generated
View File

@ -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-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-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_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-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"},
{file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, {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"}, {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"},