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

526 lines
17 KiB
TypeScript

// Metro module 3817 (f3818).
import ImpersonateStore from "../modules/impersonate/ImpersonateStore";
import LurkingStore from "../modules/lurker_mode/LurkingStore";
import StageInstanceStore from "../modules/stage_channels/StageInstanceStore";
import JoinedThreadsStore from "../modules/threads/JoinedThreadsStore";
import { ChannelRecordBase, THREAD_CHANNEL_TYPES } from "../records/ChannelRecord";
import { isGuildOwner, isGuildOwnerWithRequiredMfaLevel } from "../records/GuildRecord";
import UserRecord from "../records/UserRecord";
import ChannelStore from "./ChannelStore";
import GuildMemberStore from "./GuildMemberStore";
import GuildStore from "./GuildStore";
import UserStore from "./UserStore";
import { Permissions } from "../Constants";
import { MemberSafetyPagePermissions } from "../modules/guild_mod_dash_member_safety/MemberSafetyConstants";
import * as _PermissionUtils from "../utils/PermissionUtils";
import { applyThreadPermissions, VIEW_GUILD_SETTINGS } from "../utils/PermissionUtils";
import Module12 from "../_bundle/Module12";
import { doesThreadMembersActionAffectMe } from "../modules/threads/ThreadActionUtils";
import { isGuildRecord } from "../utils/GuildRecordUtils";
import Module589 from "../_bundle/Module589";
import { hasAny, has } from "../_bundle/HighLow";
import BasicPermissionUtils from "../utils/BasicPermissionUtils";
import Dispatcher from "../Dispatcher";
let c2156_19, c2156_20, c2156_21, c2156_22, updateGuildVersion, computePermissions2;
const getUncachedChannelPermissions = function getUncachedChannelPermissions(a0, checkElevated = true) {
let r35, NONE;
const currentUser = UserStore.getCurrentUser();
if (currentUser == null) {
return _PermissionUtils.NONE;
}
const channel = ChannelStore.getChannel(a0);
if (channel == null) {
return _PermissionUtils.NONE;
}
const guildId = channel.getGuildId();
const r18 = guildId != null && (LurkingStore.isLurking(guildId) || GuildMemberStore.getMember(guildId, currentUser.id)?.isPending);
L23: {
if (!channel.isScheduledForDeletion() && (!r18 && (Module12.isEmpty(channel.permissionOverwrites) && guildId != null))) {
r35 = c2156_19[guildId];
if (r35 != null) {
break L23;
}
const currentUser2 = UserStore.getCurrentUser();
if (currentUser2 == null) {
r35 = _PermissionUtils.NONE;
break L23;
}
const guild = GuildStore.getGuild(guildId);
if (guild == null) {
NONE = _PermissionUtils.NONE;
} else {
NONE = _PermissionUtils.computePermissions({
user: currentUser2,
context: guild,
checkElevated: true
});
c2156_19[guildId] = NONE;
}
r35 = NONE;
} else {
r35 = _PermissionUtils.computePermissions({
user: currentUser,
context: channel,
checkElevated
});
}
}
return r35;
};
updateGuildVersion = function updateGuildVersion(a0) {
if (a0 != null) {
let r5 = c2156_21[a0];
if (r5 == null) {
r5 = 0;
}
c2156_21[a0] = r5 + 1;
}
};
const handleConnectionOpen = function handleConnectionOpen() {
c2156_19 = {};
c2156_20 = {};
for (const key in c2156_21) {
c2156_21[key] = c2156_21[key] + 1;
}
c2156_22 = c2156_22 + 1;
};
const handleGuild = function handleGuild() {
c2156_19 = {};
c2156_20 = {};
for (const key in c2156_21) {
c2156_21[key] = c2156_21[key] + 1;
}
c2156_22 = c2156_22 + 1;
};
const handleGuildMemberUpdate = function handleGuildMemberUpdate(a0) {
if (a0.user.id !== UserStore.getCurrentUser()?.id) {
return false;
}
c2156_19 = {};
c2156_20 = {};
for (const key in c2156_21) {
c2156_21[key] = c2156_21[key] + 1;
}
c2156_22 = c2156_22 + 1;
};
const handleThreadAction = function handleThreadAction() {
return true;
};
const handleSearchMessagesSuccess = function handleSearchMessagesSuccess(a0) {
return a0.data.some((a0) => {
const messages = a0.messages;
return a0.threads.length > 0 || messages.some((message) => message.some((item) => item.thread != null));
});
};
const handleGuildRole = function handleGuildRole({ guildId }) {
delete c2156_19[guildId];
Module12.forEach(ChannelStore.getMutableBasicGuildChannelsForGuild(guildId), (a0) => {
delete c2156_20[a0.id];
});
c2156_22 = c2156_22 + 1;
if (guildId != null) {
let r21 = c2156_21[guildId];
if (r21 == null) {
r21 = 0;
}
c2156_21[guildId] = r21 + 1;
}
};
const handleStageInstancesChanged = function handleStageInstancesChanged(a0) {
const channel = ChannelStore.getChannel(a0.instance.channel_id);
if (channel == null) {
return false;
}
const r20 = _PermissionUtils.computePermissions({
user: UserStore.getCurrentUser(),
context: channel
});
if (r20 === c2156_20[channel.id]) {
return false;
}
c2156_20[channel.id] = r20;
c2156_22 = c2156_22 + 1;
};
const handleImpersonateUpdate = function handleImpersonateUpdate({ guildId }) {
delete c2156_19[guildId];
Module12.forEach(ChannelStore.getMutableBasicGuildChannelsForGuild(guildId), (a0) => {
delete c2156_20[a0.id];
});
c2156_22 = c2156_22 + 1;
if (guildId != null) {
let r21 = c2156_21[guildId];
if (r21 == null) {
r21 = 0;
}
c2156_21[guildId] = r21 + 1;
}
};
computePermissions2 = function computePermissions(a0, a1, a2, a3) {
let NONE2;
let NONE = _PermissionUtils.NONE;
if (a0 instanceof ChannelRecordBase) {
if (THREAD_CHANNEL_TYPES.has(a0.type)) {
const channel = ChannelStore.getChannel(a0.parent_id);
return channel == null ? _PermissionUtils.NONE : applyThreadPermissions(a0, computePermissions2(channel, a1, a2, a3), JoinedThreadsStore.hasJoined(a0.id), GuildMemberStore.isCurrentUserGuest(a0.guild_id));
}
const id2 = a0.id;
let r51 = c2156_20[id2];
if (r51 == null) {
const uncachedChannelPermissions = getUncachedChannelPermissions(id2, true);
c2156_20[id2] = uncachedChannelPermissions;
r51 = uncachedChannelPermissions;
}
NONE = r51;
} else if (isGuildRecord(a0)) {
const id = a0.id;
let r31 = c2156_19[id];
if (r31 == null) {
const currentUser = UserStore.getCurrentUser();
if (currentUser == null) {
r31 = _PermissionUtils.NONE;
} else {
const guild = GuildStore.getGuild(id);
if (guild == null) {
NONE2 = _PermissionUtils.NONE;
} else {
NONE2 = _PermissionUtils.computePermissions({
user: currentUser,
context: guild,
checkElevated: true
});
c2156_19[id] = NONE2;
}
r31 = NONE2;
}
}
NONE = r31;
}
if (!(a1 === void 0 && (a2 === void 0 && a3 === void 0))) {
NONE = _PermissionUtils.computePermissions({
user: UserStore.getCurrentUser(),
context: a0,
overwrites: a1,
roles: a2,
checkElevated: true,
excludeGuildPermissions: a3
});
}
return NONE;
};
c2156_19 = {};
c2156_20 = {};
c2156_21 = {};
c2156_22 = 0;
class PermissionStore extends Module589.Store {
static displayName = "PermissionStore";
initialize() {
this.waitFor(ChannelStore, GuildMemberStore, GuildStore, ImpersonateStore, JoinedThreadsStore, LurkingStore, StageInstanceStore, UserStore);
}
getChannelPermissions(a0) {
let r10;
if (THREAD_CHANNEL_TYPES.has(a0.type)) {
r10 = getUncachedChannelPermissions(a0.id);
} else {
const id = a0.id;
r10 = c2156_20[id];
if (r10 == null) {
const uncachedChannelPermissions = getUncachedChannelPermissions(id, true);
c2156_20[id] = uncachedChannelPermissions;
r10 = uncachedChannelPermissions;
}
}
return r10;
}
getGuildPermissions({ id }) {
let NONE;
let r11 = c2156_19[id];
if (r11 == null) {
const currentUser = UserStore.getCurrentUser();
if (currentUser == null) {
r11 = _PermissionUtils.NONE;
} else {
const guild = GuildStore.getGuild(id);
if (guild == null) {
NONE = _PermissionUtils.NONE;
} else {
NONE = _PermissionUtils.computePermissions({
user: currentUser,
context: guild,
checkElevated: true
});
c2156_19[id] = NONE;
}
r11 = NONE;
}
}
return r11;
}
getGuildPermissionProps(a0) {
const currentUser = UserStore.getCurrentUser();
return {
canManageGuild: this.can(Permissions.MANAGE_GUILD, a0),
canManageChannels: this.can(Permissions.MANAGE_CHANNELS, a0),
canManageRoles: this.can(Permissions.MANAGE_ROLES, a0),
canManageBans: this.can(Permissions.BAN_MEMBERS, a0),
canManageNicknames: this.can(Permissions.MANAGE_NICKNAMES, a0),
canManageGuildExpressions: this.can(Permissions.MANAGE_GUILD_EXPRESSIONS, a0) || this.can(Permissions.CREATE_GUILD_EXPRESSIONS, a0),
canViewAuditLog: this.can(Permissions.VIEW_AUDIT_LOG, a0),
canViewAuditLogV2: this.can(Permissions.VIEW_AUDIT_LOG, a0),
canManageWebhooks: this.can(Permissions.MANAGE_WEBHOOKS, a0),
canViewGuildAnalytics: this.can(Permissions.VIEW_GUILD_ANALYTICS, a0),
canAccessMembersPage: this.canAccessMemberSafetyPage(a0),
isGuildAdmin: this.can(Permissions.ADMINISTRATOR, a0),
isOwner: currentUser != null && isGuildOwner(a0, currentUser),
isOwnerWithRequiredMfaLevel: currentUser != null && isGuildOwnerWithRequiredMfaLevel(a0, currentUser),
guild: a0
};
}
canAccessMemberSafetyPage({ id }) {
let NONE;
let r17 = c2156_19[id];
if (r17 == null) {
const currentUser = UserStore.getCurrentUser();
if (currentUser == null) {
r17 = _PermissionUtils.NONE;
} else {
const guild = GuildStore.getGuild(id);
if (guild == null) {
NONE = _PermissionUtils.NONE;
} else {
NONE = _PermissionUtils.computePermissions({
user: currentUser,
context: guild,
checkElevated: true
});
c2156_19[id] = NONE;
}
r17 = NONE;
}
}
return hasAny(r17, MemberSafetyPagePermissions);
}
canAccessGuildSettings({ id }) {
let NONE;
let r16 = c2156_19[id];
if (r16 == null) {
const currentUser = UserStore.getCurrentUser();
if (currentUser == null) {
r16 = _PermissionUtils.NONE;
} else {
const guild = GuildStore.getGuild(id);
if (guild == null) {
NONE = _PermissionUtils.NONE;
} else {
NONE = _PermissionUtils.computePermissions({
user: currentUser,
context: guild,
checkElevated: true
});
c2156_19[id] = NONE;
}
r16 = NONE;
}
}
return hasAny(r16, VIEW_GUILD_SETTINGS);
}
canWithPartialContext(a0, a1) {
return "channelId" in a1 && typeof a1.channelId === "string" ? this.can(a0, ChannelStore.getChannel(a1.channelId)) : "guildId" in a1 && typeof a1.guildId === "string" && this.can(a0, GuildStore.getGuild(a1.guildId));
}
can(a0, a1, a2, a3, a4) {
return has(computePermissions2(a1, a2, a3, a4), a0);
}
canBasicChannel(a0, a1, a2, a3, a4) {
return "basicPermissions" in a1 ? BasicPermissionUtils.has(a1.basicPermissions, a0) : has(computePermissions2(a1, a2, a3, a4), BasicPermissionUtils.asBigFlag(a0));
}
computePermissions(a0, a1, a2, a3) {
return computePermissions2(a0, a1, a2, a3);
}
computeBasicPermissions(a0) {
return "basicPermissions" in a0 ? a0.basicPermissions : BasicPermissionUtils.asBasicFlag(computePermissions2(a0));
}
canManageUser(a0, a1, a2) {
const r16 = a1 instanceof UserRecord ? a1.id : a1;
const isGuildOwner2 = isGuildOwner(a2, r16);
if (isGuildOwner2) {
return false;
}
const currentUser = UserStore.getCurrentUser();
if (this.can(a0, a2)) {
const r8 = currentUser != null ? _PermissionUtils.getHighestRole(a2, currentUser.id) : void 0;
const highestRole = _PermissionUtils.getHighestRole(a2, r16);
return currentUser != null && _PermissionUtils.isRoleHigher(a2, currentUser.id, r8, highestRole);
}
return false;
}
getHighestRole(a0) {
const currentUser = UserStore.getCurrentUser();
return currentUser != null ? _PermissionUtils.getHighestRole(a0, currentUser.id) : null;
}
isRoleHigher(a0, a1, a2) {
const currentUser = UserStore.getCurrentUser();
return _PermissionUtils.isRoleHigher(a0, ImpersonateStore.isViewingRoles(a0.id) ? void 0 : currentUser?.id, a1, a2);
}
canImpersonateRole(a0, a1) {
const highestRole = this.getHighestRole(a0);
let r9 = this.can(Permissions.MANAGE_GUILD, a0) && this.can(Permissions.MANAGE_ROLES, a0);
let r14 = this.isRoleHigher(a0, highestRole, a1);
if (r9) {
if (!r14) {
r14 = a1.id === highestRole?.id;
}
r9 = r14;
}
return r9;
}
getGuildVersion(a0) {
let r5 = c2156_21[a0];
if (r5 == null) {
r5 = 0;
}
return r5;
}
getChannelsVersion() {
return c2156_22;
}
}
const permissionStore = new PermissionStore(Dispatcher, {
BACKGROUND_SYNC: handleConnectionOpen,
CONNECTION_OPEN: handleConnectionOpen,
OVERLAY_INITIALIZE: handleConnectionOpen,
CACHE_LOADED: handleConnectionOpen,
CACHE_LOADED_LAZY: handleConnectionOpen,
CONNECTION_CLOSED: function handleConnectionClose() {
c2156_20 = {};
c2156_19 = {};
c2156_21 = {};
c2156_22 = 0;
},
GUILD_CREATE: handleGuild,
GUILD_UPDATE: handleGuild,
GUILD_DELETE: handleGuild,
GUILD_MEMBER_ADD: handleGuildMemberUpdate,
GUILD_MEMBER_UPDATE: handleGuildMemberUpdate,
CURRENT_USER_UPDATE: handleGuildMemberUpdate,
CHANNEL_CREATE: function handleChannelCreate(a0) {
const channel = ChannelStore.getChannel(a0.channel.id);
if (channel != null && !channel.isPrivate()) {
const r23 = _PermissionUtils.computePermissions({
user: UserStore.getCurrentUser(),
context: channel
});
if (c2156_20[channel.id] === r23) {
return false;
}
c2156_20[channel.id] = r23;
c2156_22 = c2156_22 + 1;
const guildId = channel.getGuildId();
if (guildId != null) {
let r32 = c2156_21[guildId];
if (r32 == null) {
r32 = 0;
}
c2156_21[guildId] = r32 + 1;
}
return void 0;
}
return false;
},
THREAD_CREATE: handleThreadAction,
THREAD_UPDATE: handleThreadAction,
THREAD_LIST_SYNC: handleThreadAction,
LOAD_THREADS_SUCCESS: handleThreadAction,
LOAD_ARCHIVED_THREADS_SUCCESS: handleThreadAction,
CHANNEL_UPDATES: function handleChannelUpdates({ channels }) {
let r1 = false;
for (const item of channels) {
const channel = ChannelStore.getChannel(item.id);
if (channel != null && !channel.isPrivate()) {
const currentUser = UserStore.getCurrentUser();
const context = channel;
const r45 = _PermissionUtils.computePermissions({
user: currentUser,
context
});
if (c2156_20[context.id] !== r45) {
c2156_20[channel.id] = r45;
updateGuildVersion(channel.getGuildId());
r1 = true;
}
}
}
let r61 = !!r1;
if (r61) {
c2156_22 = c2156_22 + 1;
r61 = r1;
}
return r61;
},
LOAD_MESSAGES_SUCCESS: function handleLoadMessagesSuccess(a0) {
return a0.messages.some((message) => message.thread != null);
},
SEARCH_MESSAGES_SUCCESS: handleSearchMessagesSuccess,
MOD_VIEW_SEARCH_MESSAGES_SUCCESS: handleSearchMessagesSuccess,
THREAD_MEMBER_UPDATE: function handleThreadMemberUpdate(a0) {
let r12 = UserStore.getCurrentUser()?.id === a0.userId;
if (r12) {
const guildId = a0.guildId;
const r4 = guildId != null;
r12 = true;
if (r4) {
let r15 = c2156_21[guildId];
if (r15 == null) {
r15 = 0;
}
c2156_21[guildId] = r15 + 1;
r12 = true;
}
}
return r12;
},
THREAD_MEMBERS_UPDATE: function handleThreadMembersUpdate(a0) {
let r14 = !!doesThreadMembersActionAffectMe(a0);
if (r14) {
const guildId = a0.guildId;
const r4 = guildId != null;
r14 = true;
if (r4) {
let r17 = c2156_21[guildId];
if (r17 == null) {
r17 = 0;
}
c2156_21[guildId] = r17 + 1;
r14 = true;
}
}
return r14;
},
CHANNEL_DELETE: function handleChannelDelete({ channel }) {
delete c2156_20[channel.id];
c2156_22 = c2156_22 + 1;
const guild_id = channel.guild_id;
if (guild_id != null) {
let r12 = c2156_21[guild_id];
if (r12 == null) {
r12 = 0;
}
c2156_21[guild_id] = r12 + 1;
}
return false;
},
GUILD_ROLE_CREATE: handleGuildRole,
GUILD_ROLE_UPDATE: handleGuildRole,
GUILD_ROLE_DELETE: handleGuildRole,
LOGOUT: function resetState() {
c2156_20 = {};
c2156_19 = {};
c2156_21 = {};
c2156_22 = 0;
},
STAGE_INSTANCE_CREATE: handleStageInstancesChanged,
STAGE_INSTANCE_UPDATE: handleStageInstancesChanged,
STAGE_INSTANCE_DELETE: handleStageInstancesChanged,
IMPERSONATE_UPDATE: handleImpersonateUpdate,
IMPERSONATE_STOP: handleImpersonateUpdate
});
export default permissionStore;