changing request to use asyncio

This commit is contained in:
franchioping 2024-07-24 22:19:38 +01:00
parent 9408d4b8d6
commit 2a0941643c
4 changed files with 84 additions and 45 deletions

View File

@ -7,25 +7,35 @@ from util import parallel_downloads
prev_label = "Prev"
next_label = "Next"
add_label = "Add"
remove_label = "Remove"
class ListManga(discord.ui.View):
def __init__(self, manga_list: list[Manga]):
def __init__(self, manga_list: list[Manga], user_manga_list: list[Manga]):
super().__init__()
self.user_manga_list = user_manga_list
self.ret = []
self.index = 0
self.manga_list = manga_list
self.thumbnail_files: list[str] = gen_manga_files(self.manga_list)
self.comp = self.children
self.prev: discord.Button = None
self.next: discord.Button = None
self.prev_button: discord.Button = None
self.next_button: discord.Button = None
self.add_button: discord.Button = None
self.remove_button: discord.Button = None
for comp in self.comp:
if comp.type.name == "button":
button: discord.Button = comp
if button.label == prev_label:
self.prev = button
self.prev_button = button
if button.label == next_label:
self.next = button
self.next_button = button
if button.label == add_label:
self.add_button = button
if button.label == remove_label:
self.remove_button = button
self.msg: discord.Message = None
print(self.manga_list)
@ -33,17 +43,16 @@ class ListManga(discord.ui.View):
self.msg = msg
async def update_buttons(self):
self.prev.disabled = self.index == 0
self.next.disabled = self.index == len(self.manga_list) - 1
print(f"index: {self.index}, prev: {self.prev.disabled}, next {self.next.disabled}")
self.prev_button.disabled = self.index == 0
self.next_button.disabled = self.index == len(self.manga_list) - 1
self.add_button.disabled = self.manga_list[self.index] in self.user_manga_list
self.remove.disabled = self.manga_list[self.index] not in self.user_manga_list
async def force_reload(self):
await self.update_buttons()
self.msg = await self.msg.edit(
embed=manga_embed(self.manga_list[self.index]),
embed=manga_embed(self.manga_list, self.index),
attachments=[
parallel_downloads.discord_file_from_filename(self.thumbnail_files[self.index])
],
@ -60,7 +69,7 @@ class ListManga(discord.ui.View):
@discord.ui.button(label=prev_label, style=discord.ButtonStyle.grey)
async def previous(self, interaction: discord.Interaction, button: discord.ui.Button):
self.prev = button
self.prev_button = button
if self.index > 0:
self.index -= 1
print("cant go anymore back")
@ -69,21 +78,27 @@ class ListManga(discord.ui.View):
@discord.ui.button(label=next_label, style=discord.ButtonStyle.grey)
async def next(self, interaction: discord.Interaction, button: discord.ui.Button):
self.next = button
self.next_button = button
if self.index < len(self.manga_list) - 1:
self.index += 1
await self.print_manga(interaction)
@discord.ui.button(label='Add', style=discord.ButtonStyle.green)
@discord.ui.button(label=add_label, style=discord.ButtonStyle.green)
async def add(self, interaction: discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self.ret.append({"manga": self.manga_list[self.index].id, "action": 1})
if self.manga_list[self.index] not in self.user_manga_list:
self.user_manga_list.append(self.manga_list[self.index])
@discord.ui.button(label='Remove', style=discord.ButtonStyle.red)
await self.print_manga(interaction)
@discord.ui.button(label=remove_label, style=discord.ButtonStyle.red)
async def remove(self, interaction: discord.Interaction, button: discord.ui.Button):
await interaction.response.defer()
self.ret.append({"manga": self.manga_list[self.index].id, "action": -1})
if self.manga_list[self.index] in self.user_manga_list:
self.user_manga_list.remove(self.manga_list[self.index])
await self.print_manga(interaction)
@discord.ui.button(label='Done', style=discord.ButtonStyle.blurple)
async def exit(self, interaction: discord.Interaction, button: discord.ui.Button):
@ -98,18 +113,23 @@ def gen_manga_files(manga_list: list[Manga]):
return parallel_downloads.parallel_download(manga_list)
def manga_list_embed(manga_list: list[Manga], index: int):
def manga_embed(manga_list: list[Manga], index: int):
manga = manga_list[index]
e = discord.Embed(title=f"({index+1}\\{len(manga_list)}) {manga.get_title()}", description=manga.get_description(), url=manga.get_url())
e = discord.Embed(title=f"({index + 1}\\{len(manga_list)}) {manga.get_title()}",
description=manga.get_description(), url=manga.get_url())
extension = manga.get_cover_art_extension()
e.set_thumbnail(url=f"attachment://{manga.id}.{extension}")
return e
def manga_embed(manga: Manga):
e = discord.Embed(title=manga.get_title(), description=manga.get_description(), url=manga.get_url())
extension = manga.get_cover_art_extension()
e.set_thumbnail(url=f"attachment://{manga.id}.{extension}")
def manga_list_embed(manga_list: list[Manga]):
e = discord.Embed(
title=f"Here's The Manga That Match Your Query ({len(manga_list)} Items)",
description="".join(
[f"{index+1} - {manga_list[index].get_title()}\n" for index in range(len(manga_list))]
),
color=discord.Color.blurple()
)
return e
@ -118,7 +138,6 @@ def get_chapter_filenames(manga: Manga):
return parallel_downloads.parallel_download([manga])
def chapter_embed(manga: Manga, chapter: Chapter):
volume_info = f"Volume {chapter.get_volume()}" if chapter.get_volume() else ""
chapter_title = f"{chapter.get_title()}" if chapter.get_title() else ""

12
main.py
View File

@ -37,13 +37,12 @@ async def render_manga_list_in_dm(interaction: discord.Interaction, manga_list:
await chanel.send("No Manga in Here")
return
view = embed_util.ListManga(manga_list)
msg = await chanel.send(view=view, embed=embed_util.manga_embed(manga_list[0]))
list_msg = await interaction.followup.send(embed=embed_util.manga_list_embed(manga_list))
view = embed_util.ListManga(manga_list, await man.get_user_mangas(interaction.user))
msg = await interaction.followup.send(view=view, embed=embed_util.manga_embed(manga_list, 0))
view.set_msg(msg)
await view.force_reload()
await interaction.followup.send("Query done, Check your DM's")
await view.wait()
print("Done.. Checking Returns")
@ -59,6 +58,7 @@ async def render_manga_list_in_dm(interaction: discord.Interaction, manga_list:
man.remove_user_from_manga(interaction.user, manga_api.Manga(manga_id))
await msg.delete()
await list_msg.delete()
await man.update()
@ -73,7 +73,7 @@ async def search_command(
):
await interaction.response.defer()
await render_manga_list_in_dm(interaction, mh.search(title))
await render_manga_list_in_dm(interaction, await mh.search(title))
@tree.command(
@ -83,7 +83,7 @@ async def search_command(
async def list_command(interaction: discord.Interaction):
await interaction.response.defer()
await render_manga_list_in_dm(interaction, man.get_user_mangas(interaction.user))
await render_manga_list_in_dm(interaction, await man.get_user_mangas(interaction.user))
@tasks.loop(minutes=5)

View File

@ -17,14 +17,14 @@ class Manager:
self.load()
def get_user_mangas(self, user: discord.User) -> list[manga_api.Manga]:
async def get_user_mangas(self, user: discord.User) -> list[manga_api.Manga]:
manga_ids = []
for manga_id in self.manga.keys():
if user.id in self.manga[manga_id]:
manga_ids.append(manga_id)
return [manga_api.Manga(manga_id) for manga_id in manga_ids]
return [await manga_api.Manga.init(manga_id) for manga_id in manga_ids]
def add_user_to_manga(self, user: discord.User, manga: manga_api.Manga) -> None:
if manga.id in self.manga.keys():
@ -36,13 +36,15 @@ class Manager:
if manga.id in self.manga.keys():
if user.id in self.manga[manga.id]:
self.manga[manga.id].remove(user.id)
if len(self.manga[manga.id]) == 0:
self.manga.pop(manga.id)
else:
self.manga[manga.id] = []
async def update(self):
for manga_id in self.manga.keys():
manga = manga_api.Manga(manga_id)
new_chap = self.check_for_new_chapter(manga)
manga = await manga_api.Manga.init(manga_id)
new_chap = await self.check_for_new_chapter(manga)
if new_chap is not None:
users = self.manga[manga_id]
print(users)
@ -50,14 +52,14 @@ class Manager:
await self.send_message_to_user(await self.client.fetch_user(userid), manga, new_chap)
self.save()
def check_for_new_chapter(self, manga: manga_api.Manga) -> manga_api.Chapter | None:
latest_chap = manga.get_latest_chap()
async def check_for_new_chapter(self, manga: manga_api.Manga) -> manga_api.Chapter | None:
latest_chap = await manga.get_latest_chap()
print("Comparing Chapters...")
if manga.id not in self.chapters.keys():
self.chapters[manga.id] = latest_chap.id
return latest_chap
old_chap = manga_api.Chapter(self.chapters[manga.id])
old_chap = await manga_api.Chapter.init(self.chapters[manga.id])
print(f"Latest Chap ID: {latest_chap.id}, Old Chap ID: {self.chapters[manga.id]}")
print(f"Latest Chap: {latest_chap.get_volume()}:{latest_chap.get_number()}")

View File

@ -1,6 +1,8 @@
import os
from dotenv import load_dotenv
import requests
import asyncio
load_dotenv()
@ -15,7 +17,13 @@ class Chapter:
self.update_data()
def update_data(self):
@classmethod
async def init(cls, id: str , _base_url=base_url):
self = cls(id, _base_url)
await self.update_data()
return self
async def update_data(self):
r = requests.get(
f"{self.base_url}/chapter/{self.id}"
)
@ -46,6 +54,9 @@ class Chapter:
"chapter_url": self.get_url()
})
def __eq__(self, other):
return self.id == other.id
class Manga:
def __init__(self, id: str, _base_url=base_url):
@ -53,9 +64,14 @@ class Manga:
self.base_url = _base_url
self.data = None
self.update_data()
@classmethod
async def init(cls, id: str, _base_url=base_url):
self = cls(id, _base_url)
await self.update_data()
return self
def update_data(self):
async def update_data(self):
r = requests.get(
f"{self.base_url}/manga/{self.id}"
)
@ -70,7 +86,7 @@ class Manga:
except KeyError:
return "No Title"
def get_latest_chap(self) -> Chapter:
async def get_latest_chap(self) -> Chapter:
params = {
"manga": self.id,
"translatedLanguage": ["en"],
@ -134,15 +150,18 @@ class Manga:
"title": self.get_title(),
"url": self.get_url(),
"art_url": self.get_cover_art_url(),
"latest_chapter": str(self.get_latest_chap())
"latest_chapter": str(asyncio.ensure_future(self.get_latest_chap()))
})
def __eq__(self, other):
return self.id == other.id
class MangaHandler:
def __init__(self):
self.base_url = base_url
def search(self, title: str) -> list[Manga]:
async def search(self, title: str) -> list[Manga]:
r = requests.get(
f"{self.base_url}/manga",
params={"title": title}
@ -158,4 +177,3 @@ class MangaHandler:
if __name__ == "__main__":
mh = MangaHandler()
print(mh.search("Umineko no Naku Koro ni Episode 4: Alliance of the Golden Witch")[0].get_latest_chap().data)