summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ATRI/plugins/anime_search.py24
-rw-r--r--ATRI/plugins/anti_effort/__init__.py62
-rw-r--r--ATRI/plugins/anti_effort/data_source.py10
-rw-r--r--ATRI/plugins/applet/__init__.py7
-rw-r--r--ATRI/plugins/applet/data_source.py9
-rw-r--r--ATRI/plugins/auto_tietie.py12
-rw-r--r--ATRI/plugins/bilibili_dynamic/__init__.py31
-rw-r--r--ATRI/plugins/bilibili_dynamic/data_source.py17
-rw-r--r--ATRI/plugins/broadcast.py23
-rw-r--r--ATRI/plugins/code_runner/__init__.py10
-rw-r--r--ATRI/plugins/code_runner/data_source.py21
-rw-r--r--ATRI/plugins/console/__init__.py48
-rw-r--r--ATRI/plugins/console/data_source.py17
-rw-r--r--ATRI/plugins/essential.py22
-rw-r--r--ATRI/plugins/funny/__init__.py13
-rw-r--r--ATRI/plugins/funny/data_source.py7
-rw-r--r--ATRI/plugins/help/__init__.py14
-rw-r--r--ATRI/plugins/help/data_source.py13
-rw-r--r--ATRI/plugins/kimo/__init__.py9
-rw-r--r--ATRI/plugins/kimo/data_source.py9
-rw-r--r--ATRI/plugins/manage/__init__.py48
-rw-r--r--ATRI/plugins/manage/data_source.py24
-rw-r--r--ATRI/plugins/polaroid/__init__.py8
-rw-r--r--ATRI/plugins/polaroid/data_source.py8
-rw-r--r--ATRI/plugins/repo.py3
-rw-r--r--ATRI/plugins/rss/__init__.py32
-rw-r--r--ATRI/plugins/rss/rss_mikanan/__init__.py36
-rw-r--r--ATRI/plugins/rss/rss_mikanan/data_source.py20
-rw-r--r--ATRI/plugins/rss/rss_rsshub/__init__.py30
-rw-r--r--ATRI/plugins/rss/rss_rsshub/data_source.py17
-rw-r--r--ATRI/plugins/saucenao/__init__.py8
-rw-r--r--ATRI/plugins/saucenao/data_source.py6
-rw-r--r--ATRI/plugins/setu/__init__.py39
-rw-r--r--ATRI/plugins/setu/data_source.py7
-rw-r--r--ATRI/plugins/status/__init__.py10
-rw-r--r--ATRI/plugins/status/data_source.py37
-rw-r--r--ATRI/plugins/thesaurus/__init__.py133
-rw-r--r--ATRI/plugins/thesaurus/data_source.py18
-rw-r--r--ATRI/plugins/thesaurus/listener.py9
-rw-r--r--ATRI/plugins/twitter/__init__.py36
-rw-r--r--ATRI/plugins/twitter/data_source.py18
-rw-r--r--ATRI/plugins/util/__init__.py28
-rw-r--r--ATRI/plugins/util/data_source.py69
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)])