From e15c17850f58e9acc21bee6b65f3448c1c576f22 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 11 Oct 2026 16:03:24 +0200 Subject: [PATCH 1/3] Handle missing members in XP lookup Refactored /xp top command to fall back to the global user object if a member can't be found for a db record --- modules/operation/xp.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/operation/xp.py b/modules/operation/xp.py index 31d10075..3fe52f28 100644 --- a/modules/operation/xp.py +++ b/modules/operation/xp.py @@ -3,7 +3,7 @@ from __future__ import annotations import random -from typing import TYPE_CHECKING, Self +from typing import Optional, TYPE_CHECKING, Self import discord import expiringdict @@ -76,17 +76,26 @@ async def top_xp_command(self: Self, interaction: discord.Interaction) -> None: index = 1 for database_entry in top_xp: # 1 - DisplayName (username), @XP, xp - xp_user: discord.Member = await interaction.guild.fetch_member( - database_entry.user_id - ) user_str = f"Unkown user ({database_entry.user_id})" xp_role_str = "No role yet" + xp_user: Optional[discord.Member] = None - if xp_user: + try: + # Try fetching member first + xp_user = await interaction.guild.fetch_member( + int(database_entry.user_id) + ) user_str = f"{xp_user.mention} ({xp_user.name})" xp_role = await get_current_XP_role(self.bot, xp_user) if xp_role: xp_role_str = xp_role.mention + except (discord.NotFound, discord.HTTPException): + try: + # Fall back to global user if no member exists + user_obj = await self.bot.fetch_user(int(database_entry.user_id)) + user_str = f"{user_obj.name} ({database_entry.user_id})" + except discord.HTTPException: + pass description += f"{index} - {user_str}, {xp_role_str}, {database_entry.xp}\n" index += 1 From c6d2e4986d0b7d6e162b9083d8a49d79b7a99309 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 11 Oct 2026 16:11:46 +0200 Subject: [PATCH 2/3] updated deprecated line pointed out by PR checks --- modules/operation/xp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/operation/xp.py b/modules/operation/xp.py index 3fe52f28..efb8eb39 100644 --- a/modules/operation/xp.py +++ b/modules/operation/xp.py @@ -78,7 +78,7 @@ async def top_xp_command(self: Self, interaction: discord.Interaction) -> None: # 1 - DisplayName (username), @XP, xp user_str = f"Unkown user ({database_entry.user_id})" xp_role_str = "No role yet" - xp_user: Optional[discord.Member] = None + xp_user: discord.Member | None = None try: # Try fetching member first From 61e39f1bf569aa6fa27f2328f92613530bf4a219 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 11 Oct 2026 16:13:36 +0200 Subject: [PATCH 3/3] I am stupid, lord praise automated PR checks I forgot to remove the import... --- modules/operation/xp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/operation/xp.py b/modules/operation/xp.py index efb8eb39..f265a1ec 100644 --- a/modules/operation/xp.py +++ b/modules/operation/xp.py @@ -3,7 +3,7 @@ from __future__ import annotations import random -from typing import Optional, TYPE_CHECKING, Self +from typing import TYPE_CHECKING, Self import discord import expiringdict