Untitled
unknown
plain_text
2 years ago
6.0 kB
11
Indexable
from typing import Any, Union, Optional
import discord
import sentry_sdk
from io import BytesIO
from database import Database, User
from enkacard import encbanner
from utility import EmbedTemplate, get_app_command_mention, config
from utility.custom_log import LOG
async def fetch_profile(uid: int):
async with encbanner.ENC(uid=str(uid)) as encard:
profile_data = await encard.profile(teamplate=1, card=True)
return profile_data
async def fetch_characters(uid: int):
async with encbanner.ENC(uid=str(uid)) as encard:
characters_data = await encard.creat(template=4)
return characters_data
async def create_profile_image(interaction: discord.Interaction, profile_data: Any):
profile = profile_data.card
player_data = profile_data.player
embed = discord.Embed(title=f"{player_data.name}'s Characters Showcase")
with BytesIO() as image_binary:
profile.save(image_binary, "PNG")
image_binary.seek(0)
dfile = discord.File(image_binary, filename="profile.png")
embed.set_image(url=f"attachment://profile.png") # noqa
return embed, dfile
async def create_character_showcase(interaction: discord.Interaction, characters_data: Any, character_index: int):
characters_data = characters_data.card
embed = discord.Embed
if 0 <= character_index < len(characters_data):
character_data = characters_data[character_index]
character_image = character_data.card
with BytesIO as image_binary:
character_image.save(image_binary, "PNG")
image_binary.seek(0)
dfile = discord.File(image_binary, filename="image1.png")
embed.set_image(url=f"attachment://image1.png") # noqa
return embed, dfile
class ShowcaseCharactersDropdown(discord.ui.Select):
"""Characters showcase dropdown menu"""
def __init__(self, characters_data: Any) -> None:
self.characters_data = characters_data
# self.uid = characters_data.info['uid']
self.uid = 821323218
options = []
options.append(discord.SelectOption(label="Player Overview", value="-1", emoji="📜"))
for i, character in enumerate(characters_data.card):
if i > 8:
break
print(character.name)
options.append(discord.SelectOption(label=character.name, value=str(i), emoji=None))
super().__init__(placeholder="Choose character to showcase:", options=options)
async def callback(self, interaction: discord.Interaction):
index = int(self.values[0])
if index >= 0:
await interaction.edit_original_response(view=ShowcaseView(self.characters_data, index))
elif index == -1:
profile_data = await fetch_profile(self.uid)
embed, dfile = await create_profile_image(interaction, profile_data)
await interaction.edit_original_response(view=ShowcaseView(embed, dfile))
class GenerateImageButton(discord.ui.Button):
"""Generate Image Button"""
def __init__(self, characters_data: Any, character_index: int):
super().__init__(style=discord.ButtonStyle.primary, label="Image")
self.characters_data = characters_data
self.character_index = character_index
async def callback(self, interaction: discord.Interaction) -> Any:
await self.handle_image_response(interaction, self.characters_data, self.character_index)
@classmethod
async def handle_image_response(
cls, interaction: discord.Interaction, characters_data: Any, character_index: int
) -> None:
"""Generate character image, handle discord interaction response by sending embed to the user"""
embed, dfile = await create_character_showcase(interaction, characters_data, character_index)
await interaction.edit_original_response(embed=embed, attachments=[dfile])
class ShowcaseView(discord.ui.View):
"""Character showcase view, display multiple templates"""
def __init__(self, characters_data: Any, character_index: Optional[int] = None):
super().__init__(timeout=config.discord_view_long_timeout)
if character_index is not None:
self.add_item(GenerateImageButton(characters_data, character_index))
else:
self.add_item(ShowcaseCharactersDropdown(characters_data))
async def showcase(
interaction: discord.Interaction,
user: Union[discord.User, discord.Member],
uid: Optional[int] = None
):
await interaction.response.defer()
_user = await Database.select_one(User, User.discord_id.is_(user.id))
uid = uid or (_user.uid_genshin if _user else None)
if uid is None:
await interaction.edit_original_response(
embed=EmbedTemplate.error(
f"Please use {get_app_command_mention('uid-settings')} first, or directly input the UID in the command",
title="UID not found",
)
)
elif len(str(uid)) != 9 or str(uid)[0] not in ["1", "2", "5", "6", "7", "8", "9"]:
await interaction.edit_original_response(embed=EmbedTemplate.error("Invalid UID format"))
else:
try:
profile_data = await fetch_profile(uid)
characters_data = await fetch_characters(uid)
view = ShowcaseView(characters_data)
embed, dfile = await create_profile_image(interaction, profile_data)
await interaction.edit_original_response(embed=embed, attachments=[dfile], view=view)
except Exception as e:
LOG.ErrorLog(interaction, e)
sentry_sdk.capture_exception(e)
embed = EmbedTemplate.error(
str(e) + f"\nWebsite Status Down", title=f"UID: {uid}" # noqa
)
await interaction.edit_original_response(embed=embed)
Editor is loading...
Leave a Comment