diff --git a/backend/src/plugins/Automod/actions/startThread.ts b/backend/src/plugins/Automod/actions/startThread.ts index cf1d4ad7..25b840e1 100644 --- a/backend/src/plugins/Automod/actions/startThread.ts +++ b/backend/src/plugins/Automod/actions/startThread.ts @@ -67,7 +67,7 @@ export const StartThreadAction = automodAction({ msg: savedMessageToTemplateSafeSavedMessage(threadContext.message!), }), ); - const threadName = await renderThreadName(actionConfig.name ?? "{user.tag}s thread"); + const threadName = await renderThreadName(actionConfig.name ?? "{user.renderedUsername}'s thread"); const threadOptions: GuildTextThreadCreateOptions = { name: threadName, autoArchiveDuration: autoArchive, diff --git a/backend/src/plugins/Automod/triggers/roleAdded.ts b/backend/src/plugins/Automod/triggers/roleAdded.ts index 387f4d9b..dc62f163 100644 --- a/backend/src/plugins/Automod/triggers/roleAdded.ts +++ b/backend/src/plugins/Automod/triggers/roleAdded.ts @@ -1,5 +1,6 @@ import { Snowflake } from "discord.js"; import * as t from "io-ts"; +import { renderUserUsername } from "../../../utils"; import { consumeIgnoredRoleChange } from "../functions/ignoredRoleChanges"; import { automodTrigger } from "../helpers"; @@ -37,7 +38,7 @@ export const RoleAddedTrigger = automodTrigger()({ const role = pluginData.guild.roles.cache.get(matchResult.extra.matchedRoleId as Snowflake); const roleName = role?.name || "Unknown"; const member = contexts[0].member!; - const memberName = `**${member.user.tag}** (\`${member.id}\`)`; + const memberName = `**${renderUserUsername(member.user)}** (\`${member.id}\`)`; return `Role ${roleName} (\`${matchResult.extra.matchedRoleId}\`) was added to ${memberName}`; }, }); diff --git a/backend/src/plugins/Automod/triggers/roleRemoved.ts b/backend/src/plugins/Automod/triggers/roleRemoved.ts index 46b68376..65624827 100644 --- a/backend/src/plugins/Automod/triggers/roleRemoved.ts +++ b/backend/src/plugins/Automod/triggers/roleRemoved.ts @@ -1,5 +1,6 @@ import { Snowflake } from "discord.js"; import * as t from "io-ts"; +import { renderUserUsername } from "../../../utils"; import { consumeIgnoredRoleChange } from "../functions/ignoredRoleChanges"; import { automodTrigger } from "../helpers"; @@ -37,7 +38,7 @@ export const RoleRemovedTrigger = automodTrigger()({ const role = pluginData.guild.roles.cache.get(matchResult.extra.matchedRoleId as Snowflake); const roleName = role?.name || "Unknown"; const member = contexts[0].member!; - const memberName = `**${member.user.tag}** (\`${member.id}\`)`; + const memberName = `**${renderUserUsername(member.user)}** (\`${member.id}\`)`; return `Role ${roleName} (\`${matchResult.extra.matchedRoleId}\`) was removed from ${memberName}`; }, }); diff --git a/backend/src/plugins/BotControl/commands/AddDashboardUserCmd.ts b/backend/src/plugins/BotControl/commands/AddDashboardUserCmd.ts index 4ac812a7..c1259594 100644 --- a/backend/src/plugins/BotControl/commands/AddDashboardUserCmd.ts +++ b/backend/src/plugins/BotControl/commands/AddDashboardUserCmd.ts @@ -1,6 +1,7 @@ import { ApiPermissions } from "@shared/apiPermissions"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { isStaffPreFilter, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; +import { renderUserUsername } from "../../../utils"; import { botControlCmd } from "../types"; export const AddDashboardUserCmd = botControlCmd({ @@ -34,7 +35,7 @@ export const AddDashboardUserCmd = botControlCmd({ await pluginData.state.apiPermissionAssignments.addUser(args.guildId, user.id, [ApiPermissions.EditConfig]); } - const userNameList = args.users.map((user) => `<@!${user.id}> (**${user.tag}**, \`${user.id}\`)`); + const userNameList = args.users.map((user) => `<@!${user.id}> (**${renderUserUsername(user)}**, \`${user.id}\`)`); sendSuccessMessage( pluginData, msg.channel, diff --git a/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts b/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts index 6513276c..7924392b 100644 --- a/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts +++ b/backend/src/plugins/BotControl/commands/ListDashboardPermsCmd.ts @@ -2,7 +2,7 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { AllowedGuild } from "../../../data/entities/AllowedGuild"; import { ApiPermissionAssignment } from "../../../data/entities/ApiPermissionAssignment"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { resolveUser } from "../../../utils"; +import { renderUserUsername, resolveUser } from "../../../utils"; import { botControlCmd } from "../types"; export const ListDashboardPermsCmd = botControlCmd({ @@ -42,7 +42,7 @@ export const ListDashboardPermsCmd = botControlCmd({ // If we have user, always display which guilds they have permissions in (or only specified guild permissions) if (args.user) { - const userInfo = `**${args.user.tag}** (\`${args.user.id}\`)`; + const userInfo = `**${renderUserUsername(args.user)}** (\`${args.user.id}\`)`; for (const assignment of existingUserAssignment!) { if (guild != null && assignment.guild_id !== args.guildId) continue; @@ -74,7 +74,9 @@ export const ListDashboardPermsCmd = botControlCmd({ finalMessage += `The server ${guildInfo} has the following assigned permissions:\n`; // Double \n for consistency with AddDashboardUserCmd for (const assignment of existingGuildAssignment) { const user = await resolveUser(pluginData.client, assignment.target_id); - finalMessage += `\n**${user.tag}**, \`${assignment.target_id}\`: ${assignment.permissions.join(", ")}`; + finalMessage += `\n**${renderUserUsername(user)}**, \`${assignment.target_id}\`: ${assignment.permissions.join( + ", ", + )}`; } } diff --git a/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts b/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts index 2c53d27b..36f1432f 100644 --- a/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts +++ b/backend/src/plugins/BotControl/commands/ListDashboardUsersCmd.ts @@ -1,6 +1,6 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { resolveUser } from "../../../utils"; +import { renderUserUsername, resolveUser } from "../../../utils"; import { botControlCmd } from "../types"; export const ListDashboardUsersCmd = botControlCmd({ @@ -27,7 +27,7 @@ export const ListDashboardUsersCmd = botControlCmd({ ); const userNameList = users.map( ({ user, permission }) => - `<@!${user.id}> (**${user.tag}**, \`${user.id}\`): ${permission.permissions.join(", ")}`, + `<@!${user.id}> (**${renderUserUsername(user)}**, \`${user.id}\`): ${permission.permissions.join(", ")}`, ); sendSuccessMessage( diff --git a/backend/src/plugins/BotControl/commands/RemoveDashboardUserCmd.ts b/backend/src/plugins/BotControl/commands/RemoveDashboardUserCmd.ts index c3f0c0d7..3a90683c 100644 --- a/backend/src/plugins/BotControl/commands/RemoveDashboardUserCmd.ts +++ b/backend/src/plugins/BotControl/commands/RemoveDashboardUserCmd.ts @@ -1,5 +1,6 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { isStaffPreFilter, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; +import { renderUserUsername } from "../../../utils"; import { botControlCmd } from "../types"; export const RemoveDashboardUserCmd = botControlCmd({ @@ -33,7 +34,7 @@ export const RemoveDashboardUserCmd = botControlCmd({ await pluginData.state.apiPermissionAssignments.removeUser(args.guildId, user.id); } - const userNameList = args.users.map((user) => `<@!${user.id}> (**${user.tag}**, \`${user.id}\`)`); + const userNameList = args.users.map((user) => `<@!${user.id}> (**${renderUserUsername(user)}**, \`${user.id}\`)`); sendSuccessMessage( pluginData, msg.channel, diff --git a/backend/src/plugins/Cases/functions/createCase.ts b/backend/src/plugins/Cases/functions/createCase.ts index ad5dd86f..c16d937b 100644 --- a/backend/src/plugins/Cases/functions/createCase.ts +++ b/backend/src/plugins/Cases/functions/createCase.ts @@ -1,14 +1,14 @@ import type { Snowflake } from "discord.js"; import { GuildPluginData } from "knub"; import { logger } from "../../../logger"; -import { resolveUser } from "../../../utils"; +import { renderUserUsername, resolveUser } from "../../../utils"; import { CaseArgs, CasesPluginType } from "../types"; import { createCaseNote } from "./createCaseNote"; import { postCaseToCaseLogChannel } from "./postToCaseLogChannel"; export async function createCase(pluginData: GuildPluginData, args: CaseArgs) { const user = await resolveUser(pluginData.client, args.userId); - const userName = user.tag; + const userName = renderUserUsername(user); const mod = await resolveUser(pluginData.client, args.modId); const modName = mod.tag; diff --git a/backend/src/plugins/ModActions/commands/AddCaseCmd.ts b/backend/src/plugins/ModActions/commands/AddCaseCmd.ts index 567bfac6..43575463 100644 --- a/backend/src/plugins/ModActions/commands/AddCaseCmd.ts +++ b/backend/src/plugins/ModActions/commands/AddCaseCmd.ts @@ -3,7 +3,7 @@ import { CaseTypes } from "../../../data/CaseTypes"; import { Case } from "../../../data/entities/Case"; import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin"; import { canActOn, hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { resolveMember, resolveUser } from "../../../utils"; +import { renderUserUsername, resolveMember, resolveUser } from "../../../utils"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { formatReasonWithAttachments } from "../functions/formatReasonWithAttachments"; import { modActionsCmd } from "../types"; @@ -72,7 +72,11 @@ export const AddCaseCmd = modActionsCmd({ }); if (user) { - sendSuccessMessage(pluginData, msg.channel, `Case #${theCase.case_number} created for **${user.tag}**`); + sendSuccessMessage( + pluginData, + msg.channel, + `Case #${theCase.case_number} created for **${renderUserUsername(user)}**`, + ); } else { sendSuccessMessage(pluginData, msg.channel, `Case #${theCase.case_number} created`); } diff --git a/backend/src/plugins/ModActions/commands/BanCmd.ts b/backend/src/plugins/ModActions/commands/BanCmd.ts index 91b57000..9d32cd10 100644 --- a/backend/src/plugins/ModActions/commands/BanCmd.ts +++ b/backend/src/plugins/ModActions/commands/BanCmd.ts @@ -5,7 +5,7 @@ import { CaseTypes } from "../../../data/CaseTypes"; import { clearExpiringTempban, registerExpiringTempban } from "../../../data/loops/expiringTempbansLoop"; import { canActOn, hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin"; -import { resolveMember, resolveUser } from "../../../utils"; +import { renderUserUsername, resolveMember, resolveUser } from "../../../utils"; import { banLock } from "../../../utils/lockNameHelpers"; import { waitForButtonConfirm } from "../../../utils/waitForInteraction"; import { LogsPlugin } from "../../Logs/LogsPlugin"; @@ -207,7 +207,7 @@ export const BanCmd = modActionsCmd({ // Confirm the action to the moderator let response = ""; if (!forceban) { - response = `Banned **${user.tag}** ${forTime}(Case #${banResult.case.case_number})`; + response = `Banned **${renderUserUsername(user)}** ${forTime}(Case #${banResult.case.case_number})`; if (banResult.notifyResult.text) response += ` (${banResult.notifyResult.text})`; } else { response = `Member forcebanned ${forTime}(Case #${banResult.case.case_number})`; diff --git a/backend/src/plugins/ModActions/commands/CasesUserCmd.ts b/backend/src/plugins/ModActions/commands/CasesUserCmd.ts index 222f6aa8..069ad31f 100644 --- a/backend/src/plugins/ModActions/commands/CasesUserCmd.ts +++ b/backend/src/plugins/ModActions/commands/CasesUserCmd.ts @@ -3,7 +3,7 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { CaseTypes } from "../../../data/CaseTypes"; import { sendErrorMessage } from "../../../pluginUtils"; import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin"; -import { UnknownUser, chunkArray, emptyEmbedValue, resolveUser, trimLines } from "../../../utils"; +import { UnknownUser, chunkArray, emptyEmbedValue, renderUserUsername, resolveUser, trimLines } from "../../../utils"; import { asyncMap } from "../../../utils/async"; import { getChunkedEmbedFields } from "../../../utils/getChunkedEmbedFields"; import { getGuildPrefix } from "../../../utils/getGuildPrefix"; @@ -61,7 +61,8 @@ export const CasesUserCmd = modActionsCmd({ const normalCases = cases.filter((c) => !c.is_hidden); const hiddenCases = cases.filter((c) => c.is_hidden); - const userName = user instanceof UnknownUser && cases.length ? cases[cases.length - 1].user_name : user.tag; + const userName = + user instanceof UnknownUser && cases.length ? cases[cases.length - 1].user_name : renderUserUsername(user); if (cases.length === 0) { msg.channel.send(`No cases found for **${userName}**`); diff --git a/backend/src/plugins/ModActions/commands/NoteCmd.ts b/backend/src/plugins/ModActions/commands/NoteCmd.ts index ad183ba1..b13ed498 100644 --- a/backend/src/plugins/ModActions/commands/NoteCmd.ts +++ b/backend/src/plugins/ModActions/commands/NoteCmd.ts @@ -1,7 +1,7 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { CaseTypes } from "../../../data/CaseTypes"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { resolveUser } from "../../../utils"; +import { renderUserUsername, resolveUser } from "../../../utils"; import { CasesPlugin } from "../../Cases/CasesPlugin"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { formatReasonWithAttachments } from "../functions/formatReasonWithAttachments"; @@ -29,7 +29,7 @@ export const NoteCmd = modActionsCmd({ return; } - const userName = user.tag; + const userName = renderUserUsername(user); const reason = formatReasonWithAttachments(args.note, [...msg.attachments.values()]); const casesPlugin = pluginData.getPlugin(CasesPlugin); diff --git a/backend/src/plugins/ModActions/commands/WarnCmd.ts b/backend/src/plugins/ModActions/commands/WarnCmd.ts index c15c82ca..c8192015 100644 --- a/backend/src/plugins/ModActions/commands/WarnCmd.ts +++ b/backend/src/plugins/ModActions/commands/WarnCmd.ts @@ -1,7 +1,7 @@ import { commandTypeHelpers as ct } from "../../../commandTypes"; import { CaseTypes } from "../../../data/CaseTypes"; import { canActOn, hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { errorMessage, resolveMember, resolveUser } from "../../../utils"; +import { errorMessage, renderUserUsername, resolveMember, resolveUser } from "../../../utils"; import { waitForButtonConfirm } from "../../../utils/waitForInteraction"; import { CasesPlugin } from "../../Cases/CasesPlugin"; import { formatReasonWithAttachments } from "../functions/formatReasonWithAttachments"; @@ -106,7 +106,7 @@ export const WarnCmd = modActionsCmd({ sendSuccessMessage( pluginData, msg.channel, - `Warned **${memberToWarn.user.tag}** (Case #${warnResult.case.case_number})${messageResultText}`, + `Warned **${renderUserUsername(memberToWarn.user)}** (Case #${warnResult.case.case_number})${messageResultText}`, ); }, }); diff --git a/backend/src/plugins/ModActions/events/PostAlertOnMemberJoinEvt.ts b/backend/src/plugins/ModActions/events/PostAlertOnMemberJoinEvt.ts index d64ec08b..677fb603 100644 --- a/backend/src/plugins/ModActions/events/PostAlertOnMemberJoinEvt.ts +++ b/backend/src/plugins/ModActions/events/PostAlertOnMemberJoinEvt.ts @@ -1,5 +1,5 @@ import { PermissionsBitField, Snowflake, TextChannel } from "discord.js"; -import { resolveMember } from "../../../utils"; +import { renderUserUsername, resolveMember } from "../../../utils"; import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { modActionsEvt } from "../types"; @@ -46,7 +46,9 @@ export const PostAlertOnMemberJoinEvt = modActionsEvt({ } await alertChannel.send( - `<@!${member.id}> (${member.user.tag} \`${member.id}\`) joined with ${actions.length} prior record(s)`, + `<@!${member.id}> (${renderUserUsername(member.user)} \`${member.id}\`) joined with ${ + actions.length + } prior record(s)`, ); } }, diff --git a/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts b/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts index 7b7d7129..73a1e2d9 100644 --- a/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualKickMemberCmd.ts @@ -3,7 +3,7 @@ import { GuildPluginData } from "knub"; import { hasPermission } from "knub/helpers"; import { LogType } from "../../../data/LogType"; import { canActOn, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { DAYS, SECONDS, errorMessage, resolveMember, resolveUser } from "../../../utils"; +import { DAYS, SECONDS, errorMessage, renderUserUsername, resolveMember, resolveUser } from "../../../utils"; import { IgnoredEventType, ModActionsPluginType } from "../types"; import { formatReasonWithAttachments } from "./formatReasonWithAttachments"; import { ignoreEvent } from "./ignoreEvent"; @@ -103,7 +103,7 @@ export async function actualKickMemberCmd( } // Confirm the action to the moderator - let response = `Kicked **${memberToKick.user.tag}** (Case #${kickResult.case.case_number})`; + let response = `Kicked **${renderUserUsername(memberToKick.user)}** (Case #${kickResult.case.case_number})`; if (kickResult.notifyResult.text) response += ` (${kickResult.notifyResult.text})`; sendSuccessMessage(pluginData, msg.channel, response); diff --git a/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts b/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts index abb3daab..5c628c4e 100644 --- a/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualMuteUserCmd.ts @@ -4,7 +4,7 @@ import { GuildPluginData } from "knub"; import { ERRORS, RecoverablePluginError } from "../../../RecoverablePluginError"; import { logger } from "../../../logger"; import { hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { UnknownUser, asSingleLine, isDiscordAPIError } from "../../../utils"; +import { UnknownUser, asSingleLine, isDiscordAPIError, renderUserUsername } from "../../../utils"; import { MutesPlugin } from "../../Mutes/MutesPlugin"; import { MuteResult } from "../../Mutes/types"; import { ModActionsPluginType } from "../types"; @@ -86,24 +86,24 @@ export async function actualMuteUserCmd( if (args.time) { if (muteResult.updatedExistingMute) { response = asSingleLine(` - Updated **${user.tag}**'s + Updated **${renderUserUsername(user)}**'s mute to ${timeUntilUnmute} (Case #${muteResult.case.case_number}) `); } else { response = asSingleLine(` - Muted **${user.tag}** + Muted **${renderUserUsername(user)}** for ${timeUntilUnmute} (Case #${muteResult.case.case_number}) `); } } else { if (muteResult.updatedExistingMute) { response = asSingleLine(` - Updated **${user.tag}**'s + Updated **${renderUserUsername(user)}**'s mute to indefinite (Case #${muteResult.case.case_number}) `); } else { response = asSingleLine(` - Muted **${user.tag}** + Muted **${renderUserUsername(user)}** indefinitely (Case #${muteResult.case.case_number}) `); } diff --git a/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts b/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts index 2e60a32b..d70a219c 100644 --- a/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts +++ b/backend/src/plugins/ModActions/functions/actualUnmuteUserCmd.ts @@ -3,7 +3,7 @@ import humanizeDuration from "humanize-duration"; import { GuildPluginData } from "knub"; import { hasPermission, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { MutesPlugin } from "../../../plugins/Mutes/MutesPlugin"; -import { UnknownUser, asSingleLine } from "../../../utils"; +import { UnknownUser, asSingleLine, renderUserUsername } from "../../../utils"; import { ModActionsPluginType } from "../types"; import { formatReasonWithAttachments } from "./formatReasonWithAttachments"; @@ -48,7 +48,7 @@ export async function actualUnmuteCmd( pluginData, msg.channel, asSingleLine(` - Unmuting **${user.tag}** + Unmuting **${renderUserUsername(user)}** in ${timeUntilUnmute} (Case #${result.case.case_number}) `), ); @@ -57,7 +57,7 @@ export async function actualUnmuteCmd( pluginData, msg.channel, asSingleLine(` - Unmuted **${user.tag}** + Unmuted **${renderUserUsername(user)}** (Case #${result.case.case_number}) `), ); diff --git a/backend/src/plugins/Mutes/commands/MutesCmd.ts b/backend/src/plugins/Mutes/commands/MutesCmd.ts index 699b8b11..179d1a65 100644 --- a/backend/src/plugins/Mutes/commands/MutesCmd.ts +++ b/backend/src/plugins/Mutes/commands/MutesCmd.ts @@ -10,7 +10,7 @@ import moment from "moment-timezone"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { humanizeDurationShort } from "../../../humanizeDurationShort"; import { getBaseUrl } from "../../../pluginUtils"; -import { DBDateFormat, MINUTES, resolveMember } from "../../../utils"; +import { DBDateFormat, MINUTES, renderUserUsername, resolveMember } from "../../../utils"; import { IMuteWithDetails, mutesCmd } from "../types"; export const MutesCmd = mutesCmd({ @@ -74,7 +74,7 @@ export const MutesCmd = mutesCmd({ totalMutes = manuallyMutedMembers.length; lines = manuallyMutedMembers.map((member) => { - return `<@!${member.id}> (**${member.user.tag}**, \`${member.id}\`) 🔧 Manual mute`; + return `<@!${member.id}> (**${renderUserUsername(member.user)}**, \`${member.id}\`) 🔧 Manual mute`; }); } else { // Show filtered active mutes (but not manual mutes) @@ -123,7 +123,7 @@ export const MutesCmd = mutesCmd({ lines = filteredMutes.map((mute) => { const user = pluginData.client.users.resolve(mute.user_id as Snowflake); - const username = user ? user.tag : "Unknown#0000"; + const username = user ? renderUserUsername(user) : "Unknown#0000"; const theCase = muteCasesById.get(mute.case_id); const caseName = theCase ? `Case #${theCase.case_number}` : "No case"; diff --git a/backend/src/plugins/NameHistory/commands/NamesCmd.ts b/backend/src/plugins/NameHistory/commands/NamesCmd.ts index e84699a9..373f1671 100644 --- a/backend/src/plugins/NameHistory/commands/NamesCmd.ts +++ b/backend/src/plugins/NameHistory/commands/NamesCmd.ts @@ -5,7 +5,7 @@ import { MAX_NICKNAME_ENTRIES_PER_USER } from "../../../data/GuildNicknameHistor import { MAX_USERNAME_ENTRIES_PER_USER } from "../../../data/UsernameHistory"; import { NICKNAME_RETENTION_PERIOD } from "../../../data/cleanup/nicknames"; import { sendErrorMessage } from "../../../pluginUtils"; -import { DAYS } from "../../../utils"; +import { DAYS, renderUserUsername } from "../../../utils"; import { nameHistoryCmd } from "../types"; export const NamesCmd = nameHistoryCmd({ @@ -31,7 +31,7 @@ export const NamesCmd = nameHistoryCmd({ const usernameRows = usernames.map((r) => `\`[${r.timestamp}]\` **${disableCodeBlocks(r.username)}**`); const user = await pluginData.client.users.fetch(args.userId as Snowflake).catch(() => null); - const currentUsername = user ? user.tag : args.userId; + const currentUsername = user ? renderUserUsername(user) : args.userId; const nicknameDays = Math.round(NICKNAME_RETENTION_PERIOD / DAYS); const usernameDays = Math.round(NICKNAME_RETENTION_PERIOD / DAYS); diff --git a/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts b/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts index 6ba6945b..a2a82fe9 100644 --- a/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts +++ b/backend/src/plugins/ReactionRoles/util/addMemberPendingRoleChange.ts @@ -1,7 +1,7 @@ import { Snowflake } from "discord.js"; import { GuildPluginData } from "knub"; import { logger } from "../../../logger"; -import { resolveMember } from "../../../utils"; +import { renderUserUsername, resolveMember } from "../../../utils"; import { memberRolesLock } from "../../../utils/lockNameHelpers"; import { PendingMemberRoleChanges, ReactionRolesPluginType, RoleChangeMode } from "../types"; @@ -33,7 +33,9 @@ export async function addMemberPendingRoleChange( try { await member.roles.set(Array.from(newRoleIds.values()), "Reaction roles"); } catch (e) { - logger.warn(`Failed to apply role changes to ${member.user.tag} (${member.id}): ${e.message}`); + logger.warn( + `Failed to apply role changes to ${renderUserUsername(member.user)} (${member.id}): ${e.message}`, + ); } } lock.unlock(); diff --git a/backend/src/plugins/Slowmode/commands/SlowmodeClearCmd.ts b/backend/src/plugins/Slowmode/commands/SlowmodeClearCmd.ts index cf434386..246a048e 100644 --- a/backend/src/plugins/Slowmode/commands/SlowmodeClearCmd.ts +++ b/backend/src/plugins/Slowmode/commands/SlowmodeClearCmd.ts @@ -1,7 +1,7 @@ import { ChannelType, escapeInlineCode } from "discord.js"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { asSingleLine } from "../../../utils"; +import { asSingleLine, renderUserUsername } from "../../../utils"; import { getMissingChannelPermissions } from "../../../utils/getMissingChannelPermissions"; import { missingPermissionError } from "../../../utils/missingPermissionError"; import { BOT_SLOWMODE_CLEAR_PERMISSIONS } from "../requiredPermissions"; @@ -45,7 +45,7 @@ export const SlowmodeClearCmd = slowmodeCmd({ pluginData, msg.channel, asSingleLine(` - Failed to clear slowmode from **${args.user.tag}** in <#${args.channel.id}>: + Failed to clear slowmode from **${renderUserUsername(args.user)}** in <#${args.channel.id}>: Threads cannot have Bot Slowmode `), ); @@ -56,13 +56,17 @@ export const SlowmodeClearCmd = slowmodeCmd({ pluginData, msg.channel, asSingleLine(` - Failed to clear slowmode from **${args.user.tag}** in <#${args.channel.id}>: + Failed to clear slowmode from **${renderUserUsername(args.user)}** in <#${args.channel.id}>: \`${escapeInlineCode(e.message)}\` `), ); return; } - sendSuccessMessage(pluginData, msg.channel, `Slowmode cleared from **${args.user.tag}** in <#${args.channel.id}>`); + sendSuccessMessage( + pluginData, + msg.channel, + `Slowmode cleared from **${renderUserUsername(args.user)}** in <#${args.channel.id}>`, + ); }, }); diff --git a/backend/src/plugins/UsernameSaver/updateUsername.ts b/backend/src/plugins/UsernameSaver/updateUsername.ts index 207e6540..163a4aae 100644 --- a/backend/src/plugins/UsernameSaver/updateUsername.ts +++ b/backend/src/plugins/UsernameSaver/updateUsername.ts @@ -1,10 +1,11 @@ import { User } from "discord.js"; import { GuildPluginData } from "knub"; +import { renderUserUsername } from "../../utils"; import { UsernameSaverPluginType } from "./types"; export async function updateUsername(pluginData: GuildPluginData, user: User) { if (!user) return; - const newUsername = user.tag; + const newUsername = renderUserUsername(user); const latestEntry = await pluginData.state.usernameHistory.getLastEntry(user.id); if (!latestEntry || newUsername !== latestEntry.username) { await pluginData.state.usernameHistory.addEntry(user.id, newUsername); diff --git a/backend/src/plugins/Utility/commands/AvatarCmd.ts b/backend/src/plugins/Utility/commands/AvatarCmd.ts index 4db271f3..ef44a2cb 100644 --- a/backend/src/plugins/Utility/commands/AvatarCmd.ts +++ b/backend/src/plugins/Utility/commands/AvatarCmd.ts @@ -1,7 +1,7 @@ import { APIEmbed, ImageFormat } from "discord.js"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { sendErrorMessage } from "../../../pluginUtils"; -import { UnknownUser } from "../../../utils"; +import { UnknownUser, renderUserUsername } from "../../../utils"; import { utilityCmd } from "../types"; export const AvatarCmd = utilityCmd({ @@ -20,7 +20,7 @@ export const AvatarCmd = utilityCmd({ image: { url: user.displayAvatarURL({ extension: ImageFormat.PNG, size: 2048 }), }, - title: `Avatar of ${user.tag}:`, + title: `Avatar of ${renderUserUsername(user)}:`, }; msg.channel.send({ embeds: [embed] }); } else { diff --git a/backend/src/plugins/Utility/commands/LevelCmd.ts b/backend/src/plugins/Utility/commands/LevelCmd.ts index e0be2605..306a1d20 100644 --- a/backend/src/plugins/Utility/commands/LevelCmd.ts +++ b/backend/src/plugins/Utility/commands/LevelCmd.ts @@ -1,5 +1,6 @@ import { helpers } from "knub"; import { commandTypeHelpers as ct } from "../../../commandTypes"; +import { renderUserUsername } from "../../../utils"; import { utilityCmd } from "../types"; const { getMemberLevel } = helpers; @@ -17,6 +18,6 @@ export const LevelCmd = utilityCmd({ run({ message, args, pluginData }) { const member = args.member || message.member; const level = getMemberLevel(pluginData, member); - message.channel.send(`The permission level of ${member.user.tag} is **${level}**`); + message.channel.send(`The permission level of ${renderUserUsername(member.user)} is **${level}**`); }, }); diff --git a/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts b/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts index 1cfc305b..0f82458a 100644 --- a/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts +++ b/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts @@ -1,6 +1,7 @@ import { VoiceChannel } from "discord.js"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { canActOn, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; +import { renderUserUsername } from "../../../utils"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { utilityCmd } from "../types"; @@ -39,6 +40,10 @@ export const VcdisconnectCmd = utilityCmd({ oldChannel: channel, }); - sendSuccessMessage(pluginData, msg.channel, `**${args.member.user.tag}** disconnected from **${channel.name}**`); + sendSuccessMessage( + pluginData, + msg.channel, + `**${renderUserUsername(args.member.user)}** disconnected from **${channel.name}**`, + ); }, }); diff --git a/backend/src/plugins/Utility/commands/VcmoveCmd.ts b/backend/src/plugins/Utility/commands/VcmoveCmd.ts index bc0481fc..db00161e 100644 --- a/backend/src/plugins/Utility/commands/VcmoveCmd.ts +++ b/backend/src/plugins/Utility/commands/VcmoveCmd.ts @@ -1,7 +1,7 @@ import { ChannelType, Snowflake, VoiceChannel } from "discord.js"; import { commandTypeHelpers as ct } from "../../../commandTypes"; import { canActOn, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; -import { channelMentionRegex, isSnowflake, simpleClosestStringMatch } from "../../../utils"; +import { channelMentionRegex, isSnowflake, renderUserUsername, simpleClosestStringMatch } from "../../../utils"; import { LogsPlugin } from "../../Logs/LogsPlugin"; import { utilityCmd } from "../types"; @@ -80,7 +80,11 @@ export const VcmoveCmd = utilityCmd({ newChannel: channel, }); - sendSuccessMessage(pluginData, msg.channel, `**${args.member.user.tag}** moved to **${channel.name}**`); + sendSuccessMessage( + pluginData, + msg.channel, + `**${renderUserUsername(args.member.user)}** moved to **${channel.name}**`, + ); }, }); @@ -153,7 +157,7 @@ export const VcmoveAllCmd = utilityCmd({ sendErrorMessage( pluginData, msg.channel, - `Failed to move ${currMember.user.tag} (${currMember.id}): You cannot act on this member`, + `Failed to move ${renderUserUsername(currMember.user)} (${currMember.id}): You cannot act on this member`, ); errAmt++; continue; @@ -168,7 +172,11 @@ export const VcmoveAllCmd = utilityCmd({ sendErrorMessage(pluginData, msg.channel, "Unknown error when trying to move members"); return; } - sendErrorMessage(pluginData, msg.channel, `Failed to move ${currMember.user.tag} (${currMember.id})`); + sendErrorMessage( + pluginData, + msg.channel, + `Failed to move ${renderUserUsername(currMember.user)} (${currMember.id})`, + ); errAmt++; continue; } diff --git a/backend/src/plugins/Utility/search.ts b/backend/src/plugins/Utility/search.ts index f030704f..19710b58 100644 --- a/backend/src/plugins/Utility/search.ts +++ b/backend/src/plugins/Utility/search.ts @@ -14,7 +14,7 @@ import { ArgsFromSignatureOrArray, GuildPluginData } from "knub"; import moment from "moment-timezone"; import { RegExpRunner, allowTimeout } from "../../RegExpRunner"; import { getBaseUrl, sendErrorMessage } from "../../pluginUtils"; -import { MINUTES, multiSorter, sorter, trimLines } from "../../utils"; +import { MINUTES, multiSorter, renderUserUsername, sorter, trimLines } from "../../utils"; import { asyncFilter } from "../../utils/async"; import { hasDiscordPermissions } from "../../utils/hasDiscordPermissions"; import { InvalidRegexError, inputPatternToRegExp } from "../../validatorUtils"; @@ -381,7 +381,7 @@ async function performMemberSearch( return true; } - const fullUsername = member.user.tag; + const fullUsername = renderUserUsername(member.user); if (await execRegExp(queryRegex, fullUsername).catch(allowTimeout)) return true; return false; @@ -448,7 +448,7 @@ async function performBanSearch( const execRegExp = getOptimizedRegExpRunner(pluginData, isSafeRegex); matchingBans = await asyncFilter(matchingBans, async (user) => { - const fullUsername = user.tag; + const fullUsername = renderUserUsername(user); if (await execRegExp(queryRegex, fullUsername).catch(allowTimeout)) return true; return false; }); @@ -492,7 +492,7 @@ function formatSearchResultList(members: Array): string { const paddedId = member.id.padEnd(longestId, " "); let line; if (member instanceof GuildMember) { - line = `${paddedId} ${member.user.tag}`; + line = `${paddedId} ${renderUserUsername(member.user)}`; if (member.nickname) line += ` (${member.nickname})`; } else { line = `${paddedId} ${member.tag}`; diff --git a/backend/src/utils.ts b/backend/src/utils.ts index e24a7318..566e0730 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -1431,18 +1431,18 @@ export function messageSummary(msg: SavedMessage) { export function verboseUserMention(user: User | UnknownUser): string { if (user.id == null) { - return `**${user.tag}**`; + return `**${renderUsername(user.username, user.discriminator)}**`; } - return `<@!${user.id}> (**${user.tag}**, \`${user.id}\`)`; + return `<@!${user.id}> (**${renderUsername(user.username, user.discriminator)}**, \`${user.id}\`)`; } export function verboseUserName(user: User | UnknownUser): string { if (user.id == null) { - return `**${user.tag}**`; + return `**${renderUsername(user.username, user.discriminator)}**`; } - return `**${user.tag}** (\`${user.id}\`)`; + return `**${renderUsername(user.username, user.discriminator)}** (\`${user.id}\`)`; } export function verboseChannelMention(channel: GuildBasedChannel): string { @@ -1603,9 +1603,13 @@ export function isTruthy(value: T): value is Exclude) { super(); @@ -248,6 +249,7 @@ export function userToTemplateSafeUser(user: User | UnknownUser): TemplateSafeUs discriminator: "0000", mention: `<@${user.id}>`, tag: "Unknown#0000", + renderedUsername: renderUserUsername(user), }); } @@ -260,6 +262,7 @@ export function userToTemplateSafeUser(user: User | UnknownUser): TemplateSafeUs avatarURL: user.displayAvatarURL?.(), bot: user.bot, createdAt: user.createdTimestamp, + renderedUsername: renderUserUsername(user), }); }