summaryrefslogtreecommitdiff
path: root/ATRI/plugins/anime_search.py
diff options
context:
space:
mode:
Diffstat (limited to 'ATRI/plugins/anime_search.py')
-rw-r--r--ATRI/plugins/anime_search.py167
1 files changed, 91 insertions, 76 deletions
diff --git a/ATRI/plugins/anime_search.py b/ATRI/plugins/anime_search.py
index 6bb11e8..de64501 100644
--- a/ATRI/plugins/anime_search.py
+++ b/ATRI/plugins/anime_search.py
@@ -1,65 +1,48 @@
import re
-import json
from aiohttp import FormData
+from random import choice
-from nonebot.adapters.cqhttp import Bot, MessageEvent
-from nonebot.adapters.cqhttp.message import Message
from nonebot.typing import T_State
+from nonebot.adapters.cqhttp import Bot, MessageEvent
+from nonebot.adapters.cqhttp.message import Message, MessageSegment
-from ATRI.service import Service as sv
+from ATRI.service import Service
from ATRI.rule import is_in_service
+from ATRI.utils import request, UbuntuPaste, Translate
+from ATRI.utils.limit import FreqLimiter
from ATRI.exceptions import RequestError
-from ATRI.utils.request import get_bytes
-from ATRI.utils.translate import to_simple_string
-from ATRI.utils.ub_paste import paste
URL = "https://trace.moe/api/search?url="
+_anime_flmt = FreqLimiter(10)
+_anime_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"])
__doc__ = """
-以图搜番
-权限组:所有人
-用法:
- 以图搜番 (pic)
+通过一张图片搜索你需要的番!据说里*也可以
"""
-anime_search = sv.on_command(cmd="以图搜番", docs=__doc__, rule=is_in_service("以图搜番"))
-
-
-@anime_search.args_parser # type: ignore
-async def _load_anime(bot: Bot, event: MessageEvent, state: T_State) -> None:
- msg = str(event.message)
- quit_list = ["算了", "罢了", "不搜了", "取消"]
- if msg in quit_list:
- await anime_search.finish("好吧...")
- if not msg:
- await anime_search.reject("图呢?")
- else:
- state["pic_anime"] = msg
-
-
-@anime_search.handle()
-async def _anime_search(bot: Bot, event: MessageEvent, state: T_State) -> None:
- msg = str(event.message).strip()
- if msg:
- state["pic_anime"] = msg
-
-
-@anime_search.got("pic_anime", prompt="图呢?")
-async def _deal_search(bot: Bot, event: MessageEvent, state: T_State) -> None:
- msg = state["pic_anime"]
- img = re.findall(r"url=(.*?)]", msg)
- if not img:
- await anime_search.reject("请发送图片而不是其它东西!!")
-
- try:
- req = await get_bytes(URL + img[0])
- except RequestError:
- raise RequestError("Request failed!")
- data = json.loads(req)["docs"]
- try:
+class Anime(Service):
+
+ def __init__(self):
+ Service.__init__(self, "以图搜番", __doc__, rule=is_in_service("以图搜番"))
+
+ @staticmethod
+ async def _request(url: str) -> dict:
+ aim = URL + url
+ try:
+ res = await request.get(aim)
+ except RequestError:
+ raise RequestError("Request failed!")
+ result = await res.json()
+ return result
+
+ @classmethod
+ async def search(cls, url: str) -> str:
+ data = await cls._request(url)
+ data = data["docs"]
+
d = dict()
for i in range(len(data)):
if data[i]["title_chinese"] in d.keys():
@@ -73,38 +56,70 @@ async def _deal_search(bot: Bot, event: MessageEvent, state: T_State) -> None:
else:
n = data[i]["episode"]
- d[to_simple_string(data[i]["title_chinese"])] = [
+ d[Translate(data[i]["title_chinese"]).to_simple()] = [
data[i]["similarity"],
f"第{n}集",
f"{int(m)}分{int(s)}秒处",
]
- except Exception as err:
- raise Exception(f"Invalid data.\n{err}")
-
- result = sorted(d.items(), key=lambda x: x[1], reverse=True)
-
- t = 0
-
- msg0 = f"> {event.sender.nickname}"
- for i in result:
- t += 1
- s = "%.2f%%" % (i[1][0] * 100)
- msg0 = msg0 + (
- "\n——————————\n"
- f"({t}) Similarity: {s}\n"
- f"Name: {i[0]}\n"
- f"Time: {i[1][1]} {i[1][2]}"
- )
-
- if len(result) == 2:
- await anime_search.finish(Message(msg0))
+
+ result = sorted(d.items(), key=lambda x: x[1], reverse=True)
+ t = 0
+ msg0 = str()
+ for i in result:
+ t += 1
+ s = "%.2f%%" % (i[1][0] * 100)
+ msg0 = msg0 + (
+ "\n——————————\n"
+ f"({t}) Similarity: {s}\n"
+ f"Name: {i[0]}\n"
+ f"Time: {i[1][1]} {i[1][2]}"
+ )
+
+ if len(result) == 2:
+ return msg0
+ else:
+ data = FormData()
+ data.add_field("poster", "ATRI running log")
+ data.add_field("syntax", "text")
+ data.add_field("expiration", "day")
+ data.add_field("content", msg0)
+
+ repo = f"详细请移步此处~\n{await UbuntuPaste(data).paste()}"
+ return repo
+
+
+anime_search = Anime().on_command("以图搜番", "发送一张图以搜索可能的番剧")
+
+@anime_search.args_parser # type: ignore
+async def _get_anime(bot: Bot, event: MessageEvent, state: T_State):
+ msg = str(event.message).strip()
+ quit_list = ["算了", "罢了", "不搜了", "取消"]
+ if msg in quit_list:
+ await anime_search.finish("好吧...")
+ if not msg:
+ await anime_search.reject("图呢?")
else:
- data = FormData()
- data.add_field("poster", "ATRI running log")
- data.add_field("syntax", "text")
- data.add_field("expiration", "day")
- data.add_field("content", msg0)
-
- repo = f"> {event.sender.nickname}\n"
- repo = repo + f"详细请移步此处~\n{await paste(data)}"
- await anime_search.finish(repo)
+ state["anime"] = msg
+
+@anime_search.handle()
+async def _ready_sear(bot: Bot, event: MessageEvent, state: T_State):
+ user_id = event.get_user_id()
+ if not _anime_flmt.check(user_id):
+ await anime_search.finish(_anime_flmt_notice)
+
+ msg = str(event.message).strip()
+ if msg:
+ state["anime"] = msg
+
+@anime_search.got("anime", "图呢?")
+async def _deal_sear(bot: Bot, event: MessageEvent, state: T_State):
+ user_id = event.get_user_id()
+ msg = state["anime"]
+ img = re.findall(r"url=(.*?)]", msg)
+ if not img:
+ await anime_search.reject("请发送图片而不是其它东西!!")
+
+ 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))