summaryrefslogtreecommitdiff
path: root/ATRI/plugins/manage
diff options
context:
space:
mode:
authorKyomotoi <[email protected]>2021-04-24 16:20:19 +0800
committerKyomotoi <[email protected]>2021-04-24 16:20:19 +0800
commite01b1ed882a01d03b763e9b06b8b5d0608fc5f21 (patch)
treea2226a4c1c505f66d5226a1ddae02038ad92a046 /ATRI/plugins/manage
parent0678347859176671d5ff11852f339336a595e2f5 (diff)
downloadATRI-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__.py8
-rw-r--r--ATRI/plugins/manage/modules/block.py143
-rw-r--r--ATRI/plugins/manage/modules/broadcast.py72
-rw-r--r--ATRI/plugins/manage/modules/debug.py131
-rw-r--r--ATRI/plugins/manage/modules/dormant.py44
-rw-r--r--ATRI/plugins/manage/modules/request.py121
-rw-r--r--ATRI/plugins/manage/modules/service.py205
-rw-r--r--ATRI/plugins/manage/modules/shutdown.py34
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("ATRI", "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;")