fix Plugins broken by recent Discord changes (#3569)

Co-authored-by: Vendicated <vendicated@riseup.net>
This commit is contained in:
sadan4 2025-07-31 16:31:33 -04:00 committed by GitHub
parent 29a2bcbf07
commit cb36cf5706
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 38 additions and 30 deletions

View file

@ -74,8 +74,8 @@ export default definePlugin({
{
find: "#{intl::GUILD_OWNER}),children:",
replacement: {
match: /(?<=roleName:\i,)color:/,
replace: "color:$self.calculateNameColorForListContext(arguments[0]),originalColor:"
match: /(?<=roleName:\i,)(colorString:)/,
replace: "$1$self.calculateNameColorForListContext(arguments[0]),originalColor:"
},
predicate: () => settings.store.memberListColors
}

View file

@ -84,7 +84,7 @@ function RolesAndUsersPermissionsComponent({ permissions, guild, modalProps, hea
const [selectedItemIndex, selectItem] = useState(0);
const selectedItem = permissions[selectedItemIndex];
const roles = GuildRoleStore.getRoles(guild.id);
const roles = GuildRoleStore.getRolesSnapshot(guild.id);
return (
<ModalRoot

View file

@ -24,7 +24,7 @@ import { filters, findBulk, proxyLazyWebpack } from "@webpack";
import { PermissionsBits, Text, Tooltip, useMemo, UserStore } from "@webpack/common";
import { PermissionsSortOrder, settings } from "..";
import { cl, getGuildPermissionSpecMap, getSortedRoles, sortUserRoles } from "../utils";
import { cl, getGuildPermissionSpecMap, getSortedRolesForMember, sortUserRoles } from "../utils";
import openRolesAndUsersPermissionsModal, { PermissionType, type RoleOrUserPermission } from "./RolesAndUsersPermissions";
interface UserPermission {
@ -94,7 +94,7 @@ function UserPermissionsComponent({ guild, guildMember, closePopout }: { guild:
const [rolePermissions, userPermissions] = useMemo(() => {
const userPermissions: UserPermissions = [];
const userRoles = getSortedRoles(guild, guildMember);
const userRoles = getSortedRolesForMember(guild, guildMember);
const rolePermissions: Array<RoleOrUserPermission> = userRoles.map(role => ({
type: PermissionType.Role,

View file

@ -31,7 +31,7 @@ import { Button, ChannelStore, Dialog, GuildMemberStore, GuildRoleStore, GuildSt
import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission } from "./components/RolesAndUsersPermissions";
import UserPermissions from "./components/UserPermissions";
import { getSortedRoles, sortPermissionOverwrites } from "./utils";
import { getSortedRolesForMember, sortPermissionOverwrites } from "./utils";
const PopoutClasses = findByPropsLazy("container", "scroller", "list");
const RoleButtonClasses = findByPropsLazy("button", "buttonInner", "icon", "banner");
@ -73,7 +73,7 @@ function MenuItem(guildId: string, id?: string, type?: MenuItemParentType) {
.with(MenuItemParentType.User, () => {
const member = GuildMemberStore.getMember(guildId, id!)!;
const permissions: RoleOrUserPermission[] = getSortedRoles(guild, member)
const permissions: RoleOrUserPermission[] = getSortedRolesForMember(guild, member)
.map(role => ({
type: PermissionType.Role,
...role
@ -107,7 +107,7 @@ function MenuItem(guildId: string, id?: string, type?: MenuItemParentType) {
};
})
.otherwise(() => {
const permissions = Object.values(GuildRoleStore.getRoles(guild.id)).map(role => ({
const permissions = GuildRoleStore.getSortedRoles(guild.id).map(role => ({
type: PermissionType.Role,
...role
}));

View file

@ -28,12 +28,11 @@ export const { getGuildPermissionSpecMap } = findByPropsLazy("getGuildPermission
export const cl = classNameFactory("vc-permviewer-");
export function getSortedRoles({ id }: Guild, member: GuildMember) {
const roles = GuildRoleStore.getRoles(id);
return [...member.roles, id]
.map(id => roles[id])
.sort((a, b) => b.position - a.position);
export function getSortedRolesForMember({ id: guildId }: Guild, member: GuildMember) {
// the guild id is the @everyone role
return GuildRoleStore
.getSortedRoles(guildId)
.filter(role => role.id === guildId || member.roles.includes(role.id));
}
export function sortUserRoles(roles: Role[]) {
@ -48,7 +47,7 @@ export function sortUserRoles(roles: Role[]) {
}
export function sortPermissionOverwrites<T extends { id: string; type: number; }>(overwrites: T[], guildId: string) {
const roles = GuildRoleStore.getRoles(guildId);
const roles = GuildRoleStore.getRolesSnapshot(guildId);
return overwrites.sort((a, b) => {
if (a.type !== PermissionType.Role || b.type !== PermissionType.Role) return 0;

View file

@ -200,7 +200,7 @@ function ServerInfoTab({ guild }: GuildProps) {
"Verification Level": ["None", "Low", "Medium", "High", "Highest"][guild.verificationLevel] || "?",
"Server Boosts": `${guild.premiumSubscriberCount ?? 0} (Level ${guild.premiumTier ?? 0})`,
"Channels": GuildChannelStore.getChannels(guild.id)?.count - 1 || "?", // - null category
"Roles": Object.keys(GuildRoleStore.getRoles(guild.id)).length - 1, // - @everyone
"Roles": GuildRoleStore.getSortedRoles(guild.id).length - 1, // - @everyone
};
return (

View file

@ -178,7 +178,7 @@ export default definePlugin({
},
// Add the hidden eye icon if the channel is hidden
{
match: /\.name,{.{0,140}\.children.+?:null(?<=,channel:(\i).+?)/,
match: /\.Children\.count.+?:null(?<=,channel:(\i).+?)/,
replace: (m, channel) => `${m},$self.isHiddenChannel(${channel})?$self.HiddenChannelIcon():null`
},
// Make voice channels also appear as muted if they are muted
@ -302,8 +302,8 @@ export default definePlugin({
},
{
// Include the @everyone role in the allowed roles list for Hidden Channels
match: /sortBy.{0,30}?\.filter\(\i=>(?<=channel:(\i).+?)/,
replace: (m, channel) => `${m}$self.isHiddenChannel(${channel})?true:`
match: /getSortedRoles.+?\.filter\(\i=>(?=!)/,
replace: m => `${m}$self.isHiddenChannel(arguments[0].channel)?true:`
},
{
// If the @everyone role has the required permissions, make the array only contain it

View file

@ -18,7 +18,9 @@
import { definePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import { Logger } from "@utils/Logger";
import definePlugin, { OptionType, PluginSettingDef } from "@utils/types";
import { GuildMember, Role } from "@vencord/discord-types";
const opt = (description: string) => ({
type: OptionType.BOOLEAN,
@ -70,8 +72,8 @@ export default definePlugin({
find: "#{intl::GUILD_MEMBER_MOD_VIEW_PERMISSION_GRANTED_BY_ARIA_LABEL}),allowOverflow:",
predicate: () => settings.store.showModView,
replacement: {
match: /(role:)\i(?=,guildId.{0,100}role:(\i\[))/,
replace: "$1$2arguments[0].member.highestRoleId]",
match: /(role:)\i(?<=\i\.roles,\i\.highestRoleId,(\i)\].+)/,
replace: "$1$self.findHighestRole(arguments[0],$2)",
}
},
// allows you to open mod view on yourself
@ -83,5 +85,14 @@ export default definePlugin({
replace: "false"
}
}
]
],
findHighestRole({ member }: { member: GuildMember; }, roles: Role[]): Role | undefined {
try {
return roles.find(role => role.id === member.highestRoleId);
} catch (e) {
new Logger("ShowHiddenThings").error("Failed to find highest role", e);
return undefined;
}
}
});

View file

@ -173,7 +173,7 @@ export default definePlugin({
{
find: "UNREAD_IMPORTANT:",
replacement: {
match: /\.name,{.{0,140}\.children.+?:null(?<=,channel:(\i).+?)/,
match: /\.Children\.count.+?:null(?<=,channel:(\i).+?)/,
replace: "$&,$self.TypingIndicator($1.id,$1.getGuildId())"
}
},

View file

@ -17,7 +17,7 @@
*/
import * as t from "@vencord/discord-types";
import { findByCodeLazy, findByPropsLazy, waitFor } from "@webpack";
import { findByCodeLazy, findByPropsLazy } from "@webpack";
import { waitForStore } from "./internal";
@ -71,6 +71,7 @@ waitForStore("PermissionStore", m => PermissionStore = m);
waitForStore("PresenceStore", m => PresenceStore = m);
waitForStore("ReadStateStore", m => ReadStateStore = m);
waitForStore("GuildChannelStore", m => GuildChannelStore = m);
waitForStore("GuildRoleStore", m => GuildRoleStore = m);
waitForStore("MessageStore", m => MessageStore = m);
waitForStore("WindowStore", m => WindowStore = m);
waitForStore("EmojiStore", m => EmojiStore = m);
@ -79,7 +80,3 @@ waitForStore("ThemeStore", m => {
// Importing this directly can easily cause circular imports. For this reason, use a non import access here.
Vencord.QuickCss.initQuickCssThemeStore();
});
// GuildRoleStore is new, this code is for stable + canary compatibility
// TODO: Change to waitForStore once GuildRoleStore is on stable
waitFor(["getRole", "getRoles"], m => GuildRoleStore = m);