Patch Fixes

Co-Authored-By: sadan4 <117494111+sadan4@users.noreply.github.com>
This commit is contained in:
thororen1234 2025-07-30 11:01:44 -04:00
parent a3bb887a93
commit d6fd6373ef
No known key found for this signature in database
10 changed files with 44 additions and 32 deletions

View file

@ -1,7 +1,12 @@
import { FluxStore, Role } from "..";
import { FluxStore, Guild, Role } from "..";
export class GuildRoleStore extends FluxStore {
serializeAllGuildRoles(): Array<{ partitionKey: string; values: Record<string, Role>; }>;
getUnsafeMutableRoles(guildId: string): Record<string, Role>;
getManyRoles(guildId: string, roleIds: string[]): Role[];
getRole(guildId: string, roleId: string): Role;
getRoles(guildId: string): Record<string, Role>;
getAllGuildRoles(): Record<string, Record<string, Role>>;
getNumRoles(guildId: string): number;
getEveryoneRole(guild: Guild): Role;
getRolesSnapshot(guildId: string): Record<string, Role>;
getSortedRoles(guildId: string): Role[];
}

View file

@ -27,11 +27,11 @@ export class RelationshipStore extends FluxStore {
getSinces(): Record<number, string>;
getFriendCount(): number;
getRelationshipCount(): number;
getOutgoingCount(): number;
getPendingCount(): number;
getPendingIgnoredCount(): number;
getSpamCount(): number;
getRelationshipCount(): number;
getOutgoingCount(): number;
getMutableRelationships(): Map<string, number>;
getVersion(): number;

View file

@ -75,8 +75,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.getSortedRoles(guild.id);
return (
<ModalRoot
@ -108,7 +108,7 @@ function RolesAndUsersPermissionsComponent({ permissions, guild, modalProps, hea
<ScrollerThin className={cl("modal-list")} orientation="auto">
{permissions.map((permission, index) => {
const user: User | undefined = UserStore.getUser(permission.id ?? "");
const role: Role | undefined = roles[permission.id ?? ""];
const role: Role | undefined = roles.find(role => role.id === permission.id);
const roleIconSrc = role != null ? getRoleIconSrc(role) : undefined;
return (

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,11 +73,10 @@ function MenuItem(guildId: string, id?: string, type?: MenuItemParentType) {
.with(MenuItemParentType.User, () => {
const member = GuildMemberStore.getMember(guildId, id!)!;
const permissions: RoleOrUserPermission[] = getSortedRoles(guild, member)
.map(role => ({
type: PermissionType.Role,
...role
}));
const permissions: RoleOrUserPermission[] = getSortedRolesForMember(guild, member).map(role => ({
type: PermissionType.Role,
...role
}));
if (guild.ownerId === id) {
permissions.push({
@ -107,7 +106,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,10 @@ 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) {
return GuildRoleStore
.getSortedRoles(guildId)
.filter(role => role.id === guildId || member.roles.includes(role.id));
}
export function sortUserRoles(roles: Role[]) {
@ -48,8 +46,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 = Object.fromEntries(GuildRoleStore.getSortedRoles(guildId).map(role => [role.id, role] as const));
return overwrites.sort((a, b) => {
if (a.type !== PermissionType.Role || b.type !== PermissionType.Role) return 0;

View file

@ -235,7 +235,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

@ -334,8 +334,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;
}
}
});