Files
discord-decomp/utils/PermissionUtils.tsx
T
2026-11-01 12:12:55 +02:00

472 lines
17 KiB
TypeScript

// Metro module 3822 (f3823).
import ImpersonateStore from "../modules/impersonate/ImpersonateStore";
import LurkingStore from "../modules/lurker_mode/LurkingStore";
import JoinedThreadsStore from "../modules/threads/JoinedThreadsStore";
import { ChannelRecordBase, THREAD_CHANNEL_TYPES } from "../records/ChannelRecord";
import { getGuildEveryoneRoleId, isGuildOwner } from "../records/GuildRecord";
import { hasPermission } from "../records/GuildRoleRecord";
import AuthenticationStore from "../stores/AuthenticationStore";
import ChannelStore from "../stores/ChannelStore";
import GuildMemberStore from "../stores/GuildMemberStore";
import GuildRoleStore from "../stores/GuildRoleStore";
import GuildStore from "../stores/GuildStore";
import UserStore from "../stores/UserStore";
import { ChannelTypes, EMPTY_STRING_SNOWFLAKE_ID, ElevatedPermissions, MFALevels, Permissions } from "../Constants";
import * as _HighLow from "../_bundle/HighLow";
import { add, remove, has, filter, combine, deserialize, equals } from "../_bundle/HighLow";
import Module12 from "../_bundle/Module12";
import * as _AutomodPermissionUtils from "../modules/guild_automod/AutomodPermissionUtils";
import { isMemberCommunicationDisabled } from "../modules/guild_communication_disabled/CommunicationDisabledUtils";
import SnowflakeUtils from "./SnowflakeUtils";
import { doesRoleSortHigher } from "./GuildRoleUtils";
import { PermissionOverwriteType } from "../flow/Server";
let allow, c2159_24, c2159_25, lurkerPermissionsMask, c2159_27, c2159_28, c2159_29, computePermissionsForMember, computePermissions, applyThreadPermissions, computePermissionsForRoles;
const applyOverwrites = function applyOverwrites(id, member2, a2, overwrites) {
let length2;
const r25 = overwrites[id];
const r16 = r25 != null ? add(remove(a2, r25.deny), r25.allow) : a2;
let r33 = r16;
if (member2 != null) {
let r34 = allow;
const length = member2.roles.length;
let r0 = 0;
const r4 = 0 < length;
let r38 = allow;
let r39 = allow;
let r15 = allow;
if (r4) {
do {
const r18 = overwrites[member2.roles[r0]];
const r1 = r0;
const r21 = r34;
const r24 = r38;
let r17 = r21;
let r42 = r24;
if (r18 != null) {
r42 = add(r24, r18.allow);
r17 = add(r21, r18.deny);
}
r0 = r1 + 1;
length2 = member2.roles.length;
r34 = r17;
r38 = r42;
r39 = r34;
r15 = r38;
} while (r0 < length2);
}
const r60 = add(remove(r16, r39), r15);
const r62 = overwrites[member2.userId];
const r63 = r62 != null ? add(remove(r60, r62.deny), r62.allow) : r60;
const r78 = has(r63, Permissions.ADMINISTRATOR);
const hasAutomodQuarantinedProfile = _AutomodPermissionUtils.hasAutomodQuarantinedProfile(member2);
const r86 = hasAutomodQuarantinedProfile && !r78 ? filter(r63, c2159_29) : r63;
r33 = isMemberCommunicationDisabled(member2) && !r78 ? filter(r86, c2159_28) : r86;
}
return r33;
};
computePermissionsForMember = function computePermissionsForMember(a0) {
let length2;
const { userId, member: member2, guild, overwrites, roles } = a0;
let checkElevated = a0.checkElevated;
if (checkElevated === void 0) {
checkElevated = true;
}
const { excludeGuildPermissions = false, lurkerPermissionsMask: lurkerPermissionsMask2 = lurkerPermissionsMask } = a0;
if (excludeGuildPermissions) {
return applyOverwrites(guild.id, member2, allow, overwrites);
}
const r28 = roles != null ? {
...GuildRoleStore.getUnsafeMutableRoles(guild.id),
...roles
} : GuildRoleStore.getUnsafeMutableRoles(guild.id);
const r37 = r28[getGuildEveryoneRoleId(guild)];
const r38 = r37 != null ? r37.permissions : c2159_25;
let r39 = r38;
if (member2 != null) {
const length = member2.roles.length;
let r0 = 0;
const r5 = 0 < length;
let r42 = r38;
r39 = r42;
if (r5) {
do {
const r45 = r28[member2.roles[r0]];
const r1 = r0;
const r20 = r42;
const r46 = r45 !== void 0 ? add(r20, r45.permissions) : r20;
r0 = r1 + 1;
length2 = member2.roles.length;
r42 = r46;
r39 = r42;
} while (r0 < length2);
}
}
const r66 = has(r39, Permissions.ADMINISTRATOR) ? c2159_24 : applyOverwrites(guild.id, member2, r39, overwrites);
const r73 = LurkingStore.isLurking(guild.id) || member2?.isPending ? filter(r66, lurkerPermissionsMask2) : r66;
const r81 = GuildMemberStore.isCurrentUserGuest(guild.id) ? filter(r73, c2159_27) : r73;
if (checkElevated === void 0) {
checkElevated = true;
}
if (checkElevated) {
checkElevated = guild.mfaLevel === MFALevels.ELEVATED;
}
if (checkElevated) {
checkElevated = userId === AuthenticationStore.getId();
}
return checkElevated ? UserStore.getCurrentUser()?.mfaEnabled ? r81 : remove(r81, ElevatedPermissions) : r81;
};
computePermissions = function computePermissions({ user: user2, context, overwrites, roles, checkElevated = true, excludeGuildPermissions = false }) {
let r62, guild, lurkerPermissionsMask2, overwrites2;
if (user2 == null) {
return allow;
}
let userId = user2;
if (typeof userId !== "string") {
userId = user2.id;
}
if (context instanceof ChannelRecordBase) {
if (context.isScheduledForDeletion()) {
return allow;
}
if (THREAD_CHANNEL_TYPES.has(context.type)) {
const channel = ChannelStore.getChannel(context.parent_id);
if (channel != null && !channel.isScheduledForDeletion()) {
const r91 = userId === UserStore.getCurrentUser()?.id && JoinedThreadsStore.hasJoined(context.id);
return applyThreadPermissions(context, computePermissions({
user: user2,
context: channel,
overwrites,
roles,
checkElevated,
excludeGuildPermissions
}), r91, GuildMemberStore.isCurrentUserGuest(context.guild_id));
}
return allow;
}
let r32 = context.computeLurkerPermissionsAllowList();
if (r32 == null) {
r32 = lurkerPermissionsMask;
}
const r33 = overwrites != null ? {
...context.permissionOverwrites,
...overwrites
} : context.permissionOverwrites;
const guildId = context.getGuildId();
guild = guildId != null ? GuildStore.getGuild(guildId) : null;
lurkerPermissionsMask2 = r32;
overwrites2 = r33;
} else {
overwrites2 = overwrites;
if (overwrites2 == null) {
overwrites2 = {};
}
lurkerPermissionsMask2 = lurkerPermissionsMask;
guild = context;
}
L43: {
if (guild == null) {
r62 = allow;
} else {
if (!(userId === UserStore.getCurrentUser()?.id && ImpersonateStore.isViewingRoles(guild.id)) && isGuildOwner(guild, userId)) {
let r55 = checkElevated;
if (r55 === void 0) {
r55 = true;
}
if (r55) {
r55 = guild.mfaLevel === MFALevels.ELEVATED;
}
if (r55) {
r55 = userId === AuthenticationStore.getId();
}
r62 = c2159_24;
if (!r55) {
break L43;
}
r62 = UserStore.getCurrentUser()?.mfaEnabled ? c2159_24 : remove(c2159_24, ElevatedPermissions);
break L43;
}
r62 = computePermissionsForMember({
userId,
member: GuildMemberStore.getMember(guild.id, userId),
guild,
overwrites: overwrites2,
roles,
checkElevated,
excludeGuildPermissions,
lurkerPermissionsMask: lurkerPermissionsMask2
});
}
}
return r62;
};
applyThreadPermissions = function applyThreadPermissions(context, a1, a2, a3) {
let r23;
L16: {
if (context.type === ChannelTypes.MEDIA_THREAD) {
r23 = combine(Permissions.READ_MESSAGE_HISTORY, Permissions.VIEW_CHANNEL);
} else {
if (context.type === ChannelTypes.PRIVATE_THREAD && !a2 && !a3 && !has(a1, Permissions.MANAGE_THREADS)) {
r23 = allow;
break L16;
}
r23 = has(a1, Permissions.SEND_MESSAGES_IN_THREADS) ? context.isLockedThread() && !has(a1, Permissions.MANAGE_THREADS) ? remove(a1, Permissions.SEND_MESSAGES) : combine(a1, Permissions.SEND_MESSAGES) : remove(a1, Permissions.SEND_MESSAGES);
}
}
return r23;
};
allow = deserialize(0);
c2159_24 = combine.apply(_HighLow, [...Module12.values(Permissions)]);
c2159_25 = combine(Permissions.CREATE_INSTANT_INVITE, Permissions.CHANGE_NICKNAME, Permissions.VIEW_CHANNEL, Permissions.SEND_MESSAGES, Permissions.EMBED_LINKS, Permissions.ATTACH_FILES, Permissions.READ_MESSAGE_HISTORY, Permissions.MENTION_EVERYONE, Permissions.USE_EXTERNAL_EMOJIS, Permissions.USE_EXTERNAL_STICKERS, Permissions.ADD_REACTIONS, Permissions.CREATE_PUBLIC_THREADS, Permissions.CREATE_PRIVATE_THREADS, Permissions.SEND_MESSAGES_IN_THREADS, Permissions.SEND_POLLS, Permissions.CONNECT, Permissions.SPEAK, Permissions.USE_VAD, Permissions.STREAM, Permissions.USE_EMBEDDED_ACTIVITIES, Permissions.USE_SOUNDBOARD, Permissions.REQUEST_TO_SPEAK, Permissions.USE_APPLICATION_COMMANDS, Permissions.CREATE_GUILD_EXPRESSIONS, Permissions.CREATE_EVENTS, Permissions.USE_EXTERNAL_APPS);
lurkerPermissionsMask = combine(Permissions.VIEW_CHANNEL, Permissions.READ_MESSAGE_HISTORY);
c2159_27 = combine(Permissions.VIEW_CHANNEL, Permissions.SEND_MESSAGES, Permissions.CONNECT, Permissions.SPEAK, Permissions.STREAM, Permissions.USE_EMBEDDED_ACTIVITIES, Permissions.USE_EXTERNAL_APPS, Permissions.USE_EXTERNAL_EMOJIS, Permissions.USE_EXTERNAL_SOUNDS, Permissions.USE_EXTERNAL_STICKERS, Permissions.USE_SOUNDBOARD, Permissions.USE_VAD, Permissions.SEND_MESSAGES_IN_THREADS, Permissions.EMBED_LINKS, Permissions.ATTACH_FILES, Permissions.ADD_REACTIONS);
c2159_28 = combine(Permissions.VIEW_CHANNEL, Permissions.READ_MESSAGE_HISTORY);
c2159_29 = combine(Permissions.VIEW_CHANNEL, Permissions.READ_MESSAGE_HISTORY, Permissions.CHANGE_NICKNAME);
const r174 = combine(Permissions.MANAGE_GUILD, Permissions.MANAGE_ROLES, Permissions.ADMINISTRATOR, Permissions.BAN_MEMBERS, Permissions.MANAGE_NICKNAMES, Permissions.CREATE_GUILD_EXPRESSIONS, Permissions.MANAGE_GUILD_EXPRESSIONS, Permissions.MANAGE_WEBHOOKS, Permissions.VIEW_AUDIT_LOG, Permissions.VIEW_GUILD_ANALYTICS);
export { allow as NONE };
export { c2159_24 as ALL };
export { c2159_25 as DEFAULT };
export { r174 as VIEW_GUILD_SETTINGS };
computePermissionsForRoles = function computePermissionsForRoles({ forceRoles, context, overwrites, roles, checkElevated = true, excludeGuildPermissions }) {
let guild, lurkerPermissionsMask2, overwrites2;
if (context instanceof ChannelRecordBase) {
if (context.isScheduledForDeletion()) {
return allow;
}
if (THREAD_CHANNEL_TYPES.has(context.type)) {
const channel = ChannelStore.getChannel(context.parent_id);
return channel == null ? allow : applyThreadPermissions(context, computePermissionsForRoles({
forceRoles,
context: channel,
overwrites,
roles,
checkElevated,
excludeGuildPermissions
}), false, false);
}
let r31 = context.computeLurkerPermissionsAllowList();
if (r31 == null) {
r31 = lurkerPermissionsMask;
}
const r33 = overwrites != null ? {
...context.permissionOverwrites,
...overwrites
} : context.permissionOverwrites;
const guildId = context.getGuildId();
guild = guildId != null ? GuildStore.getGuild(guildId) : null;
lurkerPermissionsMask2 = r31;
overwrites2 = r33;
} else {
overwrites2 = overwrites;
if (overwrites2 == null) {
overwrites2 = {};
}
lurkerPermissionsMask2 = lurkerPermissionsMask;
guild = context;
}
if (guild == null) {
return allow;
}
return computePermissionsForMember({
userId: EMPTY_STRING_SNOWFLAKE_ID,
member: {
userId: EMPTY_STRING_SNOWFLAKE_ID,
nick: "",
guildId: guild.id,
guildMemberAvatar: null,
roles: SnowflakeUtils.keys(forceRoles),
colorString: null,
colorStrings: null,
hoistRoleId: null,
premiumSince: null,
isPending: false,
joinedAt: new Date().toISOString(),
communicationDisabledUntil: null
},
guild,
overwrites: overwrites2,
roles,
checkElevated,
excludeGuildPermissions,
lurkerPermissionsMask: lurkerPermissionsMask2
});
};
export { computePermissionsForRoles };
export { computePermissions };
export { applyThreadPermissions };
export function areChannelsLocked(a0, a1) {
if (THREAD_CHANNEL_TYPES.has(a0.type)) {
return true;
}
const guild_id = a0.guild_id;
if (a1 != null && guild_id != null && guild_id === a1.guild_id) {
const r5 = {
...a0.permissionOverwrites
};
let c13631_0 = r5;
const r8 = {
...a1.permissionOverwrites
};
let c13631_1 = r8;
if (r5[guild_id] == null) {
r5[guild_id] = {
id: guild_id,
type: PermissionOverwriteType.ROLE,
allow,
deny: allow
};
}
if (r8[guild_id] == null) {
r8[guild_id] = {
id: guild_id,
type: PermissionOverwriteType.ROLE,
allow,
deny: allow
};
}
return Object.keys(r5).length === Object.keys(r8).length && !Object.keys(r5).some((item) => {
const r8 = c13631_0[item];
const r10 = c13631_1[item];
return r10 == null || !equals(r10.deny, r8.deny) || !equals(r10.allow, r8.allow);
});
}
return false;
}
export function getGuildVisualOwnerId(a0) {
const r14 = Module12.some(GuildRoleStore.getUnsafeMutableRoles(a0.id), (a0) => a0.hoist && hasPermission(a0, Permissions.ADMINISTRATOR));
let r15 = void 0;
if (!r14) {
let ownerId = a0.ownerId;
if (ownerId == null) {
ownerId = void 0;
}
r15 = ownerId;
}
return r15;
}
export function isRoleHigher(a0, a1, a2, a3) {
const r0 = a1 == null || !isGuildOwner(a0, a1);
return r0 ? a2 != null && (a3 == null || doesRoleSortHigher(a2, a3)) : !r0;
}
export function getHighestRole(a0, a1) {
const member = GuildMemberStore.getMember(a0.id, a1);
if (member != null) {
return GuildRoleStore.getSortedRoles(a0.id).find((item) => member.roles.includes(item.id));
}
}
export function getHighestHoistedRole(a0, a1) {
return a1.hoistRoleId != null ? GuildRoleStore.getRole(a0.id, a1.hoistRoleId) : null;
}
export function makeEveryoneOverwrite(a0) {
return {
id: a0,
type: PermissionOverwriteType.ROLE,
allow,
deny: allow
};
}
export function canManageACategory(a0, a1, a2) {
const user = a0;
const r3 = {
permission: Permissions.MANAGE_CHANNELS,
user: a0,
context: a1
};
const { permission, user: user2 } = r3;
return !!has(computePermissions({
user: user2,
context: r3.context,
overwrites: r3.overwrites,
roles: r3.roles,
checkElevated: true,
excludeGuildPermissions: r3.excludeGuildPermissions
}), permission) || a2.some(({ channel }) => {
let r13 = channel.id !== "null";
if (r13) {
const r3 = {
permission: Permissions.MANAGE_CHANNELS,
user,
context: channel
};
const { permission, user: user2 } = r3;
r13 = has(computePermissions({
user: user2,
context: r3.context,
overwrites: r3.overwrites,
roles: r3.roles,
checkElevated: true,
excludeGuildPermissions: r3.excludeGuildPermissions
}), permission);
}
return r13;
});
}
export function can(a0) {
const { permission, user: user2 } = a0;
return has(computePermissions({
user: user2,
context: a0.context,
overwrites: a0.overwrites,
roles: a0.roles,
checkElevated: true,
excludeGuildPermissions: a0.excludeGuildPermissions
}), permission);
}
export const ALLOW = "ALLOW";
export const DENY = "DENY";
export const PASSTHROUGH = "PASSTHROUGH";
export function canEveryoneRole(a0, a1) {
let r3 = {};
const r0 = a1 instanceof ChannelRecordBase;
let r10 = a1;
if (r0) {
if (a1.type === ChannelTypes.PRIVATE_THREAD) {
return false;
}
const r14 = THREAD_CHANNEL_TYPES.has(a1.type);
let r15 = a1;
if (r14) {
r15 = ChannelStore.getChannel(a1.parent_id);
if (r15 == null) {
return false;
}
}
const permissionOverwrites = r15.permissionOverwrites;
const guildId = r15.getGuildId();
r10 = guildId != null ? GuildStore.getGuild(guildId) : null;
r3 = permissionOverwrites;
}
if (r10 == null) {
return false;
}
const permissions = GuildRoleStore.getEveryoneRole(r10).permissions;
const r31 = r3[r10.id];
return has(r31 != null ? add(remove(permissions, r31.deny), r31.allow) : permissions, a0);
}
export function canEveryone(a0, a1) {
let c13634_0 = a0;
let r5 = {};
const r0 = a1 instanceof ChannelRecordBase;
let r8 = a1;
if (r0) {
if (a1.type === ChannelTypes.PRIVATE_THREAD) {
return false;
}
const r16 = THREAD_CHANNEL_TYPES.has(a1.type);
let r17 = a1;
if (r16) {
r17 = ChannelStore.getChannel(a1.parent_id);
if (r17 == null) {
return false;
}
}
const permissionOverwrites = r17.permissionOverwrites;
const guildId = r17.getGuildId();
r8 = guildId != null ? GuildStore.getGuild(guildId) : null;
r5 = permissionOverwrites;
}
if (r8 == null) {
return false;
}
return !!hasPermission(GuildRoleStore.getEveryoneRole(r8), a0) && !Module12.some(r5, (a0) => has(a0.deny, c13634_0));
}