From 3e32ca3964ff8f40e0b491e87f153040f2348fd0 Mon Sep 17 00:00:00 2001 From: Kyomotoi Date: Thu, 3 Feb 2022 14:36:24 +0800 Subject: =?UTF-8?q?=F0=9F=94=96=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新记录请参考文档: atri.kyomotoi.moe/changelog/overview/ --- ATRI/plugins/broadcast.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 ATRI/plugins/broadcast.py (limited to 'ATRI/plugins/broadcast.py') diff --git a/ATRI/plugins/broadcast.py b/ATRI/plugins/broadcast.py new file mode 100644 index 0000000..0948e31 --- /dev/null +++ b/ATRI/plugins/broadcast.py @@ -0,0 +1,134 @@ +import os +import json +import random +import asyncio +from pathlib import Path + +from nonebot.matcher import Matcher +from nonebot.permission import SUPERUSER +from nonebot.params import CommandArg, ArgPlainText +from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent +from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN +from nonebot.adapters.onebot.v11 import GroupMessageEvent, PrivateMessageEvent + + +from ATRI.service import Service +from ATRI.rule import to_bot + + +BC_PATH = Path(".") / "data" / "database" / "broadcast" +os.makedirs(BC_PATH, exist_ok=True) + +_BROADCAST_BACK = """ +广播报告: +信息:{msg} +预计推送个数(群):{len_g} +成功:{su_g} +失败:{fl_g} +失败列表:{f_g} +""".strip() + + +class BroadCast(Service): + def __init__(self): + Service.__init__(self, "广播", "向bot所在的所有群发送信息", True, to_bot()) + + @staticmethod + def load_rej_list() -> list: + data = list() + path = BC_PATH / "rej_list.json" + if not path.is_file(): + with open(path, "w", encoding="utf-8") as w: + w.write(json.dumps(data)) + return data + + return json.loads(path.read_bytes()) + + @classmethod + def store_rej_list(cls, data: list): + path = BC_PATH/ "rej_list.json" + if not path.is_file(): + cls.load_rej_list() + + with open(path, "w", encoding="utf-8") as w: + w.write(json.dumps(data)) + + +caster = BroadCast().on_command("广播", "向bot所在的所有群发送信息,有防寄延迟", aliases={"/bc","bc"}, permission=SUPERUSER) + + +@caster.handle() +async def _(matcher: Matcher, args: Message = CommandArg()): + msg = args.extract_plain_text() + if msg: + matcher.set_arg("bc_msg", args) + + +@caster.got("bc_msg", "想要咱群发什么呢?") +async def _(bot: Bot, event: MessageEvent, s_msg: str = ArgPlainText("bc_msg")): + w_group = await bot.get_group_list() + + await bot.send(event, "正在推送...(每个群延迟1~3s)") + + w_msg = f" 来自维护者的信息:\n{s_msg}" + + su_g = list() + fl_g = list() + for i in w_group: + group_id = i["group_id"] + try: + await bot.send_group_msg(group_id=group_id, message=w_msg) + su_g.append(group_id) + except: + fl_g.append(group_id) + + await asyncio.sleep(random.randint(2, 3)) + + repo_msg = _BROADCAST_BACK.format( + msg=s_msg, + len_g=len(w_group), + su_g=su_g, + fl_g=fl_g, + f_g="、".join(map(str, fl_g)) + ) + await caster.finish(repo_msg) + + +rej_broadcast = BroadCast().on_command("拒绝广播", "拒绝来自开发者的广播推送", permission=GROUP_OWNER | GROUP_ADMIN) + + +@rej_broadcast.handle() +async def _(bot: Bot, event: GroupMessageEvent): + group_id = str(event.group_id) + + rej_g = BroadCast().load_rej_list() + if group_id in rej_g: + await rej_broadcast.finish("本群已在推送黑名单内辣!") + else: + rej_g.append(group_id) + BroadCast().store_rej_list(rej_g) + await rej_broadcast.finish("完成~!已将本群列入推送黑名单") + +@rej_broadcast.handle() +async def _(event: PrivateMessageEvent): + await rej_broadcast.finish("该功能仅在群聊中触发...") + + +acc_broadcast = BroadCast().on_command("接受广播", "接受来自开发者的广播推送", permission=GROUP_OWNER | GROUP_ADMIN) + + +@acc_broadcast.handle() +async def _(bot: Bot, event: GroupMessageEvent): + group_id = str(event.group_id) + + rej_g = BroadCast().load_rej_list() + if group_id in rej_g: + rej_g.remove(group_id) + BroadCast().store_rej_list(rej_g) + await rej_broadcast.finish("已将本群移除推送黑名单!") + else: + await rej_broadcast.finish("本群不在推送黑名单里呢...") + +@acc_broadcast.handle() +async def _(event: PrivateMessageEvent): + await rej_broadcast.finish("该功能仅在群聊中触发...") -- cgit v1.2.3