Add RoleMembersViewer to InRole

This commit is contained in:
thororen1234 2025-02-08 15:21:43 -05:00
parent f3f7696dca
commit 51f78e5caf
3 changed files with 28 additions and 152 deletions

View file

@ -10,7 +10,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
### Extra included plugins
<details>
<summary>151 additional plugins</summary>
<summary>152 additional plugins</summary>
### All Platforms
- AllCallTimers by MaxHerbold & D3SOX
@ -109,6 +109,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
- PinIcon by iamme
- PolishWording (Grammar) by Samwich
- PlatformSpoofer by Drag
- PreMiD by Nyako
- PurgeMessages by bhop & nyx
- QuestCompleter by HappyEnderman, SerStars, maintained by thororen
- QuestionMarkReplacement by nyx

View file

@ -85,6 +85,32 @@ export default definePlugin({
const role = GuildStore.getRole(guild.id, id);
if (!role) return;
children.push(
<Menu.MenuItem
id="vc-view-inrole"
label="View Members in Role"
action={() => {
showInRoleModal(getMembersInRole(role.id, guild.id), role.id, channel.id);
}}
icon={InfoIcon}
/>
);
},
"message"(children, { message }: { message: any; }) {
const guild = getCurrentGuild();
if (!guild) return;
const roleMentions = message.content.match(/<@&(\d+)>/g);
if (!roleMentions?.length) return;
const channel = getCurrentChannel();
if (!channel) return;
const roleIds = roleMentions.map(mention => mention.match(/<@&(\d+)>/)![1]);
const role = GuildStore.getRole(guild.id, roleIds);
if (!role) return;
children.push(
<Menu.MenuItem
id="vc-view-inrole"

View file

@ -1,151 +0,0 @@
/*
* Vencord, a Discord client mod
* Copyright (c) 2025 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import { EquicordDevs } from "@utils/constants";
import definePlugin from "@utils/types";
import {
FluxDispatcher,
GuildMemberStore,
GuildStore,
Menu,
SelectedChannelStore,
SelectedGuildStore,
UserProfileActions,
UserStore
} from "@webpack/common";
import { JSX } from "react";
function fetchMembersWithRole(guildId: string, roleId: string) {
const guildMembers = GuildMemberStore.getMembers(guildId);
let membersInRole = 0;
guildMembers.forEach(member => {
if (member.roles.includes(roleId)) {
membersInRole++;
}
});
if (Object.keys(guildMembers).length < membersInRole) {
const chunk = 100;
const requestCount = Math.ceil(membersInRole / chunk);
for (let i = 0; i < requestCount; i++) {
FluxDispatcher.dispatch({
type: "GUILD_MEMBERS_REQUEST",
guildId,
userIds: [],
query: "",
limit: chunk,
withPresences: true,
notifyOnLimit: true
});
}
}
const updatedGuildMembers = GuildMemberStore.getMembers(guildId);
return Object.values(updatedGuildMembers)
.filter(m => m.roles.includes(roleId))
.map(m => ({
...m,
user: UserStore.getUser(m.userId)
}))
.sort((a, b) => a.user.username.localeCompare(b.user.username));
}
export default definePlugin({
name: "RoleMembersViewer",
description: "Shows members with a role when right clicking roles in user profiles or role mentions in messages",
authors: [EquicordDevs.okiso],
contextMenus: {
"dev-context"(children, { id }: { id: string; }) {
const guild = GuildStore.getGuild(SelectedGuildStore.getGuildId());
if (!guild) return;
const role = GuildStore.getRole(guild.id, id);
if (!role) return;
const guildId = guild.id;
const membersWithRole = fetchMembersWithRole(guildId, id);
const memberItems = membersWithRole.map(member => (
<Menu.MenuItem
key={member.userId}
id={`role-member-${member.userId}`}
label={member.user.username}
action={() => {
UserProfileActions.openUserProfileModal({
userId: member.userId,
guildId,
channelId: SelectedChannelStore.getChannelId()
});
}}
/>
));
children.push(
<Menu.MenuItem
id="role-members-viewer"
label={`View Members (${role.name}) - ${membersWithRole.length}`}
>
<Menu.MenuGroup>{memberItems}</Menu.MenuGroup>
</Menu.MenuItem>
);
},
"message"(children, { message }: { message: any; }) {
const guild = GuildStore.getGuild(SelectedGuildStore.getGuildId());
if (!guild) return;
const roleMentions = message.content.match(/<@&(\d+)>/g);
if (!roleMentions?.length) return;
// Extract unique role IDs from the mentions.
const roleIds = roleMentions.map(mention => mention.match(/<@&(\d+)>/)![1]);
const uniqueRoleIds = [...new Set(roleIds)];
const guildId = guild.id;
const roleMenuItems: JSX.Element[] = [];
for (const roleId of uniqueRoleIds as string[]) {
const role = GuildStore.getRole(guildId, roleId);
if (!role) continue;
const membersWithRole = fetchMembersWithRole(guildId, roleId);
const memberItems = membersWithRole.map(member => (
<Menu.MenuItem
key={member.userId}
id={`role-member-${member.userId}`}
label={member.user?.username ?? "Unknown User"}
action={() => {
UserProfileActions.openUserProfileModal({
userId: member.userId,
guildId,
channelId: SelectedChannelStore.getChannelId()
});
}}
/>
));
roleMenuItems.push(
<Menu.MenuItem
id={`role-members-viewer-${roleId}`}
label={`@${role.name} - ${membersWithRole.length}`}
>
<Menu.MenuGroup>{memberItems}</Menu.MenuGroup>
</Menu.MenuItem>
);
}
if (roleMenuItems.length > 0) {
children.push(
<Menu.MenuItem
id="role-members-viewer"
label={`View Role Members (${roleMenuItems.length} roles)`}
>
<Menu.MenuGroup>{roleMenuItems}</Menu.MenuGroup>
</Menu.MenuItem>
);
}
}
}
});