From df3b63a751df2cf603ddf3dc6f10f3649564c5b5 Mon Sep 17 00:00:00 2001 From: GeekCornerGH <45696571+GeekCornerGH@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:13:24 +0100 Subject: [PATCH] fix: Username --- src/utils/getUsername.ts | 56 +++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/src/utils/getUsername.ts b/src/utils/getUsername.ts index c2bd468..178872a 100644 --- a/src/utils/getUsername.ts +++ b/src/utils/getUsername.ts @@ -1,13 +1,45 @@ -import { Client, Snowflake } from "discord.js"; - -export async function getUsername(client: Client, guildId: Snowflake, memberId: Snowflake) { - let guild = client.guilds.cache.get(guildId); - if (!guild) guild = await client.guilds.fetch(guildId); - let member = guild.members.cache.get(memberId); - if (!member) member = await guild.members.fetch(memberId); - if (member) return member.displayName; - let user = client.users.cache.get(memberId); - if (!user) user = await client.users.fetch(memberId); - if (!user) return ""; - return user.displayName; +import { Client, DiscordAPIError, Guild, GuildMember, Snowflake, } from "discord.js"; + +const nonExistentMemberCache = new Map(); +const CACHE_DURATION = 30000; // 30 seconds + +export async function getUsername(client: Client, guildId: Snowflake, memberId: Snowflake): Promise { + try { + // Fetch guild + const guild = client.guilds.cache.get(guildId) || await client.guilds.fetch(guildId); + + // Check if member is cached as non-existent + if (nonExistentMemberCache.has(memberId)) { + return await fetchUserDisplayName(client, memberId); + } + + // Attempt to fetch member + try { + const member = await fetchMember(guild, memberId); + return member.displayName; + } catch (memberError) { + if ((memberError as DiscordAPIError).code === 10007) { // Unknown member error + nonExistentMemberCache.set(memberId, true); + setTimeout(() => nonExistentMemberCache.delete(memberId), CACHE_DURATION); + } + return await fetchUserDisplayName(client, memberId); + } + } catch (error) { + console.error("Error in getUsername:", error); + return ""; + } +} + +async function fetchMember(guild: Guild, memberId: Snowflake): Promise { + return guild.members.cache.get(memberId) || await guild.members.fetch(memberId); +} + +async function fetchUserDisplayName(client: Client, userId: Snowflake): Promise { + try { + const user = client.users.cache.get(userId) || await client.users.fetch(userId); + return user.displayName; + } catch (error) { + console.error("Error fetching user:", error); + return ""; + } }