diff options
author | Kyomotoi <[email protected]> | 2021-04-24 16:20:19 +0800 |
---|---|---|
committer | Kyomotoi <[email protected]> | 2021-04-24 16:20:19 +0800 |
commit | e01b1ed882a01d03b763e9b06b8b5d0608fc5f21 (patch) | |
tree | a2226a4c1c505f66d5226a1ddae02038ad92a046 /ATRI/plugins/manage | |
parent | 0678347859176671d5ff11852f339336a595e2f5 (diff) | |
download | ATRI-e01b1ed882a01d03b763e9b06b8b5d0608fc5f21.tar.gz ATRI-e01b1ed882a01d03b763e9b06b8b5d0608fc5f21.tar.bz2 ATRI-e01b1ed882a01d03b763e9b06b8b5d0608fc5f21.zip |
✨🔥🎨🐛♻️📝 更新
新增:开发工具中ub paste,再也不怕长消息了。
新增:错误处理两项`ReadFileError`、`FormatError`
修复:bot退群显示被自己踢出群
删除:Service部分内容
删除:hitokoto本地库,改用请求
优化:b站小程序抓取
重构:bot管理部分,对命令进行简化
Diffstat (limited to 'ATRI/plugins/manage')
-rw-r--r-- | ATRI/plugins/manage/__init__.py | 8 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/block.py | 143 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/broadcast.py | 72 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/debug.py | 131 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/dormant.py | 44 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/request.py | 121 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/service.py | 205 | ||||
-rw-r--r-- | ATRI/plugins/manage/modules/shutdown.py | 34 |
8 files changed, 758 insertions, 0 deletions
diff --git a/ATRI/plugins/manage/__init__.py b/ATRI/plugins/manage/__init__.py new file mode 100644 index 0000000..c60171e --- /dev/null +++ b/ATRI/plugins/manage/__init__.py @@ -0,0 +1,8 @@ +import nonebot as nb +from pathlib import Path + + +_sub_plugins = set() + +_sub_plugins |= nb.load_plugins( + str((Path(__file__).parent / 'modules').resolve())) diff --git a/ATRI/plugins/manage/modules/block.py b/ATRI/plugins/manage/modules/block.py new file mode 100644 index 0000000..65a6a86 --- /dev/null +++ b/ATRI/plugins/manage/modules/block.py @@ -0,0 +1,143 @@ +from nonebot.typing import T_State +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp import Bot, MessageEvent + +from ATRI.service import Service as sv + + +__doc__ = """ +封禁用户 +权限组:维护者 +用法: + 封禁用户 QQ号 +""" + +block_user = sv.on_command( + cmd="封禁用户", + docs=__doc__, + permission=SUPERUSER +) + +@block_user.args_parser # type: ignore +async def _block_user_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + cancel = ['算了', '罢了'] + if msg in cancel: + await block_user.finish('好吧...') + if not msg: + await block_user.reject('是谁呢?!GKD!') + else: + state['noob'] = msg + +@block_user.handle() +async def _block_user(bot: Bot, event: MessageEvent, state: T_State) -> None: + noob = state['noob'] + sv.BlockSystem.control_list(True, user=noob) + msg = f"用户[{noob}]已被封禁(;′⌒`)" + await block_user.finish(msg) + + +__doc__ = """ +解封用户 +权限组:维护者 +用法: + 解封用户 QQ号 +""" + +unblock_user = sv.on_command( + cmd="解封用户", + docs=__doc__, + permission=SUPERUSER +) + +@unblock_user.args_parser # type: ignore +async def _unblock_user_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + cancel = ['算了', '罢了'] + if msg in cancel: + await unblock_user.finish('好吧...') + if not msg: + await unblock_user.reject('要原谅谁呢...') + else: + state['forgive'] = msg + +@unblock_user.handle() +async def _unblock_user(bot: Bot, event: MessageEvent, state: T_State) -> None: + forgive = state['forgive'] + sv.BlockSystem.control_list(False, user=forgive) + msg = f"用户[{forgive}]已被解封ヾ(´・ω・`)ノ" + await unblock_user.finish(msg) + + +__doc__ = """ +封禁群 +权限组:维护者 +用法: + 封禁群 群号 +""" + +block_group = sv.on_command( + cmd="封禁群", + docs=__doc__, + permission=SUPERUSER +) + +@block_group.args_parser # type: ignore +async def _block_group_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + cancel = ['算了', '罢了'] + if msg in cancel: + await block_user.finish('好吧...') + if not msg: + await block_user.reject('是哪个群?!GKD!') + else: + state['noob_g'] = msg + +@block_group.handle() +async def _block_group(bot: Bot, event: MessageEvent, state: T_State) -> None: + noob_g = state['noob_g'] + sv.BlockSystem.control_list(True, group=noob_g) + msg = f"群[{noob_g}]已被封禁(;′⌒`)" + await block_user.finish(msg) + + +__doc__ = """ +解封群 +权限组:维护者 +用法: + 解封 群号 +""" + +unblock_group = sv.on_command( + cmd="解封群", + docs=__doc__, + permission=SUPERUSER +) + +@unblock_group.args_parser # type: ignore +async def _unblock_group_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + cancel = ['算了', '罢了'] + if msg in cancel: + await block_user.finish('好吧...') + if not msg: + await block_user.reject('要原谅哪个群呢...') + else: + state['forgive_g'] = msg + +@unblock_group.handle() +async def _unblock_group(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + forgive_g = state['forgive_g'] + sv.BlockSystem.control_list(False, group=forgive_g) + msg = f"群[{forgive_g}]已被解封ヾ(´・ω・`)ノ" + await unblock_user.finish(msg) diff --git a/ATRI/plugins/manage/modules/broadcast.py b/ATRI/plugins/manage/modules/broadcast.py new file mode 100644 index 0000000..5086fcf --- /dev/null +++ b/ATRI/plugins/manage/modules/broadcast.py @@ -0,0 +1,72 @@ +import asyncio +from random import randint + +from nonebot.typing import T_State +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp import Bot, MessageEvent + +from ATRI.service import Service as sv + + +__doc__ = """ +群发内容 +权限组:维护者 +用法: + 广播 内容 +""" + +broadcast = sv.on_command( + cmd="广播", + docs=__doc__, + permission=SUPERUSER +) + [email protected]_parser # type: ignore +async def _broadcast_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message) + quit_list = ['算了', '罢了', '取消'] + if msg in quit_list: + await broadcast.finish('好吧...') + if not msg: + await broadcast.reject('想群发啥呢0w0') + else: + state['msg'] = msg + +async def _broadcast(bot: Bot, event: MessageEvent, state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['msg'] = msg + [email protected]('msg', prompt='请告诉咱需要群发的内容~!') +async def _deal_broadcast(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = state['msg'] + group_list = await bot.get_group_list() + succ_list = [] + err_list = [] + + for group in group_list: + await asyncio.sleep(randint(0, 2)) + try: + await bot.send_group_msg(group_id=group["group_id"], + message=msg) + except BaseException: + err_list.append(group["group_id"]) + + msg0 = "" + for i in err_list: + msg0 += f" {i}\n" + + repo_msg = ( + f"推送消息:\n{msg}\n" + "————————\n" + f"总共:{len(group_list)}\n" + f"成功推送:{len(succ_list)}\n" + f"失败[{len(err_list)}]个:\n" + ) + msg0 + + await broadcast.finish(repo_msg) diff --git a/ATRI/plugins/manage/modules/debug.py b/ATRI/plugins/manage/modules/debug.py new file mode 100644 index 0000000..66a84cf --- /dev/null +++ b/ATRI/plugins/manage/modules/debug.py @@ -0,0 +1,131 @@ +from aiohttp import FormData + +from nonebot.typing import T_State +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp import Bot, MessageEvent +from nonebot.adapters.cqhttp.message import MessageSegment + +from ATRI.service import Service as sv +from ATRI.log import LOGGER_DIR, NOW_TIME +from ATRI.utils.file import open_file +from ATRI.utils.ub_paste import paste +from ATRI.exceptions import load_error + + +level_list = ['info', 'warning', 'error', 'debug'] + + +__doc__ = """ +获取控制台信息 +权限组:维护者 +用法: + 获取log 等级 行数 +示例: + 获取log info -20(最新20行) +""" + +get_console = sv.on_command( + cmd="获取log", + aliases={'获取LOG', '获取控制台', '获取控制台信息'}, + docs=__doc__, + permission=SUPERUSER +) + +@get_console.handle() +async def _get_console(bot: Bot, event: MessageEvent, state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['level'] = msg + +@get_console.got('level', prompt='需要获取的等级是?') +async def _got(bot: Bot, event: MessageEvent, state: T_State) -> None: + quit_list = ['算了', '罢了', '不了'] + if state['level'] in quit_list: + await get_console.finish('好吧...') + +@get_console.got('line', prompt='需要获取的行数是?') +async def _deal_get(bot: Bot, event: MessageEvent, state: T_State) -> None: + level = state['level'] + line = state['line'] + repo = str() + + path = LOGGER_DIR / f"{level}" / f"{NOW_TIME}.log" + logs = await open_file(path, 'readlines') + + try: + content = logs[int(line):] # type: ignore + repo = "\n".join(content).replace("[36mATRI[0m", "ATRI") + except IndexError: + await get_console.finish(f'行数错误...max: {len(logs)}') # type: ignore + + data = FormData() + data.add_field('poster', 'ATRI running log') + data.add_field('syntax', 'text') + data.add_field('expiration', 'day') + data.add_field('content', repo) + + msg0 = f"> {event.sender.nickname}\n" + msg0 = msg0 + f"详细请移步此处~\n{await paste(data)}" + await track_error.finish(msg0) + + +__doc__ = """ +追踪错误 +权限组:维护者 +用法: + track 追踪ID +""" + +track_error = sv.on_command( + cmd="track", + aliases={'追踪'}, + docs=__doc__, + permission=SUPERUSER +) + +@track_error.args_parser # type: ignore +async def _track_error_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + cancel = ['算了', '罢了'] + if msg in cancel: + await track_error.finish('好吧...') + if not msg: + await track_error.reject('欸?!要开始debug了吗,请提供追踪ID...Ծ‸Ծ') + else: + state['track'] = msg + +@track_error.handle() +async def _track_error(bot: Bot, event: MessageEvent, state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['track'] = msg + +@track_error.got('track', prompt='欸?!要开始debug了吗,请提供追踪ID...Ծ‸Ծ') +async def _deal_track(bot: Bot, event: MessageEvent, state: T_State) -> None: + track_id = state['track'] + data = dict() + + try: + data = load_error(track_id) + except BaseException: + await track_error.finish('未发现对应ID呢...(⇀‸↼‶)') + + msg = ( + f"ID: [{track_id}]\n" + f"Time: [{data['time']}]\n" + f"Prompt: [{data['prompt']}]\n" + "——————\n" + f"{data['content']}" + ) + + data = FormData() + data.add_field('poster', track_id) + data.add_field('syntax', 'text') + data.add_field('expiration', 'day') + data.add_field('content', msg) + + msg0 = f"> {event.sender.nickname}\n" + msg0 = msg0 + f"详细请移步此处~\n{await paste(data)}" + await track_error.finish(msg0) diff --git a/ATRI/plugins/manage/modules/dormant.py b/ATRI/plugins/manage/modules/dormant.py new file mode 100644 index 0000000..5274eaa --- /dev/null +++ b/ATRI/plugins/manage/modules/dormant.py @@ -0,0 +1,44 @@ +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp import Bot, MessageEvent + +from ATRI.service import Service as sv + + +__doc__ = """ +休眠,不处理任何信息 +权限组:维护者 +用法: + @ 休眠 +""" + +dormant_enabled = sv.on_command( + cmd='休眠', + docs=__doc__, + permission=SUPERUSER +) + +@dormant_enabled.handle() +async def _dormant_enabled(bot: Bot, event: MessageEvent) -> None: + sv.Dormant.control_dormant(True) + msg = "已进入休眠状态...期间咱不会回应任何人的消息哦..." + await dormant_enabled.finish(msg) + + +__doc__ = """ +苏醒,开始处理信息 +权限组:维护者 +用法: + @ 苏醒 +""" + +dormant_disabled = sv.on_command( + cmd='休眠', + docs=__doc__, + permission=SUPERUSER +) + +@dormant_disabled.handle() +async def _dormant_disabled(bot: Bot, event: MessageEvent) -> None: + sv.Dormant.control_dormant(False) + msg = "唔...早上好...——哇哈哈" + await dormant_disabled.finish(msg)
\ No newline at end of file diff --git a/ATRI/plugins/manage/modules/request.py b/ATRI/plugins/manage/modules/request.py new file mode 100644 index 0000000..c90ed66 --- /dev/null +++ b/ATRI/plugins/manage/modules/request.py @@ -0,0 +1,121 @@ +import re +import json +from pathlib import Path + +from nonebot.typing import T_State +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp import Bot, MessageEvent + +from ATRI.service import Service as sv +from ATRI.exceptions import ReadFileError, FormatError + + +ESSENTIAL_DIR = Path('.') / 'ATRI' / 'data' / 'database' / 'essential' + + +__doc__ = """ +查看好友/群申请列表 +权限组:维护者 +用法: + 查看申请列表 +""" + +req_list = sv.on_command( + cmd="申请列表", + docs=__doc__, + permission=SUPERUSER +) + +@req_list.handle() +async def _req_list(bot: Bot, event: MessageEvent, state: T_State) -> None: + path_f = ESSENTIAL_DIR / 'request_friend.json' + path_g = ESSENTIAL_DIR / 'request_group.json' + data_f, data_g = dict() + try: + data_f = json.loads(path_f.read_bytes()) + except ReadFileError: + msg_f = "[读取文件失败]" + try: + data_g = json.loads(path_g.read_bytes()) + except ReadFileError: + msg_g = "[读取文件失败]" + + msg_f = str() + for i in data_f.keys(): + msg_f += f"{i} | {data_f[i]['user_id']} | {data_f[i]['comment']}\n" + + msg_g = str() + for i in data_g.keys(): + msg_g += f"{i} | {data_g[i]['sub_type']} | {data_g[i]['user_id']} | {data_g[i]['comment']}\n" + + msg = ( + "好友/群申请列表如下:\n" + "· 好友:\n" + f"{msg_f}" + "· 群:\n" + f"{msg_g}" + ) + await req_list.finish(msg) + + +req_deal = sv.on_regex( + r'[同意|拒绝][好友|群]申请', + permission=SUPERUSER +) + +@req_deal.handle() +async def _req_deal(bot: Bot, event: MessageEvent, state: T_State) -> None: + msg = str(event.message).split(' ') + arg = re.findall(r'[同意|拒绝][好友|群]申请', msg[0]) + app = arg[0] + _type = arg[1] + + if not msg[1]: + await req_deal.finish(f'正确用法!速看\n{app}{_type}申请 (reqid)') + + path = ESSENTIAL_DIR / "request_group.json" + data_g = dict() + try: + data_g = json.loads(path.read_bytes()) + except FileExistsError: + await req_deal.finish("读取群数据失败,可能并没有请求...") + + reqid = msg[1] + if app == "同意": + if _type == "好友": + try: + await bot.set_friend_add_request(flag=reqid, + approve=True) + await req_deal.finish(f"完成~!已同意申请") + except FormatError: + await req_deal.finish('请检查输入的值是否正确——!') + elif _type == "群": + try: + await bot.set_group_add_request(flag=reqid, + sub_type=data_g[reqid]['sub_type'], + approve=True) + await req_deal.finish(f"完成~!已同意申请") + except FormatError: + await req_deal.finish('请检查输入的值是否正确——!') + else: + await req_deal.finish('请检查输入的值是否正确——!') + elif app == "拒绝": + if _type == "好友": + try: + await bot.set_friend_add_request(flag=reqid, + approve=False) + await req_deal.finish(f"完成~!已拒绝申请") + except FormatError: + await req_deal.finish('请检查输入的值是否正确——!') + elif _type == "群": + try: + await bot.set_group_add_request(flag=reqid, + sub_type=data_g[reqid]['sub_type'], + approve=False) + await req_deal.finish(f"完成~!已拒绝申请") + except FormatError: + await req_deal.finish('请检查输入的值是否正确——!') + else: + await req_deal.finish('请检查输入的值是否正确——!') + else: + await req_deal.finish('请检查输入的值是否正确——!') diff --git a/ATRI/plugins/manage/modules/service.py b/ATRI/plugins/manage/modules/service.py new file mode 100644 index 0000000..8bb7e9c --- /dev/null +++ b/ATRI/plugins/manage/modules/service.py @@ -0,0 +1,205 @@ +from nonebot.typing import T_State +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp.permission import GROUP_ADMIN, GROUP_OWNER +from nonebot.adapters.cqhttp import ( + Bot, + MessageEvent, + GroupMessageEvent, + PrivateMessageEvent +) + +from ATRI.service import Service as sv + + +__doc__ = """ +启用功能,针对单群 +权限组:维护者,群管理 +用法: + 启用 目标命令 +示例: + 启用 以图搜图 +""" + +cur_service_ena = sv.on_command( + cmd="启用功能", + docs=__doc__, + permission=SUPERUSER|GROUP_ADMIN|GROUP_OWNER +) + +@cur_service_ena.args_parser # type: ignore +async def _cur_ena_load(bot: Bot, + event: GroupMessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + quit_list = ['算了', '罢了', '取消'] + if msg in quit_list: + await cur_service_ena.finish('好吧...') + if not msg: + await cur_service_ena.reject('请告诉咱目标命令!') + else: + state['service_e'] = msg + +@cur_service_ena.handle() +async def _cur_ena(bot: Bot, + event: GroupMessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['service_e'] = msg + +@cur_service_ena.got('service_e', prompt='请告诉咱目标命令!') +async def _deal_cur_ena(bot: Bot, + event: GroupMessageEvent, + state: T_State) -> None: + cmd = state['service_e'] + group = str(event.group_id) + sv.control_service(cmd, False, True, group=group) + await cur_service_ena.finish(f'成功!本群已启用:{cmd}') + +@cur_service_ena.handle() +async def _refuse_cur_ena(bot: Bot, + event: PrivateMessageEvent, + state: T_State) -> None: + await cur_service_ena.finish('只能在群聊中决定哦...') + + +__doc__ = """ +禁用功能,针对单群 +权限组:维护者,群管理 +用法: + 禁用 目标命令 +示例: + 禁用 以图搜图 +""" + +cur_service_dis = sv.on_command( + cmd="禁用功能", + docs=__doc__, + permission=SUPERUSER|GROUP_ADMIN|GROUP_OWNER +) + +@cur_service_dis.args_parser # type: ignore +async def _cur_dis_load(bot: Bot, + event: GroupMessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + quit_list = ['算了', '罢了', '取消'] + if msg in quit_list: + await cur_service_dis.finish('好吧...') + if not msg: + await cur_service_dis.reject('请告诉咱目标命令!') + else: + state['service_d'] = msg + +@cur_service_dis.handle() +async def _cur_dis(bot: Bot, + event: GroupMessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['service_d'] = msg + +@cur_service_dis.got('service_d', prompt='请告诉咱目标命令!') +async def _deal_cur_dis(bot: Bot, + event: GroupMessageEvent, + state: T_State) -> None: + cmd = state['service_d'] + group = str(event.group_id) + sv.control_service(cmd, False, False, group=group) + await cur_service_dis.finish(f'成功!本群已禁用:{cmd}') + +@cur_service_dis.handle() +async def _refuse_cur_dis(bot: Bot, + event: PrivateMessageEvent, + state: T_State) -> None: + await cur_service_dis.finish('只能在群聊中决定哦...') + + +__doc__ = """ +全局启用功能 +权限组:维护者 +用法: + 全局启用 目标命令 +示例: + 全局启用 以图搜图 +""" + +glo_service_ena = sv.on_command( + cmd="全局启用", + docs=__doc__, + permission=SUPERUSER +) + +@glo_service_ena.args_parser # type: ignore +async def _glo_ena_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + quit_list = ['算了', '罢了', '取消'] + if msg in quit_list: + await glo_service_ena.finish('好吧...') + if not msg: + await glo_service_ena.reject('请告诉咱目标命令!') + else: + state['service_e_g'] = msg + +@glo_service_ena.handle() +async def _glo_ena(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['service_e_g'] = msg + +@glo_service_ena.got('service_e_g', prompt='请告诉咱目标命令!') +async def _deal_glo_ena(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + cmd = state['service_e_g'] + sv.control_service(cmd, True, True) + await glo_service_ena.finish(f'成功!已全局启用:{cmd}') + + +__doc__ = """ +全局禁用功能 +权限组:维护者 +用法: + 禁用启用 目标命令 +示例: + 禁用启用 以图搜图 +""" + +glo_service_dis = sv.on_command( + cmd="全局禁用", + docs=__doc__, + permission=SUPERUSER +) + +@glo_service_dis.args_parser # type: ignore +async def _glo_dis_load(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + quit_list = ['算了', '罢了', '取消'] + if msg in quit_list: + await glo_service_dis.finish('好吧...') + if not msg: + await glo_service_dis.reject('请告诉咱目标命令!') + else: + state['service_d_g'] = msg + +@glo_service_dis.handle() +async def _glo_dis(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state['service_d_g'] = msg + +@glo_service_dis.got('service_d_g', prompt='请告诉咱目标命令!') +async def _deal_glo_dis(bot: Bot, + event: MessageEvent, + state: T_State) -> None: + cmd = state['service_d_g'] + sv.control_service(cmd, True, False) + await glo_service_dis.finish(f'成功!已全局禁用:{cmd}') diff --git a/ATRI/plugins/manage/modules/shutdown.py b/ATRI/plugins/manage/modules/shutdown.py new file mode 100644 index 0000000..11b2b1b --- /dev/null +++ b/ATRI/plugins/manage/modules/shutdown.py @@ -0,0 +1,34 @@ +from nonebot.typing import T_State +from nonebot.permission import SUPERUSER +from nonebot.adapters.cqhttp import Bot, MessageEvent + +from ATRI.service import Service as sv + + +__doc__ = """ +紧急停机 +权限组:维护者 +用法: + @ 关机 +""" + +shutdown = sv.on_command( + cmd="关机", + docs=__doc__, + permission=SUPERUSER +) + +async def _shutdown(bot: Bot, event: MessageEvent, state: T_State) -> None: + msg = str(event.message).strip() + if msg: + state["msg"] = msg + [email protected]("msg", prompt="[WARNING]此项操作将强行终止bot运行,是否继续(y/n)") +async def __shutdown(bot: Bot, event: MessageEvent, state: T_State) -> None: + t = ['y', 'Y', '是'] + if state["msg"] in t: + await bot.send(event, "咱还会醒来的,一定") + exit(0) + else: + await shutdown.finish("再考虑下吧 ;w;") |