From 581aa7d6cccaa50d22cce60a4af5ce55aa4aed48 Mon Sep 17 00:00:00 2001 From: snowy Date: Sun, 24 Mar 2024 23:07:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20require()=E6=8F=92=E4=BB=B6=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- liteyuki/liteyuki_eventpush.py | 122 +++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 liteyuki/liteyuki_eventpush.py diff --git a/liteyuki/liteyuki_eventpush.py b/liteyuki/liteyuki_eventpush.py new file mode 100644 index 00000000..bb8b58bd --- /dev/null +++ b/liteyuki/liteyuki_eventpush.py @@ -0,0 +1,122 @@ +from typing import Optional + +import nonebot +from nonebot import on_message +from arclet.alconna import Arparma, Alconna, Args, Option, Subcommand, Arg +from nonebot.plugin import PluginMetadata +from nonebot_plugin_alconna import on_alconna +from liteyuki.utils.data import LiteModel +from liteyuki.utils.message import send_markdown +from liteyuki.utils.ly_typing import T_Bot, T_MessageEvent +from liteyuki.utils.data import Database + + +class Node(LiteModel): + bot_id: str + session_type: str + session_id: str + + def __str__(self): + return f"{self.bot_id}.{self.session_type}.{self.session_id}" + + +class Push(LiteModel): + source: Node + target: Node + inde: int + + +pushes_db = Database("data/pushes.ldb") +pushes_db.auto_migrate(Push, Node) + +alc = Alconna( + "lep", + Subcommand( + "add", + Args["source", str], + Args["target", str], + Option("bidirectional", Args["bidirectional", bool]) + ), + Subcommand( + "rm", + Args["index", int], + + ), + Subcommand( + "list", + ) +) + +add_push = on_alconna(alc) + + +@add_push.handle() +async def _(result: Arparma): + """bot_id.session_type.session_id""" + if result.subcommands.get("add"): + source = result.subcommands["add"].args.get("source") + target = result.subcommands["add"].args.get("target") + if source and target: + source = source.split(".") + target = target.split(".") + push1 = Push( + source=Node(bot_id=source[0], session_type=source[1], session_id=source[2]), + target=Node(bot_id=target[0], session_type=target[1], session_id=target[2]), + inde=len(pushes_db.all(Push, default=[])) + ) + pushes_db.upsert(push1) + + if result.subcommands["add"].args.get("bidirectional"): + push2 = Push( + source=Node(bot_id=target[0], session_type=target[1], session_id=target[2]), + target=Node(bot_id=source[0], session_type=source[1], session_id=source[2]), + inde=len(pushes_db.all(Push, default=[])) + ) + pushes_db.upsert(push2) + await add_push.finish("添加成功") + else: + await add_push.finish("参数缺失") + elif result.subcommands.get("rm"): + index = result.subcommands["rm"].args.get("index") + if index is not None: + try: + pushes_db.delete(Push, "inde = ?", index) + await add_push.finish("删除成功") + except IndexError: + await add_push.finish("索引错误") + else: + await add_push.finish("参数缺失") + elif result.subcommands.get("list"): + await add_push.finish( + "\n".join([f"{push.inde} {push.source.bot_id}.{push.source.session_type}.{push.source.session_id} -> " + f"{push.target.bot_id}.{push.target.session_type}.{push.target.session_id}" for i, push in + enumerate(pushes_db.all(Push, default=[]))])) + else: + await add_push.finish("参数错误") + + +@on_message(block=False).handle() +async def _(event: T_MessageEvent, bot: T_Bot): + for push in pushes_db.all(Push, default=[]): + if str(push.source) == f"{bot.self_id}.{event.message_type}.{event.user_id if event.message_type == 'private' else event.group_id}": + bot2 = nonebot.get_bot(push.target.bot_id) + msg_formatted = "" + for l in str(event.message).split("\n"): + msg_formatted += f"**{l.strip()}**\n" + push_message = ( + f"> From {event.sender.nickname}@{push.source.session_type}.{push.source.session_id}\n> Bot {bot.self_id}\n\n" + f"{msg_formatted}") + await send_markdown(push_message, bot2, message_type=push.target.session_type, session_id=push.target.session_id) + return + + +__author__ = "snowykami" +__plugin_meta__ = PluginMetadata( + name="轻雪事件推送", + description="事件推送插件,支持单向和双向推送,支持跨Bot推送", + usage="", + homepage="https://github.com/snowykami/LiteyukiBot", + extra={ + "liteyuki": True, + } +)