From 6ea5c4656104fdea31700c8ee8da2b3b57df0178 Mon Sep 17 00:00:00 2001 From: crygup <65101093+crygup@users.noreply.github.com> Date: Wed, 22 Jul 2026 13:17:50 -0400 Subject: [PATCH] Fix discriminator display for non-bot users Use a shared username formatter across embed authors and response text. Preserve discriminators for bot accounts only. --- src/commands/prefixed/info/channel.ts | 8 ++--- src/commands/prefixed/info/users.ts | 9 +++--- src/commands/prefixed/moderation/ban.ts | 12 ++++---- src/commands/prefixed/moderation/kick.ts | 12 ++++---- .../prefixed/moderation/nick.mass.reset.ts | 4 +-- src/commands/prefixed/moderation/nick.mass.ts | 4 +-- src/commands/prefixed/moderation/prune.ts | 4 +-- src/commands/prefixed/moderation/unban.ts | 10 +++---- src/commands/prefixed/owner/seenon.ts | 9 +++--- src/stores/guildlogging.ts | 9 +++--- src/utils/formatter/commands/info.user.ts | 11 +++---- .../commands/media.av.tools.identify.ts | 3 +- .../commands/reminder.list.server.ts | 2 +- src/utils/tools.ts | 30 ++++++++++++------- 14 files changed, 71 insertions(+), 56 deletions(-) diff --git a/src/commands/prefixed/info/channel.ts b/src/commands/prefixed/info/channel.ts index b793d225..28ae455d 100644 --- a/src/commands/prefixed/info/channel.ts +++ b/src/commands/prefixed/info/channel.ts @@ -6,7 +6,7 @@ import { Snowflake } from 'detritus-utils'; import { BooleanEmojis, ChannelTypesText, CommandCategories, DateMomentLogFormat } from '../../../constants'; import { GuildChannelsStored } from '../../../stores/guildchannels'; -import { Parameters, createTimestampMomentFromGuild, editOrReply } from '../../../utils'; +import { Parameters, createTimestampMomentFromGuild, createUserDisplayName, editOrReply } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -154,9 +154,9 @@ export default class ChannelCommand extends BaseCommand { const owner = channel.owner; if (owner) { - description.push(`**Owner**: ${(insideDm) ? owner.mention : owner}`); - } - const users = channel.recipients.map((user: Structures.User) => (insideDm) ? user.mention : user.toString()); + description.push(`**Owner**: ${(insideDm) ? owner.mention : createUserDisplayName(owner)}`); + } + const users = channel.recipients.map((user: Structures.User) => (insideDm) ? user.mention : createUserDisplayName(user)); description.push(`**Recipients (${users.length})**: ${users.join(', ')}`); embed.addField('DM Information', description.join('\n')); diff --git a/src/commands/prefixed/info/users.ts b/src/commands/prefixed/info/users.ts index 038c7e0d..7a39aae4 100644 --- a/src/commands/prefixed/info/users.ts +++ b/src/commands/prefixed/info/users.ts @@ -14,9 +14,10 @@ import { import { DefaultParameters, Paginator, - Parameters, - createTimestampMomentFromGuild, - editOrReply, + Parameters, + createTimestampMomentFromGuild, + createUserDisplayName, + editOrReply, getMemberJoinPosition, toTitleCase, } from '../../../utils'; @@ -136,7 +137,7 @@ export default class UsersCommand extends BaseCommand { const user = ((isMember) ? member.user : memberOrUser) as Structures.User; const embed = new Embed(); - embed.setAuthor(user.toString(), user.avatarUrlFormat(null, {size: 1024}), user.jumpLink); + embed.setAuthor(createUserDisplayName(user), user.avatarUrlFormat(null, {size: 1024}), user.jumpLink); embed.setColor(PresenceStatusColors['offline']); embed.setDescription(member.mention); embed.setThumbnail(member.avatarUrlFormat(null, {size: 1024})); diff --git a/src/commands/prefixed/moderation/ban.ts b/src/commands/prefixed/moderation/ban.ts index c0f41b2f..3076fc45 100644 --- a/src/commands/prefixed/moderation/ban.ts +++ b/src/commands/prefixed/moderation/ban.ts @@ -3,7 +3,7 @@ import { Permissions } from 'detritus-client/lib/constants'; import { Markup } from 'detritus-client/lib/utils'; import { CommandCategories, DateMomentLogFormat, EmbedColors } from '../../../constants'; -import { Parameters, createTimestampMomentFromGuild, createUserEmbed, editOrReply } from '../../../utils'; +import { Parameters, createTimestampMomentFromGuild, createUserDisplayName, createUserEmbed, editOrReply } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -97,7 +97,7 @@ export default class BanCommand extends BaseCommand { let reason: string | undefined; { const description: Array = []; - description.push(`Admin: ${context.user} (${context.user.id})`); + description.push(`Admin: ${createUserDisplayName(context.user)} (${context.user.id})`); description.push(`Reason: ${(payload.text) ? Markup.escape.all(payload.text) : '[Unspecified Reason]'}`); { const timestamp = createTimestampMomentFromGuild(Date.now(), context.guildId); @@ -144,7 +144,7 @@ export default class BanCommand extends BaseCommand { { const description: Array = []; if (canEdit.length) { - const members = canEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = canEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); for (let member of members) { description.push(`-> ${member}`); } @@ -163,7 +163,7 @@ export default class BanCommand extends BaseCommand { const description: Array = []; if (cannotEdit.length || clientCannotEdit.length) { if (clientCannotEdit.length) { - const members = clientCannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = clientCannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Couldn\'t ban due to Bot\'s Role Position'); for (let member of members) { description.push(`-> ${member}`); @@ -171,7 +171,7 @@ export default class BanCommand extends BaseCommand { } description.push(''); if (cannotEdit.length) { - const members = cannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = cannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Couldn\'t ban due to Your Role Position'); for (let member of members) { description.push(`-> ${member}`); @@ -181,7 +181,7 @@ export default class BanCommand extends BaseCommand { } if (us.length) { - const members = us.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = us.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Cannot Ban Yourself or Myself'); for (let member of members) { description.push(`-> ${member}`); diff --git a/src/commands/prefixed/moderation/kick.ts b/src/commands/prefixed/moderation/kick.ts index 9645a7b7..bc5e7e36 100644 --- a/src/commands/prefixed/moderation/kick.ts +++ b/src/commands/prefixed/moderation/kick.ts @@ -3,7 +3,7 @@ import { Permissions } from 'detritus-client/lib/constants'; import { Markup } from 'detritus-client/lib/utils'; import { CommandCategories, DateMomentLogFormat, EmbedColors } from '../../../constants'; -import { Parameters, createTimestampMomentFromGuild, createUserEmbed } from '../../../utils'; +import { Parameters, createTimestampMomentFromGuild, createUserDisplayName, createUserEmbed } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -92,7 +92,7 @@ export default class KickCommand extends BaseCommand { let reason: string | undefined; { const description: Array = []; - description.push(`Admin: ${context.user} (${context.user.id})`); + description.push(`Admin: ${createUserDisplayName(context.user)} (${context.user.id})`); description.push(`Reason: ${(payload.text) ? Markup.escape.all(payload.text) : '[Unspecified Reason]'}`); { const timestamp = createTimestampMomentFromGuild(Date.now(), context.guildId); @@ -120,7 +120,7 @@ export default class KickCommand extends BaseCommand { { const description: Array = []; if (canEdit.length) { - const members = canEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = canEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); for (let member of members) { description.push(`-> ${member}`); } @@ -139,7 +139,7 @@ export default class KickCommand extends BaseCommand { const description: Array = []; if (cannotEdit.length || clientCannotEdit.length) { if (clientCannotEdit.length) { - const members = clientCannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = clientCannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Couldn\'t kick due to Bot\'s Role Position'); for (let member of members) { description.push(`-> ${member}`); @@ -147,7 +147,7 @@ export default class KickCommand extends BaseCommand { } description.push(''); if (cannotEdit.length) { - const members = cannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = cannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Couldn\'t kick due to Your Role Position'); for (let member of members) { description.push(`-> ${member}`); @@ -157,7 +157,7 @@ export default class KickCommand extends BaseCommand { } if (us.length) { - const members = us.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = us.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Cannot Kick Yourself or Myself'); for (let member of members) { description.push(`-> ${member}`); diff --git a/src/commands/prefixed/moderation/nick.mass.reset.ts b/src/commands/prefixed/moderation/nick.mass.reset.ts index 984143f6..e8a5d0ae 100644 --- a/src/commands/prefixed/moderation/nick.mass.reset.ts +++ b/src/commands/prefixed/moderation/nick.mass.reset.ts @@ -5,7 +5,7 @@ import { Timers } from 'detritus-utils'; import { CommandCategories, DateMomentLogFormat, EmbedColors } from '../../../constants'; import ServerExecutionsStore, { ServerExecutionsStored } from '../../../stores/serverexecutions'; -import { Parameters, createTimestampMomentFromGuild, createUserEmbed, editOrReply } from '../../../utils'; +import { Parameters, createTimestampMomentFromGuild, createUserDisplayName, createUserEmbed, editOrReply } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -138,7 +138,7 @@ export default class NickMassResetCommand extends BaseCommand { skipped: 0, }; const errors: Array = []; - const reason = `Mass Nickname Reset by ${context.user} (${context.user.id})`; + const reason = `Mass Nickname Reset by ${createUserDisplayName(context.user)} (${context.user.id})`; { embed.setDescription(`Ok, starting to clear ${membersThatWillBeEdited.toLocaleString()} member\'s nicknames. (Should take about ${((membersThatWillBeEdited / amount) * time).toLocaleString()} seconds)`); diff --git a/src/commands/prefixed/moderation/nick.mass.ts b/src/commands/prefixed/moderation/nick.mass.ts index 55dd21eb..e6431a09 100644 --- a/src/commands/prefixed/moderation/nick.mass.ts +++ b/src/commands/prefixed/moderation/nick.mass.ts @@ -5,7 +5,7 @@ import { Timers } from 'detritus-utils'; import { CommandCategories, DateMomentLogFormat, EmbedColors } from '../../../constants'; import ServerExecutionsStore, { ServerExecutionsStored } from '../../../stores/serverexecutions'; -import { Parameters, createTimestampMomentFromGuild, createUserEmbed, editOrReply } from '../../../utils'; +import { Parameters, createTimestampMomentFromGuild, createUserDisplayName, createUserEmbed, editOrReply } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -146,7 +146,7 @@ export default class NickMassCommand extends BaseCommand { skipped: 0, }; const errors: Array = []; - const reason = `Mass Nickname change by ${context.user} (${context.user.id})`; + const reason = `Mass Nickname change by ${createUserDisplayName(context.user)} (${context.user.id})`; { embed.setDescription(`Ok, starting to edit ${members.length.toLocaleString()} member\'s nicknames. (Should take about ${((members.length / amount) * time).toLocaleString()} seconds)`); diff --git a/src/commands/prefixed/moderation/prune.ts b/src/commands/prefixed/moderation/prune.ts index c2dea064..09cb223a 100644 --- a/src/commands/prefixed/moderation/prune.ts +++ b/src/commands/prefixed/moderation/prune.ts @@ -11,7 +11,7 @@ import { Timers } from 'detritus-utils'; import { CommandCategories, DateMomentLogFormat, EmbedColors } from '../../../constants'; import ServerExecutionsStore from '../../../stores/serverexecutions'; -import { DefaultParameters, Parameters, createTimestampMomentFromGuild, createUserEmbed, editOrReply } from '../../../utils'; +import { DefaultParameters, Parameters, createTimestampMomentFromGuild, createUserDisplayName, createUserEmbed, editOrReply } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -348,7 +348,7 @@ export default class PruneCommand extends BaseCommand { const manualToDelete = manual.filter((message) => message.canDelete && !message.deleted).map((message) => message.id); deletedTotal += manualToDelete.length; - const reason = `Pruning of ${deletedTotal.toLocaleString()} messages by ${context.user} (${context.user.id})`; + const reason = `Pruning of ${deletedTotal.toLocaleString()} messages by ${createUserDisplayName(context.user)} (${context.user.id})`; for (let messageId of manualToDelete) { await context.rest.deleteMessage(channelId, messageId, {reason}); } diff --git a/src/commands/prefixed/moderation/unban.ts b/src/commands/prefixed/moderation/unban.ts index 61a6b732..3ea5b8e9 100644 --- a/src/commands/prefixed/moderation/unban.ts +++ b/src/commands/prefixed/moderation/unban.ts @@ -3,7 +3,7 @@ import { Permissions } from 'detritus-client/lib/constants'; import { Markup } from 'detritus-client/lib/utils'; import { CommandCategories, DateMomentLogFormat, EmbedColors } from '../../../constants'; -import { Parameters, createTimestampMomentFromGuild, createUserEmbed, editOrReply } from '../../../utils'; +import { Parameters, createTimestampMomentFromGuild, createUserDisplayName, createUserEmbed, editOrReply } from '../../../utils'; import { BaseCommand } from '../basecommand'; @@ -105,7 +105,7 @@ export default class UnbanCommand extends BaseCommand { let reason: string | undefined; { const description: Array = []; - description.push(`Admin: ${context.user} (${context.user.id})`); + description.push(`Admin: ${createUserDisplayName(context.user)} (${context.user.id})`); description.push(`Reason: ${(payload.text) ? Markup.escape.all(payload.text) : '[Unspecified Reason]'}`); { const timestamp = createTimestampMomentFromGuild(Date.now(), context.guildId); @@ -126,7 +126,7 @@ export default class UnbanCommand extends BaseCommand { { const description: Array = []; if (canEdit.length) { - const members = canEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = canEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); for (let member of members) { description.push(`-> ${member}`); } @@ -146,7 +146,7 @@ export default class UnbanCommand extends BaseCommand { if (cannotEdit.length) { description.push(''); if (cannotEdit.length) { - const members = cannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = cannotEdit.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Couldn\'t unban because they ain\'t banned'); for (let member of members) { description.push(`-> ${member}`); @@ -156,7 +156,7 @@ export default class UnbanCommand extends BaseCommand { } if (us.length) { - const members = us.map((member) => `${member.mention} ${Markup.spoiler(`(${member})`)}`); + const members = us.map((member) => `${member.mention} ${Markup.spoiler(`(${createUserDisplayName(member)})`)}`); description.push('Cannot Unban Yourself or Myself'); for (let member of members) { description.push(`-> ${member}`); diff --git a/src/commands/prefixed/owner/seenon.ts b/src/commands/prefixed/owner/seenon.ts index adb0111f..fe65d210 100644 --- a/src/commands/prefixed/owner/seenon.ts +++ b/src/commands/prefixed/owner/seenon.ts @@ -8,9 +8,10 @@ import { CommandCategories, DateMomentLogFormat } from '../../../constants'; import { DefaultParameters, Paginator, - Parameters, - createTimestampMomentFromGuild, - editOrReply, + Parameters, + createTimestampMomentFromGuild, + createUserDisplayName, + editOrReply, toTitleCase, } from '../../../utils'; @@ -144,7 +145,7 @@ export default class SeenOnCommand extends BaseCommand { pageLimit, onPage: (page) => { const embed = new Embed(); - embed.setAuthor(user.toString(), user.avatarUrlFormat(null, {size: 1024}), user.jumpLink); + embed.setAuthor(createUserDisplayName(user), user.avatarUrlFormat(null, {size: 1024}), user.jumpLink); embed.setColor(Colors.BLURPLE); const resultNumber = page - 1; diff --git a/src/stores/guildlogging.ts b/src/stores/guildlogging.ts index 579bcb4f..d8b279a6 100644 --- a/src/stores/guildlogging.ts +++ b/src/stores/guildlogging.ts @@ -31,9 +31,10 @@ import { import { RedisSpewer } from '../redis'; import { createColorUrl, - createTimestampMomentFromGuild, - createTimestampStringFromGuild, - createUserEmbed, + createTimestampMomentFromGuild, + createTimestampStringFromGuild, + createUserDisplayName, + createUserEmbed, createUserString, permissionsToObject, } from '../utils'; @@ -1734,7 +1735,7 @@ export function createLogPayload( if (MAX_MENTIONS <= message.mentions.length) { text.push(`${message.mentions.length.toLocaleString()} Users`); } else { - text.push(message.mentions.map((user) => `**${Markup.codestring(String(user))}**`).join(', ')); + text.push(message.mentions.map((user) => `**${Markup.codestring(createUserDisplayName(user))}**`).join(', ')); } } embed.addField('Mentions', `- ${text.join(', ')}`); diff --git a/src/utils/formatter/commands/info.user.ts b/src/utils/formatter/commands/info.user.ts index dc0a60de..390f6c35 100644 --- a/src/utils/formatter/commands/info.user.ts +++ b/src/utils/formatter/commands/info.user.ts @@ -14,9 +14,10 @@ import { PRESENCE_CLIENT_STATUS_KEYS, } from '../../../constants'; import { - Paginator, - createTimestampMomentFromContext, - getMemberJoinPosition, + Paginator, + createTimestampMomentFromContext, + createUserDisplayName, + getMemberJoinPosition, toTitleCase, } from '../../../utils'; @@ -100,10 +101,10 @@ export async function createMessage( if (files.length) { const file = files[0]!; - embed.setAuthor(user.toString(), `attachment://${file.filename}`, user.jumpLink); + embed.setAuthor(createUserDisplayName(user), `attachment://${file.filename}`, user.jumpLink); embed.setThumbnail(`attachment://${file.filename}`); } else { - embed.setAuthor(user.toString(), avatarUrl, user.jumpLink); + embed.setAuthor(createUserDisplayName(user), avatarUrl, user.jumpLink); embed.setThumbnail(avatarUrl); } diff --git a/src/utils/formatter/commands/media.av.tools.identify.ts b/src/utils/formatter/commands/media.av.tools.identify.ts index 2dc0d2da..2b2b930a 100644 --- a/src/utils/formatter/commands/media.av.tools.identify.ts +++ b/src/utils/formatter/commands/media.av.tools.identify.ts @@ -7,6 +7,7 @@ import { DateMomentLogFormat, EmbedBrands, EmbedColors } from '../../../constant import { Paginator, createTimestampMomentFromGuild, + createUserDisplayName, createUserEmbed, createUserString, editOrReply, @@ -147,7 +148,7 @@ export async function createMessage( isEphemeral: args.isEphemeral, onPage: (page) => { const embed = new Embed(); - embed.setAuthor(user.toString(), user.avatarUrlFormat(null, {size: 1024}), user.jumpLink); + embed.setAuthor(createUserDisplayName(user), user.avatarUrlFormat(null, {size: 1024}), user.jumpLink); // future proofing embed.setColor(PresenceStatusColors['offline']); embed.setDescription(user.mention); diff --git a/src/utils/formatter/commands/reminder.list.server.ts b/src/utils/formatter/commands/reminder.list.server.ts index 7b3e02dc..19600c5a 100644 --- a/src/utils/formatter/commands/reminder.list.server.ts +++ b/src/utils/formatter/commands/reminder.list.server.ts @@ -98,7 +98,7 @@ export async function createMessage( const user = context.users.get(reminder.user.id)!; noun = createUserString(reminder.user.id, user); } else { - const name = `${reminder.user.username}#${reminder.user.discriminator}`; + const name = reminder.user.username; noun = createUserString(reminder.user.id, null, name); } text = `${text} by ${noun} (Id: ${reminder.position})`; diff --git a/src/utils/tools.ts b/src/utils/tools.ts index 78af2305..b0d446fc 100644 --- a/src/utils/tools.ts +++ b/src/utils/tools.ts @@ -150,20 +150,30 @@ export function createTimestampStringFromGuild(timestamp: number | string, guild } -export function createUserEmbed(user: Structures.User, embed: Embed = new Embed()) { - embed.setAuthor( - (user.bot) ? `${user} (BOT)` : user.toString(), - user.avatarUrlFormat(null, {size: 1024}), - user.jumpLink, - ); +export function createUserDisplayName(user: Structures.Member | Structures.User): string { + if (user.bot && user.discriminator && user.discriminator !== '0') { + return `${user.username}#${user.discriminator}`; + } + return user.username; +} + + +export function createUserEmbed(user: Structures.User, embed: Embed = new Embed()) { + const name = createUserDisplayName(user); + embed.setAuthor( + (user.bot) ? `${name} (BOT)` : name, + user.avatarUrlFormat(null, {size: 1024}), + user.jumpLink, + ); return embed; } -export function createUserString(userId: string = '1', user?: Structures.User | null, name?: string): string { - if (user || name) { - return `<@${userId}> ${Markup.spoiler(`(${Markup.escape.all(String(user || name))})`)}`; - } +export function createUserString(userId: string = '1', user?: Structures.User | null, name?: string): string { + if (user || name) { + const displayName = (user) ? createUserDisplayName(user) : name!; + return `<@${userId}> ${Markup.spoiler(`(${Markup.escape.all(displayName)})`)}`; + } return `<@${userId}>`; }