diff --git a/embed_util.py b/embed_util.py index d4faf2a..d5d1edb 100644 --- a/embed_util.py +++ b/embed_util.py @@ -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 "" diff --git a/main.py b/main.py index 77d88d4..264b7aa 100644 --- a/main.py +++ b/main.py @@ -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) diff --git a/manager.py b/manager.py index b8de04c..416114d 100644 --- a/manager.py +++ b/manager.py @@ -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()}") diff --git a/manga_api.py b/manga_api.py index c5ec26b..eb51ac0 100644 --- a/manga_api.py +++ b/manga_api.py @@ -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} @@ -157,5 +176,4 @@ 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) + mh = MangaHandler() \ No newline at end of file