From 251bfaf4106553a8faf19634a5b0072fbd72a2c9 Mon Sep 17 00:00:00 2001 From: Expliyh Date: Thu, 16 May 2024 20:09:20 +0800 Subject: [PATCH] =?UTF-8?q?Core=E9=80=82=E9=85=8Dsatori?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liteyuki/liteyuki_main/core.py | 87 +++++++++++-------- liteyuki/utils/message/message.py | 79 ++++++++++------- liteyuki/utils/satori_utils/__init__.py | 2 + liteyuki/utils/satori_utils/event_tools.py | 10 +++ .../utils/satori_utils/get_message_type.py | 10 +++ 5 files changed, 123 insertions(+), 65 deletions(-) create mode 100644 liteyuki/utils/satori_utils/event_tools.py create mode 100644 liteyuki/utils/satori_utils/get_message_type.py diff --git a/liteyuki/liteyuki_main/core.py b/liteyuki/liteyuki_main/core.py index edaeaeea..ae0c70d4 100644 --- a/liteyuki/liteyuki_main/core.py +++ b/liteyuki/liteyuki_main/core.py @@ -37,6 +37,7 @@ markdown_image = common_db.where_one(StoredConfig(), default=StoredConfig()).con ), permission=SUPERUSER ).handle() +# Satori OK async def _(bot: T_Bot, matcher: Matcher, result: Arparma): if result.main_args.get("text"): await matcher.finish(Message(unescape(result.main_args.get("text")))) @@ -51,9 +52,11 @@ async def _(bot: T_Bot, matcher: Matcher, result: Arparma): ), permission=SUPERUSER ).handle() +# Satori OK async def _(bot: T_Bot, event: T_MessageEvent): # 使用git pull更新 - ulang = get_user_lang(str(event.user_id)) + + ulang = get_user_lang(str(event.user.id if isinstance(event, satori.event.Event) else event.user_id)) success, logs = update_liteyuki() reply = "Liteyuki updated!\n" reply += f"```\n{logs}\n```\n" @@ -70,18 +73,19 @@ async def _(bot: T_Bot, event: T_MessageEvent): ), permission=SUPERUSER ).handle() +# Satori OK async def _(matcher: Matcher, bot: T_Bot, event: T_MessageEvent): await matcher.send("Liteyuki reloading") temp_data = common_db.where_one(TempConfig(), default=TempConfig()) temp_data.data.update( { - "reload" : True, - "reload_time" : time.time(), - "reload_bot_id" : bot.self_id, - "reload_session_type": event.message_type, - "reload_session_id" : event.group_id if event.message_type == "group" else event.user_id, - "delta_time" : 0 + "reload": True, + "reload_time": time.time(), + "reload_bot_id": bot.self_id, + "reload_session_type": satori_utils.get_message_type(event), + "reload_session_id": (event.group_id if event.message_type == "group" else event.user_id) if not isinstance(event,satori.event.Event) else event.channel.id, + "delta_time": 0 } ) @@ -112,8 +116,9 @@ async def _(matcher: Matcher, bot: T_Bot, event: T_MessageEvent): ), permission=SUPERUSER ).handle() +# Satori OK async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot, matcher: Matcher): - ulang = get_user_lang(str(event.user_id)) + ulang = get_user_lang(str(satori_utils.get_user_id(event))) stored_config: StoredConfig = common_db.where_one(StoredConfig(), default=StoredConfig()) if result.subcommands.get("set"): key, value = result.subcommands.get("set").args.get("key"), result.subcommands.get("set").args.get("value") @@ -159,15 +164,17 @@ async def _(result: Arparma, event: T_MessageEvent, bot: T_Bot, matcher: Matcher ), permission=SUPERUSER ).handle() +# Satori OK async def _(event: T_MessageEvent, matcher: Matcher): global markdown_image # 切换图片模式,False以图片形式发送,True以markdown形式发送 - ulang = get_user_lang(str(event.user_id)) + ulang = get_user_lang(str(satori_utils.get_user_id(event))) stored_config: StoredConfig = common_db.where_one(StoredConfig(), default=StoredConfig()) stored_config.config["markdown_image"] = not stored_config.config.get("markdown_image", False) markdown_image = stored_config.config["markdown_image"] common_db.save(stored_config) - await matcher.finish(ulang.get("liteyuki.image_mode_on" if stored_config.config["markdown_image"] else "liteyuki.image_mode_off")) + await matcher.finish( + ulang.get("liteyuki.image_mode_on" if stored_config.config["markdown_image"] else "liteyuki.image_mode_off")) @on_alconna( @@ -176,6 +183,7 @@ async def _(event: T_MessageEvent, matcher: Matcher): ), aliases={"轻雪文档"}, ).handle() +# Satori OK async def _(matcher: Matcher): await matcher.finish("https://bot.liteyuki.icu/usage") @@ -228,7 +236,8 @@ async def _(result: Arparma, bot: T_Bot, event: T_MessageEvent, matcher: Matcher @Bot.on_calling_api # 图片模式检测 async def test_for_md_image(bot: T_Bot, api: str, data: dict): # 截获大图发送,转换为markdown发送 - if api in ["send_msg", "send_private_msg", "send_group_msg"] and markdown_image and data.get("user_id") != bot.self_id: + if api in ["send_msg", "send_private_msg", "send_group_msg"] and markdown_image and data.get( + "user_id") != bot.self_id: if api == "send_msg" and data.get("message_type") == "private" or api == "send_private_msg": session_type = "private" session_id = data.get("user_id") @@ -241,10 +250,12 @@ async def test_for_md_image(bot: T_Bot, api: str, data: dict): file: str = data["message"][0].data.get("file") # file:// http:// base64:// if file.startswith("http"): - result = await md.send_md(await md.image_async(file), bot, message_type=session_type, session_id=session_id) + result = await md.send_md(await md.image_async(file), bot, message_type=session_type, + session_id=session_id) elif file.startswith("file"): file = file.replace("file://", "") - result = await md.send_image(open(file, "rb").read(), bot, message_type=session_type, session_id=session_id) + result = await md.send_image(open(file, "rb").read(), bot, message_type=session_type, + session_id=session_id) elif file.startswith("base64"): file_bytes = base64.b64decode(file.replace("base64://", "")) result = await md.send_image(file_bytes, bot, message_type=session_type, session_id=session_id) @@ -271,7 +282,7 @@ async def on_shutdown(): @driver.on_bot_connect async def _(bot: T_Bot): temp_data = common_db.where_one(TempConfig(), default=TempConfig()) - if isinstance(bot,satori.Bot): + if isinstance(bot, satori.Bot): await satori_utils.user_infos.load_friends(bot) # 用于重启计时 if temp_data.data.get("reload", False): @@ -283,13 +294,19 @@ async def _(bot: T_Bot): reload_session_id = temp_data.data.get("reload_session_id", 0) delta_time = temp_data.data.get("delta_time", 0) common_db.save(temp_data) # 更新数据 - await bot.call_api( - "send_msg", - message_type=reload_session_type, - user_id=reload_session_id, - group_id=reload_session_id, - message="Liteyuki reloaded in %.2f s" % delta_time - ) + if isinstance(bot,satori.Bot): + await bot.send_message( + channel_id=reload_session_id, + message="Liteyuki reloaded in %.2f s" % delta_time + ) + else: + await bot.call_api( + "send_msg", + message_type=reload_session_type, + user_id=reload_session_id, + group_id=reload_session_id, + message="Liteyuki reloaded in %.2f s" % delta_time + ) # 每天4点更新 @@ -308,21 +325,21 @@ async def every_day_update(): # 安全的需要用户id的api need_user_id = ( - "send_private_msg", - "send_msg", - "set_group_card", - "set_group_special_title", - "get_stranger_info", - "get_group_member_info" + "send_private_msg", + "send_msg", + "set_group_card", + "set_group_special_title", + "get_stranger_info", + "get_group_member_info" ) need_group_id = ( - "send_group_msg", - "send_msg", - "set_group_card", - "set_group_name", - "set_group_special_title", - "get_group_member_info", - "get_group_member_list", - "get_group_honor_info" + "send_group_msg", + "send_msg", + "set_group_card", + "set_group_name", + "set_group_special_title", + "get_group_member_info", + "get_group_member_list", + "get_group_honor_info" ) diff --git a/liteyuki/utils/message/message.py b/liteyuki/utils/message/message.py index 32388cd4..1ef1163e 100644 --- a/liteyuki/utils/message/message.py +++ b/liteyuki/utils/message/message.py @@ -7,6 +7,7 @@ from PIL import Image import aiohttp import nonebot from nonebot import require +from nonebot.adapters import satori from nonebot.adapters.onebot import v11 from typing import Any, Type @@ -65,28 +66,37 @@ class MarkdownMessage: """ formatted_md = v11.unescape(markdown).replace("\n", r"\n").replace('"', r'\\\"') if event is not None and message_type is None: - message_type = event.message_type - session_id = event.user_id if event.message_type == "private" else event.group_id + if isinstance(event, satori.event.Event): + message_type = "private" if event.guild is None else "group" + group_id = event.guild.id if event.guild is not None else None + else: + assert event is not None + message_type = event.message_type + group_id = event.group_id if message_type == "group" else None + user_id = event.user.id if isinstance(event, satori.event.Event) else event.user_id + session_id = user_id if message_type == "private" else group_id + else: + pass try: raise TencentBannedMarkdownError("Tencent banned markdown") forward_id = await bot.call_api( "send_private_forward_msg", messages=[ - { - "type": "node", - "data": { - "content": [ - { - "data": { - "content": "{\"content\":\"%s\"}" % formatted_md, - }, - "type": "markdown" - } - ], - "name" : "[]", - "uin" : bot.self_id + { + "type": "node", + "data": { + "content": [ + { + "data": { + "content": "{\"content\":\"%s\"}" % formatted_md, + }, + "type": "markdown" } + ], + "name": "[]", + "uin": bot.self_id } + } ], user_id=bot.self_id @@ -96,12 +106,12 @@ class MarkdownMessage: group_id=session_id, message_type=message_type, message=[ - { - "type": "longmsg", - "data": { - "id": forward_id - } - }, + { + "type": "longmsg", + "data": { + "id": forward_id + } + }, ], **kwargs ) @@ -117,12 +127,19 @@ class MarkdownMessage: width=540, device_scale_factor=4 ) - data = await bot.send_msg( - message_type=message_type, - group_id=session_id, - user_id=session_id, - message=v11.MessageSegment.image(md_image_bytes), - ) + if isinstance(bot, satori.Bot): + msg_seg = satori.MessageSegment.image(raw=md_image_bytes,mime="image/png") + data = await bot.send( + event=event, + message=msg_seg + ) + else: + data = await bot.send_msg( + message_type=message_type, + group_id=session_id, + user_id=session_id, + message=v11.MessageSegment.image(md_image_bytes), + ) return data @staticmethod @@ -164,7 +181,8 @@ class MarkdownMessage: if method == 2: base64_string = base64.b64encode(image).decode("utf-8") data = await bot.call_api("upload_image", file=f"base64://{base64_string}") - await MarkdownMessage.send_md(MarkdownMessage.image(data, Image.open(io.BytesIO(image)).size), bot, event=event, message_type=message_type, + await MarkdownMessage.send_md(MarkdownMessage.image(data, Image.open(io.BytesIO(image)).size), bot, + event=event, message_type=message_type, session_id=session_id, **kwargs) # 其他实现端方案 @@ -172,13 +190,14 @@ class MarkdownMessage: image_message_id = (await bot.send_private_msg( user_id=bot.self_id, message=[ - v11.MessageSegment.image(file=image) + v11.MessageSegment.image(file=image) ] ))["message_id"] image_url = (await bot.get_msg(message_id=image_message_id))["message"][0]["data"]["url"] image_size = Image.open(io.BytesIO(image)).size image_md = MarkdownMessage.image(image_url, image_size) - return await MarkdownMessage.send_md(image_md, bot, message_type=message_type, session_id=session_id, event=event, **kwargs) + return await MarkdownMessage.send_md(image_md, bot, message_type=message_type, session_id=session_id, + event=event, **kwargs) if data is None: data = await bot.send_msg( diff --git a/liteyuki/utils/satori_utils/__init__.py b/liteyuki/utils/satori_utils/__init__.py index df22a953..64f569e3 100644 --- a/liteyuki/utils/satori_utils/__init__.py +++ b/liteyuki/utils/satori_utils/__init__.py @@ -1 +1,3 @@ from .user_info import user_infos +from .get_message_type import get_message_type +from .event_tools import * diff --git a/liteyuki/utils/satori_utils/event_tools.py b/liteyuki/utils/satori_utils/event_tools.py new file mode 100644 index 00000000..04930f8c --- /dev/null +++ b/liteyuki/utils/satori_utils/event_tools.py @@ -0,0 +1,10 @@ +from nonebot.adapters import satori + +from liteyuki.utils.base.ly_typing import T_MessageEvent + + +def get_user_id(event: T_MessageEvent): + if isinstance(event, satori.event.Event): + return event.user.id + else: + return event.user_id diff --git a/liteyuki/utils/satori_utils/get_message_type.py b/liteyuki/utils/satori_utils/get_message_type.py new file mode 100644 index 00000000..df5ab604 --- /dev/null +++ b/liteyuki/utils/satori_utils/get_message_type.py @@ -0,0 +1,10 @@ +from nonebot.adapters import satori + +from liteyuki.utils.base.ly_typing import T_MessageEvent + + +def get_message_type(event: T_MessageEvent) -> str: + if isinstance(event, satori.event.Event): + return "private" if event.guild is None else "group" + else: + return event.message_type