From bfc90093dc83d0c891d7ea542852835f1337e2d0 Mon Sep 17 00:00:00 2001
From: Tiago R <metal@i0.tf>
Date: Sun, 26 Nov 2023 15:57:23 +0000
Subject: [PATCH] yeet renderUserUsername

Signed-off-by: GitHub <noreply@github.com>
---
 backend/src/plugins/Automod/triggers/roleAdded.ts    |  4 ++--
 backend/src/plugins/Automod/triggers/roleRemoved.ts  |  4 ++--
 .../BotControl/commands/AddDashboardUserCmd.ts       |  4 ++--
 .../BotControl/commands/ListDashboardPermsCmd.ts     |  6 +++---
 .../BotControl/commands/ListDashboardUsersCmd.ts     |  4 ++--
 .../BotControl/commands/RemoveDashboardUserCmd.ts    |  4 ++--
 .../src/plugins/ModActions/commands/AddCaseCmd.ts    |  4 ++--
 backend/src/plugins/ModActions/commands/BanCmd.ts    |  4 ++--
 backend/src/plugins/ModActions/commands/NoteCmd.ts   |  4 ++--
 backend/src/plugins/ModActions/commands/WarnCmd.ts   |  4 ++--
 .../ModActions/events/PostAlertOnMemberJoinEvt.ts    |  4 ++--
 .../ModActions/functions/actualKickMemberCmd.ts      |  4 ++--
 .../ModActions/functions/actualMuteUserCmd.ts        | 10 +++++-----
 .../ModActions/functions/actualUnmuteUserCmd.ts      |  6 +++---
 backend/src/plugins/Mutes/commands/MutesCmd.ts       |  6 +++---
 backend/src/plugins/NameHistory/commands/NamesCmd.ts |  4 ++--
 .../ReactionRoles/util/addMemberPendingRoleChange.ts |  6 ++----
 .../plugins/Slowmode/commands/SlowmodeClearCmd.ts    |  8 ++++----
 backend/src/plugins/UsernameSaver/updateUsername.ts  |  4 ++--
 backend/src/plugins/Utility/commands/LevelCmd.ts     |  4 ++--
 .../src/plugins/Utility/commands/VcdisconnectCmd.ts  |  4 ++--
 backend/src/plugins/Utility/commands/VcmoveCmd.ts    | 12 ++++--------
 backend/src/utils.ts                                 |  8 ++------
 backend/src/utils/templateSafeObjects.ts             |  6 +++---
 24 files changed, 59 insertions(+), 69 deletions(-)

diff --git a/backend/src/plugins/Automod/triggers/roleAdded.ts b/backend/src/plugins/Automod/triggers/roleAdded.ts
index dc62f163..754be1b3 100644
--- a/backend/src/plugins/Automod/triggers/roleAdded.ts
+++ b/backend/src/plugins/Automod/triggers/roleAdded.ts
@@ -1,6 +1,6 @@
 import { Snowflake } from "discord.js";
 import * as t from "io-ts";
-import { renderUserUsername } from "../../../utils";
+import { renderUsername } from "../../../utils";
 import { consumeIgnoredRoleChange } from "../functions/ignoredRoleChanges";
 import { automodTrigger } from "../helpers";
 
@@ -38,7 +38,7 @@ export const RoleAddedTrigger = automodTrigger<RoleAddedMatchResult>()({
     const role = pluginData.guild.roles.cache.get(matchResult.extra.matchedRoleId as Snowflake);
     const roleName = role?.name || "Unknown";
     const member = contexts[0].member!;
-    const memberName = `**${renderUserUsername(member.user)}** (\`${member.id}\`)`;
+    const memberName = `**${renderUsername(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 65624827..fc5d5ae3 100644
--- a/backend/src/plugins/Automod/triggers/roleRemoved.ts
+++ b/backend/src/plugins/Automod/triggers/roleRemoved.ts
@@ -1,6 +1,6 @@
 import { Snowflake } from "discord.js";
 import * as t from "io-ts";
-import { renderUserUsername } from "../../../utils";
+import { renderUsername } from "../../../utils";
 import { consumeIgnoredRoleChange } from "../functions/ignoredRoleChanges";
 import { automodTrigger } from "../helpers";
 
@@ -38,7 +38,7 @@ export const RoleRemovedTrigger = automodTrigger<RoleAddedMatchResult>()({
     const role = pluginData.guild.roles.cache.get(matchResult.extra.matchedRoleId as Snowflake);
     const roleName = role?.name || "Unknown";
     const member = contexts[0].member!;
-    const memberName = `**${renderUserUsername(member.user)}** (\`${member.id}\`)`;
+    const memberName = `**${renderUsername(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 c1259594..0cb87f95 100644
--- a/backend/src/plugins/BotControl/commands/AddDashboardUserCmd.ts
+++ b/backend/src/plugins/BotControl/commands/AddDashboardUserCmd.ts
@@ -1,7 +1,7 @@
 import { ApiPermissions } from "@shared/apiPermissions";
 import { commandTypeHelpers as ct } from "../../../commandTypes";
 import { isStaffPreFilter, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
-import { renderUserUsername } from "../../../utils";
+import { renderUsername } from "../../../utils";
 import { botControlCmd } from "../types";
 
 export const AddDashboardUserCmd = botControlCmd({
@@ -35,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}> (**${renderUserUsername(user)}**, \`${user.id}\`)`);
+    const userNameList = args.users.map((user) => `<@!${user.id}> (**${renderUsername(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 18c7d0d7..7c6d2aa5 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 { renderUserUsername, resolveUser } from "../../../utils";
+import { renderUsername, 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 = `**${renderUserUsername(args.user)}** (\`${args.user.id}\`)`;
+      const userInfo = `**${renderUsername(args.user)}** (\`${args.user.id}\`)`;
 
       for (const assignment of existingUserAssignment!) {
         if (guild != null && assignment.guild_id !== args.guildId) continue;
@@ -74,7 +74,7 @@ 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**${renderUserUsername(user)}**, \`${assignment.target_id}\`: ${assignment.permissions.join(
+        finalMessage += `\n**${renderUsername(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 36f1432f..1d3c1ffe 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 { renderUserUsername, resolveUser } from "../../../utils";
+import { renderUsername, 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}> (**${renderUserUsername(user)}**, \`${user.id}\`): ${permission.permissions.join(", ")}`,
+        `<@!${user.id}> (**${renderUsername(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 3a90683c..c3d1ec99 100644
--- a/backend/src/plugins/BotControl/commands/RemoveDashboardUserCmd.ts
+++ b/backend/src/plugins/BotControl/commands/RemoveDashboardUserCmd.ts
@@ -1,6 +1,6 @@
 import { commandTypeHelpers as ct } from "../../../commandTypes";
 import { isStaffPreFilter, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
-import { renderUserUsername } from "../../../utils";
+import { renderUsername } from "../../../utils";
 import { botControlCmd } from "../types";
 
 export const RemoveDashboardUserCmd = botControlCmd({
@@ -34,7 +34,7 @@ export const RemoveDashboardUserCmd = botControlCmd({
       await pluginData.state.apiPermissionAssignments.removeUser(args.guildId, user.id);
     }
 
-    const userNameList = args.users.map((user) => `<@!${user.id}> (**${renderUserUsername(user)}**, \`${user.id}\`)`);
+    const userNameList = args.users.map((user) => `<@!${user.id}> (**${renderUsername(user)}**, \`${user.id}\`)`);
     sendSuccessMessage(
       pluginData,
       msg.channel,
diff --git a/backend/src/plugins/ModActions/commands/AddCaseCmd.ts b/backend/src/plugins/ModActions/commands/AddCaseCmd.ts
index 43575463..3f8b9dfc 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 { renderUserUsername, resolveMember, resolveUser } from "../../../utils";
+import { renderUsername, resolveMember, resolveUser } from "../../../utils";
 import { LogsPlugin } from "../../Logs/LogsPlugin";
 import { formatReasonWithAttachments } from "../functions/formatReasonWithAttachments";
 import { modActionsCmd } from "../types";
@@ -75,7 +75,7 @@ export const AddCaseCmd = modActionsCmd({
       sendSuccessMessage(
         pluginData,
         msg.channel,
-        `Case #${theCase.case_number} created for **${renderUserUsername(user)}**`,
+        `Case #${theCase.case_number} created for **${renderUsername(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 9d32cd10..3e66e8a2 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 { renderUserUsername, resolveMember, resolveUser } from "../../../utils";
+import { renderUsername, 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 **${renderUserUsername(user)}** ${forTime}(Case #${banResult.case.case_number})`;
+      response = `Banned **${renderUsername(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/NoteCmd.ts b/backend/src/plugins/ModActions/commands/NoteCmd.ts
index b13ed498..edb2202d 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 { renderUserUsername, resolveUser } from "../../../utils";
+import { renderUsername, 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 = renderUserUsername(user);
+    const userName = renderUsername(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 c8192015..f917c55e 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, renderUserUsername, resolveMember, resolveUser } from "../../../utils";
+import { errorMessage, renderUsername, 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 **${renderUserUsername(memberToWarn.user)}** (Case #${warnResult.case.case_number})${messageResultText}`,
+      `Warned **${renderUsername(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 677fb603..7874c241 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 { renderUserUsername, resolveMember } from "../../../utils";
+import { renderUsername, resolveMember } from "../../../utils";
 import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
 import { LogsPlugin } from "../../Logs/LogsPlugin";
 import { modActionsEvt } from "../types";
@@ -46,7 +46,7 @@ export const PostAlertOnMemberJoinEvt = modActionsEvt({
       }
 
       await alertChannel.send(
-        `<@!${member.id}> (${renderUserUsername(member.user)} \`${member.id}\`) joined with ${
+        `<@!${member.id}> (${renderUsername(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 73a1e2d9..fac3f906 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, renderUserUsername, resolveMember, resolveUser } from "../../../utils";
+import { DAYS, SECONDS, errorMessage, renderUsername, 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 **${renderUserUsername(memberToKick.user)}** (Case #${kickResult.case.case_number})`;
+  let response = `Kicked **${renderUsername(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 5c628c4e..2f108410 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, renderUserUsername } from "../../../utils";
+import { UnknownUser, asSingleLine, isDiscordAPIError, renderUsername } 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 **${renderUserUsername(user)}**'s
+        Updated **${renderUsername(user)}**'s
         mute to ${timeUntilUnmute} (Case #${muteResult.case.case_number})
       `);
     } else {
       response = asSingleLine(`
-        Muted **${renderUserUsername(user)}**
+        Muted **${renderUsername(user)}**
         for ${timeUntilUnmute} (Case #${muteResult.case.case_number})
       `);
     }
   } else {
     if (muteResult.updatedExistingMute) {
       response = asSingleLine(`
-        Updated **${renderUserUsername(user)}**'s
+        Updated **${renderUsername(user)}**'s
         mute to indefinite (Case #${muteResult.case.case_number})
       `);
     } else {
       response = asSingleLine(`
-        Muted **${renderUserUsername(user)}**
+        Muted **${renderUsername(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 d70a219c..5b28aee7 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, renderUserUsername } from "../../../utils";
+import { UnknownUser, asSingleLine, renderUsername } from "../../../utils";
 import { ModActionsPluginType } from "../types";
 import { formatReasonWithAttachments } from "./formatReasonWithAttachments";
 
@@ -48,7 +48,7 @@ export async function actualUnmuteCmd(
       pluginData,
       msg.channel,
       asSingleLine(`
-        Unmuting **${renderUserUsername(user)}**
+        Unmuting **${renderUsername(user)}**
         in ${timeUntilUnmute} (Case #${result.case.case_number})
       `),
     );
@@ -57,7 +57,7 @@ export async function actualUnmuteCmd(
       pluginData,
       msg.channel,
       asSingleLine(`
-        Unmuted **${renderUserUsername(user)}**
+        Unmuted **${renderUsername(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 179d1a65..22cd74c5 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, renderUserUsername, resolveMember } from "../../../utils";
+import { DBDateFormat, MINUTES, renderUsername, 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}> (**${renderUserUsername(member.user)}**, \`${member.id}\`)   🔧 Manual mute`;
+        return `<@!${member.id}> (**${renderUsername(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 ? renderUserUsername(user) : "Unknown#0000";
+        const username = user ? renderUsername(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 373f1671..da8ba48a 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, renderUserUsername } from "../../../utils";
+import { DAYS, renderUsername } 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 ? renderUserUsername(user) : args.userId;
+    const currentUsername = user ? renderUsername(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 a2a82fe9..dda8a6bc 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 { renderUserUsername, resolveMember } from "../../../utils";
+import { renderUsername, resolveMember } from "../../../utils";
 import { memberRolesLock } from "../../../utils/lockNameHelpers";
 import { PendingMemberRoleChanges, ReactionRolesPluginType, RoleChangeMode } from "../types";
 
@@ -33,9 +33,7 @@ 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 ${renderUserUsername(member.user)} (${member.id}): ${e.message}`,
-            );
+            logger.warn(`Failed to apply role changes to ${renderUsername(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 246a048e..fd133c3a 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, renderUserUsername } from "../../../utils";
+import { asSingleLine, renderUsername } 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 **${renderUserUsername(args.user)}** in <#${args.channel.id}>:
+            Failed to clear slowmode from **${renderUsername(args.user)}** in <#${args.channel.id}>:
             Threads cannot have Bot Slowmode
           `),
         );
@@ -56,7 +56,7 @@ export const SlowmodeClearCmd = slowmodeCmd({
         pluginData,
         msg.channel,
         asSingleLine(`
-          Failed to clear slowmode from **${renderUserUsername(args.user)}** in <#${args.channel.id}>:
+          Failed to clear slowmode from **${renderUsername(args.user)}** in <#${args.channel.id}>:
           \`${escapeInlineCode(e.message)}\`
         `),
       );
@@ -66,7 +66,7 @@ export const SlowmodeClearCmd = slowmodeCmd({
     sendSuccessMessage(
       pluginData,
       msg.channel,
-      `Slowmode cleared from **${renderUserUsername(args.user)}** in <#${args.channel.id}>`,
+      `Slowmode cleared from **${renderUsername(args.user)}** in <#${args.channel.id}>`,
     );
   },
 });
diff --git a/backend/src/plugins/UsernameSaver/updateUsername.ts b/backend/src/plugins/UsernameSaver/updateUsername.ts
index 163a4aae..ed0fb73f 100644
--- a/backend/src/plugins/UsernameSaver/updateUsername.ts
+++ b/backend/src/plugins/UsernameSaver/updateUsername.ts
@@ -1,11 +1,11 @@
 import { User } from "discord.js";
 import { GuildPluginData } from "knub";
-import { renderUserUsername } from "../../utils";
+import { renderUsername } from "../../utils";
 import { UsernameSaverPluginType } from "./types";
 
 export async function updateUsername(pluginData: GuildPluginData<UsernameSaverPluginType>, user: User) {
   if (!user) return;
-  const newUsername = renderUserUsername(user);
+  const newUsername = renderUsername(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/LevelCmd.ts b/backend/src/plugins/Utility/commands/LevelCmd.ts
index 306a1d20..df4d9325 100644
--- a/backend/src/plugins/Utility/commands/LevelCmd.ts
+++ b/backend/src/plugins/Utility/commands/LevelCmd.ts
@@ -1,6 +1,6 @@
 import { helpers } from "knub";
 import { commandTypeHelpers as ct } from "../../../commandTypes";
-import { renderUserUsername } from "../../../utils";
+import { renderUsername } from "../../../utils";
 import { utilityCmd } from "../types";
 
 const { getMemberLevel } = helpers;
@@ -18,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 ${renderUserUsername(member.user)} is **${level}**`);
+    message.channel.send(`The permission level of ${renderUsername(member.user)} is **${level}**`);
   },
 });
diff --git a/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts b/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts
index 0f82458a..240c763f 100644
--- a/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts
+++ b/backend/src/plugins/Utility/commands/VcdisconnectCmd.ts
@@ -1,7 +1,7 @@
 import { VoiceChannel } from "discord.js";
 import { commandTypeHelpers as ct } from "../../../commandTypes";
 import { canActOn, sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
-import { renderUserUsername } from "../../../utils";
+import { renderUsername } from "../../../utils";
 import { LogsPlugin } from "../../Logs/LogsPlugin";
 import { utilityCmd } from "../types";
 
@@ -43,7 +43,7 @@ export const VcdisconnectCmd = utilityCmd({
     sendSuccessMessage(
       pluginData,
       msg.channel,
-      `**${renderUserUsername(args.member.user)}** disconnected from **${channel.name}**`,
+      `**${renderUsername(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 db00161e..6ffe8588 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, renderUserUsername, simpleClosestStringMatch } from "../../../utils";
+import { channelMentionRegex, isSnowflake, renderUsername, simpleClosestStringMatch } from "../../../utils";
 import { LogsPlugin } from "../../Logs/LogsPlugin";
 import { utilityCmd } from "../types";
 
@@ -80,11 +80,7 @@ export const VcmoveCmd = utilityCmd({
       newChannel: channel,
     });
 
-    sendSuccessMessage(
-      pluginData,
-      msg.channel,
-      `**${renderUserUsername(args.member.user)}** moved to **${channel.name}**`,
-    );
+    sendSuccessMessage(pluginData, msg.channel, `**${renderUsername(args.member.user)}** moved to **${channel.name}**`);
   },
 });
 
@@ -157,7 +153,7 @@ export const VcmoveAllCmd = utilityCmd({
         sendErrorMessage(
           pluginData,
           msg.channel,
-          `Failed to move ${renderUserUsername(currMember.user)} (${currMember.id}): You cannot act on this member`,
+          `Failed to move ${renderUsername(currMember.user)} (${currMember.id}): You cannot act on this member`,
         );
         errAmt++;
         continue;
@@ -175,7 +171,7 @@ export const VcmoveAllCmd = utilityCmd({
         sendErrorMessage(
           pluginData,
           msg.channel,
-          `Failed to move ${renderUserUsername(currMember.user)} (${currMember.id})`,
+          `Failed to move ${renderUsername(currMember.user)} (${currMember.id})`,
         );
         errAmt++;
         continue;
diff --git a/backend/src/utils.ts b/backend/src/utils.ts
index 5c795072..990c1f7e 100644
--- a/backend/src/utils.ts
+++ b/backend/src/utils.ts
@@ -1607,15 +1607,11 @@ export const DBDateFormat = "YYYY-MM-DD HH:mm:ss";
 //export function renderUsername(username: GuildMember): string;
 //export function renderUsername(username: User): string;
 //export function renderUsername(username: string, discriminator?: string): string;
-export function renderUsername(username: string | User | GuildMember, discriminator?: string): string {
+export function renderUsername(username: string | User | GuildMember | UnknownUser, discriminator?: string): string {
   if (username instanceof GuildMember) return username.user.tag;
-  if (username instanceof User) return username.tag;
+  if (username instanceof User || username instanceof UnknownUser) return username.tag;
   if (discriminator === "0" || discriminator === "0000") {
     return username;
   }
   return `${username}#${discriminator}`;
 }
-
-export function renderUserUsername(user: User | UnknownUser): string {
-  return renderUsername(user.username, user.discriminator);
-}
diff --git a/backend/src/utils/templateSafeObjects.ts b/backend/src/utils/templateSafeObjects.ts
index 33e36971..d6a0dfd6 100644
--- a/backend/src/utils/templateSafeObjects.ts
+++ b/backend/src/utils/templateSafeObjects.ts
@@ -13,7 +13,7 @@ import {
   User,
 } from "discord.js";
 import { GuildPluginData } from "knub";
-import { UnknownUser, renderUserUsername } from "src/utils";
+import { UnknownUser, renderUsername } from "src/utils";
 import { Case } from "../data/entities/Case";
 import {
   ISavedMessageAttachmentData,
@@ -250,7 +250,7 @@ export function userToTemplateSafeUser(user: User | UnknownUser): TemplateSafeUs
       discriminator: "0000",
       mention: `<@${user.id}>`,
       tag: "Unknown#0000",
-      renderedUsername: renderUserUsername(user),
+      renderedUsername: renderUsername(user),
     });
   }
 
@@ -264,7 +264,7 @@ export function userToTemplateSafeUser(user: User | UnknownUser): TemplateSafeUs
     avatarURL: user.displayAvatarURL(),
     bot: user.bot,
     createdAt: user.createdTimestamp,
-    renderedUsername: renderUserUsername(user),
+    renderedUsername: renderUsername(user),
   });
 }