__version__ = (1, 1, 0)
# ╔╗╔┌─┐┬─┐┌─┐┬ ┬
# ║║║├┤ ├┬┘│ └┬┘
# ╝╚╝└─┘┴└─└─┘ ┴
# Code is licensed under CC-BY-NC-ND 4.0 unless otherwise specified.
# https://creativecommons.org/licenses/by-nc-nd/4.0/
# You CANNOT edit this file without direct permission from the author.
# You can redistribute this file without any changes.
# meta developer: @nercymods
# scope: hikka_min 1.6.2
import requests
from deep_translator import GoogleTranslator
from hikkatl.tl.types import Message
from .. import loader, utils
languages = ["ru", "en", "ja"]
@loader.tds
class JikanModule(loader.Module):
"""Module for working with Jikan API"""
strings = {
"name": "JikanModule",
"anime_not_found": "No anime found.",
"character_not_found": "No character found.",
"manga_not_found": "No manga found.",
"expression_missing": "Please specify a search query.",
"result": "Result:\n{result}",
"error": "Error: {error}",
}
strings_ru = {
"anime_not_found": "Аниме не найдено.",
"character_not_found": "Персонаж не найден.",
"manga_not_found": "Манга не найдена.",
"expression_missing": "Пожалуйста, укажите поисковой запрос.",
"result": "Результат:\n{result}",
"error": "Ошибка: {error}",
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"language",
"en",
lambda: "Language of output",
validator=loader.validators.Choice(languages),
),
)
@loader.command(
ru_doc="Поиск аниме по названию",
en_doc="Search for anime by title",
)
async def sanime(self, message: Message):
"""Search for anime by title"""
query = utils.get_args_raw(message)
if not query:
await utils.answer(message, self.strings["expression_missing"])
return
translator = GoogleTranslator(source="auto", target="en")
tquery = translator.translate(query)
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/anime",
params={"q": tquery},
)
data = response.json()
if "data" not in data or not data["data"]:
await utils.answer(message, self.strings["anime_not_found"])
return
anime = data["data"][0]
title = anime.get("title")
title_english = anime.get("title_english")
title_japanese = anime.get("title_japanese")
type_ = anime.get("type")
episodes = anime.get("episodes")
status = anime.get("status")
start_date = anime.get("aired").get("from") if "aired" in anime else None
end_date = anime.get("aired").get("to") if "aired" in anime else None
duration = anime.get("duration")
rating = anime.get("rating")
score = anime.get("score")
synopsis = anime.get("synopsis")
sfw = anime.get("sfw") is None
result = f"Title: {title}\n"
if title_english:
result += f"English Title: {title_english}\n"
if title_japanese:
result += f"Japanese Title: {title_japanese}\n"
if type_:
result += f"Type: {type_}\n"
if episodes:
result += f"Episodes: {episodes}\n"
if status:
result += f"Status: {status}\n"
if start_date:
start_date = start_date.split("T")[0]
result += f"Start Date: {start_date}\n"
if end_date:
end_date = end_date.split("T")[0]
result += f"End Date: {end_date}\n"
if duration:
result += f"Duration: {duration}\n"
if rating:
result += f"Rating: {rating}\n"
if score:
result += f"Score: {score}\n"
if sfw:
result += f"SFW: Yes\n"
else:
result += f"SFW: No\n"
if synopsis:
result += f"Synopsis: {synopsis}"
if self.config["language"] == "en":
await utils.answer(message, self.strings["result"].format(result=result))
else:
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(
self.strings["result"].format(result=result)
)
await utils.answer(message, translation)
@loader.command(ru_doc="Поиск манги по названию", en_doc="Search manga by title")
async def smanga(self, m: Message):
"""Search manga by title"""
query = utils.get_args_raw(m)
if not query:
await utils.answer(m, self.strings["expression_missing"])
return
translator = GoogleTranslator(source="auto", target="en")
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/manga",
params={"q": query},
)
data = response.json()
if "data" not in data or not data["data"]:
await utils.answer(m, self.strings["manga_not_found"])
return
manga = data["data"][0]
title = manga.get("title")
title_english = manga.get("title_english")
title_japanese = manga.get("title_japanese")
type_ = manga.get("type")
chapters = manga.get("chapters")
volumes = manga.get("volumes")
status = manga.get("status")
start_date = (
manga.get("published").get("from") if "published" in manga else None
)
end_date = manga.get("published").get("to") if "published" in manga else None
score = manga.get("score")
synopsis = manga.get("synopsis")
sfw = manga.get("explicit_genres") is None
result = f"Title: {title}\n"
if title_english:
result += f"English Title: {title_english}\n"
if title_japanese:
result += f"Japanese Title: {title_japanese}\n"
if type_:
result += f"Type: {type_}\n"
if chapters:
result += f"Chapters: {chapters}\n"
if volumes:
result += f"Volumes: {volumes}\n"
if status:
result += f"Status: {status}\n"
if start_date:
start_date = start_date.split("T")[0]
result += f"Start Date: {start_date}\n"
if end_date:
end_date = end_date.split("T")[0]
result += f"End Date: {end_date}\n"
if score:
result += f"Score: {score}\n"
if sfw:
result += f"SFW: Yes\n"
else:
result += f"SFW: No\n"
if synopsis:
result += f"Synopsis: {synopsis}"
if self.config["language"] == "en":
await utils.answer(m, self.strings["result"].format(result=result))
return
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(self.strings["result"].format(result=result))
await utils.answer(m, translation)
@loader.command(
ru_doc="Поиск персонажа по имени",
en_doc="Search character by name",
)
async def scharacter(self, message: Message):
"""Search character by name"""
query = utils.get_args_raw(message)
if not query:
await utils.answer(message, self.strings["expression_missing"])
return
translator = GoogleTranslator(source="auto", target="en")
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/characters",
params={"q": query},
)
data = response.json()
if "data" not in data or not data["data"]:
await utils.answer(message, self.strings["character_not_found"])
return
character = data["data"][0]
name = character.get("name")
name_kanji = character.get("name_kanji")
nicknames = character.get("nicknames")
favorites = character.get("favorites")
about = character.get("about")
result = f"Name: {name}\n"
if name_kanji:
result += f"Kanji Name: {name_kanji}\n"
if nicknames:
result += f"Nicknames: {', '.join(nicknames)}\n"
if favorites is not None:
result += f"Favorites: {favorites}\n"
if about:
result += f"About: {about}"
if self.config["language"] == "en":
await utils.answer(message, self.strings["result"].format(result=result))
return
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(self.strings["result"].format(result=result))
await utils.answer(message, translation)
@loader.command(
ru_doc="Получить рекомендации аниме",
en_doc="Get anime recommendations",
)
async def rсanime(self, message: Message):
"""Get anime recommendations"""
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/recommendations/anime",
)
data = response.json()
if "data" not in data or not data["data"]:
await utils.answer(
message,
self.strings["error"].format(error="No recommendations found."),
)
return
recommendations = data["data"][:3]
result = ""
for recommendation in recommendations:
title = recommendation["entry"][0].get("title")
content = recommendation.get("content")
user = recommendation.get("user")
username = user.get("username") if user else None
result += f"Title: {title}\n" if title else ""
result += f"Content: {content}\n" if content else ""
result += f"User: {username}\n" if username else ""
result += "\n"
if self.config["language"] == "en":
await utils.answer(message, self.strings["result"].format(result=result))
return
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(self.strings["result"].format(result=result))
await utils.answer(message, translation)
@loader.command(
ru_doc="Получить рекомендации манги",
en_doc="Get manga recommendations",
)
async def rсmanga(self, message: Message):
"""Get manga recommendations"""
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/recommendations/manga",
)
data = response.json()
if "data" not in data or not data["data"]:
await utils.answer(
message,
self.strings["error"].format(error="No recommendations found."),
)
return
recommendations = data["data"][:3]
result = ""
for recommendation in recommendations:
title = recommendation["entry"][0].get("title")
content = recommendation.get("content")
user = recommendation.get("user")
username = user.get("username") if user else None
result += f"Title: {title}\n" if title else ""
result += f"Content: {content}\n" if content else ""
result += f"User: {username}\n" if username else ""
result += "\n"
if self.config["language"] == "en":
await utils.answer(message, self.strings["result"].format(result=result))
return
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(self.strings["result"].format(result=result))
await utils.answer(message, translation)
@loader.command(ru_doc="Случайное аниме", en_doc="Random anime")
async def ranime(self, message: Message):
"""Random anime"""
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/random/anime",
)
data = response.json()
if not data.get("data"):
await utils.answer(message, self.strings["anime_not_found"])
return
anime = data["data"]
title = anime.get("title")
title_english = anime.get("title_english")
title_japanese = anime.get("title_japanese")
type_ = anime.get("type")
episodes = anime.get("episodes")
status = anime.get("status")
airing = anime.get("airing")
duration = anime.get("duration")
rating = anime.get("rating")
score = anime.get("score")
synopsis = anime.get("synopsis")
result = f"Title: {title}\n"
if title_english:
result += f"English Title: {title_english}\n"
if title_japanese:
result += f"Japanese Title: {title_japanese}\n"
if type_:
result += f"Type: {type_}\n"
if episodes:
result += f"Episodes: {episodes}\n"
if status:
result += f"Status: {status}\n"
if airing is not None:
result += f"Airing: {airing}\n"
if duration:
result += f"Duration: {duration}\n"
if rating:
result += f"Rating: {rating}\n"
if score:
result += f"Score: {score}\n"
if synopsis:
result += f"Synopsis: {synopsis}"
if self.config["language"] == "en":
await utils.answer(message, self.strings["result"].format(result=result))
return
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(self.strings["result"].format(result=result))
await utils.answer(message, translation)
@loader.command(ru_doc="Случайная манга", en_doc="Random manga")
async def rmanga(self, message: Message):
"""Random manga"""
response = await utils.run_sync(
requests.get,
"https://api.jikan.moe/v4/random/manga",
)
data = response.json()
if "data" not in data or not data["data"]:
await utils.answer(message, self.strings["manga_not_found"])
return
anime = data["data"]
title = anime.get("title")
title_english = anime.get("title_english")
title_japanese = anime.get("title_japanese")
type_ = anime.get("type")
episodes = anime.get("episodes")
status = anime.get("status")
airing = anime.get("airing")
duration = anime.get("duration")
rating = anime.get("rating")
score = anime.get("score")
synopsis = anime.get("synopsis")
result = f"Title: {title}\n"
if title_english:
result += f"English Title: {title_english}\n"
if title_japanese:
result += f"Japanese Title: {title_japanese}\n"
if type_:
result += f"Type: {type_}\n"
if episodes:
result += f"Episodes: {episodes}\n"
if status:
result += f"Status: {status}\n"
if airing is not None:
result += f"Airing: {airing}\n"
if duration:
result += f"Duration: {duration}\n"
if rating:
result += f"Rating: {rating}\n"
if score:
result += f"Score: {score}\n"
if synopsis:
result += f"Synopsis: {synopsis}"
if self.config["language"] == "en":
await utils.answer(message, self.strings["result"].format(result=result))
return
translator = GoogleTranslator(source="auto", target=self.config["language"])
translation = translator.translate(self.strings["result"].format(result=result))
await utils.answer(message, translation)