diff --git a/src/plugins/memberCount.tsx b/src/plugins/memberCount.tsx new file mode 100644 index 00000000..db0a34a9 --- /dev/null +++ b/src/plugins/memberCount.tsx @@ -0,0 +1,119 @@ +/* + * Vencord, a modification for Discord's desktop app + * Copyright (c) 2022 Vendicated and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +import ErrorBoundary from "@components/ErrorBoundary"; +import { Flex } from "@components/Flex"; +import { Devs } from "@utils/constants"; +import { getCurrentChannel } from "@utils/discord"; +import { useForceUpdater } from "@utils/misc"; +import definePlugin from "@utils/types"; +import { FluxDispatcher } from "@webpack/common"; + +const counts = {} as Record; +let forceUpdate: () => void; + +function MemberCount() { + const guildId = getCurrentChannel().guild_id; + const c = counts[guildId]; + + forceUpdate = useForceUpdater(); + + if (!c) return null; + + let total = String(c[0]); + if (total === "0" && c[1] > 0) { + total = "Loading..."; + } + + return ( + +
+ + {c[1]} +
+
+ + {total} +
+
+ ); +} + +export default definePlugin({ + name: "MemberCount", + description: "Shows the amount of online & total members in the server member list", + authors: [Devs.Ven], + + patches: [{ + find: ".isSidebarVisible,", + replacement: { + match: /(var (.)=.\.className.+?children):\[(.\.useMemo[^}]+"aria-multiselectable")/, + replace: "$1:[$2.startsWith('members')?Vencord.Plugins.plugins.MemberCount.render():null,$3" + } + }], + + onGuildMemberListUpdate({ guildId, groups, memberCount }) { + let count = 0; + for (const group of groups) { + if (group.id !== "offline") + count += group.count; + } + counts[guildId] = [memberCount, count]; + forceUpdate?.(); + }, + + start() { + FluxDispatcher.subscribe("GUILD_MEMBER_LIST_UPDATE", this.onGuildMemberListUpdate); + }, + + stop() { + FluxDispatcher.unsubscribe("GUILD_MEMBER_LIST_UPDATE", this.onGuildMemberListUpdate); + }, + + render: () => ( + + + + ) +});