Plugin
ServerProfilesToolbox
Adds a copy/paste/reset button to the server profiles editor
1
/*2
* FiveCord — a Discord client mod3
* Copyright (c) 2025 FiveCord4
* SPDX-License-Identifier: GPL-3.0-or-later5
*/6
7
import { Devs } from "@utils/constants";8
import definePlugin from "@utils/types";9
import { findByPropsLazy, findComponentByCodeLazy } from "@webpack";10
import { Button, GuildMemberStore, UserProfileStore, UserStore } from "@webpack/common";11
12
const SummaryItem = findComponentByCodeLazy("borderType", "showBorder", "hideDivider");13
14
let savedNick: string | null = null;15
let savedPronouns: string | null = null;16
let savedBio: string | undefined = undefined;17
let savedThemeColors: number[] | undefined = undefined;18
let savedBanner: string | undefined = undefined;19
let savedAvatar: string | undefined = undefined;20
21
const { setPendingAvatar, setPendingBanner, setPendingBio, setPendingNickname, setPendingPronouns, setPendingThemeColors }: {22
setPendingAvatar: (a: string | undefined) => void;23
setPendingBanner: (a: string | undefined) => void;24
setPendingBio: (a: string | undefined) => void;25
setPendingNickname: (a: string | null) => void;26
setPendingPronouns: (a: string | null) => void;27
setPendingThemeColors: (a: number[] | undefined) => void;28
} = findByPropsLazy("setPendingNickname", "setPendingPronouns");29
30
export default definePlugin({31
name: "ServerProfilesToolbox",32
authors: [Devs.FiveCord],33
description: "Adds a copy/paste/reset button to the server profiles editor",34
35
patchServerProfiles({ guildId }: { guildId: string; }) {36
const currentUser = UserStore.getCurrentUser();37
const premiumType = currentUser.premiumType ?? 0;38
39
return <SummaryItem title="Server Profiles Toolbox" hideDivider={false} forcedDivider>40
<div style={{ display: "flex", gap: "5px" }}>41
<Button onClick={() => {42
const profile = UserProfileStore.getGuildMemberProfile(currentUser.id, guildId);43
const nick = GuildMemberStore.getNick(guildId, currentUser.id);44
const selfMember = GuildMemberStore.getMember(guildId, currentUser.id);45
savedNick = nick ?? "";46
savedPronouns = profile.pronouns;47
savedBio = profile.bio;48
savedThemeColors = profile.themeColors;49
savedBanner = profile.banner;50
savedAvatar = selfMember.avatar;51
}}>52
Copy profile53
</Button>54
<Button onClick={() => {55
// set pending56
setPendingNickname(savedNick);57
setPendingPronouns(savedPronouns);58
if (premiumType === 2) {59
setPendingBio(savedBio);60
setPendingThemeColors(savedThemeColors);61
setPendingBanner(savedBanner);62
setPendingAvatar(savedAvatar);63
}64
}}>65
Paste profile66
</Button>67
<Button onClick={() => {68
// reset69
setPendingNickname("");70
setPendingPronouns("");71
if (premiumType === 2) {72
setPendingBio("");73
setPendingThemeColors([]);74
setPendingBanner("");75
setPendingAvatar("");76
}77
}}>78
Reset profile79
</Button>80
</div>81
</SummaryItem>;82
},83
84
patches: [85
{86
find: ".PROFILE_CUSTOMIZATION_GUILD_SELECT_TITLE",87
replacement: {88
match: /return\(0(.{10,350})\}\)\}\)\}/,89
replace: "return [(0$1})}),$self.patchServerProfiles(e)]}"90
}91
}92
],93
94
});95