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

305 lines
11 KiB
TypeScript

// Metro module 4372 (f4373).
import { isGuildSelectableChannelType, THREAD_CHANNEL_TYPES, TEXT_CHANNEL_TYPES } from "../records/ChannelRecord";
import ChannelStore from "../stores/ChannelStore";
import GuildChannelStore from "../stores/GuildChannelStore";
import PermissionStore from "../stores/PermissionStore";
import SelectedChannelStore from "../stores/SelectedChannelStore";
import SortedVoiceStateStore from "../stores/views/SortedVoiceStateStore";
import { Permissions, ChannelTypes, BITRATE_DEFAULT, BITRATE_MAX, GuildFeatures, BoostedGuildTiers, Routes, AnalyticsPages } from "../Constants";
import { BoostedGuildFeatures } from "../modules/premium/PremiumConstants";
import { NONE } from "./PermissionUtils";
import { add } from "../_bundle/HighLow";
import { PermissionOverwriteType } from "../flow/Server";
import { hasStream } from "../modules/guild_sidebar/ChannelListUtils";
import { getAudienceRequestToSpeakState, RequestToSpeakStates } from "../modules/stage_channels/useAudienceRequestToSpeakState";
import { intl, t } from "../intl/index.native";
import UserUtils from "./UserUtils";
import * as _MediaPostEmbedUtils from "../modules/media_channel/MediaPostEmbedUtils";
import SnowflakeUtils from "./SnowflakeUtils";
import sanitizeGuildTextChannelName from "../modules/channel/sanitizeGuildTextChannelName";
function $mk74367($env) {
return (a0) => {
const r1 = $env;
if (a0.id !== r1[1] && a0.id !== r1[0]) {
const r9 = r1[2][a0.id];
if (r9 != null) {
if (a0.isGuildStageVoice()) {
r9.forEach($mk103750(r1));
} else {
r9.forEach($mk103751(r1));
}
}
}
};
}
function $mk103750($env) {
return (a0) => {
const r1 = $env.$parent;
const r4 = r1[0];
const r7 = r1[3];
if (r4(r7[12]).getAudienceRequestToSpeakState(a0.voiceState) === r4(r7[12]).RequestToSpeakStates.ON_STAGE) {
$env[3].push(a0);
}
};
}
function $mk103751($env) {
return (a0) => $env[3].push(a0);
}
let GUILD_VOICE, GUILD_CATEGORY, GUILD_STAGE_VOICE;
let env2590 = {};
export function allowChannelAccess(a0, a1, a2) {
const r11 = (0, isGuildSelectableChannelType)(a1) || a1 === GUILD_CATEGORY ? add(NONE, Permissions.VIEW_CHANNEL) : NONE;
return {
id: a0,
type: a2,
deny: NONE,
allow: a1 === GUILD_VOICE || a1 === GUILD_CATEGORY || (a1 === GUILD_STAGE_VOICE || a1 === GUILD_CATEGORY) ? add(add(r11, Permissions.VIEW_CHANNEL), Permissions.CONNECT) : r11
};
}
const ChannelTypes2 = ChannelTypes;
GUILD_VOICE = ChannelTypes2.GUILD_VOICE;
GUILD_CATEGORY = ChannelTypes2.GUILD_CATEGORY;
GUILD_STAGE_VOICE = ChannelTypes2.GUILD_STAGE_VOICE;
export function denyChannelAccessForNonPaidUsers(a0, a1) {
if (a1 === ChannelTypes.GUILD_STAGE_VOICE) {
return {
id: a0,
type: PermissionOverwriteType.ROLE,
allow: NONE,
deny: add(NONE, Permissions.CONNECT)
};
}
throw new Error(`Premium channel feature not supported for channel type ${a1}`);
}
export function permissionOverwritesForRoles(a0, a1, a2) {
let r8 = arguments[3];
if (r8 === void 0) {
r8 = false;
}
const r4 = [];
let c14146_1 = r4;
if (a2.length > 0 || r8) {
const ROLE = PermissionOverwriteType.ROLE;
const r16 = (0, isGuildSelectableChannelType)(a1) || a1 === GUILD_CATEGORY ? add(NONE, Permissions.VIEW_CHANNEL) : NONE;
r4.push({
id: a0,
type: ROLE,
allow: NONE,
deny: a1 === GUILD_VOICE || a1 === GUILD_CATEGORY ? add(add(r16, Permissions.VIEW_CHANNEL), Permissions.CONNECT) : r16
});
}
a2.forEach((item) => {
c14146_1.push(allowChannelAccess(item, a1, PermissionOverwriteType.ROLE));
});
return r4;
}
export function permissionOverwriteForUser(a0, a1) {
return allowChannelAccess(a0, a1, PermissionOverwriteType.MEMBER);
}
export function permissionOverwriteForRole(a0, a1) {
return allowChannelAccess(a0, a1, PermissionOverwriteType.ROLE);
}
export function permissionOverwritesForAnnouncement(a0) {
return [{
id: a0,
type: PermissionOverwriteType.ROLE,
deny: Permissions.SEND_MESSAGES,
allow: NONE
}];
}
export function isChannelFull(a0, a1, a2) {
const guildId = a0.getGuildId();
const guild = a2.getGuild(guildId);
let r11 = guild?.maxVideoChannelUsers;
if (r11 == null) {
r11 = -1;
}
let r10 = guild?.maxStageVideoChannelUsers;
if (r10 == null) {
r10 = -1;
}
const r22 = SortedVoiceStateStore.countVoiceStatesForChannel(a0.id);
const voiceStatesForChannel = SortedVoiceStateStore.getVoiceStatesForChannel(a0);
const r26 = PermissionStore.can(Permissions.MOVE_MEMBERS, a0) && PermissionStore.can(Permissions.CONNECT, a0);
let r32 = a0.type === GUILD_STAGE_VOICE ? guildId != null && (a1.hasVideo(a0.id) || hasStream(voiceStatesForChannel)) && r10 > 0 && r22 >= r10 : guildId != null && a1.hasVideo(a0.id) && r11 > 0 && r22 >= r11 + (r26 ? 1 : 0);
let r48 = a0.userLimit > 0 && r22 >= a0.userLimit;
if (!r32) {
if (r48) {
r48 = !r26;
}
r32 = r48;
}
return r32;
}
exports.sanitizeGuildTextChannelName = sanitizeGuildTextChannelName;
export function getBitrateLimit(a0, a1) {
return a1.isGuildStageVoice() ? BITRATE_DEFAULT : a0 == null ? BITRATE_MAX : Math.max(a0.features.has(GuildFeatures.VIP_REGIONS) ? BoostedGuildFeatures[BoostedGuildTiers.TIER_3].limits.bitrate : BITRATE_MAX, BoostedGuildFeatures[a0.premiumTier].limits.bitrate);
}
export function computeSummarizedVoiceStates(a0) {
let env14145;
const r1 = env14145 = {
$parent: env2590
};
const channels = a0.channels;
env14145[0] = a0.selectedChannelId;
env14145[1] = a0.selectedVoiceChannelId;
env14145[2] = a0.voiceStates;
const r6 = [];
env14145[3] = r6;
channels.forEach($mk74367(r1));
return r6;
}
export function computeSummarizedVoiceUsers({ channels, selectedChannelId, selectedVoiceChannelId, voiceStates }) {
let env14147;
const r6 = env14147 = {
$parent: env2590
};
env14147[0] = selectedChannelId;
env14147[1] = selectedVoiceChannelId;
env14147[2] = voiceStates;
const r7 = [];
env14147[3] = r7;
channels.forEach($mk74367(r6));
return r7.map((item) => item.user);
}
export function isAnyVoiceStateStage(a0, a1, a2) {
for (const item2 of a0) {
L10: {
if (item2.id === a1) {
continue;
}
const r34 = a2[item2.id];
if (r34 == null) {
continue;
}
if (!item2.isGuildStageVoice()) {
continue;
}
for (const item of r34) {
if (getAudienceRequestToSpeakState(item.voiceState) !== RequestToSpeakStates.ON_STAGE) {
continue;
}
break L10;
}
continue;
}
return true;
}
return false;
}
export function channelTypeString({ type }) {
if (ChannelTypes.DM === type) {
return intl.string(t.jN2DfZ);
}
if (ChannelTypes.GROUP_DM === type) {
return intl.string(t["e5y+gm"]);
}
if (ChannelTypes.GUILD_TEXT === type) {
return intl.string(t.Pnajj0);
}
if (ChannelTypes.GUILD_FORUM === type) {
return intl.string(t.GbryDd);
}
if (ChannelTypes.GUILD_MEDIA === type) {
return intl.string(t.seKITE);
}
if (ChannelTypes.GUILD_VOICE === type) {
return intl.string(t.BVZqJl);
}
if (ChannelTypes.GUILD_STAGE_VOICE === type) {
return intl.string(t.EErMzA);
}
if (ChannelTypes.GUILD_ANNOUNCEMENT === type) {
return intl.string(t.l1dkSD);
}
if (ChannelTypes.GUILD_STORE === type) {
return intl.string(t["P1/Erq"]);
}
if (ChannelTypes.GUILD_CATEGORY === type) {
return intl.string(t.vHCZwr);
}
return null;
}
export function getPrivateChannelUserTagsString(a0, a1) {
if (a0 == null) {
return null;
}
const id = a1.getCurrentUser()?.id;
if (id == null) {
return null;
}
const r6 = [];
for (const item of a0) {
if (id !== item) {
const user = a1.getUser(item);
if (user != null) {
r6.push(user);
}
}
}
if (r6.length === 0) {
return null;
}
const r46 = r6.slice(0, 2).map((item) => item.isProvisional ? UserUtils.getName(item) : UserUtils.getUserTag(item));
return intl.formatToPlainString(t.BXG0Eh, {
users: r6.length,
user1: r46[0],
user2: r46[1],
extras: r6.length - r46.length
});
}
export function getMentionIconType(a0) {
if (a0 == null) {
return "text";
}
const isNSFW = a0.isNSFW();
const isSpoilerChannel = a0.isSpoilerChannel();
const isMediaChannel = a0.isMediaChannel();
return a0.type === ChannelTypes.GUILD_VOICE ? PermissionStore.can(Permissions.CONNECT, a0) ? isNSFW ? "voice-nsfw" : isSpoilerChannel ? "voice-spoiler" : "voice" : "voice-locked" : a0.type === ChannelTypes.GUILD_STAGE_VOICE ? PermissionStore.can(Permissions.CONNECT, a0) ? "stage" : "stage-locked" : THREAD_CHANNEL_TYPES.has(a0.type) ? a0.isForumPost() ? "post" : "thread" : a0.type === ChannelTypes.GUILD_FORUM ? isMediaChannel ? isNSFW ? "media-nsfw" : "media" : isNSFW ? "forum-nsfw" : isSpoilerChannel ? "forum-spoiler" : "forum" : a0.type === ChannelTypes.GUILD_MEDIA ? isNSFW ? "media-nsfw" : "media" : a0.type === ChannelTypes.GUILD_ANNOUNCEMENT ? isNSFW ? "announcement-nsfw" : isSpoilerChannel ? "announcement-spoiler" : "announcement" : TEXT_CHANNEL_TYPES.has(a0.type) ? isNSFW ? "text-nsfw" : isSpoilerChannel ? "text-spoiler" : "text" : void 0;
}
export function previousTextChannelRouteForGuild(a0) {
let id;
const channel = ChannelStore.getChannel(SelectedChannelStore.getLastSelectedChannelId());
if (channel != null && (channel.getGuildId() === a0 && channel.type === ChannelTypes.GUILD_TEXT)) {
id = channel.id;
} else {
const defaultChannel = GuildChannelStore.getDefaultChannel(a0);
id = defaultChannel != null ? defaultChannel.id : null;
}
return Routes.CHANNEL(a0, id);
}
export function getChannelPermalink(a0, a1, a2, a3) {
const r6 = a3 == null ? "" : `?summaryId=${a3}`;
return `${location.protocol}//${location.host}${Routes.CHANNEL(a0, a1, a2)}${r6}`;
}
export function getChannelThreadPermalink(a0, a1, a2, a3) {
return a0 != null && (a1 != null && a2 != null) ? `${location.protocol}//${location.host}${Routes.CHANNEL_THREAD_VIEW(a0, a1, a2, a3)}` : `${location.protocol}//${location.host}${Routes.CHANNEL(a0, a1, a3)}`;
}
export function getChannelLinkToCopy(a0, a1, a2, a3) {
let r25;
const guildId = a0.getGuildId();
const canUseMediaPostEmbed = _MediaPostEmbedUtils.canUseMediaPostEmbed(guildId, a1);
if (a1 != null && canUseMediaPostEmbed) {
const id = a1.id;
const id2 = a0.id;
const r39 = SnowflakeUtils.castChannelIdAsMessageId(a0.id);
r25 = guildId != null && (id != null && id2 != null) ? `${location.protocol}//${location.host}${Routes.CHANNEL_THREAD_VIEW(guildId, id, id2, r39)}` : `${location.protocol}//${location.host}${Routes.CHANNEL(guildId, id, r39)}`;
} else {
r25 = a3 == null ? `${location.protocol}//${location.host}${Routes.CHANNEL(guildId, a0.id, a2)}` : a3;
}
return r25;
}
export function getChannelAnalyticsPage(a0) {
if (a0 == null) {
return null;
}
const type = a0.type;
if (ChannelTypes.GUILD_ANNOUNCEMENT !== type && ChannelTypes.GUILD_TEXT !== type && ChannelTypes.GUILD_FORUM !== type && ChannelTypes.GUILD_MEDIA !== type) {
if (ChannelTypes.GROUP_DM !== type && ChannelTypes.DM !== type) {
return null;
}
return AnalyticsPages.DM_CHANNEL;
}
return AnalyticsPages.GUILD_CHANNEL;
}