summaryrefslogtreecommitdiff
path: root/ATRI/plugins/broadcast.py
blob: e034bd37656d5bc831465ed2382bea4c611b2ea3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import random
import asyncio

from nonebot.matcher import Matcher
from nonebot.params import CommandArg, ArgPlainText
from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, GroupMessageEvent

from ATRI.rule import to_bot
from ATRI.service import Service
from ATRI.utils import FileDealer
from ATRI.permission import ADMIN, MASTER
from ATRI.message import MessageBuilder


_BROADCAST_REPO_FORMAT = (
    MessageBuilder("广播报告:")
    .text("信息: {msg}")
    .text("预计推送群:{len_group} 个")
    .text("成功: {success_group} 失败: {failed_group}")
    .text("失败群列表:")
    .text("{failed_group_list}")
    .done()
)


async def __load_reject_list() -> list:
    path = plugin.get_path() / "rej_list.json"
    file = FileDealer(path)
    if not path.is_file():
        await file.write_json(list())
        return list()

    return list(file.json())


async def __store_reject_list(data: list) -> None:
    path = plugin.get_path() / "rej_list.json"
    file = FileDealer(path)
    if not path.is_file():
        await __load_reject_list()

    await file.write_json(data)


plugin = Service("广播").document("向 ATRI 所在的所有群发送信息").rule(to_bot())


caster = plugin.on_command("广播", "向 ATRI 所在的群发送信息", aliases={"/bc"}, permission=MASTER)


@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", prompt="需要咱广播啥呢")
async def _(bot: Bot, event: MessageEvent, msg: str = ArgPlainText("bc_msg")):
    group_list = await bot.get_group_list()
    if not group_list:
        await caster.finish("你还没让咱加入任何群呢...")

    await caster.send("正在推送...(每群延迟2-4s)")

    bc_msg = Message(f"来自维护者的消息:\n{msg}")

    success_group = list()
    failed_group = list()
    for i in group_list:
        group_id = i["group_id"]
        try:
            await bot.send_group_msg(group_id=group_id, message=bc_msg)
            success_group.append(group_id)
        except Exception:
            failed_group.append(group_id)

        await asyncio.sleep(random.randint(2, 4))

    result = _BROADCAST_REPO_FORMAT.format(
        msg=bc_msg,
        len_group=len(group_list),
        success_group=len(success_group),
        failed_group=len(failed_group),
        failed_group_list=", ".join(map(str, failed_group)),
    )
    await caster.finish(Message(result))


reject_bc = plugin.on_command("拒绝广播", "拒绝来自维护者的信息推送", permission=ADMIN)


@reject_bc.handle()
async def _(event: GroupMessageEvent):
    group_id = str(event.group_id)

    reject_list = await __load_reject_list()
    if group_id in reject_list:
        await reject_bc.finish("本群拒绝过啦~")
    else:
        reject_list.append(group_id)
        await __store_reject_list(reject_list)
        await reject_bc.finish("完成!")


accept_bc = plugin.on_command("接受广播", "接受来自维护者的信息推送", permission=ADMIN)


@accept_bc.handle()
async def _(event: GroupMessageEvent):
    group_id = str(event.group_id)

    reject_list = await __load_reject_list()
    if group_id in reject_list:
        reject_list.remove(group_id)
        await __store_reject_list(reject_list)
        await accept_bc.finish("完成!")
    else:
        await accept_bc.finish("本群未拒绝广播呢...")