Plugin

ServerProfilesToolbox

Adds a copy/paste/reset button to the server profiles editor

index.tsx
Download

Source

src/plugins/serverProfilesToolBox/index.tsx
1/*
2 * FiveCord — a Discord client mod
3 * Copyright (c) 2025 FiveCord
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7import { Devs } from "@utils/constants";
8import definePlugin from "@utils/types";
9import { findByPropsLazy, findComponentByCodeLazy } from "@webpack";
10import { Button, GuildMemberStore, UserProfileStore, UserStore } from "@webpack/common";
11
12const SummaryItem = findComponentByCodeLazy("borderType", "showBorder", "hideDivider");
13
14let savedNick: string | null = null;
15let savedPronouns: string | null = null;
16let savedBio: string | undefined = undefined;
17let savedThemeColors: number[] | undefined = undefined;
18let savedBanner: string | undefined = undefined;
19let savedAvatar: string | undefined = undefined;
20
21const { 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
30export 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 profile
53 </Button>
54 <Button onClick={() => {
55 // set pending
56 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 profile
66 </Button>
67 <Button onClick={() => {
68 // reset
69 setPendingNickname("");
70 setPendingPronouns("");
71 if (premiumType === 2) {
72 setPendingBio("");
73 setPendingThemeColors([]);
74 setPendingBanner("");
75 setPendingAvatar("");
76 }
77 }}>
78 Reset profile
79 </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