diff options
author | Kyomotoi <[email protected]> | 2022-02-03 14:36:24 +0800 |
---|---|---|
committer | Kyomotoi <[email protected]> | 2022-02-03 14:36:24 +0800 |
commit | 3e32ca3964ff8f40e0b491e87f153040f2348fd0 (patch) | |
tree | d04d19ba5a25f6f1f6a9c4f8c398d49eb252df3c /ATRI/plugins/broadcast.py | |
parent | f5a020d45f7294214bbcd488955b9c391d651a6d (diff) | |
download | ATRI-3e32ca3964ff8f40e0b491e87f153040f2348fd0.tar.gz ATRI-3e32ca3964ff8f40e0b491e87f153040f2348fd0.tar.bz2 ATRI-3e32ca3964ff8f40e0b491e87f153040f2348fd0.zip |
🔖 更新版本:
更新记录请参考文档: atri.kyomotoi.moe/changelog/overview/
Diffstat (limited to 'ATRI/plugins/broadcast.py')
-rw-r--r-- | ATRI/plugins/broadcast.py | 134 |
1 files changed, 134 insertions, 0 deletions
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) + + +async def _(matcher: Matcher, args: Message = CommandArg()): + msg = args.extract_plain_text() + if msg: + matcher.set_arg("bc_msg", args) + + [email protected]("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("该功能仅在群聊中触发...") |