diff options
-rw-r--r-- | ATRI/config.py | 3 | ||||
-rw-r--r-- | ATRI/plugins/anime_search.py | 35 | ||||
-rw-r--r-- | ATRI/plugins/chat/__init__.py | 35 | ||||
-rw-r--r-- | ATRI/plugins/code_runner/__init__.py | 11 | ||||
-rw-r--r-- | ATRI/plugins/funny/__init__.py | 35 | ||||
-rw-r--r-- | ATRI/plugins/repo.py | 17 | ||||
-rw-r--r-- | ATRI/plugins/rich/__init__.py | 10 | ||||
-rw-r--r-- | ATRI/plugins/saucenao/__init__.py | 25 | ||||
-rw-r--r-- | ATRI/plugins/setu/__init__.py | 58 | ||||
-rw-r--r-- | ATRI/plugins/setu/data_source.py | 38 | ||||
-rw-r--r-- | ATRI/plugins/util/__init__.py | 15 | ||||
-rw-r--r-- | ATRI/plugins/wife/__init__.py | 30 | ||||
-rw-r--r-- | ATRI/utils/limit.py | 142 | ||||
-rw-r--r-- | config.yml | 1 |
14 files changed, 91 insertions, 364 deletions
diff --git a/ATRI/config.py b/ATRI/config.py index 66e65fc..f9b8d95 100644 --- a/ATRI/config.py +++ b/ATRI/config.py @@ -35,6 +35,7 @@ class InlineGoCQHTTP: enabled: bool = bool(config.get("enabled", True)) accounts: list = config.get("accounts", []) + download_domain: str = config.get("download_domain", "download.fastgit.org") download_version: str = str(config.get("download_version", "latest")) @@ -60,6 +61,8 @@ RUNTIME_CONFIG = { "command_start": BotSelfConfig.command_start, "command_sep": BotSelfConfig.command_sep, "session_expire_timeout": BotSelfConfig.session_expire_timeout, + "gocq_accounts": InlineGoCQHTTP.accounts, + "gocq_download_domain": InlineGoCQHTTP.download_domain, "gocq_version": InlineGoCQHTTP.download_version, } diff --git a/ATRI/plugins/anime_search.py b/ATRI/plugins/anime_search.py index 7436aa2..2909632 100644 --- a/ATRI/plugins/anime_search.py +++ b/ATRI/plugins/anime_search.py @@ -1,18 +1,14 @@ -import re from random import choice -from nonebot.matcher import Matcher -from nonebot.params import ArgPlainText, CommandArg from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message, MessageSegment +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.utils.limit import FreqLimiter from ATRI.exceptions import RequestError URL = "https://api.trace.moe/search?anilistInfo=true&url=" -_anime_flmt = FreqLimiter(10) _anime_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) __doc__ = """ @@ -31,13 +27,16 @@ class Anime(Service): res = await request.get(aim) except RequestError: raise RequestError("Request failed!") - result = await res.json() + result = res.json() return result @classmethod async def search(cls, url: str) -> str: data = await cls._request(url) - data = data["result"] + try: + data = data["result"] + except: + return "没有相似的结果呢..." d = dict() for i in range(3): @@ -80,30 +79,16 @@ class Anime(Service): anime_search = Anime().on_command("以图搜番", "发送一张图以搜索可能的番剧") -@anime_search.handle() -async def _ready_sear( - matcher: Matcher, event: MessageEvent, args: Message = CommandArg() -): - user_id = event.get_user_id() - if not _anime_flmt.check(user_id): - await anime_search.finish(_anime_flmt_notice) - - msg = args.extract_plain_text() - if msg: - matcher.set_arg("anime_pic", args) - - -@anime_search.got("anime_pic", "图呢?") +@anime_search.got("anime_pic", "图呢?", [Cooldown(5, prompt=_anime_flmt_notice)]) async def _deal_sear( - bot: Bot, event: MessageEvent, pic: str = ArgPlainText("anime_pic") + bot: Bot, event: MessageEvent ): user_id = event.get_user_id() - img = re.findall(r"url=(.*?)]", pic) + img = extract_image_urls(event.message) if not img: - await anime_search.reject("请发送图片而不是其它东西!!") + await anime_search.finish("请发送图片而不是其它东西!!") await bot.send(event, "别急,在找了") a = await Anime().search(img[0]) result = f"> {MessageSegment.at(user_id)}\n" + a - _anime_flmt.start_cd(user_id) await anime_search.finish(Message(result)) diff --git a/ATRI/plugins/chat/__init__.py b/ATRI/plugins/chat/__init__.py index 217c71e..2b03792 100644 --- a/ATRI/plugins/chat/__init__.py +++ b/ATRI/plugins/chat/__init__.py @@ -2,28 +2,24 @@ from random import choice from nonebot.matcher import Matcher from nonebot.params import ArgPlainText, CommandArg -from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message +from nonebot.adapters.onebot.v11 import MessageEvent, Message +from nonebot.adapters.onebot.v11.helpers import Cooldown -from ATRI.utils.limit import FreqLimiter from ATRI.utils.apscheduler import scheduler from .data_source import Chat -_chat_flmt = FreqLimiter(3) + _chat_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~", "我开始为你以后的伴侣担心了..."]) chat = Chat().on_message("文爱", "闲聊(文爱") -async def _chat(bot: Bot, event: MessageEvent): [email protected]([Cooldown(3, prompt=_chat_flmt_notice)]) +async def _chat(event: MessageEvent): user_id = event.get_user_id() - if not _chat_flmt.check(user_id): - await chat.finish(_chat_flmt_notice) - msg = str(event.message) repo = await Chat().deal(msg, user_id) - _chat_flmt.start_cd(user_id) try: await chat.finish(repo) except Exception: @@ -33,12 +29,8 @@ async def _chat(bot: Bot, event: MessageEvent): my_name_is = Chat().on_command("叫我", "更改闲聊(文爱)时的称呼", aliases={"我是"}, priority=1) -@my_name_is.handle() -async def _name(matcher: Matcher, event: MessageEvent, args: Message = CommandArg()): - user_id = event.get_user_id() - if not _chat_flmt.check(user_id): - await my_name_is.finish(_chat_flmt_notice) - +@my_name_is.handle([Cooldown(3, prompt=_chat_flmt_notice)]) +async def _name(matcher: Matcher, args: Message = CommandArg()): msg = args.extract_plain_text() if msg: matcher.set_arg("name", args) @@ -56,30 +48,23 @@ async def _deal_name(event: MessageEvent, new_name: str = ArgPlainText("name")): ] ) Chat().name_is(user_id, new_name) - _chat_flmt.start_cd(user_id) await my_name_is.finish(repo) say = Chat().on_command("说", "别人让我说啥就说啥(", priority=1) [email protected]([Cooldown(3, prompt=_chat_flmt_notice)]) async def _ready_say( - matcher: Matcher, event: MessageEvent, args: Message = CommandArg() + matcher: Matcher, args: Message = CommandArg() ): - user_id = event.get_user_id() - if not _chat_flmt.check(user_id): - await say.finish(_chat_flmt_notice) - msg = args.extract_plain_text() if msg: matcher.set_arg("say", args) @say.got("say", "想要咱复读啥呢...") -async def _deal_say(event: MessageEvent, msg: str = ArgPlainText("say")): - user_id = event.get_user_id() - _chat_flmt.start_cd(user_id) +async def _deal_say(msg: str = ArgPlainText("say")): await say.finish(msg) diff --git a/ATRI/plugins/code_runner/__init__.py b/ATRI/plugins/code_runner/__init__.py index 26f5c52..01b09c6 100644 --- a/ATRI/plugins/code_runner/__init__.py +++ b/ATRI/plugins/code_runner/__init__.py @@ -3,28 +3,24 @@ from random import choice from nonebot.matcher import Matcher 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.utils.limit import FreqLimiter from .data_source import CodeRunner -_flmt = FreqLimiter(5) _flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) code_runner = CodeRunner().on_command("/code", "在线运行一段代码,帮助:/code help") -@code_runner.handle() +@code_runner.handle([Cooldown(5, prompt=_flmt_notice)]) async def _code_runner( matcher: Matcher, event: MessageEvent, args: Message = CommandArg() ): user_id = event.get_user_id() - if not _flmt.check(user_id): - await code_runner.finish(_flmt_notice) - msg = args.extract_plain_text() - print(msg, args, type(msg), type(args)) + if msg: matcher.set_arg("opt", args) else: @@ -44,5 +40,4 @@ async def _(event: MessageEvent, opt: str = ArgPlainText("opt")): else: content = MessageSegment.at(user_id) + await CodeRunner().runner(unescape(opt)) - _flmt.start_cd(user_id) await code_runner.finish(Message(content)) diff --git a/ATRI/plugins/funny/__init__.py b/ATRI/plugins/funny/__init__.py index 8173f3b..5b158b2 100644 --- a/ATRI/plugins/funny/__init__.py +++ b/ATRI/plugins/funny/__init__.py @@ -3,8 +3,8 @@ from random import choice, randint from nonebot.matcher import Matcher 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.utils.limit import FreqLimiter, DailyLimiter from .data_source import Funny @@ -29,26 +29,18 @@ async def _me_re_you(bot: Bot, event: MessageEvent): await me_re_you.finish(content) +_fake_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) + + fake_msg = Funny().on_command( "/fakemsg", "伪造假转发内容,格式:qq-name-content\n可构造多条,使用空格隔开,仅限群聊" ) -_fake_daliy_max = DailyLimiter(3) -_fake_max_notice = "不能继续下去了!明早再来" -_fake_flmt = FreqLimiter(60) -_fake_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) - -@fake_msg.handle() +@fake_msg.handle([Cooldown(3600, prompt=_fake_flmt_notice)]) async def _ready_fake( - matcher: Matcher, event: GroupMessageEvent, args: Message = CommandArg() + matcher: Matcher, args: Message = CommandArg() ): - user_id = event.get_user_id() - if not _fake_daliy_max.check(user_id): - await fake_msg.finish(_fake_max_notice) - if not _fake_flmt.check(user_id): - await fake_msg.finish(_fake_flmt_notice) - msg = args.extract_plain_text() if msg: matcher.set_arg("content", args) @@ -59,7 +51,6 @@ async def _deal_fake( bot: Bot, event: GroupMessageEvent, content: str = ArgPlainText("content") ): group_id = event.group_id - user_id = event.get_user_id() try: node = Funny().fake_msg(content) except Exception: @@ -70,23 +61,13 @@ async def _deal_fake( except Exception: await fake_msg.finish("构造失败惹...可能是被制裁了(") - _fake_flmt.start_cd(user_id) - _fake_daliy_max.increase(user_id) - eat_what = Funny().on_regex(r"大?[今明后]天(.*?)吃[什啥]么?", "我来决定你吃什么!") -_eat_flmt = FreqLimiter(15) - - -@eat_what.handle() -async def _eat_what(bot: Bot, event: MessageEvent): - user_id = event.get_user_id() - if not _eat_flmt.check(user_id): - return +@eat_what.handle([Cooldown(15, prompt="慢慢吃,不要贪心哦!")]) +async def _eat_what(event: MessageEvent): msg = str(event.get_message()) user_name = event.sender.nickname or "裙友" eat = await Funny().eat_what(user_name, msg) - _eat_flmt.start_cd(user_id) await eat_what.finish(Message(eat)) diff --git a/ATRI/plugins/repo.py b/ATRI/plugins/repo.py index 40869eb..57fa327 100644 --- a/ATRI/plugins/repo.py +++ b/ATRI/plugins/repo.py @@ -3,16 +3,13 @@ from random import choice from nonebot.matcher import Matcher from nonebot.params import CommandArg, ArgPlainText from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message +from nonebot.adapters.onebot.v11.helpers import Cooldown from ATRI.service import Service from ATRI.config import BotSelfConfig -from ATRI.utils.limit import FreqLimiter, DailyLimiter -_repo_flmt = FreqLimiter(20) _repo_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) -_repo_dlmt = DailyLimiter(5) -_repo_dlmt_notice = "阿!不能再喝了,再喝就晕过去了!" REPO_FORMAT = """ @@ -29,16 +26,10 @@ class Repo(Service): reporter = Repo().on_command("来杯红茶", "向维护者发送消息", aliases={"反馈", "报告"}) [email protected]([Cooldown(120, prompt=_repo_flmt_notice)]) async def _ready_repo( - matcher: Matcher, event: MessageEvent, args: Message = CommandArg() + matcher: Matcher, args: Message = CommandArg() ): - user_id = event.get_user_id() - if not _repo_flmt.check(user_id): - await reporter.finish(_repo_flmt_notice) - if not _repo_dlmt.check(user_id): - await reporter.finish(_repo_dlmt_notice) - msg = args.extract_plain_text() if msg: matcher.set_arg("repo", args) @@ -59,6 +50,4 @@ async def _deal_repo( except BaseException: await reporter.finish("发送失败了呢...") - _repo_flmt.start_cd(user_id) - _repo_dlmt.increase(user_id) await reporter.finish("吾辈的心愿已由咱转告维护者!") diff --git a/ATRI/plugins/rich/__init__.py b/ATRI/plugins/rich/__init__.py index 3b49750..2d8f8c6 100644 --- a/ATRI/plugins/rich/__init__.py +++ b/ATRI/plugins/rich/__init__.py @@ -1,20 +1,15 @@ from nonebot.adapters.onebot.v11 import MessageEvent +from nonebot.adapters.onebot.v11.helpers import Cooldown -from ATRI.utils.limit import FreqLimiter from ATRI.log import logger as log from .data_source import Rich -_rich_flmt = FreqLimiter(3) bili_rich = Rich().on_message("小程序检测", "小程序爪巴", block=False) -@bili_rich.handle() +@bili_rich.handle([Cooldown(3)]) async def _fk_bili(event: MessageEvent): - user_id = event.get_user_id() - if not _rich_flmt.check(user_id): - return - msg = str(event.message) try: result, is_ok = await Rich().fk_bili(msg) @@ -23,5 +18,4 @@ async def _fk_bili(event: MessageEvent): log.debug(result, is_ok) if not is_ok: return - _rich_flmt.start_cd(user_id) await bili_rich.finish(result) diff --git a/ATRI/plugins/saucenao/__init__.py b/ATRI/plugins/saucenao/__init__.py index 092db50..d3ad38f 100644 --- a/ATRI/plugins/saucenao/__init__.py +++ b/ATRI/plugins/saucenao/__init__.py @@ -1,39 +1,23 @@ from re import findall from random import choice -from nonebot.matcher import Matcher -from nonebot.params import ArgPlainText, CommandArg from nonebot.adapters.onebot.v11 import MessageEvent, Message, MessageSegment +from nonebot.adapters.onebot.v11.helpers import extract_image_urls, Cooldown from ATRI.config import SauceNAO -from ATRI.utils.limit import FreqLimiter from .data_source import SaouceNao -_search_flmt = FreqLimiter(10) _search_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) saucenao = SaouceNao().on_command("以图搜图", "透过一张图搜索可能的来源") -async def _ready_search( - matcher: Matcher, event: MessageEvent, args: Message = CommandArg() -): [email protected]("saucenao_img", "图呢?", [Cooldown(5, prompt=_search_flmt_notice)]) +async def _deal_search(event: MessageEvent): user_id = event.get_user_id() - if not _search_flmt.check(user_id): - await saucenao.finish(_search_flmt_notice) - - msg = args.extract_plain_text() - if msg: - matcher.set_arg("saucenao_img", args) - - [email protected]("saucenao_img", "图呢?") -async def _deal_search(event: MessageEvent, msg: str = ArgPlainText("saucenao_img")): - user_id = event.get_user_id() - img = findall(r"url=(.*?)]", msg) + img = extract_image_urls(event.message) if not img: await saucenao.reject("请发送图片而不是其他东西!!") @@ -43,5 +27,4 @@ async def _deal_search(event: MessageEvent, msg: str = ArgPlainText("saucenao_im await saucenao.finish("失败了...") result = f"> {MessageSegment.at(user_id)}" + await a.search(img[0]) # type: ignore - _search_flmt.start_cd(user_id) await saucenao.finish(Message(result)) diff --git a/ATRI/plugins/setu/__init__.py b/ATRI/plugins/setu/__init__.py index ee2fc6c..70d0dc2 100644 --- a/ATRI/plugins/setu/__init__.py +++ b/ATRI/plugins/setu/__init__.py @@ -6,32 +6,25 @@ 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.config import BotSelfConfig -from ATRI.utils.limit import FreqLimiter, DailyLimiter from ATRI.utils.apscheduler import scheduler from .data_source import Setu -_setu_flmt = FreqLimiter(120) -_setu_dlmt = DailyLimiter(5) +loop = asyncio.get_event_loop() random_setu = Setu().on_command( - "来张涩图", "来张随机涩图,冷却2分钟,每天限5张", aliases={"涩图来", "来点涩图", "来份涩图"} + "来张涩图", "来张随机涩图,冷却2分钟", aliases={"涩图来", "来点涩图", "来份涩图"} ) -@random_setu.handle() +@random_setu.handle([Cooldown(120)]) async def _random_setu( bot: Bot, event: MessageEvent, matcher: Matcher, args: Message = CommandArg() ): - user_id = event.get_user_id() - if not _setu_flmt.check(user_id): - await random_setu.finish() - if not _setu_dlmt.check(user_id): - await random_setu.finish() - repo, setu = await Setu().random_setu() await bot.send(event, repo) @@ -41,16 +34,14 @@ async def _random_setu( except Exception: await random_setu.finish("hso(发不出") - event_id = msg_1["message_id"] - _setu_flmt.start_cd(user_id) - _setu_dlmt.increase(user_id) - await asyncio.sleep(30) - await bot.delete_msg(message_id=event_id) msg = args.extract_plain_text() if msg: matcher.set_arg("r_rush_after_think", args) + event_id = msg_1["message_id"] + loop.create_task(Setu().async_recall(bot, event_id)) + @random_setu.got("r_rush_after_think") async def _(think: str = ArgPlainText("r_rush_after_think")): @@ -61,19 +52,13 @@ async def _(think: str = ArgPlainText("r_rush_after_think")): await random_setu.finish(is_repo) -tag_setu = Setu().on_regex(r"来[张点丶份](.*?)的[涩色🐍]图", "根据提供的tag查找涩图") +tag_setu = Setu().on_regex(r"来[张点丶份](.*?)的[涩色🐍]图", "根据提供的tag查找涩图,冷却2分钟") -@tag_setu.handle() +@tag_setu.handle([Cooldown(120)]) async def _tag_setu( bot: Bot, event: MessageEvent, matcher: Matcher, args: Message = CommandArg() ): - user_id = event.get_user_id() - if not _setu_flmt.check(user_id): - await random_setu.finish() - if not _setu_dlmt.check(user_id): - await random_setu.finish() - msg = str(event.message).strip() pattern = r"来[张点丶份](.*?)的[涩色🐍]图" tag = re.findall(pattern, msg)[0] @@ -89,16 +74,13 @@ async def _tag_setu( except Exception: await random_setu.finish("hso(发不出") - event_id = msg_1["message_id"] - _setu_flmt.start_cd(user_id) - _setu_dlmt.increase(user_id) - await asyncio.sleep(30) - await bot.delete_msg(message_id=event_id) - msg = args.extract_plain_text() if msg: matcher.set_arg("r_rush_after_think", args) + event_id = msg_1["message_id"] + loop.create_task(Setu().async_recall(bot, event_id)) + @tag_setu.got("t_rush_after_think") async def _(think: str = ArgPlainText("t_rush_after_think")): @@ -117,9 +99,7 @@ setu_catcher = Setu().on_message("涩图嗅探", "涩图嗅探器", block=False) @setu_catcher.handle() async def _setu_catcher(bot: Bot, event: MessageEvent): - msg = str(event.message) - pattern = r"url=(.*?)]" - args = re.findall(pattern, msg) + args = extract_image_urls(event.message) if not args: return else: @@ -159,17 +139,9 @@ async def _setu_catcher(bot: Bot, event: MessageEvent): nsfw_checker = Setu().on_command("/nsfw", "涩值检测") -@nsfw_checker.handle() -async def _nsfw_checker(matcher: Matcher, args: Message = CommandArg()): - msg = args.extract_plain_text() - if msg: - matcher.set_arg("nsfw_img", args) - - @nsfw_checker.got("nsfw_img", "图呢?") -async def _deal_check(bot: Bot, img: str = ArgPlainText("nsfw_img")): - pattern = r"url=(.*?)]" - args = re.findall(pattern, img) +async def _deal_check(bot: Bot, event: MessageEvent): + args = extract_image_urls(event.message) if not args: await nsfw_checker.reject("请发送图片而不是其他东西!!") diff --git a/ATRI/plugins/setu/data_source.py b/ATRI/plugins/setu/data_source.py index d8ad00e..0b8ae50 100644 --- a/ATRI/plugins/setu/data_source.py +++ b/ATRI/plugins/setu/data_source.py @@ -1,5 +1,6 @@ +import asyncio from random import choice -from nonebot.adapters.onebot.v11 import MessageSegment +from nonebot.adapters.onebot.v11 import Bot, MessageSegment from ATRI.service import Service from ATRI.rule import is_in_service @@ -17,9 +18,16 @@ DEFAULT_SETU = ( class Setu(Service): def __init__(self): Service.__init__(self, "涩图", "hso!", rule=is_in_service("涩图")) - + @staticmethod - async def random_setu() -> tuple: + def _use_proxy(url: str) -> str: + if ST.reverse_proxy: + return url.replace("i.pixiv.cat", ST.reverse_proxy_domain) + else: + return url + + @classmethod + async def random_setu(cls) -> tuple: """ 随机涩图. """ @@ -34,12 +42,12 @@ class Setu(Service): p_id = data.get("pid", 88124144) url: str = data["urls"].get("original", "ignore") - setu = MessageSegment.image(use_proxy(url), timeout=114514) + setu = MessageSegment.image(cls._use_proxy(url), timeout=114514) repo = f"Title: {title}\nPid: {p_id}" return repo, setu - @staticmethod - async def tag_setu(tag: str) -> tuple: + @classmethod + async def tag_setu(cls, tag: str) -> tuple: """ 指定tag涩图. """ @@ -56,7 +64,7 @@ class Setu(Service): p_id = data.get("pid", 88124144) url = data["urls"].get( "original", - use_proxy(DEFAULT_SETU), + cls._use_proxy(DEFAULT_SETU), ) setu = MessageSegment.image(url, timeout=114514) repo = f"Title: {title}\nPid: {p_id}" @@ -70,8 +78,8 @@ class Setu(Service): data = await detect_image(url, file_size) return data - @staticmethod - async def scheduler() -> str: + @classmethod + async def scheduler(cls) -> str: """ 每隔指定时间随机抽取一个群发送涩图. 格式: @@ -88,15 +96,13 @@ class Setu(Service): url = temp_data[0]["urls"].get( "original", - use_proxy(DEFAULT_SETU), + cls._use_proxy(DEFAULT_SETU), ) setu = MessageSegment.image(url, timeout=114514) repo = f"是{tag}哦~❤\n{setu}" return repo - -def use_proxy(url: str) -> str: - if ST.reverse_proxy: - return url.replace("i.pixiv.cat", ST.reverse_proxy_domain) - else: - return url + @staticmethod + async def async_recall(bot: Bot, event_id): + await asyncio.sleep(30) + await bot.delete_msg(message_id=event_id) diff --git a/ATRI/plugins/util/__init__.py b/ATRI/plugins/util/__init__.py index b67a988..e63870b 100644 --- a/ATRI/plugins/util/__init__.py +++ b/ATRI/plugins/util/__init__.py @@ -4,8 +4,8 @@ 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.helpers import Cooldown -from ATRI.utils.limit import FreqLimiter from .data_source import Encrypt, Utils, Yinglish @@ -69,18 +69,14 @@ async def _deal_de(text: str = ArgPlainText("encr_de_text")): sepi = Utils().on_command("涩批一下", "将正常的句子涩一涩~") -_sepi_flmt = FreqLimiter(3) -_sepi_flmt_notice = ["涩批爬", "✌🥵✌"] +_sepi_flmt_notice = choice(["涩批爬", "✌🥵✌"]) + [email protected]([Cooldown(3, prompt=_sepi_flmt_notice)]) async def _ready_sepi( - matcher: Matcher, event: MessageEvent, args: Message = CommandArg() + matcher: Matcher, args: Message = CommandArg() ): - user_id = event.get_user_id() - if not _sepi_flmt.check(user_id): - await sepi.finish(choice(_sepi_flmt_notice)) - msg = args.extract_plain_text() if msg: matcher.set_arg("sepi_text", args) @@ -93,5 +89,4 @@ async def _deal_sepi(event: MessageEvent, msg: str = ArgPlainText("sepi_text")): await sepi.finish("这么短?涩不起来!") result = Yinglish.deal(msg, random()) - _sepi_flmt.start_cd(user_id) await sepi.finish(result) diff --git a/ATRI/plugins/wife/__init__.py b/ATRI/plugins/wife/__init__.py index b69315d..ff0f354 100644 --- a/ATRI/plugins/wife/__init__.py +++ b/ATRI/plugins/wife/__init__.py @@ -7,12 +7,11 @@ from nonebot.matcher import Matcher from nonebot.params import CommandArg, ArgPlainText from nonebot.permission import SUPERUSER from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, Message +from nonebot.adapters.onebot.v11.helpers import Cooldown -from ATRI.utils.limit import FreqLimiter from .data_source import Wife -_tietie_flmt = FreqLimiter(600) _is_tietie = True @@ -25,17 +24,13 @@ tietie_superuser = Wife().on_message( ) -@tietie_superuser.handle() +@tietie_superuser.handle([Cooldown(600)]) async def _tietie_superuser(event: MessageEvent): if not _is_tietie: await tietie_superuser.finish() user_id = event.get_user_id() - if not _tietie_flmt.check(user_id): - await tietie_superuser.finish() - result = Wife().to_superuser(user_id) - _tietie_flmt.start_cd(user_id) await tietie_superuser.finish(Message(result)) @@ -59,9 +54,6 @@ async def _yes_tietie(): await yes_tietie.finish("好欸!") -_wife_flmt = FreqLimiter(10) - - class MarryInfo(BaseModel): name: str sex: str @@ -71,11 +63,9 @@ class MarryInfo(BaseModel): get_wife = Wife().on_command("抽老婆", "随机选择一位幸运裙友成为老婆!") -@get_wife.handle() +@get_wife.handle([Cooldown(10)]) async def _get_wife(bot: Bot, event: GroupMessageEvent): user_id = event.get_user_id() - if not _wife_flmt.check(user_id): - await get_wife.finish() data = Wife().load_marry_list() if user_id in data: @@ -119,21 +109,15 @@ async def _get_wife(bot: Bot, event: GroupMessageEvent): Wife().save_marry_list(data) repo_1 = f"好欸!{lucky_user_card}成为了{req_user_card}的{is_nick}" - _wife_flmt.start_cd(user_id) await get_wife.finish(repo_1) -_call_wife_flmt = FreqLimiter(60) - - call_wife = Wife().on_command("老婆", "呼唤老婆/老公!", aliases={"老公", "老婆!", "老公!"}) -@call_wife.handle() +@call_wife.handle([Cooldown(60)]) async def _call_wife(event: MessageEvent): user_id = event.get_user_id() - if not _wife_flmt.check(user_id): - await call_wife.finish() data = Wife().load_marry_list() if user_id not in data: @@ -143,20 +127,17 @@ async def _call_wife(event: MessageEvent): sex = data[user_id].get("sex", "male") is_nick = "老公" if sex == "male" else "老婆" repo = f"你已经有{is_nick}啦!是{wife}噢~" - _call_wife_flmt.start_cd(user_id) await call_wife.finish(repo) discard_wife = Wife().on_command("我要离婚", "离婚!") -@discard_wife.handle() +@discard_wife.handle([Cooldown(60)]) async def _discard_wife( matcher: Matcher, event: GroupMessageEvent, args: Message = CommandArg() ): user_id = event.get_user_id() - if not _wife_flmt.check(user_id): - await discard_wife.finish() data = Wife().load_marry_list() if user_id not in data: @@ -200,5 +181,4 @@ async def _deal_discard( data.pop(discard_user_id) Wife().save_marry_list(data) repo = f"悲,{user_card}抛弃了{discard_user_card}..." - _wife_flmt.start_cd(user_id) await discard_wife.finish(repo) diff --git a/ATRI/utils/limit.py b/ATRI/utils/limit.py deleted file mode 100644 index 905d744..0000000 --- a/ATRI/utils/limit.py +++ /dev/null @@ -1,142 +0,0 @@ -import time -import pytz -import functools -from threading import RLock -from collections import defaultdict, deque -from datetime import datetime, timedelta - - -class LimitBucket: - """ - 限制某功能运行中某段在一定速率下 - """ - - def __init__(self, capacity, fill_rate, is_lock: bool = False) -> None: - """ - :param capacity: 容量总数 - :param fill_rate: 重新装填速率(单位:秒) - """ - self._capacity = float(capacity) - self._tokens = float(capacity) - self._fill_rate = float(fill_rate) - self._last_time = time() - self._is_lock = is_lock - self._lock = RLock() - - def _get_cur_tokens(self): - if self._tokens < self._capacity: - now = time() - delta = self._fill_rate * (now - self._last_time) - self._tokens = min(self._capacity, self._tokens + delta) - self._last_time = now - return self._tokens - - def get_cur_tokens(self): - if self._is_lock: - with self._lock: - return self._get_cur_tokens() - else: - return self._get_cur_tokens() - - def _consume(self, tokens) -> bool: - if tokens <= self.get_cur_tokens(): - self._tokens -= tokens - return True - return False - - def consume(self, tokens): - if self._is_lock: - with self._lock: - return self._consume(tokens) - else: - return self._consume(tokens) - - -class RateLimiting: - """ - 限制该功能全体速率 - """ - - def __init__(self, max_calls, period=1.0): - if period <= 0: - raise ValueError("Rate limiting period should be > 0") - if max_calls <= 0: - raise ValueError("Rate limiting number of calls should be > 0") - - self.calls = deque() - - self.period = period - self.max_calls = max_calls - - def __call__(self, func): - @functools.wraps(func) - def wrapped(*args, **kwargs): - with self: - return func(*args, **kwargs) - - return wrapped - - def __enter__(self): - if len(self.calls) >= self.max_calls: - time.sleep(self.period - self._timespan) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.calls.append(time.time()) - while self._timespan >= self.period: - self.calls.popleft() - - @property - def _timespan(self): - return self.calls[-1] - self.calls[0] - - -class FreqLimiter: - """ - Copy from: https://github.com/Ice-Cirno/HoshinoBot/blob/master/hoshino/util/__init__.py - """ - - def __init__(self, default_cd_seconds): - self.next_time = defaultdict(float) - self.default_cd = default_cd_seconds - - def check(self, key) -> bool: - return bool(time.time() >= self.next_time[key]) - - def start_cd(self, key, cd_time=0): - self.next_time[key] = time.time() + ( - cd_time if cd_time > 0 else self.default_cd - ) - - def left_time(self, key) -> float: - return self.next_time[key] - time.time() - - -class DailyLimiter: - """ - Copy from: https://github.com/Ice-Cirno/HoshinoBot/blob/master/hoshino/util/__init__.py - """ - - tz = pytz.timezone("Asia/Shanghai") - - def __init__(self, max_num): - self.today = -1 - self.count = defaultdict(int) - self.max = max_num - - def check(self, key) -> bool: - now = datetime.now(self.tz) - day = (now - timedelta(hours=6)).day - if day != self.today: - self.today = day - self.count.clear() - return bool(self.count[key] < self.max) - - def get_num(self, key): - return self.count[key] - - def increase(self, key, num=1): - self.count[key] += num - - def reset(self, key): - self.count[key] = 0 @@ -16,6 +16,7 @@ InlineGoCQHTTP: password: "" protocol: 3 + download_domain: "github.com" download_version: "latest" SauceNAO: |