mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-15 09:33:03 -04:00
Add RoleMembersViewer to InRole
This commit is contained in:
parent
f3f7696dca
commit
51f78e5caf
3 changed files with 28 additions and 152 deletions
|
@ -10,7 +10,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
|
||||||
|
|
||||||
### Extra included plugins
|
### Extra included plugins
|
||||||
<details>
|
<details>
|
||||||
<summary>151 additional plugins</summary>
|
<summary>152 additional plugins</summary>
|
||||||
|
|
||||||
### All Platforms
|
### All Platforms
|
||||||
- AllCallTimers by MaxHerbold & D3SOX
|
- AllCallTimers by MaxHerbold & D3SOX
|
||||||
|
@ -109,6 +109,7 @@ You can join our [discord server](https://discord.gg/5Xh2W87egW) for commits, ch
|
||||||
- PinIcon by iamme
|
- PinIcon by iamme
|
||||||
- PolishWording (Grammar) by Samwich
|
- PolishWording (Grammar) by Samwich
|
||||||
- PlatformSpoofer by Drag
|
- PlatformSpoofer by Drag
|
||||||
|
- PreMiD by Nyako
|
||||||
- PurgeMessages by bhop & nyx
|
- PurgeMessages by bhop & nyx
|
||||||
- QuestCompleter by HappyEnderman, SerStars, maintained by thororen
|
- QuestCompleter by HappyEnderman, SerStars, maintained by thororen
|
||||||
- QuestionMarkReplacement by nyx
|
- QuestionMarkReplacement by nyx
|
||||||
|
|
|
@ -85,6 +85,32 @@ export default definePlugin({
|
||||||
const role = GuildStore.getRole(guild.id, id);
|
const role = GuildStore.getRole(guild.id, id);
|
||||||
if (!role) return;
|
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(
|
children.push(
|
||||||
<Menu.MenuItem
|
<Menu.MenuItem
|
||||||
id="vc-view-inrole"
|
id="vc-view-inrole"
|
||||||
|
|
|
@ -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>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
Loading…
Add table
Add a link
Reference in a new issue