diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e1ffefb..6f08811 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,9 +20,7 @@ jobs: username: ${{ secrets.EC2_USER }} key: ${{ secrets.EC2_SSH_KEY }} script: | + pkill -f "uv" cd /home/ubuntu/TACT/ - sudo -u ubuntu kill -9 $(pgrep -o -f "uv") || true - sleep 3 git pull fork ft-rework - sleep 3 nohup uv run task app-prod & diff --git a/bot/cogs/board.py b/bot/cogs/board.py index 9c8b098..bc8ea3b 100644 --- a/bot/cogs/board.py +++ b/bot/cogs/board.py @@ -1,3 +1,5 @@ +import asyncio + from discord import Color, Embed, Interaction, Member, User, app_commands from discord.app_commands import command, guild_only from discord.ext.commands import Cog @@ -57,6 +59,12 @@ async def profile( @app_commands.guild_only() @app_commands.command(description="View leaderboard") async def leaderboard(self, interaction: Interaction): + # Check guild (not needed but just for type-checking) + guild = interaction.guild + if not guild: + return + + # Get top actors await interaction.response.defer() db = self.bot.get_db(interaction.guild) actors = ( @@ -77,14 +85,41 @@ async def leaderboard(self, interaction: Interaction): embed=EmbedX.info("", "No members found for the leaderboard.") ) return + + # Get associated members + members = [] + for actor in actors: + member = guild.get_member(actor.id) # Try get from cache + if member: + members.append(member) + else: + members.append(None) # placeholder to fetch later concurrently + + # Fetch missing members concurrently + members_futures = [ + guild.fetch_member(actor.id) + for i, actor in enumerate(actors) + if members[i] is None + ] + try: + fetched_members = await asyncio.gather(*members_futures) + except Exception as e: + await interaction.followup.send( + embed=EmbedX.error(description="Could not fetch members.") + ) + return + + # Update members list with fetched members + fetched_index = 0 + for i, actor in enumerate(actors): + if members[i] is None: + members[i] = fetched_members[fetched_index] + fetched_index += 1 + + # Create embed embed = Embed(title="🏆 Leaderboard", color=Color.blue()) for i, actor in enumerate(actors): - guild = interaction.guild - member = ( - (guild.get_member(actor.id) or await guild.fetch_member(actor.id)) - if guild - else None - ) + member = members[i] member_name = member.display_name if member else f"{actor.display_name} (⚠)" embed.add_field( name="", diff --git a/bot/main.py b/bot/main.py index 3174ce1..dcbed75 100644 --- a/bot/main.py +++ b/bot/main.py @@ -52,7 +52,7 @@ async def on_ready(self): log.info("\n" + self.app_commands_info_text) log.info("\n" + await self.app_commands_remote_info_text) log.info("\n" + self.commands_info_text) - await self.sync_commands() + # await self.sync_commands() @Cog.listener() async def on_message(self, message: Message):