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" prev_label = "Prev"
next_label = "Next" next_label = "Next"
add_label = "Add"
remove_label = "Remove"
class ListManga(discord.ui.View): 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__() super().__init__()
self.user_manga_list = user_manga_list
self.ret = [] self.ret = []
self.index = 0 self.index = 0
self.manga_list = manga_list self.manga_list = manga_list
self.thumbnail_files: list[str] = gen_manga_files(self.manga_list) self.thumbnail_files: list[str] = gen_manga_files(self.manga_list)
self.comp = self.children self.comp = self.children
self.prev: discord.Button = None self.prev_button: discord.Button = None
self.next: 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: for comp in self.comp:
if comp.type.name == "button": if comp.type.name == "button":
button: discord.Button = comp button: discord.Button = comp
if button.label == prev_label: if button.label == prev_label:
self.prev = button self.prev_button = button
if button.label == next_label: 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 self.msg: discord.Message = None
print(self.manga_list) print(self.manga_list)
@ -33,17 +43,16 @@ class ListManga(discord.ui.View):
self.msg = msg self.msg = msg
async def update_buttons(self): async def update_buttons(self):
self.prev.disabled = self.index == 0 self.prev_button.disabled = self.index == 0
self.next.disabled = self.index == len(self.manga_list) - 1 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
print(f"index: {self.index}, prev: {self.prev.disabled}, next {self.next.disabled}") self.remove.disabled = self.manga_list[self.index] not in self.user_manga_list
async def force_reload(self): async def force_reload(self):
await self.update_buttons() await self.update_buttons()
self.msg = await self.msg.edit( self.msg = await self.msg.edit(
embed=manga_embed(self.manga_list[self.index]), embed=manga_embed(self.manga_list, self.index),
attachments=[ attachments=[
parallel_downloads.discord_file_from_filename(self.thumbnail_files[self.index]) 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) @discord.ui.button(label=prev_label, style=discord.ButtonStyle.grey)
async def previous(self, interaction: discord.Interaction, button: discord.ui.Button): async def previous(self, interaction: discord.Interaction, button: discord.ui.Button):
self.prev = button self.prev_button = button
if self.index > 0: if self.index > 0:
self.index -= 1 self.index -= 1
print("cant go anymore back") print("cant go anymore back")
@ -69,21 +78,27 @@ class ListManga(discord.ui.View):
@discord.ui.button(label=next_label, style=discord.ButtonStyle.grey) @discord.ui.button(label=next_label, style=discord.ButtonStyle.grey)
async def next(self, interaction: discord.Interaction, button: discord.ui.Button): 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: if self.index < len(self.manga_list) - 1:
self.index += 1 self.index += 1
await self.print_manga(interaction) 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): 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}) 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): 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}) 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) @discord.ui.button(label='Done', style=discord.ButtonStyle.blurple)
async def exit(self, interaction: discord.Interaction, button: discord.ui.Button): 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) 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] 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() extension = manga.get_cover_art_extension()
e.set_thumbnail(url=f"attachment://{manga.id}.{extension}") e.set_thumbnail(url=f"attachment://{manga.id}.{extension}")
return e return e
def manga_embed(manga: Manga): def manga_list_embed(manga_list: list[Manga]):
e = discord.Embed(title=manga.get_title(), description=manga.get_description(), url=manga.get_url()) e = discord.Embed(
extension = manga.get_cover_art_extension() title=f"Here's The Manga That Match Your Query ({len(manga_list)} Items)",
e.set_thumbnail(url=f"attachment://{manga.id}.{extension}") description="".join(
[f"{index+1} - {manga_list[index].get_title()}\n" for index in range(len(manga_list))]
),
color=discord.Color.blurple()
)
return e return e
@ -118,7 +138,6 @@ def get_chapter_filenames(manga: Manga):
return parallel_downloads.parallel_download([manga]) return parallel_downloads.parallel_download([manga])
def chapter_embed(manga: Manga, chapter: Chapter): def chapter_embed(manga: Manga, chapter: Chapter):
volume_info = f"Volume {chapter.get_volume()}" if chapter.get_volume() else "" volume_info = f"Volume {chapter.get_volume()}" if chapter.get_volume() else ""
chapter_title = f"{chapter.get_title()}" if chapter.get_title() 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") await chanel.send("No Manga in Here")
return return
view = embed_util.ListManga(manga_list) list_msg = await interaction.followup.send(embed=embed_util.manga_list_embed(manga_list))
msg = await chanel.send(view=view, embed=embed_util.manga_embed(manga_list[0])) 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) view.set_msg(msg)
await view.force_reload() await view.force_reload()
await interaction.followup.send("Query done, Check your DM's")
await view.wait() await view.wait()
print("Done.. Checking Returns") 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)) man.remove_user_from_manga(interaction.user, manga_api.Manga(manga_id))
await msg.delete() await msg.delete()
await list_msg.delete()
await man.update() await man.update()
@ -73,7 +73,7 @@ async def search_command(
): ):
await interaction.response.defer() 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( @tree.command(
@ -83,7 +83,7 @@ async def search_command(
async def list_command(interaction: discord.Interaction): async def list_command(interaction: discord.Interaction):
await interaction.response.defer() 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) @tasks.loop(minutes=5)

View File

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

View File

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