from typing import Optional, TYPE_CHECKING from datetime import datetime, timedelta import discord from meta import LionBot from gui.cards import ProfileCard from modules.ranks.cog import RankCog from modules.ranks.utils import format_stat_range if TYPE_CHECKING: from ..cog import StatsCog async def get_profile_card(bot: LionBot, userid: int, guildid: int): ranks: Optional[RankCog] = bot.get_cog('RankCog') stats: Optional[StatsCog] = bot.get_cog('StatsCog') if ranks is None or stats is None: return guild = bot.get_guild(guildid) if guild is None: return lion = await bot.core.lions.fetch_member(guildid, userid) luser = lion.luser member = await lion.fetch_member() if member: username = (member.display_name, '#' + str(member.discriminator)) avatar = member.avatar.key if member.avatar else member.default_avatar.key else: username = (lion.data.display_name, "#????") avatar = luser.data.avatar_hash profile_badges = await stats.data.ProfileTag.fetch_tags(guildid, userid) # Fetch current and next guild rank season_rank = await ranks.get_member_rank(guildid, userid) rank_type = lion.lguild.config.get('rank_type').value crank = season_rank.current_rank nrank = season_rank.next_rank if crank: roleid = crank.roleid role = guild.get_role(roleid) name = role.name if role else 'Unknown Rank' minimum = crank.required maximum = nrank.required if nrank else None rangestr = format_stat_range(rank_type, minimum, maximum) if maximum is None: rangestr = f"≥ {rangestr}" current_rank = (name, rangestr) if maximum: rank_progress = (season_rank.stat - minimum) / (maximum - minimum) else: rank_progress = 1 else: current_rank = None rank_progress = 0 if nrank: roleid = nrank.roleid role = guild.get_role(roleid) name = role.name if role else 'Unknown Rank' minimum = nrank.required guild_ranks = await ranks.get_guild_ranks(guildid) nnrank = next((rank for rank in guild_ranks if rank.required > nrank.required), None) maximum = nnrank.required if nnrank else None rangestr = format_stat_range(rank_type, minimum, maximum) if maximum is None: rangestr = f"≥ {rangestr}" next_rank = (name, rangestr) else: next_rank = None achievements = (0, 1, 2, 3) card = ProfileCard( user=username, avatar=(userid, avatar), coins=lion.data.coins, gems=luser.data.gems, gifts=0, profile_badges=profile_badges, achievements=achievements, current_rank=current_rank, rank_progress=rank_progress, next_rank=next_rank ) return card