🎨: clean codes

This commit is contained in:
Soulter
2024-04-21 22:20:23 +08:00
parent 03bb932f8f
commit f66091e08f
22 changed files with 671 additions and 479 deletions
+16 -10
View File
@@ -10,9 +10,11 @@ from typing import List, Union
import time
# QQ官方消息类型转换
def qq_official_message_parse(message: List[BaseMessageComponent]):
plain_text = ""
image_path = None # only one img supported
image_path = None # only one img supported
for i in message:
if isinstance(i, Plain):
plain_text += i.text
@@ -24,6 +26,8 @@ def qq_official_message_parse(message: List[BaseMessageComponent]):
return plain_text, image_path
# QQ官方消息类型 2 AstrBotMessage
def qq_official_message_parse_rev(message: Union[botpy.message.Message, botpy.message.GroupMessage],
message_type: MessageType) -> AstrBotMessage:
abm = AstrBotMessage()
@@ -33,7 +37,7 @@ def qq_official_message_parse_rev(message: Union[botpy.message.Message, botpy.me
abm.message_id = message.id
abm.tag = "qqchan"
msg: List[BaseMessageComponent] = []
if message_type == MessageType.GROUP_MESSAGE:
abm.sender = MessageMember(
message.author.member_openid,
@@ -41,7 +45,7 @@ def qq_official_message_parse_rev(message: Union[botpy.message.Message, botpy.me
)
abm.message_str = message.content.strip()
abm.self_id = "unknown_selfid"
msg.append(Plain(abm.message_str))
if message.attachments:
for i in message.attachments:
@@ -52,15 +56,16 @@ def qq_official_message_parse_rev(message: Union[botpy.message.Message, botpy.me
img = Image.fromURL(url)
msg.append(img)
abm.message = msg
elif message_type == MessageType.GUILD_MESSAGE or message_type == MessageType.FRIEND_MESSAGE:
# 目前对于 FRIEND_MESSAGE 只处理频道私聊
try:
abm.self_id = str(message.mentions[0].id)
except:
abm.self_id = ""
plain_content = message.content.replace("<@!"+str(abm.self_id)+">", "").strip()
plain_content = message.content.replace(
"<@!"+str(abm.self_id)+">", "").strip()
msg.append(Plain(plain_content))
if message.attachments:
for i in message.attachments:
@@ -80,19 +85,20 @@ def qq_official_message_parse_rev(message: Union[botpy.message.Message, botpy.me
raise ValueError(f"Unknown message type: {message_type}")
return abm
def nakuru_message_parse_rev(message: Union[GuildMessage, GroupMessage, FriendMessage]) -> AstrBotMessage:
abm = AstrBotMessage()
abm.type = MessageType(message.type)
abm.timestamp = int(time.time())
abm.raw_message = message
abm.message_id = message.message_id
plain_content = ""
for i in message.message:
if isinstance(i, Plain):
plain_content += i.text
abm.message_str = plain_content
abm.self_id = str(message.self_id)
abm.sender = MessageMember(
str(message.sender.user_id),
@@ -100,5 +106,5 @@ def nakuru_message_parse_rev(message: Union[GuildMessage, GroupMessage, FriendMe
)
abm.tag = "gocq"
abm.message = message.message
return abm
return abm
+1
View File
@@ -1,6 +1,7 @@
from dataclasses import dataclass
from typing import Union, Optional
@dataclass
class MessageResult():
result_message: Union[str, list]
+1 -1
View File
@@ -43,7 +43,7 @@ class Platform():
发送消息(主动发送)同 send_msg()
'''
pass
def parse_message_outline(self, message: Union[GuildMessage, GroupMessage, FriendMessage, str, list]) -> str:
'''
将消息解析成大纲消息形式。
+31 -28
View File
@@ -23,7 +23,7 @@ class FakeSource:
self.type = type
self.group_id = group_id
class QQGOCQ(Platform):
def __init__(self, cfg: dict, message_handler: callable, global_object) -> None:
super().__init__(message_handler)
@@ -39,11 +39,11 @@ class QQGOCQ(Platform):
try:
self.nick_qq = cfg['nick_qq']
except:
self.nick_qq = ["ai","!",""]
self.nick_qq = ["ai", "!", ""]
nick_qq = self.nick_qq
if isinstance(nick_qq, str):
nick_qq = [nick_qq]
self.unique_session = cfg['uniqueSessionMode']
self.pic_mode = cfg['qq_pic_mode']
@@ -67,7 +67,7 @@ class QQGOCQ(Platform):
await self.handle_msg(abm)
else:
return
@gocq_app.receiver("FriendMessage")
async def _(app: CQHTTP, source: FriendMessage):
if self.cc.get("gocq_react_friend", True):
@@ -76,12 +76,12 @@ class QQGOCQ(Platform):
await self.handle_msg(abm)
else:
return
@gocq_app.receiver("GroupMemberIncrease")
async def _(app: CQHTTP, source: GroupMemberIncrease):
if self.cc.get("gocq_react_group_increase", True):
await app.sendGroupMessage(source.group_id, [
Plain(text = self.announcement)
Plain(text=self.announcement)
])
# @gocq_app.receiver("Notify")
@@ -101,16 +101,18 @@ class QQGOCQ(Platform):
await self.handle_msg(abm)
else:
return
def run(self):
self.client.run()
async def handle_msg(self, message: AstrBotMessage):
self.logger.log(f"{message.sender.nickname}/{message.sender.user_id} -> {self.parse_message_outline(message)}", tag="QQ_GOCQ")
assert isinstance(message.raw_message, (GroupMessage, FriendMessage, GuildMessage))
self.logger.log(
f"{message.sender.nickname}/{message.sender.user_id} -> {self.parse_message_outline(message)}", tag="QQ_GOCQ")
assert isinstance(message.raw_message,
(GroupMessage, FriendMessage, GuildMessage))
is_group = message.type != MessageType.FRIEND_MESSAGE
# 判断是否响应消息
resp = False
if not is_group:
@@ -132,9 +134,10 @@ class QQGOCQ(Platform):
if nick != '' and i.text.strip().startswith(nick):
resp = True
break
if not resp: return
if not resp:
return
# 解析 session_id
if self.unique_session or not is_group:
session_id = message.raw_message.user_id
@@ -144,13 +147,13 @@ class QQGOCQ(Platform):
session_id = message.raw_message.channel_id
else:
session_id = message.raw_message.user_id
message.session_id = session_id
# 解析 role
sender_id = str(message.raw_message.user_id)
if sender_id == self.cc.get('admin_qq', '') or \
sender_id in self.cc.get('other_admins', []):
sender_id in self.cc.get('other_admins', []):
role = 'admin'
else:
role = 'member'
@@ -167,7 +170,7 @@ class QQGOCQ(Platform):
await self.reply_msg(message, message_result.result_message)
if message_result.callback is not None:
message_result.callback()
# 如果是等待回复的消息
if session_id in self.waiting and self.waiting[session_id] == '':
self.waiting[session_id] = message
@@ -182,14 +185,15 @@ class QQGOCQ(Platform):
source = message.raw_message
else:
source = message
res = result_message
self.logger.log(f"{source.user_id} <- {self.parse_message_outline(res)}", tag="QQ_GOCQ")
self.logger.log(
f"{source.user_id} <- {self.parse_message_outline(res)}", tag="QQ_GOCQ")
if isinstance(source, int):
source = FakeSource("GroupMessage", source)
# str convert to CQ Message Chain
if isinstance(res, str):
res_str = res
@@ -241,7 +245,7 @@ class QQGOCQ(Platform):
node.name = f"bot"
node.time = int(time.time())
# print(node)
nodes=[node]
nodes = [node]
await self.client.sendGroupForwardMessage(source.group_id, nodes)
return
await self.client.sendGroupMessage(source.group_id, res)
@@ -256,10 +260,10 @@ class QQGOCQ(Platform):
await self.reply_msg(message, result_message)
except BaseException as e:
raise e
async def send(self,
to,
res):
async def send(self,
to,
res):
'''
同 send_msg()
'''
@@ -311,4 +315,3 @@ class QQGOCQ(Platform):
return ret
except BaseException as e:
raise e
+45 -32
View File
@@ -11,7 +11,7 @@ from botpy.types.message import Reference
from botpy import Client
import time
from ._platfrom import Platform
from ._message_parse import(
from ._message_parse import (
qq_official_message_parse_rev,
qq_official_message_parse
)
@@ -20,10 +20,12 @@ from typing import Union, List
from nakuru.entities.components import BaseMessageComponent
# QQ 机器人官方框架
class botClient(Client):
def set_platform(self, platform: 'QQOfficial'):
self.platform = platform
async def on_group_at_message_create(self, message: botpy.message.GroupMessage):
abm = qq_official_message_parse_rev(message, MessageType.GROUP_MESSAGE)
await self.platform.handle_msg(abm)
@@ -37,9 +39,11 @@ class botClient(Client):
# 收到私聊消息
async def on_direct_message_create(self, message: botpy.message.DirectMessage):
# 转换层
abm = qq_official_message_parse_rev(message, MessageType.FRIEND_MESSAGE)
abm = qq_official_message_parse_rev(
message, MessageType.FRIEND_MESSAGE)
await self.platform.handle_msg(abm)
class QQOfficial(Platform):
def __init__(self, cfg: dict, message_handler: callable, global_object) -> None:
@@ -47,7 +51,7 @@ class QQOfficial(Platform):
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
self.waiting: dict = {}
self.cfg = cfg
@@ -57,7 +61,7 @@ class QQOfficial(Platform):
self.unique_session = cfg['uniqueSessionMode']
self.logger: gu.Logger = global_object.logger
qq_group = cfg['qqofficial_enable_group_message']
if qq_group:
self.intents = botpy.Intents(
public_messages=True,
@@ -79,7 +83,7 @@ class QQOfficial(Platform):
def run(self):
try:
self.loop.run_until_complete(self.client.run(
appid=self.appid,
appid=self.appid,
secret=self.secret
))
except BaseException as e:
@@ -90,17 +94,19 @@ class QQOfficial(Platform):
)
self.client.set_platform(self)
self.client.run(
appid=self.appid,
appid=self.appid,
token=self.token
)
async def handle_msg(self, message: AstrBotMessage):
assert isinstance(message.raw_message, (botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage))
assert isinstance(message.raw_message, (botpy.message.Message,
botpy.message.GroupMessage, botpy.message.DirectMessage))
is_group = message.type != MessageType.FRIEND_MESSAGE
_t = "/私聊" if not is_group else ""
self.logger.log(f"{message.sender.nickname}({message.sender.user_id}{_t}) -> {self.parse_message_outline(message)}", tag="QQ_OFFICIAL")
self.logger.log(
f"{message.sender.nickname}({message.sender.user_id}{_t}) -> {self.parse_message_outline(message)}", tag="QQ_OFFICIAL")
# 解析出 session_id
if self.unique_session or not is_group:
session_id = message.sender.user_id
@@ -116,7 +122,7 @@ class QQOfficial(Platform):
# 解析出 role
sender_id = message.sender.user_id
if sender_id == self.cfg['admin_qqchan'] or \
sender_id in self.cfg['other_admins']:
sender_id in self.cfg['other_admins']:
role = 'admin'
else:
role = 'member'
@@ -139,18 +145,20 @@ class QQOfficial(Platform):
if session_id in self.waiting and self.waiting[session_id] == '':
self.waiting[session_id] = message
async def reply_msg(self,
message: Union[botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage, AstrBotMessage],
res: Union[str, list]):
async def reply_msg(self,
message: Union[botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage, AstrBotMessage],
res: Union[str, list]):
'''
回复频道消息
'''
if isinstance(message, AstrBotMessage):
source = message.raw_message
else:
source = message
assert isinstance(source, (botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage))
self.logger.log(f"{message.sender.nickname}({message.sender.user_id}) <- {self.parse_message_outline(res)}", tag="QQ_OFFICIAL")
source = message
assert isinstance(source, (botpy.message.Message,
botpy.message.GroupMessage, botpy.message.DirectMessage))
self.logger.log(
f"{message.sender.nickname}({message.sender.user_id}) <- {self.parse_message_outline(res)}", tag="QQ_OFFICIAL")
plain_text = ''
image_path = ''
@@ -160,7 +168,7 @@ class QQOfficial(Platform):
plain_text, image_path = qq_official_message_parse(res)
elif isinstance(res, str):
plain_text = res
if self.cfg['qq_pic_mode']:
# 文本转图片,并且加上原来的图片
if plain_text != '' or image_path != '':
@@ -168,7 +176,8 @@ class QQOfficial(Platform):
if image_path.startswith("http"):
plain_text += "\n\n" + "![](" + image_path + ")"
else:
plain_text += "\n\n" + "![](file:///" + image_path + ")"
plain_text += "\n\n" + \
"![](file:///" + image_path + ")"
image_path = gu.create_markdown_image("".join(plain_text))
plain_text = ""
@@ -182,9 +191,10 @@ class QQOfficial(Platform):
image = PILImage.open(io.BytesIO(await response.read()))
image_path = gu.save_temp_img(image)
if source is not None and image_path == '': # file_image与message_reference不能同时传入
msg_ref = Reference(message_id=source.id, ignore_get_message_error=False)
if source is not None and image_path == '': # file_image与message_reference不能同时传入
msg_ref = Reference(message_id=source.id,
ignore_get_message_error=False)
# 到这里,我们得到了 plain_textimage_pathmsg_ref
data = {
'content': plain_text,
@@ -210,7 +220,7 @@ class QQOfficial(Platform):
# 分割过长的消息
if "msg over length" in str(e):
split_res = []
split_res.append(plain_text[:len(plain_text)//2])
split_res.append(plain_text[:len(plain_text)//2])
split_res.append(plain_text[len(plain_text)//2:])
for i in split_res:
data['content'] = i
@@ -227,11 +237,12 @@ class QQOfficial(Platform):
data['content'] = str.join(" ", plain_text)
await self._send_wrapper(**data)
except BaseException as e:
plain_text = re.sub(r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '[被隐藏的链接]', str(e), flags=re.MULTILINE)
plain_text = re.sub(
r'(https|http)?:\/\/(\w|\.|\/|\?|\=|\&|\%)*\b', '[被隐藏的链接]', str(e), flags=re.MULTILINE)
plain_text = plain_text.replace(".", "·")
data['content'] = plain_text
await self._send_wrapper(**data)
async def _send_wrapper(self, **kwargs):
if 'group_openid' in kwargs:
# QQ群组消息
@@ -248,27 +259,29 @@ class QQOfficial(Platform):
elif 'channel_id' in kwargs:
# 频道消息
if 'file_image' in kwargs:
kwargs['file_image'] = kwargs['file_image'].replace("file://", "")
kwargs['file_image'] = kwargs['file_image'].replace(
"file://", "")
await self.client.api.post_message(**kwargs)
else:
# 频道私聊消息
if 'file_image' in kwargs:
kwargs['file_image'] = kwargs['file_image'].replace("file://", "")
kwargs['file_image'] = kwargs['file_image'].replace(
"file://", "")
await self.client.api.post_dms(**kwargs)
async def send_msg(self,
message_obj: Union[botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage, AstrBotMessage],
message_chain: List[BaseMessageComponent],
):
):
'''
发送消息。目前只支持被动回复消息(即拥有一个 botpy Message 类型的 message_obj 传入)
'''
await self.reply_msg(message_obj, message_chain)
async def send(self,
message_obj: Union[botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage, AstrBotMessage],
message_chain: List[BaseMessageComponent],
):
message_obj: Union[botpy.message.Message, botpy.message.GroupMessage, botpy.message.DirectMessage, AstrBotMessage],
message_chain: List[BaseMessageComponent],
):
'''
发送消息。目前只支持被动回复消息(即拥有一个 botpy Message 类型的 message_obj 传入)
'''