diff options
43 files changed, 462 insertions, 560 deletions
diff --git a/ATRI/plugins/anime_search.py b/ATRI/plugins/anime_search.py index 08e9a0d..07c56c4 100644 --- a/ATRI/plugins/anime_search.py +++ b/ATRI/plugins/anime_search.py @@ -4,7 +4,6 @@ from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message, MessageSegme from nonebot.adapters.onebot.v11.helpers import extract_image_urls, Cooldown from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.utils import request, Translate from ATRI.exceptions import RequestError @@ -13,14 +12,11 @@ URL = "https://api.trace.moe/search?anilistInfo=true" _anime_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) -class Anime(Service): - def __init__(self): - Service.__init__( - self, "以图搜番", "通过一张图片搜索你需要的番!据说里*也可以", rule=is_in_service("以图搜番") - ) +class Anime: + def __init__(self, img: str): + self.img = img - @staticmethod - async def _request(url: str) -> dict: + async def _request(self, url: str) -> dict: try: resp = await request.get(url) image_bytes = resp.read() @@ -32,9 +28,8 @@ class Anime(Service): result = res.json() return result - @classmethod - async def search(cls, url: str) -> str: - data = await cls._request(url) + async def do_search(self) -> str: + data = await self._request(self.img) try: data = data["result"] except Exception: @@ -78,7 +73,10 @@ class Anime(Service): return msg0 -anime_search = Anime().on_command("以图搜番", "发送一张图以搜索可能的番剧") +ani = Service("以图搜番").document("通过一张图片搜索你需要的番!据说里*也可以") + + +anime_search = ani.on_command("以图搜番", "发送一张图以搜索可能的番剧") @anime_search.got("anime_pic", "图呢?", [Cooldown(5, prompt=_anime_flmt_notice)]) @@ -89,6 +87,6 @@ async def _deal_sear(bot: Bot, event: MessageEvent): await anime_search.finish("请发送图片而不是其它东西!!") await bot.send(event, "别急,在找了") - a = await Anime().search(img[0]) + a = await Anime(img[0]).do_search() result = f"> {MessageSegment.at(user_id)}\n" + a await anime_search.finish(Message(result)) diff --git a/ATRI/plugins/anti_effort/__init__.py b/ATRI/plugins/anti_effort/__init__.py index 52fea9c..aa38f78 100644 --- a/ATRI/plugins/anti_effort/__init__.py +++ b/ATRI/plugins/anti_effort/__init__.py @@ -5,7 +5,6 @@ from random import choice from nonebot import get_bot from nonebot.params import ArgPlainText -from nonebot.permission import SUPERUSER from nonebot.adapters.onebot.v11 import ( Message, MessageEvent, @@ -14,12 +13,17 @@ from nonebot.adapters.onebot.v11 import ( ) from nonebot.adapters.onebot.v11.helpers import Cooldown +from ATRI.service import Service from ATRI.message import MessageBuilder +from ATRI.permission import MASTER from ATRI.utils.apscheduler import scheduler from .data_source import AntiEffort, PLUGIN_DIR +plugin = Service("谁是卷王").document("谁是卷王!").main_cmd("/ae") +ae = AntiEffort() + _lmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~", "呜呜...别急"]) _GET_URL_MSG = ( @@ -32,7 +36,7 @@ _GET_URL_MSG = ( ) -add_user = AntiEffort().on_command("!我也要卷", "加入卷王统计榜") +add_user = plugin.on_command("!我也要卷", "加入卷王统计榜") @add_user.got( @@ -51,13 +55,13 @@ async def _deal_add_user( user_id = event.user_id aititude = ["y", "Y", "是", "希望", "同意"] if to_global in aititude: - await AntiEffort().add_user(int(), user_id, user_nickname, url) + await ae.add_user(int(), user_id, user_nickname, url) - result = await AntiEffort().add_user(group_id, user_id, user_nickname, url) + result = await ae.add_user(group_id, user_id, user_nickname, url) await add_user.finish(result) -join_global_rank = AntiEffort().on_command("!参加公共卷", "加入公共卷王榜") +join_global_rank = plugin.on_command("!参加公共卷", "加入公共卷王榜") @join_global_rank.handle() @@ -65,14 +69,14 @@ async def _join_global_rank(event: GroupMessageEvent): group_id = event.group_id user_id = event.user_id - raw_data = AntiEffort().get_data(group_id) + raw_data = ae.get_data(group_id) if raw_data: data = raw_data["data"] for i in data: if i["user_id"] == user_id: user_nickname = i["user_nickname"] url = i["waka_url"] - await AntiEffort().add_user(int(), user_id, user_nickname, url) + await ae.add_user(int(), user_id, user_nickname, url) await join_global_rank.finish("完成~!") @@ -87,11 +91,11 @@ async def _( ): user_id = event.user_id - result = await AntiEffort().add_user(int(), user_id, user_nickname, url) + result = await ae.add_user(int(), user_id, user_nickname, url) await join_global_rank.finish(result) -user_leave = AntiEffort().on_command("!我不卷了", "退出卷王统计榜") +user_leave = plugin.on_command("!我不卷了", "退出卷王统计榜") @user_leave.handle([Cooldown(60, prompt=_lmt_notice)]) @@ -99,12 +103,12 @@ async def _user_leave(event: GroupMessageEvent): group_id = event.group_id user_id = event.user_id - AntiEffort().del_user(int(), user_id) - result = AntiEffort().del_user(group_id, user_id) + ae.del_user(int(), user_id) + result = ae.del_user(group_id, user_id) await user_leave.finish(result) -check_rank_today = AntiEffort().on_command("今日卷王", "查看今日卷王榜", aliases={"日卷王"}) +check_rank_today = plugin.on_command("今日卷王", "查看今日卷王榜", aliases={"日卷王"}) @check_rank_today.handle([Cooldown(15, prompt=_lmt_notice)]) @@ -113,15 +117,15 @@ async def _check_rank_today(event: GroupMessageEvent): group_id = event.group_id user_id = event.user_id - raw_data = AntiEffort().get_data(group_id) + raw_data = ae.get_data(group_id) if not raw_data: await check_rank_today.finish("贵群还没有人加入卷王统计榜!") - result = AntiEffort().gen_rank(raw_data, user_id, "today") + result = ae.gen_rank(raw_data, user_id, "today") await check_rank_today.finish(result) -check_rank_recent_week = AntiEffort().on_command("周卷王", "查看近一周卷王榜") +check_rank_recent_week = plugin.on_command("周卷王", "查看近一周卷王榜") @check_rank_recent_week.handle([Cooldown(15, prompt=_lmt_notice)]) @@ -130,15 +134,15 @@ async def _check_rank_recent_week(event: GroupMessageEvent): group_id = event.group_id user_id = event.user_id - raw_data = AntiEffort().get_data(group_id) + raw_data = ae.get_data(group_id) if not raw_data: await check_rank_recent_week.finish("贵群还没有人加入卷王统计榜!") - result = AntiEffort().gen_rank(raw_data, user_id, "recent_week") + result = ae.gen_rank(raw_data, user_id, "recent_week") await check_rank_recent_week.finish(result) -check_rank_global_today = AntiEffort().on_command("公共卷王", "查看今日公共卷王榜") +check_rank_global_today = plugin.on_command("公共卷王", "查看今日公共卷王榜") @check_rank_global_today.handle([Cooldown(15, prompt=_lmt_notice)]) @@ -146,15 +150,15 @@ async def _check_rank_global_today(event: MessageEvent): await check_rank_global_today.send("别急!正在统计!") user_id = event.user_id - raw_data = AntiEffort().get_data(int()) + raw_data = ae.get_data(int()) if not raw_data: await check_rank_global_today.finish("还没有人加入公共卷王统计榜!") - result = AntiEffort().gen_rank(raw_data, user_id, "global_today") + result = ae.gen_rank(raw_data, user_id, "global_today") await check_rank_global_today.finish(result) -check_rank_global_recent_week = AntiEffort().on_command("公共周卷王", "查看近一周公共卷王榜") +check_rank_global_recent_week = plugin.on_command("公共周卷王", "查看近一周公共卷王榜") @check_rank_global_recent_week.handle([Cooldown(15, prompt=_lmt_notice)]) @@ -162,32 +166,32 @@ async def _check_rank_global_recent_week(event: MessageEvent): await check_rank_global_recent_week.send("别急!正在统计!") user_id = event.user_id - raw_data = AntiEffort().get_data(int()) + raw_data = ae.get_data(int()) if not raw_data: await check_rank_global_recent_week.finish("还没有人加入公共卷王统计榜!") - result = AntiEffort().gen_rank(raw_data, user_id, "global_recent_week") + result = ae.gen_rank(raw_data, user_id, "global_recent_week") await check_rank_global_recent_week.finish(result) -update_data = AntiEffort().cmd_as_group("update", "更新卷王统计榜数据", permission=SUPERUSER) +update_data = plugin.cmd_as_group("update", "更新卷王统计榜数据", permission=MASTER) @update_data.handle() async def _update_data(event: MessageEvent): - await AntiEffort().update_data() + await ae.update_data() await update_data.finish("更新完成~!") @scheduler.scheduled_job("interval", name="卷王数据更新", minutes=15, misfire_grace_time=15) # type: ignore async def _(): - await AntiEffort().update_data() + await ae.update_data() @scheduler.scheduled_job("cron", name="卷王数据存储", hour=0, misfire_grace_time=30) # type: ignore async def _(): - await AntiEffort().update_data() - AntiEffort().store_user_data_recent() + await ae.update_data() + ae.store_user_data_recent() @scheduler.scheduled_job("cron", name="对昨日卷王进行颁奖", hour=8, misfire_grace_time=30) # type: ignore @@ -226,7 +230,7 @@ async def _(): winner_nickname = winner["user_nickname"] coding_time = float(winner["recent_count"]) - img = await AntiEffort().gen_img(winner_id, winner_nickname, coding_time) + img = await ae.gen_img(winner_id, winner_nickname, coding_time) result = MessageSegment.image(img) try: diff --git a/ATRI/plugins/anti_effort/data_source.py b/ATRI/plugins/anti_effort/data_source.py index 02bdb82..2d04823 100644 --- a/ATRI/plugins/anti_effort/data_source.py +++ b/ATRI/plugins/anti_effort/data_source.py @@ -6,8 +6,7 @@ from datetime import datetime from tabulate import tabulate from ATRI import driver -from ATRI.service import Service, ServiceTools -from ATRI.rule import is_in_service +from ATRI.service import ServiceTools from ATRI.utils import request from ATRI.log import log @@ -22,12 +21,7 @@ PLUGIN_DIR = Path(".") / "data" / "plugins" / "anti_effort" PLUGIN_DIR.mkdir(parents=True, exist_ok=True) -class AntiEffort(Service): - def __init__(self): - Service.__init__( - self, "谁是卷王", "谁是卷王!", rule=is_in_service("谁是卷王"), main_cmd="/ae" - ) - +class AntiEffort: def get_enabled_group(self) -> list: groups = list() diff --git a/ATRI/plugins/applet/__init__.py b/ATRI/plugins/applet/__init__.py index 9c4d0ce..5949e34 100644 --- a/ATRI/plugins/applet/__init__.py +++ b/ATRI/plugins/applet/__init__.py @@ -1,10 +1,15 @@ from nonebot.adapters.onebot.v11 import MessageEvent from nonebot.adapters.onebot.v11.helpers import Cooldown +from ATRI.service import Service + from .data_source import Applet -bili_applet = Applet().on_message("b站小程序检测", "B站小程序爪巴", priority=5, block=False) +plugin = Service("小程序处理").document("啥b腾讯小程序给👴爪巴\n目前只整了b站的") + + +bili_applet = plugin.on_message("b站小程序检测", "B站小程序爪巴", priority=5, block=False) @bili_applet.handle([Cooldown(3)]) diff --git a/ATRI/plugins/applet/data_source.py b/ATRI/plugins/applet/data_source.py index e94c0d9..296c337 100644 --- a/ATRI/plugins/applet/data_source.py +++ b/ATRI/plugins/applet/data_source.py @@ -1,8 +1,6 @@ import re -from ATRI.service import Service from ATRI.utils import request -from ATRI.rule import is_in_service URL = "https://api.kyomotoi.moe/api/bilibili/v3/video_info?aid=" @@ -16,12 +14,7 @@ xor = 177451812 add = 8728348608 -class Applet(Service): - def __init__(self): - Service.__init__( - self, "小程序处理", "啥b腾讯小程序给👴爪巴\n目前只整了b站的", rule=is_in_service("小程序处理") - ) - +class Applet: @staticmethod def _bv_dec(x) -> str: r = 0 diff --git a/ATRI/plugins/auto_tietie.py b/ATRI/plugins/auto_tietie.py index 61f1370..177c2a9 100644 --- a/ATRI/plugins/auto_tietie.py +++ b/ATRI/plugins/auto_tietie.py @@ -1,12 +1,11 @@ from random import choice -from nonebot.permission import SUPERUSER from nonebot.adapters.onebot.v11 import MessageEvent from nonebot.adapters.onebot.v11 import MessageSegment from nonebot.adapters.onebot.v11.helpers import Cooldown from ATRI.service import Service -from ATRI.rule import is_in_service +from ATRI.permission import MASTER _is_tietie = True @@ -29,7 +28,12 @@ _tietie_wd = choice( ] ) -tt = Service("贴贴", "全自动贴贴机", True, is_in_service("贴贴"), permission=SUPERUSER) +tt = ( + Service("贴贴") + .document("全自动贴贴机") + .only_admin(True) + .permission(MASTER) +) auto_tietie = tt.on_message( @@ -44,7 +48,7 @@ async def _(event: MessageEvent): user_id = event.get_user_id() at = MessageSegment.at(user_id) - result = at + _tietie_wd + result = at + _tietie_wd # type: ignore await auto_tietie.finish(result) diff --git a/ATRI/plugins/bilibili_dynamic/__init__.py b/ATRI/plugins/bilibili_dynamic/__init__.py index ec62540..8ea5740 100644 --- a/ATRI/plugins/bilibili_dynamic/__init__.py +++ b/ATRI/plugins/bilibili_dynamic/__init__.py @@ -11,10 +11,12 @@ from apscheduler.triggers.interval import IntervalTrigger from nonebot import get_bot from nonebot.matcher import Matcher from nonebot.params import CommandArg, ArgPlainText -from nonebot.permission import Permission, SUPERUSER +from nonebot.permission import Permission from nonebot.adapters.onebot.v11 import Message, MessageSegment, GroupMessageEvent from ATRI.log import log +from ATRI.service import Service +from ATRI.permission import MASTER, ADMIN from ATRI.utils import timestamp2datetime from ATRI.utils.apscheduler import scheduler from ATRI.database import BilibiliSubscription @@ -24,8 +26,11 @@ from .data_source import BilibiliDynamicSubscriptor _CONTENT_LIMIT: int = 0 +plugin = Service("b站动态订阅").document("b站动态订阅助手~").permission(ADMIN).main_cmd("/bd") +sub = BilibiliDynamicSubscriptor() -add_sub = BilibiliDynamicSubscriptor().cmd_as_group("add", "添加b站up主订阅") + +add_sub = plugin.cmd_as_group("add", "添加b站up主订阅") @add_sub.handle() @@ -46,17 +51,16 @@ async def _bd_deal_add_sub( __id = int(_id) group_id = event.group_id - result = await BilibiliDynamicSubscriptor().add_sub(__id, group_id) + result = await sub.add_sub(__id, group_id) await add_sub.finish(result) -del_sub = BilibiliDynamicSubscriptor().cmd_as_group("del", "删除b站up主订阅") +del_sub = plugin.cmd_as_group("del", "删除b站up主订阅") @del_sub.handle() async def _bd_del_sub(event: GroupMessageEvent): group_id = event.group_id - sub = BilibiliDynamicSubscriptor() query_result = await sub.get_sub_list(group_id=group_id) if not query_result: @@ -84,19 +88,16 @@ async def _bd_deal_del_sub( __id = int(_id) group_id = event.group_id - result = await BilibiliDynamicSubscriptor().del_sub(__id, group_id) + result = await sub.del_sub(__id, group_id) await del_sub.finish(result) -get_sub_list = BilibiliDynamicSubscriptor().cmd_as_group( - "list", "获取b站up主订阅列表", permission=Permission() -) +get_sub_list = plugin.cmd_as_group("list", "获取b站up主订阅列表", permission=Permission()) @get_sub_list.handle() async def _bd_get_sub_list(event: GroupMessageEvent): group_id = event.group_id - sub = BilibiliDynamicSubscriptor() query_result = await sub.get_sub_list(group_id=group_id) if not query_result: @@ -117,9 +118,7 @@ async def _bd_get_sub_list(event: GroupMessageEvent): await get_sub_list.finish(output) -limit_content = BilibiliDynamicSubscriptor().cmd_as_group( - "limit", "设置订阅内容字数限制", permission=SUPERUSER -) +limit_content = plugin.cmd_as_group("limit", "设置订阅内容字数限制", permission=MASTER) @limit_content.handle() @@ -147,8 +146,7 @@ tq = asyncio.Queue() class BilibiliDynamicChecker(BaseTrigger): def get_next_fire_time(self, previous_fire_time, now): - sub = BilibiliDynamicSubscriptor() - conf = sub.load_service("b站动态订阅") + conf = plugin.load_service("b站动态订阅") if conf.get("enabled"): return now @@ -159,8 +157,7 @@ class BilibiliDynamicChecker(BaseTrigger): max_instances=3, # type: ignore misfire_grace_time=60, # type: ignore ) -async def _check_bd(): - sub = BilibiliDynamicSubscriptor() +async def _(): try: all_dy = await sub.get_all_subs() except Exception: diff --git a/ATRI/plugins/bilibili_dynamic/data_source.py b/ATRI/plugins/bilibili_dynamic/data_source.py index 8f1c6f9..26ebf50 100644 --- a/ATRI/plugins/bilibili_dynamic/data_source.py +++ b/ATRI/plugins/bilibili_dynamic/data_source.py @@ -2,11 +2,6 @@ import json from datetime import datetime from operator import itemgetter -from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN - -from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.message import MessageBuilder from ATRI.utils import timestamp2datetime from ATRI.exceptions import BilibiliDynamicError @@ -24,17 +19,7 @@ _OUTPUT_FORMAT = ( ) -class BilibiliDynamicSubscriptor(Service): - def __init__(self): - Service.__init__( - self, - "b站动态订阅", - "b站动态订阅助手~", - rule=is_in_service("b站动态订阅"), - permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN, - main_cmd="/bd", - ) - +class BilibiliDynamicSubscriptor: async def __add_sub(self, uid: int, group_id: int): try: async with DB() as db: diff --git a/ATRI/plugins/broadcast.py b/ATRI/plugins/broadcast.py index 83f1d23..180a0bb 100644 --- a/ATRI/plugins/broadcast.py +++ b/ATRI/plugins/broadcast.py @@ -4,14 +4,13 @@ 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.rule import to_bot from ATRI.service import Service +from ATRI.permission import MASTER, GROUP_ADMIN from ATRI.message import MessageBuilder @@ -28,10 +27,7 @@ _BROADCAST_REPO = ( ) -class BroadCast(Service): - def __init__(self): - Service.__init__(self, "广播", "向bot所在的所有群发送信息", True, to_bot()) - +class BroadCast: @staticmethod def load_rej_list() -> list: data = list() @@ -53,8 +49,11 @@ class BroadCast(Service): w.write(json.dumps(data)) -caster = BroadCast().on_command( - "广播", "向bot所在的所有群发送信息,有防寄延迟", aliases={"bc"}, permission=SUPERUSER +bc = Service("广播").document("向bot所在的所有群发送信息").only_admin(True).rule(to_bot()) + + +caster = bc.on_command( + "广播", "向bot所在的所有群发送信息,有防寄延迟", aliases={"bc"}, permission=MASTER ) @@ -95,9 +94,7 @@ async def _(bot: Bot, event: MessageEvent, s_msg: str = ArgPlainText("bc_msg")): await caster.finish(Message(repo_msg)) -rej_broadcast = BroadCast().on_command( - "拒绝广播", "拒绝来自开发者的广播推送", permission=GROUP_OWNER | GROUP_ADMIN -) +rej_broadcast = bc.on_command("拒绝广播", "拒绝来自开发者的广播推送", permission=GROUP_ADMIN) @rej_broadcast.handle() @@ -118,9 +115,7 @@ async def _(event: PrivateMessageEvent): await rej_broadcast.finish("该功能仅在群聊中触发...") -acc_broadcast = BroadCast().on_command( - "接受广播", "接受来自开发者的广播推送", permission=GROUP_OWNER | GROUP_ADMIN -) +acc_broadcast = bc.on_command("接受广播", "接受来自开发者的广播推送", permission=GROUP_ADMIN) @acc_broadcast.handle() diff --git a/ATRI/plugins/code_runner/__init__.py b/ATRI/plugins/code_runner/__init__.py index 77240ec..26fcce5 100644 --- a/ATRI/plugins/code_runner/__init__.py +++ b/ATRI/plugins/code_runner/__init__.py @@ -5,13 +5,17 @@ from nonebot.params import CommandArg, ArgPlainText from nonebot.adapters.onebot.v11 import MessageEvent, Message, MessageSegment, unescape from nonebot.adapters.onebot.v11.helpers import Cooldown +from ATRI.service import Service + from .data_source import CodeRunner +plugin = Service("在线跑代码").document("在线运行代码").main_cmd("/code") + _flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) -code_runner = CodeRunner().on_command("/code", "在线运行一段代码,获取帮助:/code.help") +code_runner = plugin.on_command("/code", "在线运行一段代码,获取帮助:/code.help") @code_runner.handle([Cooldown(5, prompt=_flmt_notice)]) @@ -37,7 +41,7 @@ async def _(event: MessageEvent, opt: str = ArgPlainText("opt")): await code_runner.finish(Message(content)) -code_runner_helper = CodeRunner().cmd_as_group("help", "使用说明") +code_runner_helper = plugin.cmd_as_group("help", "使用说明") @code_runner_helper.handle() @@ -45,7 +49,7 @@ async def _(): await code_runner_helper.finish(CodeRunner().help()) -code_supp_list = CodeRunner().cmd_as_group("list", "查看支持的语言") +code_supp_list = plugin.cmd_as_group("list", "查看支持的语言") @code_supp_list.handle() diff --git a/ATRI/plugins/code_runner/data_source.py b/ATRI/plugins/code_runner/data_source.py index d5df230..8b4ffca 100644 --- a/ATRI/plugins/code_runner/data_source.py +++ b/ATRI/plugins/code_runner/data_source.py @@ -1,6 +1,5 @@ -from ATRI.rule import is_in_service -from ATRI.service import Service from ATRI.utils import request +from ATRI.message import MessageBuilder from ATRI.exceptions import RequestError @@ -34,20 +33,16 @@ SUPPORTED_LANGUAGES = { } -class CodeRunner(Service): - def __init__(self): - Service.__init__( - self, "在线跑代码", "在线跑代码", rule=is_in_service("在线跑代码"), main_cmd="/code" - ) - +class CodeRunner: @staticmethod def help() -> str: return ( - "/code {语言}\n" - "{代码}\n" - "For example:\n" - "/code python\n" - "print('hello world')" + MessageBuilder("/code {语言}") + .text("{代码}") + .text("For example:") + .text("/code python") + .text("print('hello world')") + .done() ) @staticmethod diff --git a/ATRI/plugins/console/__init__.py b/ATRI/plugins/console/__init__.py index 5836b31..b09cb29 100644 --- a/ATRI/plugins/console/__init__.py +++ b/ATRI/plugins/console/__init__.py @@ -6,6 +6,8 @@ from nonebot.adapters.onebot.v11 import PrivateMessageEvent, GroupMessageEvent from ATRI import conf from ATRI.log import log +from ATRI.service import Service +from ATRI.permission import MASTER from ATRI.message import MessageBuilder from ATRI.exceptions import WriteFileError from ATRI.utils.apscheduler import scheduler @@ -17,13 +19,22 @@ from .models import AuthData __AUTH_FILE_PATH = CONSOLE_DIR / "data.json" +plugin = ( + Service("控制台") + .document("前端管理页面") + .only_admin(True) + .permission(MASTER) + .main_cmd("/con") +) + + def __del_auth_key(): with open(__AUTH_FILE_PATH, "w", encoding="utf-8") as w: w.write(json.dumps({})) log.warning("控制台验证密钥已过期") -gen_console_key = Console().cmd_as_group("auth", "获取进入网页后台的凭证") +gen_console_key = plugin.cmd_as_group("auth", "获取进入网页后台的凭证") @gen_console_key.got("is_pub_n", "咱的运行环境是否有公网(y/n)") @@ -41,19 +52,22 @@ async def _(event: PrivateMessageEvent, is_pub_n: str = ArgPlainText("is_pub_n") with open(__AUTH_FILE_PATH, "w", encoding="utf-8") as w: w.write(json.dumps(dict())) else: - now_time = datetime.now().timestamp() - data = json.loads(__AUTH_FILE_PATH.read_bytes())["data"] - if now_time < data["dead_time"] and data.get("dead_time"): - raw_last_time = data["dead_time"] - now_time - last_time = datetime.fromtimestamp(raw_last_time).minute - await gen_console_key.finish( - MessageBuilder("之前生成的密钥还在有效时间内奥") - .text(f"Token: {data['token']}") - .text(f"剩余有效时间: {last_time} min") - ) - else: - with open(__AUTH_FILE_PATH, "w", encoding="utf-8") as w: - w.write(json.dumps(dict())) + raw_data = json.loads(__AUTH_FILE_PATH.read_bytes()) + + data = raw_data.get("data") + if data: + now_time = datetime.now().timestamp() + if now_time < data["dead_time"] and data.get("dead_time"): + raw_last_time = data["dead_time"] - now_time + last_time = datetime.fromtimestamp(raw_last_time).minute + await gen_console_key.finish( + MessageBuilder("之前生成的密钥还在有效时间内奥") + .text(f"Token: {data['token']}") + .text(f"剩余有效时间: {last_time} min") + ) + else: + with open(__AUTH_FILE_PATH, "w", encoding="utf-8") as w: + w.write(json.dumps(dict())) if is_pub_n != "y": host = str(await Console().get_host_ip(False)) @@ -80,8 +94,8 @@ async def _(event: PrivateMessageEvent, is_pub_n: str = ArgPlainText("is_pub_n") scheduler.add_job( __del_auth_key, name="清除后台验证凭证", - next_run_time=dead_time, - misfire_grace_time=15, + next_run_time=dead_time, # type: ignore + misfire_grace_time=15, # type: ignore ) await gen_console_key.finish(msg) @@ -92,7 +106,7 @@ async def _(event: GroupMessageEvent): await gen_console_key.finish("请私戳咱获取(") -del_console_key = Console().cmd_as_group("del", "销毁进入网页后台的凭证") +del_console_key = plugin.cmd_as_group("del", "销毁进入网页后台的凭证") @del_console_key.got("is_sure_d", "...你确定吗(y/n)") diff --git a/ATRI/plugins/console/data_source.py b/ATRI/plugins/console/data_source.py index 79a15b8..b4a28cb 100644 --- a/ATRI/plugins/console/data_source.py +++ b/ATRI/plugins/console/data_source.py @@ -5,11 +5,7 @@ import zipfile from random import sample from pathlib import Path -from nonebot.permission import SUPERUSER - -from ATRI.service import Service from ATRI.utils import request -from ATRI.rule import is_in_service from ATRI.exceptions import WriteFileError from ATRI.log import log @@ -18,18 +14,7 @@ CONSOLE_DIR = Path(".") / "data" / "plugins" / "console" CONSOLE_DIR.mkdir(parents=True, exist_ok=True) -class Console(Service): - def __init__(self): - Service.__init__( - self, - "控制台", - "前端管理页面", - True, - is_in_service("控制台"), - main_cmd="/con", - permission=SUPERUSER, - ) - +class Console: @staticmethod async def get_host_ip(is_pub: bool): if is_pub: diff --git a/ATRI/plugins/essential.py b/ATRI/plugins/essential.py index c9b48a7..08c2ec1 100644 --- a/ATRI/plugins/essential.py +++ b/ATRI/plugins/essential.py @@ -8,7 +8,6 @@ from pathlib import Path from typing import Union import nonebot -from nonebot.permission import SUPERUSER from nonebot.message import run_preprocessor from nonebot.exception import IgnoredException from nonebot.adapters.onebot.v11 import ( @@ -32,6 +31,7 @@ from ATRI.service import Service from ATRI.log import log from ATRI.utils import MessageChecker from ATRI.utils.apscheduler import scheduler +from ATRI.permission import MASTER bots = nonebot.get_bots() @@ -93,12 +93,10 @@ class GroupRequestInfo(BaseModel): is_approve: bool -class Essential(Service): - def __init__(self): - Service.__init__(self, "基础部件", "对bot基础/必须请求进行处理") +ess = Service("基础部件").document("对bot基础/必须请求进行处理") -friend_add_event = Essential().on_request("好友添加", "好友添加检测") +friend_add_event = ess.on_request("好友添加", "好友添加检测") @friend_add_event.handle() @@ -144,7 +142,7 @@ async def _friend_add(bot: Bot, event: FriendRequestEvent): await bot.send_private_msg(user_id=superuser, message=repo) -group_invite_event = Essential().on_request("邀请入群", "被邀请入群检测") +group_invite_event = ess.on_request("邀请入群", "被邀请入群检测") @group_invite_event.handle() @@ -190,7 +188,7 @@ async def _group_invite(bot: Bot, event: GroupRequestEvent): await bot.send_private_msg(user_id=superuser, message=repo) -group_member_event = Essential().on_notice("群成员变动", "群成员变动检测") +group_member_event = ess.on_notice("群成员变动", "群成员变动检测") @group_member_event.handle() @@ -206,7 +204,7 @@ async def _group_member_left(bot: Bot, event: GroupDecreaseNoticeEvent): await group_member_event.finish("呜——有人跑了...") -group_admin_event = Essential().on_notice("群管理变动", "群管理变动检测") +group_admin_event = ess.on_notice("群管理变动", "群管理变动检测") @group_admin_event.handle() @@ -220,7 +218,7 @@ async def _group_admin_event(bot: Bot, event: GroupAdminNoticeEvent): ) -group_ban_event = Essential().on_notice("群禁言变动", "群禁言变动检测") +group_ban_event = ess.on_notice("群禁言变动", "群禁言变动检测") @group_ban_event.handle() @@ -245,7 +243,7 @@ async def _group_ban_event(bot: Bot, event: GroupBanNoticeEvent): _acc_recall = True -recall_event = Essential().on_notice("撤回事件", "撤回事件检测") +recall_event = ess.on_notice("撤回事件", "撤回事件检测") @recall_event.handle() @@ -310,7 +308,7 @@ async def _recall_private_event(bot: Bot, event: FriendRecallNoticeEvent): await bot.send_private_msg(user_id=int(superuser), message=Message(msg)) -rej_recall = Essential().on_command("拒绝撤回", "拒绝撤回信息", permission=SUPERUSER) +rej_recall = ess.on_command("拒绝撤回", "拒绝撤回信息", permission=MASTER) @rej_recall.handle() @@ -320,7 +318,7 @@ async def _(): await rej_recall.finish("已拒绝撤回信息...") -acc_recall = Essential().on_command("接受撤回", "接受撤回信息", permission=SUPERUSER) +acc_recall = ess.on_command("接受撤回", "接受撤回信息", permission=MASTER) @acc_recall.handle() diff --git a/ATRI/plugins/funny/__init__.py b/ATRI/plugins/funny/__init__.py index 7a0241c..094e569 100644 --- a/ATRI/plugins/funny/__init__.py +++ b/ATRI/plugins/funny/__init__.py @@ -5,10 +5,15 @@ from nonebot.params import ArgPlainText, CommandArg from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, Message from nonebot.adapters.onebot.v11.helpers import Cooldown +from ATRI.service import Service + from .data_source import Funny -get_laugh = Funny().on_command("来句笑话", "隐晦的笑话...") +plugin = Service("乐").document("乐1乐, 莫当真") + + +get_laugh = plugin.on_command("来句笑话", "隐晦的笑话...") @get_laugh.handle() @@ -17,7 +22,7 @@ async def _get_laugh(bot: Bot, event: MessageEvent): await get_laugh.finish(await Funny().idk_laugh(user_name)) -me_re_you = Funny().on_regex(r"我", "我也不懂咋解释", block=False) +me_re_you = plugin.on_regex(r"我", "我也不懂咋解释", block=False) @me_re_you.handle() @@ -32,7 +37,7 @@ async def _me_re_you(bot: Bot, event: MessageEvent): _fake_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) -fake_msg = Funny().on_command( +fake_msg = plugin.on_command( "/fakemsg", "伪造假转发内容,格式:qq-name-content\n可构造多条,使用空格隔开,仅限群聊" ) @@ -60,7 +65,7 @@ async def _deal_fake( await fake_msg.finish("构造失败惹...可能是被制裁了(") -eat_what = Funny().on_regex(r"大?[今明后]天(.*?)吃[什啥]么?", "我来决定你吃什么!") +eat_what = plugin.on_regex(r"大?[今明后]天(.*?)吃[什啥]么?", "我来决定你吃什么!") @eat_what.handle([Cooldown(15, prompt="慢慢吃,不要贪心哦!")]) diff --git a/ATRI/plugins/funny/data_source.py b/ATRI/plugins/funny/data_source.py index 18e0503..d3f88cc 100644 --- a/ATRI/plugins/funny/data_source.py +++ b/ATRI/plugins/funny/data_source.py @@ -4,22 +4,17 @@ from pathlib import Path from random import choice, randint from nonebot.adapters.onebot.v11 import unescape -from ATRI.service import Service from ATRI.log import log from ATRI.exceptions import RequestError from ATRI.utils import request from ATRI.utils import request, Translate -from ATRI.rule import is_in_service FUNNY_DIR = Path(".") / "data" / "plugins" / "funny" FUNNY_DIR.mkdir(parents=True, exist_ok=True) -class Funny(Service): - def __init__(self): - Service.__init__(self, "乐", "乐1乐,莫当真", rule=is_in_service("乐")) - +class Funny: @staticmethod async def idk_laugh(name: str) -> str: laugh_list = list() diff --git a/ATRI/plugins/help/__init__.py b/ATRI/plugins/help/__init__.py index a9663eb..4f302c9 100644 --- a/ATRI/plugins/help/__init__.py +++ b/ATRI/plugins/help/__init__.py @@ -1,9 +1,15 @@ from nonebot.adapters.onebot.v11 import MessageEvent +from ATRI.service import Service +from ATRI.rule import to_bot + from .data_source import Helper -menu = Helper().on_command("菜单", "获取食用bot的方法", aliases={"menu"}) +plugin = Service("帮助").document("bot的食用指南~").rule(to_bot()) + + +menu = plugin.on_command("菜单", "获取食用bot的方法", aliases={"menu"}) @menu.handle() @@ -11,7 +17,7 @@ async def _(): await menu.finish(Helper().menu()) -about = Helper().on_command("关于", "获取关于bot的信息", aliases={"about"}) +about = plugin.on_command("关于", "获取关于bot的信息", aliases={"about"}) @about.handle() @@ -19,7 +25,7 @@ async def _(): await about.finish(Helper().about()) -service_list = Helper().on_command("服务列表", "获取服务列表", aliases={"功能列表"}) +service_list = plugin.on_command("服务列表", "获取服务列表", aliases={"功能列表"}) @service_list.handle() @@ -27,7 +33,7 @@ async def _(): await service_list.finish(Helper().service_list()) -service_info = Helper().on_command("帮助", "获取对应服务详细信息", aliases={"help"}) +service_info = plugin.on_command("帮助", "获取对应服务详细信息", aliases={"help"}) @service_info.handle() diff --git a/ATRI/plugins/help/data_source.py b/ATRI/plugins/help/data_source.py index 7492197..6261a05 100644 --- a/ATRI/plugins/help/data_source.py +++ b/ATRI/plugins/help/data_source.py @@ -4,9 +4,8 @@ import json from tabulate import tabulate from ATRI import __version__, conf -from ATRI.rule import to_bot from ATRI.message import MessageBuilder -from ATRI.service import Service, SERVICES_DIR, ServiceTools +from ATRI.service import SERVICES_DIR, ServiceTools __SERVICE_INFO_FORMAT = ( @@ -26,10 +25,7 @@ __COMMAND_INFO_FORMAT = ( ) -class Helper(Service): - def __init__(self): - Service.__init__(self, "帮助", "bot的食用指南~", rule=to_bot()) - +class Helper: @staticmethod def menu() -> str: return ( @@ -38,6 +34,7 @@ class Helper(Service): .text("服务列表 -以查看所有可用服务") .text("帮助 [服务] -以查看对应服务帮助") .text("Tip: 均需要at触发。@bot 菜单 以打开此页面") + .done() ) @staticmethod @@ -53,6 +50,7 @@ class Helper(Service): .text("想进一步了解:") .text("atri.imki.moe") .text("进不去: project-atri-docs.vercel.app") + .done() ) @staticmethod @@ -76,8 +74,7 @@ class Helper(Service): headers=["服务名称", "开启状态(全局)", "仅支持管理员"], tablefmt="plain", ) - repo = f"咱搭载了以下服务~\n{table}\n@bot 帮助 [服务] -以查看对应服务帮助" - return MessageBuilder("咱搭载了以下服务~").text(table).text("@bot 帮助 [服务] -以查看对应服务帮助") + return MessageBuilder("咱搭载了以下服务~").text(table).text("@bot 帮助 [服务] -以查看对应服务帮助").done() @staticmethod def service_info(service: str) -> str: diff --git a/ATRI/plugins/kimo/__init__.py b/ATRI/plugins/kimo/__init__.py index aedf36b..ef9e073 100644 --- a/ATRI/plugins/kimo/__init__.py +++ b/ATRI/plugins/kimo/__init__.py @@ -5,14 +5,19 @@ from nonebot.params import ArgPlainText, CommandArg from nonebot.adapters.onebot.v11 import MessageEvent, Message from nonebot.adapters.onebot.v11.helpers import Cooldown +from ATRI.service import Service +from ATRI.rule import to_bot from ATRI.utils.apscheduler import scheduler + from .data_source import Kimo +plugin = Service("kimo").document("好像有点涩?").rule(to_bot()).priority(5) + _chat_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~", "我开始为你以后的伴侣担心了..."]) -kimo = Kimo().on_message("文爱", "闲聊(文爱", priority=10, block=False) +kimo = plugin.on_message("文爱", "闲聊(文爱", priority=10, block=False) @kimo.handle([Cooldown(3, prompt=_chat_flmt_notice)]) @@ -27,7 +32,7 @@ async def _chat(event: MessageEvent): return -my_name_is = Kimo().on_command("叫我", "更改kimo时的称呼", aliases={"我是"}, priority=1) +my_name_is = plugin.on_command("叫我", "更改kimo时的称呼", aliases={"我是"}, priority=1) @my_name_is.handle([Cooldown(3, prompt=_chat_flmt_notice)]) diff --git a/ATRI/plugins/kimo/data_source.py b/ATRI/plugins/kimo/data_source.py index 3e4f56b..26272e5 100644 --- a/ATRI/plugins/kimo/data_source.py +++ b/ATRI/plugins/kimo/data_source.py @@ -3,8 +3,6 @@ from pathlib import Path from jieba import posseg from random import choice, shuffle -from ATRI.service import Service -from ATRI.rule import to_bot, is_in_service from ATRI.log import log from ATRI.utils import request from ATRI.exceptions import ReadFileError, WriteFileError @@ -15,12 +13,7 @@ CHAT_PATH.mkdir(parents=True, exist_ok=True) KIMO_URL = "https://jsd.imki.moe/gh/Kyomotoi/AnimeThesaurus/data.json" -class Kimo(Service): - def __init__(self): - Service.__init__( - self, "kimo", "好像有点涩?", rule=to_bot() & is_in_service("kimo"), priority=5 - ) - +class Kimo: @staticmethod async def _request(url: str) -> dict: res = await request.get(url) diff --git a/ATRI/plugins/manage/__init__.py b/ATRI/plugins/manage/__init__.py index e6fc4a9..04d1da0 100644 --- a/ATRI/plugins/manage/__init__.py +++ b/ATRI/plugins/manage/__init__.py @@ -1,16 +1,20 @@ import re -from nonebot.permission import SUPERUSER from nonebot.matcher import Matcher from nonebot.params import ArgPlainText, CommandArg from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, GroupMessageEvent -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN from ATRI.rule import to_bot +from ATRI.service import Service +from ATRI.permission import MASTER, ADMIN + from .data_source import Manage -block_user = Manage().on_command("封禁用户", "对目标用户进行封禁") +plugin = Service("管理").document("控制bot的各项服务").only_admin(True).permission(MASTER) + + +block_user = plugin.on_command("封禁用户", "对目标用户进行封禁") @block_user.handle() @@ -33,7 +37,7 @@ async def _deal_block_user(user_id: str = ArgPlainText("block_user")): await block_user.finish(f"用户 {user_id} 危!") -unblock_user = Manage().on_command("解封用户", "对目标用户进行解封") +unblock_user = plugin.on_command("解封用户", "对目标用户进行解封") @unblock_user.handle() @@ -56,7 +60,7 @@ async def _deal_unblock_user(user_id: str = ArgPlainText("unblock_user")): await unblock_user.finish(f"好欸!{user_id} 重获新生!") -block_group = Manage().on_command("封禁群", "对目标群进行封禁") +block_group = plugin.on_command("封禁群", "对目标群进行封禁") @block_group.handle() @@ -79,7 +83,7 @@ async def _deal_block_group(group_id: str = ArgPlainText("block_group")): await block_group.finish(f"群 {group_id} 危!") -unblock_group = Manage().on_command("解封群", "对目标群进行解封") +unblock_group = plugin.on_command("解封群", "对目标群进行解封") @unblock_group.handle() @@ -102,7 +106,7 @@ async def _deal_unblock_group(group_id: str = ArgPlainText("unblock_group")): await unblock_group.finish(f"好欸!群 {group_id} 重获新生!") -global_block_service = Manage().on_command("全局禁用", "全局禁用某服务") +global_block_service = plugin.on_command("全局禁用", "全局禁用某服务") @global_block_service.handle() @@ -127,7 +131,7 @@ async def _deal_global_block_service( await global_block_service.finish(f"服务 {block_service} 已被禁用") -global_unblock_service = Manage().on_command("全局启用", "全局启用某服务") +global_unblock_service = plugin.on_command("全局启用", "全局启用某服务") @global_unblock_service.handle() @@ -154,7 +158,7 @@ async def _deal_global_unblock_service( await global_unblock_service.finish(f"服务 {unblock_service} 已启用") -user_block_service = Manage().on_regex(r"对用户(.*?)禁用(.*)", "针对某一用户(qid)禁用服务") +user_block_service = plugin.on_regex(r"对用户(.*?)禁用(.*)", "针对某一用户(qid)禁用服务") @user_block_service.handle() @@ -171,7 +175,7 @@ async def _user_block_service(event: MessageEvent): await user_block_service.finish(f"完成~已禁止用户 {aim_user} 使用 {aim_service}") -user_unblock_service = Manage().on_regex(r"对用户(.*?)启用(.*)", "针对某一用户(qid)启用服务") +user_unblock_service = plugin.on_regex(r"对用户(.*?)启用(.*)", "针对某一用户(qid)启用服务") @user_unblock_service.handle() @@ -188,8 +192,8 @@ async def _user_unblock_service(event: MessageEvent): await user_unblock_service.finish(f"完成~已允许用户 {aim_user} 使用 {aim_service}") -group_block_service = Manage().on_command( - "禁用", "针对所在群禁用某服务", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN +group_block_service = plugin.on_command( + "禁用", "针对所在群禁用某服务", permission=ADMIN ) @@ -217,8 +221,8 @@ async def _deal_group_block_service( await group_block_service.finish(f"完成!~已禁止本群使用服务:{aim_service}") -group_unblock_service = Manage().on_command( - "启用", "针对所在群启用某服务", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN +group_unblock_service = plugin.on_command( + "启用", "针对所在群启用某服务", permission=ADMIN ) @@ -246,7 +250,7 @@ async def _deal_group_unblock_service( await group_unblock_service.finish(f"完成!~已允许本群使用服务:{aim_service}") -get_friend_add_list = Manage().on_command("获取好友申请", "获取好友申请列表") +get_friend_add_list = plugin.on_command("获取好友申请", "获取好友申请列表") @get_friend_add_list.handle() @@ -265,7 +269,7 @@ async def _get_friend_add_list(): await get_friend_add_list.finish(msg1) -approve_friend_add = Manage().on_command("同意好友", "同意好友申请") +approve_friend_add = plugin.on_command("同意好友", "同意好友申请") @approve_friend_add.handle() @@ -295,7 +299,7 @@ async def _deal_approve_friend_add( await approve_friend_add.finish("好欸!申请已通过!") -refuse_friend_add = Manage().on_command("拒绝好友", "拒绝好友申请") +refuse_friend_add = plugin.on_command("拒绝好友", "拒绝好友申请") @refuse_friend_add.handle() @@ -325,7 +329,7 @@ async def _deal_refuse_friend_add( await refuse_friend_add.finish("已拒绝!") -get_group_invite_list = Manage().on_command("获取邀请列表", "获取群邀请列表") +get_group_invite_list = plugin.on_command("获取邀请列表", "获取群邀请列表") @get_group_invite_list.handle() @@ -344,7 +348,7 @@ async def _get_group_invite_list(): await get_friend_add_list.finish(msg1) -approve_group_invite = Manage().on_command("同意邀请", "同意群聊邀请") +approve_group_invite = plugin.on_command("同意邀请", "同意群聊邀请") @approve_group_invite.handle() @@ -376,7 +380,7 @@ async def _deal_approve_group_invite( await approve_group_invite.finish("好欸!申请已通过!") -refuse_group_invite = Manage().on_command("拒绝邀请", "拒绝群聊邀请") +refuse_group_invite = plugin.on_command("拒绝邀请", "拒绝群聊邀请") @refuse_group_invite.handle() @@ -408,7 +412,7 @@ async def _deal_refuse_group_invite( await refuse_group_invite.finish("已拒绝!") -track_error = Manage().on_command("追踪", "获取报错信息,传入追踪码", aliases={"/track"}) +track_error = plugin.on_command("追踪", "获取报错信息,传入追踪码", aliases={"/track"}) @track_error.handle() @@ -428,7 +432,7 @@ async def _(track_code: str = ArgPlainText("track_code")): await track_error.finish(repo) -recall_msg = Manage().on_command("撤回", "撤回bot已发送的信息", to_bot()) +recall_msg = plugin.on_command("撤回", "撤回bot已发送的信息", to_bot()) @recall_msg.handle() diff --git a/ATRI/plugins/manage/data_source.py b/ATRI/plugins/manage/data_source.py index 35462f0..29e2a69 100644 --- a/ATRI/plugins/manage/data_source.py +++ b/ATRI/plugins/manage/data_source.py @@ -2,9 +2,8 @@ import json from pathlib import Path from datetime import datetime -from nonebot.permission import SUPERUSER - -from ATRI.service import Service, ServiceTools +from ATRI.service import ServiceTools +from ATRI.message import MessageBuilder from ATRI.exceptions import load_error @@ -14,17 +13,16 @@ MANAGE_DIR.mkdir(parents=True, exist_ok=True) ESSENTIAL_DIR.mkdir(parents=True, exist_ok=True) -TRACK_BACK_FORMAT = """Track ID:{track_id} -Prompt: {prompt} -Time: {time} -{content} -""".strip() - +_TRACK_BACK_FORMAT = ( + MessageBuilder("Track ID: {track_id}") + .text("Prompt: {prompt}") + .text("Time: {time}") + .text("{content}") + .done() +) -class Manage(Service): - def __init__(self): - Service.__init__(self, "管理", "控制bot的各项服务", True, permission=SUPERUSER) +class Manage: @staticmethod def _load_block_user_list() -> dict: """ @@ -269,7 +267,7 @@ class Manage(Service): time = data.get("time", "ignore") content = data.get("content", "ignore") - repo = TRACK_BACK_FORMAT.format( + repo = _TRACK_BACK_FORMAT.format( track_id=track_id, prompt=prompt, time=time, content=content ) return repo diff --git a/ATRI/plugins/polaroid/__init__.py b/ATRI/plugins/polaroid/__init__.py index a3d2d61..18795e7 100644 --- a/ATRI/plugins/polaroid/__init__.py +++ b/ATRI/plugins/polaroid/__init__.py @@ -4,13 +4,19 @@ from nonebot.adapters.onebot.v11 import MessageEvent, MessageSegment, Message from nonebot.adapters.onebot.v11.helpers import Cooldown from ATRI.rule import to_bot +from ATRI.service import Service + from .data_source import Polaroid, TEMP_PATH +plugin = Service("拍立得").document("根据头像生成拍立得风格照片!") +pol = Polaroid() + + _flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) -polaroid = Polaroid().on_command("拍立得", "获取一张以自己头像的拍立得图片!需at", rule=to_bot()) +polaroid = plugin.on_command("拍立得", "获取一张以自己头像的拍立得图片! 需at", rule=to_bot()) @polaroid.handle([Cooldown(15, prompt=_flmt_notice)]) diff --git a/ATRI/plugins/polaroid/data_source.py b/ATRI/plugins/polaroid/data_source.py index a48b5eb..e994c5e 100644 --- a/ATRI/plugins/polaroid/data_source.py +++ b/ATRI/plugins/polaroid/data_source.py @@ -1,6 +1,5 @@ from ATRI import driver -from ATRI.service import Service, ServiceTools -from ATRI.rule import is_in_service +from ATRI.service import ServiceTools from ATRI.utils import request from ATRI.log import log from ATRI.exceptions import RequestError @@ -12,10 +11,7 @@ TENCENT_AVATER_URL = "https://q1.qlogo.cn/g?b=qq&nk={user_id}&s=640" SOURCE_URL = "https://jsd.imki.moe/gh/Kyomotoi/CDN@master/project/ATRI/" -class Polaroid(Service): - def __init__(self): - Service.__init__(self, "拍立得", "根据头像生成拍立得风格照片!", rule=is_in_service("拍立得")) - +class Polaroid: @classmethod async def _request(cls, user_id: str) -> bytes: try: diff --git a/ATRI/plugins/repo.py b/ATRI/plugins/repo.py index c550f4b..dd67476 100644 --- a/ATRI/plugins/repo.py +++ b/ATRI/plugins/repo.py @@ -6,7 +6,6 @@ from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message from nonebot.adapters.onebot.v11.helpers import Cooldown from ATRI import conf -from ATRI.rule import is_in_service from ATRI.service import Service from ATRI.message import MessageBuilder @@ -24,7 +23,7 @@ _REPO_FORMAT = ( _REPO_FORMAT = MessageBuilder("来自用户{user}反馈:").text("{msg}").done() -repo = Service("反馈", "向维护者发送消息", rule=is_in_service("反馈")) +repo = Service("反馈").document("向维护者发送消息") reporter = repo.on_command("来杯红茶", "向维护者发送消息", aliases={"反馈", "报告"}) diff --git a/ATRI/plugins/rss/__init__.py b/ATRI/plugins/rss/__init__.py index a29f385..3f0b906 100644 --- a/ATRI/plugins/rss/__init__.py +++ b/ATRI/plugins/rss/__init__.py @@ -1,28 +1,25 @@ from pathlib import Path from nonebot.adapters.onebot.v11 import MessageEvent -from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN +from ATRI.permission import ADMIN from ATRI.service import Service +from ATRI.message import MessageBuilder RSS_PLUGIN_DIR = Path(".") / "ATRI" / "plugins" / "rss" -class RssHelper(Service): - def __init__(self): - Service.__init__( - self, - "rss", - "Rss系插件助手", - True, - permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN, - main_cmd="/rss", - ) +rss_helper = ( + Service("rss") + .document("Rss系插件助手") + .only_admin(True) + .permission(ADMIN) + .main_cmd("/rss") +) -rss_menu = RssHelper().on_command("/rss", "Rss帮助菜单") +rss_menu = rss_helper.on_command("/rss", "Rss帮助菜单") @rss_menu.handle() @@ -32,8 +29,9 @@ async def _rss_menu(event: MessageEvent): if not rss_list: rss_list = [str(i).split("\\")[-1] for i in raw_rss_list] - result = f"""Rss Helper: - 可用订阅源: {"、".join(map(str, rss_list)).replace("rss_", str())} - 命令: /rss.(订阅源名称) - """.strip() + result = ( + MessageBuilder("Rss Helper:") + .text(f"可用订阅源: {', '.join(map(str, rss_list)).replace('rss_', str())}") + .text("命令: /rss.(订阅源名称)") + ) await rss_menu.finish(result) diff --git a/ATRI/plugins/rss/rss_mikanan/__init__.py b/ATRI/plugins/rss/rss_mikanan/__init__.py index a04f5cd..3165438 100644 --- a/ATRI/plugins/rss/rss_mikanan/__init__.py +++ b/ATRI/plugins/rss/rss_mikanan/__init__.py @@ -14,6 +14,9 @@ from nonebot.permission import Permission from nonebot.adapters.onebot.v11 import Message, GroupMessageEvent from ATRI.log import log +from ATRI.service import Service +from ATRI.permission import ADMIN +from ATRI.message import MessageBuilder from ATRI.plugins.rss.rss_rsshub.data_source import RssHubSubscriptor from ATRI.utils import timestamp2datetime from ATRI.utils.apscheduler import scheduler @@ -22,7 +25,16 @@ from ATRI.database import RssMikananiSubcription from .data_source import RssMikananSubscriptor -add_sub = RssMikananSubscriptor().cmd_as_group("add", "为本群添加 Mikan 订阅") +plugin = ( + Service("rss.mikan") + .document("Rss的mikan支持") + .permission(ADMIN) + .main_cmd("/rss.mikan") +) +sub = RssMikananSubscriptor() + + +add_sub = plugin.cmd_as_group("add", "为本群添加 Mikan 订阅") @add_sub.handle() @@ -35,19 +47,17 @@ async def _(matcher: Matcher, args: Message = CommandArg()): @add_sub.got("rm_add_url", prompt="Mikan 链接呢? 速速") async def _(event: GroupMessageEvent, _url: str = ArgPlainText("rm_add_url")): group_id = event.group_id - sub = RssMikananSubscriptor() result = await sub.add_sub(_url, group_id) await add_sub.finish(result) -del_sub = RssMikananSubscriptor().cmd_as_group("del", "删除本群 Mikan 订阅") +del_sub = plugin.cmd_as_group("del", "删除本群 Mikan 订阅") @del_sub.handle() async def _(event: GroupMessageEvent): group_id = event.group_id - sub = RssMikananSubscriptor() query_result = await sub.get_sub_list({"group_id": group_id}) if not query_result: @@ -69,21 +79,17 @@ async def _(event: GroupMessageEvent, _id: str = ArgPlainText("rm_del_sub_id")): await del_sub.finish("已取消操作~") group_id = event.group_id - sub = RssMikananSubscriptor() result = await sub.del_sub(_id, group_id) await del_sub.finish(result) -get_sub_list = RssMikananSubscriptor().cmd_as_group( - "list", "获取本群 Mikan 订阅列表", permission=Permission() -) +get_sub_list = plugin.cmd_as_group("list", "获取本群 Mikan 订阅列表", permission=Permission()) @get_sub_list.handle() async def _(event: GroupMessageEvent): group_id = event.group_id - sub = RssMikananSubscriptor() query_result = await sub.get_sub_list({"group_id": group_id}) if not query_result: @@ -104,7 +110,7 @@ tq = asyncio.Queue() class RssMikanDynamicChecker(BaseTrigger): def get_next_fire_time(self, previous_fire_time, now): - conf = RssHubSubscriptor().load_service("rss.mikan") + conf = plugin.load_service("rss.mikan") if conf.get("enabled"): return now @@ -112,11 +118,10 @@ class RssMikanDynamicChecker(BaseTrigger): @scheduler.scheduled_job( AndTrigger([IntervalTrigger(seconds=60), RssMikanDynamicChecker()]), name="Mikan 订阅检查", - max_instances=3, - misfire_grace_time=60, + max_instances=3, # type: ignore + misfire_grace_time=60, # type: ignore ) async def _(): - sub = RssMikananSubscriptor() try: all_dy = await sub.get_all_subs() except Exception: @@ -156,10 +161,7 @@ async def _(): if ts < m_t: title = data.title - repo = f"""本群订阅的 Mikan 更新啦! - {title} - {link} - """ + repo = MessageBuilder("本群订阅的 Mikan 更新啦!").text(f"{title}").text(f"{link}") bot = get_bot() await bot.send_group_msg(group_id=data.group_id, message=repo) diff --git a/ATRI/plugins/rss/rss_mikanan/data_source.py b/ATRI/plugins/rss/rss_mikanan/data_source.py index 6397c70..6aec1b5 100644 --- a/ATRI/plugins/rss/rss_mikanan/data_source.py +++ b/ATRI/plugins/rss/rss_mikanan/data_source.py @@ -1,11 +1,5 @@ import xmltodict -from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN - - -from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.exceptions import RssError from ATRI.utils import request, gen_random_str @@ -13,17 +7,7 @@ from ATRI.utils import request, gen_random_str from .db import DB -class RssMikananSubscriptor(Service): - def __init__(self): - Service.__init__( - self, - "rss.mikan", - "Rss的mikan支持", - rule=is_in_service("rss.mikan"), - permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN, - main_cmd="/rss.mikan", - ) - +class RssMikananSubscriptor: async def __add_sub(self, _id: str, group_id: int): try: async with DB() as db: @@ -98,7 +82,7 @@ class RssMikananSubscriptor(Service): try: resp = await request.get(url) except Exception: - RssError("rss.mikan: 请求链接失败") + raise RssError("rss.mikan: 请求链接失败") xml_data = resp.read() data = xmltodict.parse(xml_data) diff --git a/ATRI/plugins/rss/rss_rsshub/__init__.py b/ATRI/plugins/rss/rss_rsshub/__init__.py index 54d0502..7d2843b 100644 --- a/ATRI/plugins/rss/rss_rsshub/__init__.py +++ b/ATRI/plugins/rss/rss_rsshub/__init__.py @@ -14,6 +14,8 @@ from nonebot.permission import Permission from nonebot.adapters.onebot.v11 import Message, GroupMessageEvent from ATRI.log import log +from ATRI.service import Service +from ATRI.permission import ADMIN from ATRI.utils import timestamp2datetime from ATRI.utils.apscheduler import scheduler from ATRI.database import RssRsshubSubcription @@ -21,7 +23,16 @@ from ATRI.database import RssRsshubSubcription from .data_source import RssHubSubscriptor -add_sub = RssHubSubscriptor().cmd_as_group("add", "为本群添加 RSSHub 订阅") +plugin = ( + Service("rss.rsshub") + .document("Rss的Rsshub支持") + .permission(ADMIN) + .main_cmd("/rss.rsshub") +) +sub = RssHubSubscriptor() + + +add_sub = plugin.cmd_as_group("add", "为本群添加 RSSHub 订阅") @add_sub.handle() @@ -34,19 +45,17 @@ async def _(matcher: Matcher, args: Message = CommandArg()): @add_sub.got("rrh_add_url", "RSSHub 链接呢?速速") async def _(event: GroupMessageEvent, _url: str = ArgPlainText("rrh_add_url")): group_id = event.group_id - sub = RssHubSubscriptor() result = await sub.add_sub(_url, group_id) await add_sub.finish(result) -del_sub = RssHubSubscriptor().cmd_as_group("del", "删除本群 RSSHub 订阅") +del_sub = plugin.cmd_as_group("del", "删除本群 RSSHub 订阅") @del_sub.handle() async def _(event: GroupMessageEvent): group_id = event.group_id - sub = RssHubSubscriptor() query_result = await sub.get_sub_list({"group_id": group_id}) if not query_result: @@ -68,21 +77,17 @@ async def _(event: GroupMessageEvent, _id: str = ArgPlainText("rrh_del_sub_id")) await del_sub.finish("已取消操作~") group_id = event.group_id - sub = RssHubSubscriptor() result = await sub.del_sub(_id, group_id) await del_sub.finish(result) -get_sub_list = RssHubSubscriptor().cmd_as_group( - "list", "获取本群 RSSHub 订阅列表", permission=Permission() -) +get_sub_list = plugin.cmd_as_group("list", "获取本群 RSSHub 订阅列表", permission=Permission()) @get_sub_list.handle() async def _(event: GroupMessageEvent): group_id = event.group_id - sub = RssHubSubscriptor() query_result = await sub.get_sub_list({"group_id": group_id}) if not query_result: @@ -103,7 +108,7 @@ tq = asyncio.Queue() class RssHubDynamicChecker(BaseTrigger): def get_next_fire_time(self, previous_fire_time, now): - conf = RssHubSubscriptor().load_service("rss.rsshub") + conf = plugin.load_service("rss.rsshub") if conf.get("enabled"): return now @@ -111,11 +116,10 @@ class RssHubDynamicChecker(BaseTrigger): @scheduler.scheduled_job( AndTrigger([IntervalTrigger(seconds=120), RssHubDynamicChecker()]), name="RssHub 订阅检查", - max_instances=3, - misfire_grace_time=60, + max_instances=3, # type: ignore + misfire_grace_time=60, # type: ignore ) async def _(): - sub = RssHubSubscriptor() try: all_dy = await sub.get_all_subs() except Exception: diff --git a/ATRI/plugins/rss/rss_rsshub/data_source.py b/ATRI/plugins/rss/rss_rsshub/data_source.py index ca6f80c..9ca1c04 100644 --- a/ATRI/plugins/rss/rss_rsshub/data_source.py +++ b/ATRI/plugins/rss/rss_rsshub/data_source.py @@ -1,27 +1,12 @@ import xmltodict -from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN - -from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.exceptions import RssError from ATRI.utils import request, gen_random_str from .db import DB -class RssHubSubscriptor(Service): - def __init__(self): - Service.__init__( - self, - "rss.rsshub", - "Rss的Rsshub支持", - rule=is_in_service("rss.rsshub"), - permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN, - main_cmd="/rss.rsshub", - ) - +class RssHubSubscriptor: async def __add_sub(self, _id: str, group_id: int): try: async with DB() as db: diff --git a/ATRI/plugins/saucenao/__init__.py b/ATRI/plugins/saucenao/__init__.py index 8850c9d..b653a13 100644 --- a/ATRI/plugins/saucenao/__init__.py +++ b/ATRI/plugins/saucenao/__init__.py @@ -5,14 +5,18 @@ from nonebot.adapters.onebot.v11.helpers import extract_image_urls, Cooldown from ATRI import conf from ATRI.log import log -from ATRI.service import ServiceTools +from ATRI.service import Service, ServiceTools from .data_source import SauceNao +plugin = Service("以图搜图").document("以图搜图,仅限二刺螈") +sau = SauceNao() + + _search_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) -saucenao = SauceNao().on_command("以图搜图", "透过一张图搜索可能的来源") +saucenao = plugin.on_command("以图搜图", "透过一张图搜索可能的来源") @saucenao.got("saucenao_img", "图呢?", [Cooldown(5, prompt=_search_flmt_notice)]) diff --git a/ATRI/plugins/saucenao/data_source.py b/ATRI/plugins/saucenao/data_source.py index eaeafed..004d9de 100644 --- a/ATRI/plugins/saucenao/data_source.py +++ b/ATRI/plugins/saucenao/data_source.py @@ -1,7 +1,5 @@ from random import choice -from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.exceptions import RequestError from ATRI.utils import request @@ -9,7 +7,7 @@ from ATRI.utils import request URL = "https://saucenao.com/search.php" -class SauceNao(Service): +class SauceNao: def __init__( self, api_key: str = str(), @@ -19,8 +17,6 @@ class SauceNao(Service): db=5, numres=5, ): - Service.__init__(self, "以图搜图", "以图搜图,仅限二刺螈", rule=is_in_service("以图搜图")) - params = dict() params["api_key"] = api_key params["output_type"] = output_type diff --git a/ATRI/plugins/setu/__init__.py b/ATRI/plugins/setu/__init__.py index 1e8af97..21721d5 100644 --- a/ATRI/plugins/setu/__init__.py +++ b/ATRI/plugins/setu/__init__.py @@ -2,17 +2,22 @@ import re import asyncio from random import choice -from nonebot.permission import SUPERUSER from nonebot.matcher import Matcher from nonebot.params import CommandArg, ArgPlainText from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message, MessageSegment from nonebot.adapters.onebot.v11.helpers import extract_image_urls, Cooldown from ATRI import conf +from ATRI.service import Service +from ATRI.permission import MASTER + from .data_source import Setu -random_setu = Setu().on_command("来张涩图", "来张随机涩图,冷却2分钟", aliases={"涩图来", "来点涩图", "来份涩图"}) +setu = Service("涩图").document("hso!") + + +random_setu = setu.on_command("来张涩图", "来张随机涩图,冷却2分钟", aliases={"涩图来", "来点涩图", "来份涩图"}) @random_setu.handle([Cooldown(120)]) @@ -24,16 +29,16 @@ async def _(): async def _random_setu(bot: Bot, event: MessageEvent): loop = asyncio.get_running_loop() - repo, setu = await Setu().random_setu() + repo, se = await Setu.random_setu() await bot.send(event, repo) try: - msg_1 = await bot.send(event, Message(setu)) + msg_1 = await bot.send(event, Message(se)) except Exception: await random_setu.finish("hso(发不出") event_id = msg_1["message_id"] - loop.create_task(Setu().async_recall(bot, event_id)) + loop.create_task(Setu.async_recall(bot, event_id)) loop.close() @@ -46,7 +51,7 @@ async def _(think: str = ArgPlainText("r_rush_after_think")): await random_setu.finish(is_repo) -tag_setu = Setu().on_regex(r"来[张点丶份](.*?)的[涩色🐍]图", "根据提供的tag查找涩图,冷却2分钟") +tag_setu = setu.on_regex(r"来[张点丶份](.*?)的[涩色🐍]图", "根据提供的tag查找涩图,冷却2分钟") @tag_setu.handle([Cooldown(120, prompt="慢...慢一..点❤")]) @@ -56,19 +61,19 @@ async def _tag_setu(bot: Bot, event: MessageEvent): msg = str(event.get_message()).strip() pattern = r"来[张点丶份](.*?)的[涩色🐍]图" tag = re.findall(pattern, msg)[0] - repo, setu = await Setu().tag_setu(tag) + repo, se = await Setu.tag_setu(tag) if not setu: await tag_setu.finish(repo) await bot.send(event, repo) try: - msg_1 = await bot.send(event, Message(setu)) + msg_1 = await bot.send(event, Message(se)) except Exception: await random_setu.finish("hso(发不出") event_id = msg_1["message_id"] - loop.create_task(Setu().async_recall(bot, event_id)) + loop.create_task(Setu.async_recall(bot, event_id)) loop.close() @@ -84,7 +89,7 @@ async def _(think: str = ArgPlainText("t_rush_after_think")): _catcher_max_file_size = 128 -setu_catcher = Setu().on_message("涩图嗅探", "涩图嗅探器", block=False) +setu_catcher = setu.on_message("涩图嗅探", "涩图嗅探器", block=False) @setu_catcher.handle() @@ -96,7 +101,7 @@ async def _setu_catcher(bot: Bot, event: MessageEvent): hso = list() for i in args: try: - data = await Setu().detecter(i, _catcher_max_file_size) + data = await Setu.detecter(i, _catcher_max_file_size) except Exception: return if data > 0.7: @@ -109,7 +114,7 @@ async def _setu_catcher(bot: Bot, event: MessageEvent): elif len(hso) == 1: u_repo = f"hso! 涩值:{'{:.2%}'.format(hso[0])}\n不行我要发给别人看" s_repo = ( - f"涩图来咧!\n{MessageSegment.image(args[0])}\n涩值:{'{:.2%}'.format(hso[0])}" + f"涩图来咧!\n{MessageSegment.image(args[0])}\n涩值: {'{:.2%}'.format(hso[0])}" ) else: @@ -126,7 +131,7 @@ async def _setu_catcher(bot: Bot, event: MessageEvent): await bot.send_private_msg(user_id=superuser, message=s_repo) -nsfw_checker = Setu().on_command("/nsfw", "涩值检测") +nsfw_checker = setu.on_command("/nsfw", "涩值检测") @nsfw_checker.got("nsfw_img", "图呢?") @@ -135,13 +140,13 @@ async def _deal_check(bot: Bot, event: MessageEvent): if not args: await nsfw_checker.reject("请发送图片而不是其他东西!!") - hso = await Setu().detecter(args[0], _catcher_max_file_size) + hso = await Setu.detecter(args[0], _catcher_max_file_size) if not hso: await nsfw_checker.finish("图太小了!不测!") resu = f"涩值:{'{:.2%}'.format(hso)}\n" if hso >= 0.75: - resu += "hso!不行我要发给别人看" + resu += "hso! 不行我要发给别人看" repo = f"涩图来咧!\n{MessageSegment.image(args[0])}\n涩值:{'{:.2%}'.format(hso)}" for superuser in conf.BotConfig.superusers: await bot.send_private_msg(user_id=superuser, message=repo) @@ -154,7 +159,7 @@ async def _deal_check(bot: Bot, event: MessageEvent): await nsfw_checker.finish(resu) -catcher_setting = Setu().on_command("嗅探设置", "涩图检测图片文件大小设置", permission=SUPERUSER) +catcher_setting = setu.on_command("嗅探设置", "涩图检测图片文件大小设置", permission=MASTER) @catcher_setting.handle() @@ -164,7 +169,7 @@ async def _catcher_setting(matcher: Matcher, args: Message = CommandArg()): matcher.set_arg("catcher_set", args) -@catcher_setting.got("catcher_set", "数值呢?(1对应1kb,默认128)") +@catcher_setting.got("catcher_set", "数值呢? (1对应1kb, 默认128)") async def _deal_setting(msg: str = ArgPlainText("catcher_set")): global _catcher_max_file_size try: diff --git a/ATRI/plugins/setu/data_source.py b/ATRI/plugins/setu/data_source.py index faf8668..79a36e0 100644 --- a/ATRI/plugins/setu/data_source.py +++ b/ATRI/plugins/setu/data_source.py @@ -2,8 +2,6 @@ import asyncio from nonebot.adapters.onebot.v11 import Bot, MessageSegment from ATRI import conf -from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.utils import request from .nsfw_checker import detect_image, init_model @@ -14,10 +12,7 @@ DEFAULT_SETU = ( ) -class Setu(Service): - def __init__(self): - Service.__init__(self, "涩图", "hso!", rule=is_in_service("涩图")) - +class Setu: @staticmethod def _use_proxy(url: str) -> str: if conf.Setu.reverse_proxy: diff --git a/ATRI/plugins/status/__init__.py b/ATRI/plugins/status/__init__.py index ee90c86..a8c532b 100644 --- a/ATRI/plugins/status/__init__.py +++ b/ATRI/plugins/status/__init__.py @@ -2,12 +2,16 @@ from nonebot import get_bot from ATRI import conf from ATRI.log import log +from ATRI.service import Service from ATRI.utils.apscheduler import scheduler from .data_source import Status -ping = Status().on_command("/ping", "检测bot简单信息处理速度") +stat = Service("状态").document("检查自身状态") + + +ping = stat.on_command("/ping", "检测bot简单信息处理速度") @ping.handle() @@ -15,7 +19,7 @@ async def _(): await ping.finish(Status.ping()) -status = Status().on_command("/status", "查看运行资源占用") +status = stat.on_command("/status", "查看运行资源占用") @status.handle() @@ -30,7 +34,7 @@ info_msg = "アトリは高性能ですから!" @scheduler.scheduled_job("interval", name="状态检查", minutes=10, misfire_grace_time=15) # type: ignore async def _(): log.info("开始检查资源消耗...") - msg, stat = Status().get_status() + msg, stat = Status.get_status() if not stat: log.warning(msg) diff --git a/ATRI/plugins/status/data_source.py b/ATRI/plugins/status/data_source.py index cede6cf..9bff1c3 100644 --- a/ATRI/plugins/status/data_source.py +++ b/ATRI/plugins/status/data_source.py @@ -4,30 +4,27 @@ import psutil from datetime import datetime from ATRI.service import Service -from ATRI.rule import is_in_service +from ATRI.message import MessageBuilder from ATRI.exceptions import GetStatusError -_status_msg = """ -> Status Overview +_STATUS_MSG = ( + MessageBuilder("> Status Overview"). + text("[CPU: {b_cpu}% of {p_cpu}%]") + .text("[Memory: {b_mem} of {p_mem}%]") + .text("[Disk usage: {p_disk}%]") + .text("") + .text("[Net sent: {inteSENT}MB]") + .text("[Net recv: {inteRECV}MB]") + .text("") + .text("[Bot runtime: {bot_time}]") + .text("[Platform runtime: {boot_time}]") + .text("{msg}") + .done() +) -[CPU: {b_cpu}% of {p_cpu}%] -[Memory: {b_mem} of {p_mem}%] -[Disk usage: {p_disk}%] - -[Net sent: {inteSENT}MB] -[Net recv: {inteRECV}MB] - -[Bot runtime: {bot_time}] -[Platform runtime: {boot_time}] -{msg} -""".strip() - - -class Status(Service): - def __init__(self): - Service.__init__(self, "状态", "检查自身状态", rule=is_in_service("状态")) +class Status: @staticmethod def ping() -> str: return "I'm fine." @@ -75,7 +72,7 @@ class Status(Service): else: is_ok = True - msg0 = _status_msg.format( + msg0 = _STATUS_MSG.format( p_cpu=cpu, p_mem=mem, p_disk=disk, diff --git a/ATRI/plugins/thesaurus/__init__.py b/ATRI/plugins/thesaurus/__init__.py index 5e96bf2..9060a78 100644 --- a/ATRI/plugins/thesaurus/__init__.py +++ b/ATRI/plugins/thesaurus/__init__.py @@ -2,17 +2,26 @@ import pytz from tabulate import tabulate from nonebot.matcher import Matcher -from nonebot.permission import SUPERUSER from nonebot.params import ArgPlainText, CommandArg, ArgStr -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, GroupMessageEvent +from ATRI.service import Service +from ATRI.message import MessageBuilder +from ATRI.permission import ADMIN, MASTER from ATRI.utils import gen_random_str, MessageChecker from .data_source import ThesaurusManager -add_item = ThesaurusManager().cmd_as_group("add", "添加本群词条,需审核或投票") +thes = ( + Service("词库管理") + .document("支持模糊匹配、全匹配、正则的自定义回复~\n支持分群、全局管理, 支持群内投票添加") + .main_cmd("/ts") +) +tm = ThesaurusManager() + + +add_item = thes.cmd_as_group("add", "添加本群词条,需审核或投票") @add_item.handle() @@ -71,9 +80,8 @@ async def _add_normal_item( operator = operator_info.get("card", "unknown") item_id = gen_random_str(6) ans = item_a.split(",,") - ts = ThesaurusManager() - result = await ts.add_item( + result = await tm.add_item( item_id, False, item_q, @@ -89,9 +97,7 @@ async def _add_normal_item( await add_item.finish(result) -add_item_as_group_admin = ThesaurusManager().cmd_as_group( - "add.g", "添加本群词条,仅限管理,无需审核", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN -) +add_item_as_group_admin = thes.cmd_as_group("add.g", "添加本群词条,仅限管理,无需审核", permission=ADMIN) @add_item_as_group_admin.handle() @@ -150,9 +156,8 @@ async def _add_group_item( operator = operator_info.get("card", "unknown") item_id = gen_random_str(6) ans = item_a.split(",,") - ts = ThesaurusManager() - result = await ts.add_item( + result = await tm.add_item( item_id, True, item_q, @@ -168,9 +173,7 @@ async def _add_group_item( await add_item_as_group_admin.finish(result) -add_item_for_global = ThesaurusManager().cmd_as_group( - "add.glo", "添加全局问答", permission=SUPERUSER -) +add_item_for_global = thes.cmd_as_group("add.glo", "添加全局问答", permission=MASTER) @add_item_for_global.handle() @@ -216,11 +219,10 @@ async def _add_global_item( agree_list = ["y", "Y", "是", "同意", "赞成"] need_at = 1 if _need_at in agree_list else 0 - operator = "SUPERUSER" + operator = "MASTER" opeartor_id = event.user_id item_id = gen_random_str(6) ans = item_a.split(",,") - tm = ThesaurusManager() result = await tm.add_item( item_id, True, item_q, ans, need_at, item_t, 0, operator, opeartor_id, 0, list() @@ -228,7 +230,7 @@ async def _add_global_item( await add_item_for_global.finish(result) -vote = ThesaurusManager().cmd_as_group("v", "对本群内审核中的词条进行投票") +vote = thes.cmd_as_group("v", "对本群内审核中的词条进行投票") @vote.handle() @@ -246,7 +248,6 @@ async def _get_vote_info(matcher: Matcher, args: Message = CommandArg()): async def _get_item_id( event: GroupMessageEvent, item_id: str = ArgPlainText("ts_vote_id") ): - tm = ThesaurusManager() user_id = event.user_id group_id = event.group_id @@ -258,13 +259,14 @@ async def _get_item_id( if user_id in item_info.vote_list: await vote.finish("你已经参与过啦!") - result = f"""你即将要投票的词条信息: - 词条ID: {item_info._id} - 有人问: {item_info.matcher} - 我答: {"、".join(map(str, item_info.result))} - 提交人: {item_info.operator}@{item_info.operator_id} - 当前赞成: {"、".join(map(str, item_info.vote_list))} - """.strip() + result = ( + MessageBuilder("你即将要投票的词条信息:") + .text(f"词条ID: {item_info._id}") + .text(f"有人问: {item_info.matcher}") + .text(f"我答: {'、'.join(map(str, item_info.result))}") + .text(f"提交人: {item_info.operator}@{item_info.operator_id}") + .text(f"当前赞成: {'、'.join(map(str, item_info.vote_list))}") + ) await vote.send(Message(result)) @@ -279,7 +281,6 @@ async def _get_voter_attitude( if attitude not in agree_list and attitude not in disagree_list: await vote.reject("你的观点似乎不相关呢...请重新输入: (y/n)") - tm = ThesaurusManager() group_id = event.group_id user_id = event.user_id @@ -290,9 +291,7 @@ async def _get_voter_attitude( await vote.finish("好吧...") -del_item = ThesaurusManager().cmd_as_group( - "del", "删除本群词条", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN -) +del_item = thes.cmd_as_group("del", "删除本群词条", permission=ADMIN) @del_item.handle() @@ -306,16 +305,13 @@ async def _get_del_normal_item_info(matcher: Matcher, args: Message = CommandArg async def _deal_del_normal_item( event: GroupMessageEvent, item_id: str = ArgPlainText("ts_del_item_id") ): - tm = ThesaurusManager() group_id = event.group_id result = await tm.del_item(item_id, group_id, True) await del_item.finish(result) -del_global_item = ThesaurusManager().cmd_as_group( - "del.g", "删除全局词条", permission=SUPERUSER -) +del_global_item = thes.cmd_as_group("del.g", "删除全局词条", permission=MASTER) @del_global_item.handle() @@ -327,15 +323,11 @@ async def _get_del_global_item_info(matcher: Matcher, args: Message = CommandArg @del_global_item.got("ts_del_global_item_id", "要删除词条的id是?") async def _deal_del_global_item(item_id: str = ArgPlainText("ts_del_global_item_id")): - tm = ThesaurusManager() - result = await tm.del_item(item_id, 0, True) await del_global_item.finish(result) -del_vote_item = ThesaurusManager().cmd_as_group( - "del.v", "删除本群处于投票中的词条", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN -) +del_vote_item = thes.cmd_as_group("del.v", "删除本群处于投票中的词条", permission=ADMIN) @del_vote_item.handle() @@ -349,7 +341,6 @@ async def _get_deal_vote_item_info(matcher: Matcher, args: Message = CommandArg( async def _deal_del_vote_item( event: GroupMessageEvent, item_id: str = ArgPlainText("ts_del_vote_item_id") ): - tm = ThesaurusManager() group_id = event.group_id result = await tm.del_item(item_id, group_id, False) @@ -359,12 +350,11 @@ async def _deal_del_vote_item( _LIST_SHOW_DATA: dict = dict() -list_item = ThesaurusManager().cmd_as_group("list", "查看本群词条") +list_item = thes.cmd_as_group("list", "查看本群词条") @list_item.handle() async def _get_normal_item_list(event: GroupMessageEvent): - tm = ThesaurusManager() group_id = event.group_id query_result = await tm.get_item_list({"group_id": group_id}, True) @@ -416,7 +406,6 @@ async def _get_normal_item_more( else: _LIST_SHOW_DATA[group_id] = {user_id: 10} - tm = ThesaurusManager() items = list() show_item = _LIST_SHOW_DATA[group_id][user_id] query_result = await tm.get_item_list({"group_id": group_id}, True) @@ -439,13 +428,11 @@ async def _get_normal_item_more( await list_item.reject(output) -list_global_item = ThesaurusManager().cmd_as_group("list.g", "查看全局词条") +list_global_item = thes.cmd_as_group("list.g", "查看全局词条") @list_global_item.handle() async def _get_global_item_list(event: MessageEvent): - tm = ThesaurusManager() - query_result = await tm.get_item_list({"group_id": 0}, True) if not query_result: await list_global_item.finish("还没有给咱添加全局词条呢...") @@ -494,7 +481,6 @@ async def _get_global_item_more( else: _LIST_SHOW_DATA[user_id] = 10 - tm = ThesaurusManager() items = list() show_item = _LIST_SHOW_DATA[user_id] query_result = await tm.get_item_list({"group_id": 0}, True) @@ -517,12 +503,11 @@ async def _get_global_item_more( await list_global_item.reject(output) -list_vote_item = ThesaurusManager().cmd_as_group("list.v", "查看本群待投票词条") +list_vote_item = thes.cmd_as_group("list.v", "查看本群待投票词条") @list_vote_item.handle() async def _get_vote_item_list(event: GroupMessageEvent): - tm = ThesaurusManager() group_id = event.group_id query_result = await tm.get_item_list({"group_id": group_id}) @@ -574,7 +559,6 @@ async def _get_vote_item_more( else: _LIST_SHOW_DATA[group_id] = {user_id: 10} - tm = ThesaurusManager() items = list() show_item = _LIST_SHOW_DATA[group_id][user_id] query_result = await tm.get_item_list({"group_id": group_id}) @@ -597,9 +581,7 @@ async def _get_vote_item_more( await list_vote_item.reject(output) -audit_item = ThesaurusManager().cmd_as_group( - "audit", "审核本群处于投票中的词条", permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN -) +audit_item = thes.cmd_as_group("audit", "审核本群处于投票中的词条", permission=ADMIN) @audit_item.handle() @@ -617,7 +599,6 @@ async def _get_group_item_info(matcher: Matcher, args: Message = CommandArg()): async def _get_audit_item_id( event: GroupMessageEvent, item_id: str = ArgPlainText("ts_group_vote_id") ): - tm = ThesaurusManager() group_id = event.group_id query_result = await tm.get_item_list({"_id": item_id, "group_id": group_id}) @@ -625,13 +606,14 @@ async def _get_audit_item_id( await audit_item.finish("未找到此id相关信息...请检查是否输入正确(") item_info = query_result[0] - result = f"""你即将要审核的词条信息: - 词条ID: {item_info._id} - 有人问: {item_info.matcher} - 我答: {"、".join(map(str, item_info.result))} - 提交人: {item_info.operator}@{item_info.operator_id} - 当前赞成: {"、".join(map(str, item_info.vote_list))} - """.strip() + result = ( + MessageBuilder("你即将要审核的词条信息:") + .text(f"词条ID: {item_info._id}") + .text(f"有人问: {item_info.matcher}") + .text(f"我答: {'、'.join(map(str, item_info.result))}") + .text(f"提交人: {item_info.operator}@{item_info.operator_id}") + .text(f"当前赞成: {'、'.join(map(str, item_info.vote_list))}") + ) await audit_item.send(Message(result)) @@ -646,7 +628,6 @@ async def _get_audit_attitude( if attitude not in agree_list and attitude not in disagree_list: await audit_item.reject("你的观点似乎不相关呢...请重新输入: (y/n)") - tm = ThesaurusManager() group_id = event.group_id query_result = await tm.get_item_list({"_id": item_id, "group_id": group_id}) @@ -675,19 +656,21 @@ async def _get_audit_attitude( await audit_item.finish("完成~!") -_ITEM_SHOW_FORMAT = """该词条信息如下: -词条ID: {_id} -有人问: {matcher} -我答: {ans} -判断方式: {m_type} -提交人: {operator}@{operator_id} -更新时间: {update_time} -是否为投票选出: {is_vote} -投票赞成: {vote_list} -""" +_ITEM_SHOW_FORMAT = ( + MessageBuilder("该词条信息如下:") + .text("词条ID: {_id}") + .text("有人问: {matcher}") + .text("我答: {ans}") + .text("判断方式: {m_type}") + .text("提交人: {operator}@{operator_id}") + .text("更新时间: {update_time}") + .text("是否为投票选出: {is_vote}") + .text("投票赞成: {vote_list}") + .done() +) -get_normal_item_info = ThesaurusManager().cmd_as_group("i", "查看本群的词条详情") +get_normal_item_info = thes.cmd_as_group("i", "查看本群的词条详情") @get_normal_item_info.handle() @@ -701,7 +684,6 @@ async def _info_normal_get_item_id(matcher: Matcher, args: Message = CommandArg( async def _info_normal_get_item_info( event: GroupMessageEvent, _id: str = ArgPlainText("info_normal_item_id") ): - tm = ThesaurusManager() group_id = event.group_id query_result = await tm.get_item_list({"_id": _id, "group_id": group_id}, True) @@ -734,7 +716,7 @@ async def _info_normal_get_item_info( await get_normal_item_info.finish(Message(result)) -get_global_item_info = ThesaurusManager().cmd_as_group("i.g", "查看全局的词条详情") +get_global_item_info = thes.cmd_as_group("i.g", "查看全局的词条详情") @get_global_item_info.handle() @@ -746,8 +728,6 @@ async def _info_global_get_item_id(matcher: Matcher, args: Message = CommandArg( @get_global_item_info.got("info_global_item_id", "需要查看的词条ID:") async def _info_global_get_item_info(_id: str = ArgPlainText("info_global_item_id")): - tm = ThesaurusManager() - query_result = await tm.get_item_list({"_id": _id, "group_id": 0}, True) if not query_result: await get_global_item_info.finish("未找到此ID相关信息...") @@ -778,7 +758,7 @@ async def _info_global_get_item_info(_id: str = ArgPlainText("info_global_item_i await get_global_item_info.finish(Message(result)) -get_vote_item_info = ThesaurusManager().cmd_as_group("i.v", "查看本群的待审核/投票的词条详情") +get_vote_item_info = thes.cmd_as_group("i.v", "查看本群的待审核/投票的词条详情") @get_vote_item_info.handle() @@ -792,7 +772,6 @@ async def _info_vote_get_item_id(matcher: Matcher, args: Message = CommandArg()) async def _info_vote_get_item_info( event: GroupMessageEvent, _id: str = ArgPlainText("info_vote_item_id") ): - tm = ThesaurusManager() group_id = event.group_id query_result = await tm.get_item_list({"_id": _id, "group_id": group_id}) diff --git a/ATRI/plugins/thesaurus/data_source.py b/ATRI/plugins/thesaurus/data_source.py index 23dddc5..8098179 100644 --- a/ATRI/plugins/thesaurus/data_source.py +++ b/ATRI/plugins/thesaurus/data_source.py @@ -1,24 +1,13 @@ import pytz from datetime import datetime -from ATRI.service import Service -from ATRI.rule import is_in_service from ATRI.exceptions import ThesaurusError from .db import DBForTS, DBForTAL from .db import ThesaurusStoragor -class ThesaurusManager(Service): - def __init__(self): - Service.__init__( - self, - "词库管理", - "支持模糊匹配、全匹配、正则的自定义回复~\n支持分群、全局管理,支持群内投票添加", - rule=is_in_service("词库管理"), - main_cmd="/ts", - ) - +class ThesaurusManager: async def __add_item(self, _id: str, group_id: int, is_main: bool = False): if is_main: try: @@ -167,10 +156,7 @@ class ThesaurusManager(Service): ) -class ThesaurusListener(Service): - def __init__(self): - Service.__init__(self, "词库监听", "词库监听器", rule=is_in_service("词库监听")) - +class ThesaurusListener: async def get_item_by_id(self, _id: str) -> ThesaurusStoragor: try: async with DBForTS() as db: diff --git a/ATRI/plugins/thesaurus/listener.py b/ATRI/plugins/thesaurus/listener.py index 1a49b35..4e37f90 100644 --- a/ATRI/plugins/thesaurus/listener.py +++ b/ATRI/plugins/thesaurus/listener.py @@ -10,15 +10,18 @@ from apscheduler.triggers.combining import AndTrigger from apscheduler.triggers.interval import IntervalTrigger from ATRI.log import log +from ATRI.service import Service from ATRI.utils.apscheduler import scheduler from .data_source import ThesaurusManager, ThesaurusListener, ThesaurusStoragor +thes_listener = Service("词库监听").document("词库监听器") + + class ThesaurusLinstenerIsEnabledChecker(BaseTrigger): def get_next_fire_time(self, previous_fire_time, now): - tm = ThesaurusManager() - conf = tm.load_service("词库管理") + conf = thes_listener.load_service("词库管理") if conf.get("enabled"): return now @@ -71,7 +74,7 @@ def init_listener(): ) -main_listener = ThesaurusListener().on_message( +main_listener = thes_listener.on_message( "词库监听器", "监听所有消息判断是否满足触发词条条件", priority=4, block=False ) diff --git a/ATRI/plugins/twitter/__init__.py b/ATRI/plugins/twitter/__init__.py index 35c07f7..14c9ee8 100644 --- a/ATRI/plugins/twitter/__init__.py +++ b/ATRI/plugins/twitter/__init__.py @@ -11,12 +11,15 @@ from apscheduler.triggers.interval import IntervalTrigger from nonebot import get_bot from nonebot.matcher import Matcher from nonebot.params import CommandArg, ArgPlainText -from nonebot.permission import Permission, SUPERUSER +from nonebot.permission import Permission from nonebot.adapters.onebot.v11 import Message, MessageSegment, GroupMessageEvent, Bot from ATRI.log import log +from ATRI.service import Service +from ATRI.permission import ADMIN from ATRI.utils import timestamp2datetime from ATRI.utils.apscheduler import scheduler +from ATRI.permission import MASTER from ATRI.database import TwitterSubscription from .data_source import TwitterDynamicSubscriptor @@ -25,7 +28,11 @@ from .data_source import TwitterDynamicSubscriptor _CONTENT_LIMIT: int = 0 -add_sub = TwitterDynamicSubscriptor().cmd_as_group("add", "添加推主订阅") +twitter = Service("推特动态订阅").document("推特动态订阅助手~").permission(ADMIN).main_cmd("/td") +sub = TwitterDynamicSubscriptor() + + +add_sub = twitter.cmd_as_group("add", "添加推主订阅") @add_sub.handle() @@ -40,19 +47,17 @@ async def _td_deal_add_sub( event: GroupMessageEvent, _name: str = ArgPlainText("td_add_sub_name") ): group_id = event.group_id - sub = TwitterDynamicSubscriptor() result = await sub.add_sub(_name, group_id) await add_sub.finish(result) -del_sub = TwitterDynamicSubscriptor().cmd_as_group("del", "删除推主订阅") +del_sub = twitter.cmd_as_group("del", "删除推主订阅") @del_sub.handle() async def _td_del_sub(event: GroupMessageEvent): group_id = event.group_id - sub = TwitterDynamicSubscriptor() query_result = await sub.get_sub_list(group_id=group_id) if not query_result: @@ -79,21 +84,17 @@ async def _td_deal_del_sub( group_id = event.group_id tid = int(_tid) - sub = TwitterDynamicSubscriptor() result = await sub.del_sub(int(tid), group_id) await del_sub.finish(result) -get_sub_list = TwitterDynamicSubscriptor().cmd_as_group( - "list", "获取本群推主订阅列表", permission=Permission() -) +get_sub_list = twitter.cmd_as_group("list", "获取本群推主订阅列表", permission=Permission()) @get_sub_list.handle() async def _td_get_sub_list(event: GroupMessageEvent): group_id = event.group_id - sub = TwitterDynamicSubscriptor() query_result = await sub.get_sub_list(group_id=group_id) if not query_result: @@ -114,9 +115,7 @@ async def _td_get_sub_list(event: GroupMessageEvent): await get_sub_list.finish(output) -limit_content = TwitterDynamicSubscriptor().cmd_as_group( - "limit", "设置订阅内容字数限制", permission=SUPERUSER -) +limit_content = twitter.cmd_as_group("limit", "设置订阅内容字数限制", permission=MASTER) @limit_content.handle() @@ -144,8 +143,7 @@ tq = asyncio.Queue() class TwitterDynamicChecker(BaseTrigger): def get_next_fire_time(self, previous_fire_time, now): - sub = TwitterDynamicSubscriptor() - conf = sub.load_service("推特动态订阅") + conf = twitter.load_service("推特动态订阅") if conf.get("enabled"): return now @@ -157,7 +155,6 @@ class TwitterDynamicChecker(BaseTrigger): misfire_grace_time=60, # type: ignore ) async def _check_td(): - sub = TwitterDynamicSubscriptor() try: all_dy = await sub.get_all_subs() except Exception: @@ -170,7 +167,12 @@ async def _check_td(): else: m: TwitterSubscription = tq.get_nowait() - _bot: Bot = get_bot() + try: + _bot: Bot = get_bot() # type: ignore + except Exception: + log.warning("当前无在线协议端, 已停止推送") + return + group_list = await _bot.get_group_list() gl = [f"{i['group_id']}" for i in group_list] if m.group_id not in gl: diff --git a/ATRI/plugins/twitter/data_source.py b/ATRI/plugins/twitter/data_source.py index 8f3e793..c735b1f 100644 --- a/ATRI/plugins/twitter/data_source.py +++ b/ATRI/plugins/twitter/data_source.py @@ -1,11 +1,7 @@ from datetime import datetime -from nonebot.permission import SUPERUSER -from nonebot.adapters.onebot.v11 import GROUP_OWNER, GROUP_ADMIN - from ATRI import driver -from ATRI.service import Service, ServiceTools -from ATRI.rule import is_in_service +from ATRI.service import ServiceTools from ATRI.log import log from ATRI.utils import request from ATRI.utils.apscheduler import scheduler @@ -21,17 +17,7 @@ _DYNAMIC_OUTPUT_FORMAT = ( ) -class TwitterDynamicSubscriptor(Service): - def __init__(self): - Service.__init__( - self, - "推特动态订阅", - "推特动态订阅助手~", - rule=is_in_service("推特动态订阅"), - permission=SUPERUSER | GROUP_OWNER | GROUP_ADMIN, - main_cmd="/td", - ) - +class TwitterDynamicSubscriptor: async def __add_sub(self, tid: int, group_id: int): try: async with DB() as db: diff --git a/ATRI/plugins/util/__init__.py b/ATRI/plugins/util/__init__.py index 19fdcaf..26ef570 100644 --- a/ATRI/plugins/util/__init__.py +++ b/ATRI/plugins/util/__init__.py @@ -3,13 +3,18 @@ from random import choice, random from nonebot.matcher import Matcher from nonebot.params import CommandArg, ArgPlainText -from nonebot.adapters.onebot.v11 import MessageEvent, Message +from nonebot.adapters.onebot.v11 import Message from nonebot.adapters.onebot.v11.helpers import Cooldown -from .data_source import Encrypt, Utils, Yinglish +from ATRI.service import Service +from .data_source import Encrypt, Yinglish, roll_dice -roll = Utils().on_command("/roll", "骰子~用法:1d10 或 2d10+2d10+more") + +utils = Service("小工具").document("非常实用(?)的工具们!") + + +roll = utils.on_command("/roll", "骰子~用法: 1d10 或 2d10+2d10+more") @roll.handle() @@ -19,18 +24,18 @@ async def _ready_roll(matcher: Matcher, args: Message = CommandArg()): matcher.set_arg("roll", args) [email protected]("roll", "参数呢?!格式:1d10 或 2d10+2d10+more") [email protected]("roll", "参数呢?! 格式: 1d10 或 2d10+2d10+more") async def _deal_roll(roll_msg: str = ArgPlainText("roll")): match = re.match(r"^([\dd+\s]+?)$", roll_msg) if not match: - await roll.finish("阿——!参数不对!格式:1d10 或 2d10+2d10+more") + await roll.finish("阿——! 参数不对! 格式: 1d10 或 2d10+2d10+more") - msg = Utils().roll_dice(roll_msg) + msg = roll_dice(roll_msg) await roll.finish(msg) -encrypt_en = Utils().on_command("加密", "我们之间的秘密❤") +encrypt_en = utils.on_command("加密", "我们之间的秘密❤") @encrypt_en.handle() @@ -50,7 +55,7 @@ async def _deal_en(text: str = ArgPlainText("encr_en_text")): await encrypt_en.finish(result) -encrypt_de = Utils().on_command("解密", "解开我们的秘密❤") +encrypt_de = utils.on_command("解密", "解开我们的秘密❤") @encrypt_de.handle() @@ -67,7 +72,7 @@ async def _deal_de(text: str = ArgPlainText("encr_de_text")): await encrypt_de.finish(result) -sepi = Utils().on_command("涩批一下", "将正常的句子涩一涩~") +sepi = utils.on_command("涩批一下", "将正常的句子涩一涩~") _sepi_flmt_notice = choice(["涩批爬", "✌🥵✌"]) @@ -81,10 +86,9 @@ async def _ready_sepi(matcher: Matcher, args: Message = CommandArg()): @sepi.got("sepi_text", "内容呢?!") -async def _deal_sepi(event: MessageEvent, msg: str = ArgPlainText("sepi_text")): - user_id = event.get_user_id() +async def _deal_sepi(msg: str = ArgPlainText("sepi_text")): if len(msg) < 4: await sepi.finish("这么短?涩不起来!") - result = Yinglish.deal(msg, random()) + result = Yinglish(msg).deal(random()) await sepi.finish(result) diff --git a/ATRI/plugins/util/data_source.py b/ATRI/plugins/util/data_source.py index 4a73c26..5245518 100644 --- a/ATRI/plugins/util/data_source.py +++ b/ATRI/plugins/util/data_source.py @@ -4,48 +4,40 @@ import jieba.posseg as pseg from typing import Union, Optional from random import random, choice, randint -from ATRI.service import Service -from ATRI.rule import is_in_service +def roll_dice(par: str) -> str: + result = 0 + proc = "" + proc_list = [] + p = par.split("+") -class Utils(Service): - def __init__(self): - Service.__init__(self, "小工具", "非常实用(?)的工具们!", rule=is_in_service("小工具")) + for i in p: + args = re.findall(r"(\d{0,10})(?:(d)(\d{1,10}))", i) + args = list(args[0]) - @staticmethod - def roll_dice(par: str) -> str: - result = 0 - proc = "" - proc_list = [] - p = par.split("+") + args[0] = args[0] or 1 + if int(args[0]) >= 5000 or int(args[2]) >= 5000: + return "阿...好大......" - for i in p: - args = re.findall(r"(\d{0,10})(?:(d)(\d{1,10}))", i) - args = list(args[0]) + for a in range(1, int(args[0]) + 1): + rd = randint(1, int(args[2])) + result = result + rd - args[0] = args[0] or 1 - if int(args[0]) >= 5000 or int(args[2]) >= 5000: - return "阿...好大......" + if len(proc_list) <= 10: + proc_list.append(rd) - for a in range(1, int(args[0]) + 1): - rd = randint(1, int(args[2])) - result = result + rd + if len(proc_list) <= 10: + proc += "+".join(map(str, proc_list)) + elif len(proc_list) > 10: + proc += "太长了不展示了就酱w" + else: + proc += str(result) - if len(proc_list) <= 10: - proc_list.append(rd) + result = f"{par}=({proc})={result}" + return result - if len(proc_list) <= 10: - proc += "+".join(map(str, proc_list)) - elif len(proc_list) > 10: - proc += "太长了不展示了就酱w" - else: - proc += str(result) - - result = f"{par}=({proc})={result}" - return result - -class Encrypt(Utils): +class Encrypt: """ 某nb改的(逃 总之就是非常nb @@ -183,8 +175,10 @@ class Encrypt(Utils): raise ValueError("Decoding failed") -class Yinglish(Utils): - @staticmethod +class Yinglish: + def __init__(self, context: str): + self.context = context + def _to_ying(x, y, ying) -> str: if random() > ying: return x @@ -208,6 +202,5 @@ class Yinglish(Utils): x = "〇" * len(x) return str(choice([f"...{x}", f"....{x}", f".....{x}", f"......{x}"])) - @classmethod - def deal(cls, text, ying: Optional[float] = 0.5) -> str: - return "".join([cls._to_ying(x, y, ying) for x, y in pseg.cut(text)]) + def deal(self, ying: Optional[float] = 0.5) -> str: + return "".join([self._to_ying(x, y, ying) for x, y in pseg.cut(self.context)]) |