diff --git a/src/plugins/betterRoleContext/index.tsx b/src/plugins/betterRoleContext/index.tsx
index a9bab1a7..f9eae586 100644
--- a/src/plugins/betterRoleContext/index.tsx
+++ b/src/plugins/betterRoleContext/index.tsx
@@ -12,7 +12,7 @@ import { Devs } from "@utils/constants";
import { getCurrentGuild, openImageModal } from "@utils/discord";
import definePlugin, { OptionType } from "@utils/types";
import { findByPropsLazy } from "@webpack";
-import { GuildStore, Menu, PermissionStore } from "@webpack/common";
+import { GuildRoleStore, Menu, PermissionStore } from "@webpack/common";
const GuildSettingsActions = findByPropsLazy("open", "selectRole", "updateGuild");
@@ -80,7 +80,7 @@ export default definePlugin({
const guild = getCurrentGuild();
if (!guild) return;
- const role = GuildStore.getRole(guild.id, id);
+ const role = GuildRoleStore.getRole(guild.id, id);
if (!role) return;
if (role.colorString) {
diff --git a/src/plugins/mentionAvatars/index.tsx b/src/plugins/mentionAvatars/index.tsx
index 5466a9e2..8f18567e 100644
--- a/src/plugins/mentionAvatars/index.tsx
+++ b/src/plugins/mentionAvatars/index.tsx
@@ -10,7 +10,7 @@ import { definePluginSettings } from "@api/Settings";
import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
-import { GuildStore, SelectedGuildStore, useState } from "@webpack/common";
+import { GuildRoleStore, SelectedGuildStore, useState } from "@webpack/common";
import { User } from "discord-types/general";
const settings = definePluginSettings({
@@ -89,7 +89,7 @@ export default definePlugin({
// Discord uses Role Mentions for uncached users because .... idk
if (!roleId) return null;
- const role = GuildStore.getRole(guildId, roleId);
+ const role = GuildRoleStore.getRole(guildId, roleId);
if (!role?.icon) return ;
diff --git a/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx b/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx
index ed620d7f..46ddb146 100644
--- a/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx
+++ b/src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx
@@ -23,7 +23,7 @@ import { copyToClipboard } from "@utils/clipboard";
import { getIntlMessage, getUniqueUsername } from "@utils/discord";
import { ModalCloseButton, ModalContent, ModalHeader, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal";
import { findByCodeLazy } from "@webpack";
-import { ContextMenuApi, FluxDispatcher, GuildMemberStore, GuildStore, i18n, Menu, PermissionsBits, ScrollerThin, Text, Tooltip, useEffect, useMemo, UserStore, useState, useStateFromStores } from "@webpack/common";
+import { ContextMenuApi, FluxDispatcher, GuildMemberStore, GuildRoleStore, i18n, Menu, PermissionsBits, ScrollerThin, Text, Tooltip, useEffect, useMemo, UserStore, useState, useStateFromStores } from "@webpack/common";
import { UnicodeEmoji } from "@webpack/types";
import type { Guild, Role, User } from "discord-types/general";
@@ -85,7 +85,7 @@ function RolesAndUsersPermissionsComponent({ permissions, guild, modalProps, hea
const [selectedItemIndex, selectItem] = useState(0);
const selectedItem = permissions[selectedItemIndex];
- const roles = GuildStore.getRoles(guild.id);
+ const roles = GuildRoleStore.getRoles(guild.id);
return (
{
- const role = GuildStore.getRole(guild.id, roleId);
+ const role = GuildRoleStore.getRole(guild.id, roleId);
if (!role) return;
onClose();
diff --git a/src/plugins/permissionsViewer/index.tsx b/src/plugins/permissionsViewer/index.tsx
index 3fd4428c..cc942f09 100644
--- a/src/plugins/permissionsViewer/index.tsx
+++ b/src/plugins/permissionsViewer/index.tsx
@@ -26,7 +26,7 @@ import { Devs } from "@utils/constants";
import { classes } from "@utils/misc";
import definePlugin, { OptionType } from "@utils/types";
import { findByPropsLazy } from "@webpack";
-import { Button, ChannelStore, Dialog, GuildMemberStore, GuildStore, match, Menu, PermissionsBits, Popout, TooltipContainer, useRef, UserStore } from "@webpack/common";
+import { Button, ChannelStore, Dialog, GuildMemberStore, GuildRoleStore, GuildStore, match, Menu, PermissionsBits, Popout, TooltipContainer, useRef, UserStore } from "@webpack/common";
import type { Guild, GuildMember } from "discord-types/general";
import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission } from "./components/RolesAndUsersPermissions";
@@ -107,7 +107,7 @@ function MenuItem(guildId: string, id?: string, type?: MenuItemParentType) {
};
})
.otherwise(() => {
- const permissions = Object.values(GuildStore.getRoles(guild.id)).map(role => ({
+ const permissions = Object.values(GuildRoleStore.getRoles(guild.id)).map(role => ({
type: PermissionType.Role,
...role
}));
diff --git a/src/plugins/permissionsViewer/utils.ts b/src/plugins/permissionsViewer/utils.ts
index dfa81e73..409c0896 100644
--- a/src/plugins/permissionsViewer/utils.ts
+++ b/src/plugins/permissionsViewer/utils.ts
@@ -18,7 +18,7 @@
import { classNameFactory } from "@api/Styles";
import { findByPropsLazy } from "@webpack";
-import { GuildStore } from "@webpack/common";
+import { GuildRoleStore } from "@webpack/common";
import { Guild, GuildMember, Role } from "discord-types/general";
import { PermissionsSortOrder, settings } from ".";
@@ -29,7 +29,7 @@ export const { getGuildPermissionSpecMap } = findByPropsLazy("getGuildPermission
export const cl = classNameFactory("vc-permviewer-");
export function getSortedRoles({ id }: Guild, member: GuildMember) {
- const roles = GuildStore.getRoles(id);
+ const roles = GuildRoleStore.getRoles(id);
return [...member.roles, id]
.map(id => roles[id])
@@ -48,7 +48,7 @@ export function sortUserRoles(roles: Role[]) {
}
export function sortPermissionOverwrites(overwrites: T[], guildId: string) {
- const roles = GuildStore.getRoles(guildId);
+ const roles = GuildRoleStore.getRoles(guildId);
return overwrites.sort((a, b) => {
if (a.type !== PermissionType.Role || b.type !== PermissionType.Role) return 0;
diff --git a/src/plugins/roleColorEverywhere/index.tsx b/src/plugins/roleColorEverywhere/index.tsx
index 61ea7868..65da676c 100644
--- a/src/plugins/roleColorEverywhere/index.tsx
+++ b/src/plugins/roleColorEverywhere/index.tsx
@@ -23,7 +23,7 @@ import { Devs } from "@utils/constants";
import { Logger } from "@utils/Logger";
import definePlugin, { OptionType } from "@utils/types";
import { findByCodeLazy } from "@webpack";
-import { ChannelStore, GuildMemberStore, GuildStore } from "@webpack/common";
+import { ChannelStore, GuildMemberStore, GuildRoleStore, GuildStore } from "@webpack/common";
const useMessageAuthor = findByCodeLazy('"Result cannot be null because the message is not null"');
@@ -210,7 +210,7 @@ export default definePlugin({
},
RoleGroupColor: ErrorBoundary.wrap(({ id, count, title, guildId, label }: { id: string; count: number; title: string; guildId: string; label: string; }) => {
- const role = GuildStore.getRole(guildId, id);
+ const role = GuildRoleStore.getRole(guildId, id);
return (
m.ANNOUNCEMENT_THREAD === 10);
@@ -267,7 +267,7 @@ export default definePlugin({
// color role mentions (unity styling btw lol)
if (message.mention_roles.length > 0) {
for (const roleId of message.mention_roles) {
- const role = GuildStore.getRole(channel.guild_id, roleId);
+ const role = GuildRoleStore.getRole(channel.guild_id, roleId);
if (!role) continue;
const roleColor = role.colorString ?? `#${pingColor}`;
finalMsg = finalMsg.replace(`<@&${roleId}>`, `@${role.name}`);
diff --git a/src/webpack/common/stores.ts b/src/webpack/common/stores.ts
index e0c00f6d..712f5bdc 100644
--- a/src/webpack/common/stores.ts
+++ b/src/webpack/common/stores.ts
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-import { findByCodeLazy, findByPropsLazy } from "@webpack";
+import { findByCodeLazy, findByPropsLazy, waitFor } from "@webpack";
import type * as Stores from "discord-types/stores";
import { waitForStore } from "./internal";
@@ -40,12 +40,13 @@ export let ReadStateStore: GenericStore;
export let PresenceStore: GenericStore;
export let GuildStore: t.GuildStore;
+export let GuildRoleStore: t.GuildRoleStore;
+export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
export let UserStore: Stores.UserStore & t.FluxStore;
export let UserProfileStore: GenericStore;
export let SelectedChannelStore: Stores.SelectedChannelStore & t.FluxStore;
export let SelectedGuildStore: t.FluxStore & Record;
export let ChannelStore: Stores.ChannelStore & t.FluxStore;
-export let GuildMemberStore: Stores.GuildMemberStore & t.FluxStore;
export let RelationshipStore: t.RelationshipStore;
export let EmojiStore: t.EmojiStore;
@@ -86,3 +87,7 @@ 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);
diff --git a/src/webpack/common/types/stores.d.ts b/src/webpack/common/types/stores.d.ts
index cb06ca4b..9a2dd132 100644
--- a/src/webpack/common/types/stores.d.ts
+++ b/src/webpack/common/types/stores.d.ts
@@ -214,6 +214,9 @@ export class GuildStore extends FluxStore {
getGuildCount(): number;
getGuilds(): Record;
getGuildIds(): string[];
+}
+
+export class GuildRoleStore extends FluxStore {
getRole(guildId: string, roleId: string): Role;
getRoles(guildId: string): Record;
getAllGuildRoles(): Record>;