summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ATRI/config.py3
-rw-r--r--ATRI/plugins/anime_search.py35
-rw-r--r--ATRI/plugins/chat/__init__.py35
-rw-r--r--ATRI/plugins/code_runner/__init__.py11
-rw-r--r--ATRI/plugins/funny/__init__.py35
-rw-r--r--ATRI/plugins/repo.py17
-rw-r--r--ATRI/plugins/rich/__init__.py10
-rw-r--r--ATRI/plugins/saucenao/__init__.py25
-rw-r--r--ATRI/plugins/setu/__init__.py58
-rw-r--r--ATRI/plugins/setu/data_source.py38
-rw-r--r--ATRI/plugins/util/__init__.py15
-rw-r--r--ATRI/plugins/wife/__init__.py30
-rw-r--r--ATRI/utils/limit.py142
-rw-r--r--config.yml1
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
diff --git a/config.yml b/config.yml
index 388271c..6906407 100644
--- a/config.yml
+++ b/config.yml
@@ -16,6 +16,7 @@ InlineGoCQHTTP:
password: ""
protocol: 3
+ download_domain: "github.com"
download_version: "latest"
SauceNAO: