fix Plugins broken by recent Discord changes (#3569)
Co-authored-by: Vendicated <vendicated@riseup.net>
This commit is contained in:
parent
29a2bcbf07
commit
cb36cf5706
11 changed files with 38 additions and 30 deletions
|
|
@ -1,7 +1,8 @@
|
||||||
import { FluxStore, Role } from "..";
|
import { FluxStore, Role } from "..";
|
||||||
|
|
||||||
|
// TODO: add the rest of the methods for GuildRoleStore
|
||||||
export class GuildRoleStore extends FluxStore {
|
export class GuildRoleStore extends FluxStore {
|
||||||
getRole(guildId: string, roleId: string): Role;
|
getRole(guildId: string, roleId: string): Role;
|
||||||
getRoles(guildId: string): Record<string, Role>;
|
getSortedRoles(guildId: string): Role[];
|
||||||
getAllGuildRoles(): Record<string, Record<string, Role>>;
|
getRolesSnapshot(guildId: string): Record<string, Role>;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -74,8 +74,8 @@ export default definePlugin({
|
||||||
{
|
{
|
||||||
find: "#{intl::GUILD_OWNER}),children:",
|
find: "#{intl::GUILD_OWNER}),children:",
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /(?<=roleName:\i,)color:/,
|
match: /(?<=roleName:\i,)(colorString:)/,
|
||||||
replace: "color:$self.calculateNameColorForListContext(arguments[0]),originalColor:"
|
replace: "$1$self.calculateNameColorForListContext(arguments[0]),originalColor:"
|
||||||
},
|
},
|
||||||
predicate: () => settings.store.memberListColors
|
predicate: () => settings.store.memberListColors
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ function RolesAndUsersPermissionsComponent({ permissions, guild, modalProps, hea
|
||||||
const [selectedItemIndex, selectItem] = useState(0);
|
const [selectedItemIndex, selectItem] = useState(0);
|
||||||
const selectedItem = permissions[selectedItemIndex];
|
const selectedItem = permissions[selectedItemIndex];
|
||||||
|
|
||||||
const roles = GuildRoleStore.getRoles(guild.id);
|
const roles = GuildRoleStore.getRolesSnapshot(guild.id);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalRoot
|
<ModalRoot
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import { filters, findBulk, proxyLazyWebpack } from "@webpack";
|
||||||
import { PermissionsBits, Text, Tooltip, useMemo, UserStore } from "@webpack/common";
|
import { PermissionsBits, Text, Tooltip, useMemo, UserStore } from "@webpack/common";
|
||||||
|
|
||||||
import { PermissionsSortOrder, settings } from "..";
|
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";
|
import openRolesAndUsersPermissionsModal, { PermissionType, type RoleOrUserPermission } from "./RolesAndUsersPermissions";
|
||||||
|
|
||||||
interface UserPermission {
|
interface UserPermission {
|
||||||
|
|
@ -94,7 +94,7 @@ function UserPermissionsComponent({ guild, guildMember, closePopout }: { guild:
|
||||||
const [rolePermissions, userPermissions] = useMemo(() => {
|
const [rolePermissions, userPermissions] = useMemo(() => {
|
||||||
const userPermissions: UserPermissions = [];
|
const userPermissions: UserPermissions = [];
|
||||||
|
|
||||||
const userRoles = getSortedRoles(guild, guildMember);
|
const userRoles = getSortedRolesForMember(guild, guildMember);
|
||||||
|
|
||||||
const rolePermissions: Array<RoleOrUserPermission> = userRoles.map(role => ({
|
const rolePermissions: Array<RoleOrUserPermission> = userRoles.map(role => ({
|
||||||
type: PermissionType.Role,
|
type: PermissionType.Role,
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ import { Button, ChannelStore, Dialog, GuildMemberStore, GuildRoleStore, GuildSt
|
||||||
|
|
||||||
import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission } from "./components/RolesAndUsersPermissions";
|
import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission } from "./components/RolesAndUsersPermissions";
|
||||||
import UserPermissions from "./components/UserPermissions";
|
import UserPermissions from "./components/UserPermissions";
|
||||||
import { getSortedRoles, sortPermissionOverwrites } from "./utils";
|
import { getSortedRolesForMember, sortPermissionOverwrites } from "./utils";
|
||||||
|
|
||||||
const PopoutClasses = findByPropsLazy("container", "scroller", "list");
|
const PopoutClasses = findByPropsLazy("container", "scroller", "list");
|
||||||
const RoleButtonClasses = findByPropsLazy("button", "buttonInner", "icon", "banner");
|
const RoleButtonClasses = findByPropsLazy("button", "buttonInner", "icon", "banner");
|
||||||
|
|
@ -73,7 +73,7 @@ function MenuItem(guildId: string, id?: string, type?: MenuItemParentType) {
|
||||||
.with(MenuItemParentType.User, () => {
|
.with(MenuItemParentType.User, () => {
|
||||||
const member = GuildMemberStore.getMember(guildId, id!)!;
|
const member = GuildMemberStore.getMember(guildId, id!)!;
|
||||||
|
|
||||||
const permissions: RoleOrUserPermission[] = getSortedRoles(guild, member)
|
const permissions: RoleOrUserPermission[] = getSortedRolesForMember(guild, member)
|
||||||
.map(role => ({
|
.map(role => ({
|
||||||
type: PermissionType.Role,
|
type: PermissionType.Role,
|
||||||
...role
|
...role
|
||||||
|
|
@ -107,7 +107,7 @@ function MenuItem(guildId: string, id?: string, type?: MenuItemParentType) {
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.otherwise(() => {
|
.otherwise(() => {
|
||||||
const permissions = Object.values(GuildRoleStore.getRoles(guild.id)).map(role => ({
|
const permissions = GuildRoleStore.getSortedRoles(guild.id).map(role => ({
|
||||||
type: PermissionType.Role,
|
type: PermissionType.Role,
|
||||||
...role
|
...role
|
||||||
}));
|
}));
|
||||||
|
|
|
||||||
|
|
@ -28,12 +28,11 @@ export const { getGuildPermissionSpecMap } = findByPropsLazy("getGuildPermission
|
||||||
|
|
||||||
export const cl = classNameFactory("vc-permviewer-");
|
export const cl = classNameFactory("vc-permviewer-");
|
||||||
|
|
||||||
export function getSortedRoles({ id }: Guild, member: GuildMember) {
|
export function getSortedRolesForMember({ id: guildId }: Guild, member: GuildMember) {
|
||||||
const roles = GuildRoleStore.getRoles(id);
|
// the guild id is the @everyone role
|
||||||
|
return GuildRoleStore
|
||||||
return [...member.roles, id]
|
.getSortedRoles(guildId)
|
||||||
.map(id => roles[id])
|
.filter(role => role.id === guildId || member.roles.includes(role.id));
|
||||||
.sort((a, b) => b.position - a.position);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sortUserRoles(roles: Role[]) {
|
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) {
|
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) => {
|
return overwrites.sort((a, b) => {
|
||||||
if (a.type !== PermissionType.Role || b.type !== PermissionType.Role) return 0;
|
if (a.type !== PermissionType.Role || b.type !== PermissionType.Role) return 0;
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ function ServerInfoTab({ guild }: GuildProps) {
|
||||||
"Verification Level": ["None", "Low", "Medium", "High", "Highest"][guild.verificationLevel] || "?",
|
"Verification Level": ["None", "Low", "Medium", "High", "Highest"][guild.verificationLevel] || "?",
|
||||||
"Server Boosts": `${guild.premiumSubscriberCount ?? 0} (Level ${guild.premiumTier ?? 0})`,
|
"Server Boosts": `${guild.premiumSubscriberCount ?? 0} (Level ${guild.premiumTier ?? 0})`,
|
||||||
"Channels": GuildChannelStore.getChannels(guild.id)?.count - 1 || "?", // - null category
|
"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 (
|
return (
|
||||||
|
|
|
||||||
|
|
@ -178,7 +178,7 @@ export default definePlugin({
|
||||||
},
|
},
|
||||||
// Add the hidden eye icon if the channel is hidden
|
// 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`
|
replace: (m, channel) => `${m},$self.isHiddenChannel(${channel})?$self.HiddenChannelIcon():null`
|
||||||
},
|
},
|
||||||
// Make voice channels also appear as muted if they are muted
|
// 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
|
// Include the @everyone role in the allowed roles list for Hidden Channels
|
||||||
match: /sortBy.{0,30}?\.filter\(\i=>(?<=channel:(\i).+?)/,
|
match: /getSortedRoles.+?\.filter\(\i=>(?=!)/,
|
||||||
replace: (m, channel) => `${m}$self.isHiddenChannel(${channel})?true:`
|
replace: m => `${m}$self.isHiddenChannel(arguments[0].channel)?true:`
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// If the @everyone role has the required permissions, make the array only contain it
|
// If the @everyone role has the required permissions, make the array only contain it
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,9 @@
|
||||||
|
|
||||||
import { definePluginSettings } from "@api/Settings";
|
import { definePluginSettings } from "@api/Settings";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
|
import { Logger } from "@utils/Logger";
|
||||||
import definePlugin, { OptionType, PluginSettingDef } from "@utils/types";
|
import definePlugin, { OptionType, PluginSettingDef } from "@utils/types";
|
||||||
|
import { GuildMember, Role } from "@vencord/discord-types";
|
||||||
|
|
||||||
const opt = (description: string) => ({
|
const opt = (description: string) => ({
|
||||||
type: OptionType.BOOLEAN,
|
type: OptionType.BOOLEAN,
|
||||||
|
|
@ -70,8 +72,8 @@ export default definePlugin({
|
||||||
find: "#{intl::GUILD_MEMBER_MOD_VIEW_PERMISSION_GRANTED_BY_ARIA_LABEL}),allowOverflow:",
|
find: "#{intl::GUILD_MEMBER_MOD_VIEW_PERMISSION_GRANTED_BY_ARIA_LABEL}),allowOverflow:",
|
||||||
predicate: () => settings.store.showModView,
|
predicate: () => settings.store.showModView,
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /(role:)\i(?=,guildId.{0,100}role:(\i\[))/,
|
match: /(role:)\i(?<=\i\.roles,\i\.highestRoleId,(\i)\].+)/,
|
||||||
replace: "$1$2arguments[0].member.highestRoleId]",
|
replace: "$1$self.findHighestRole(arguments[0],$2)",
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// allows you to open mod view on yourself
|
// allows you to open mod view on yourself
|
||||||
|
|
@ -83,5 +85,14 @@ export default definePlugin({
|
||||||
replace: "false"
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -173,7 +173,7 @@ export default definePlugin({
|
||||||
{
|
{
|
||||||
find: "UNREAD_IMPORTANT:",
|
find: "UNREAD_IMPORTANT:",
|
||||||
replacement: {
|
replacement: {
|
||||||
match: /\.name,{.{0,140}\.children.+?:null(?<=,channel:(\i).+?)/,
|
match: /\.Children\.count.+?:null(?<=,channel:(\i).+?)/,
|
||||||
replace: "$&,$self.TypingIndicator($1.id,$1.getGuildId())"
|
replace: "$&,$self.TypingIndicator($1.id,$1.getGuildId())"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as t from "@vencord/discord-types";
|
import * as t from "@vencord/discord-types";
|
||||||
import { findByCodeLazy, findByPropsLazy, waitFor } from "@webpack";
|
import { findByCodeLazy, findByPropsLazy } from "@webpack";
|
||||||
|
|
||||||
import { waitForStore } from "./internal";
|
import { waitForStore } from "./internal";
|
||||||
|
|
||||||
|
|
@ -71,6 +71,7 @@ waitForStore("PermissionStore", m => PermissionStore = m);
|
||||||
waitForStore("PresenceStore", m => PresenceStore = m);
|
waitForStore("PresenceStore", m => PresenceStore = m);
|
||||||
waitForStore("ReadStateStore", m => ReadStateStore = m);
|
waitForStore("ReadStateStore", m => ReadStateStore = m);
|
||||||
waitForStore("GuildChannelStore", m => GuildChannelStore = m);
|
waitForStore("GuildChannelStore", m => GuildChannelStore = m);
|
||||||
|
waitForStore("GuildRoleStore", m => GuildRoleStore = m);
|
||||||
waitForStore("MessageStore", m => MessageStore = m);
|
waitForStore("MessageStore", m => MessageStore = m);
|
||||||
waitForStore("WindowStore", m => WindowStore = m);
|
waitForStore("WindowStore", m => WindowStore = m);
|
||||||
waitForStore("EmojiStore", m => EmojiStore = 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.
|
// Importing this directly can easily cause circular imports. For this reason, use a non import access here.
|
||||||
Vencord.QuickCss.initQuickCssThemeStore();
|
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);
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue