Files
discord-decomp/modules/explicit_media_redaction/ExplicitMediaManager.tsx
T
2026-11-01 12:12:55 +02:00

547 lines
21 KiB
TypeScript

// Metro module 5873 (f5874).
import ReferencedMessageStore, { ReferencedMessageState } from "../replies/ReferencedMessageStore";
import AuthenticationStore from "../../stores/AuthenticationStore";
import ChannelSectionStore from "../../stores/ChannelSectionStore";
import ChannelStore from "../../stores/ChannelStore";
import MessageStore from "../../stores/MessageStore";
import SelectedChannelStore from "../../stores/SelectedChannelStore";
import SelectedGuildStore from "../../stores/SelectedGuildStore";
import ExplicitMediaSearchStore from "./ExplicitMediaSearchStore";
import { MessageTypesWithLazyLoadedReferences } from "../../Constants";
import { UserSettingsTypes } from "../user_settings/UserSettingsConstants";
import { TimeoutCancelSource, trackExplicitMediaScanComplete, trackScanTiming, trackScanningTimedOut, trackExplicitMediaRedactableMessagedLoaded, trackRedactableMessageLoaded, hasMessageSnapshotsWithAttachmentsOrEmbeds } from "./ExplicitMediaRedactionUtils";
import { isMediaFlaggedForHarmType, isEligibleForScanning, hasUnscannedMedia, getUnscannedMediaIds, getEnabledHarmTypesForMessage, getChannelIdAndAuthorIdFromMessage } from "./ObscuredMediaUtils";
import { ContentHarmType } from "./HarmTypeConfiguration";
import { ObscuredMediaTypes } from "./ExplicitMediaRedactionModels";
import Dispatcher from "../../Dispatcher";
import { sendMultiChannelMessagesForScanning, sendMessagesForScanning } from "./ExplicitMediaRedactionActionCreators";
import MonitoringAgent from "../monitoring/MonitoringAgent";
import { MetricEvents } from "../../_bundle/Module5872";
import { hasAttachmentsEmbedsComponentsOrSnapshots } from "./ExplicitMediaManagerUtils";
import uniqWith from "../../_bundle/uniqWith";
import SnowflakeUtils from "../../utils/SnowflakeUtils";
import { updateMessageRecord } from "../messages/MessageRecordUtils";
import flatten from "../../_bundle/flatten";
import AutomaticLifecycleManager from "../../lib/AutomaticLifecycleManager";
function $mk77264() {
return (a0) => a0.id;
}
function $mk77270($env) {
return (a0) => {
const r5 = $env;
const r12 = r5[0];
if (r12[a0.channel_id] == null) {
r12[a0.channel_id] = {
numOfAttachments: 0,
numOfAttachmentsPendingScan: 0,
numOfEmbeds: 0,
numOfEmbedsPendingScan: 0
};
}
const r15 = r5[1];
if (r15[a0.id] == null) {
r15[a0.id] = {
channelId: a0.channel_id,
numOfAttachments: 0,
numOfSelfHarmAttachments: 0,
numOfGoreAttachments: 0,
numOfExplicitAttachments: 0,
numOfEmbeds: 0,
numOfSelfHarmEmbeds: 0,
numOfGoreEmbeds: 0,
numOfExplicitEmbeds: 0
};
}
let r9 = a0.attachments?.length;
if (r9 == null) {
r9 = 0;
}
let r23 = a0.embeds?.length;
if (r23 == null) {
r23 = 0;
}
const r24 = $env.$parent;
const unscannedMediaIds = (0, r24[0])(r24[2][11]).getUnscannedMediaIds(a0);
const { attachmentIds, embedIds } = unscannedMediaIds;
const r32 = r12[a0.channel_id];
r32.numOfAttachments = r32.numOfAttachments + r9;
r32.numOfEmbeds = r32.numOfEmbeds + r23;
r32.numOfAttachmentsPendingScan = r32.numOfAttachmentsPendingScan + attachmentIds.length;
r32.numOfEmbedsPendingScan = r32.numOfEmbedsPendingScan + embedIds.length;
const r44 = r15[a0.id];
r44.numOfAttachments = r44.numOfAttachments + r9;
r44.numOfEmbeds = r44.numOfEmbeds + r23;
const attachments = a0.attachments;
let numOfExplicitAttachments = attachments == null ? void 0 : attachments.filter($mk104760(r24)).length;
if (numOfExplicitAttachments == null) {
numOfExplicitAttachments = 0;
}
r44.numOfExplicitAttachments = numOfExplicitAttachments;
const embeds = a0.embeds;
let numOfExplicitEmbeds = embeds == null ? void 0 : embeds.filter($mk104761(r24)).length;
if (numOfExplicitEmbeds == null) {
numOfExplicitEmbeds = 0;
}
r44.numOfExplicitEmbeds = numOfExplicitEmbeds;
const attachments2 = a0.attachments;
let numOfGoreAttachments = attachments2 == null ? void 0 : attachments2.filter($mk104762(r24)).length;
if (numOfGoreAttachments == null) {
numOfGoreAttachments = 0;
}
r44.numOfGoreAttachments = numOfGoreAttachments;
const embeds2 = a0.embeds;
let numOfGoreEmbeds = embeds2 == null ? void 0 : embeds2.filter($mk104763(r24)).length;
if (numOfGoreEmbeds == null) {
numOfGoreEmbeds = 0;
}
r44.numOfGoreEmbeds = numOfGoreEmbeds;
const attachments3 = a0.attachments;
let numOfSelfHarmAttachments = attachments3 == null ? void 0 : attachments3.filter($mk104764(r24)).length;
if (numOfSelfHarmAttachments == null) {
numOfSelfHarmAttachments = 0;
}
r44.numOfSelfHarmAttachments = numOfSelfHarmAttachments;
const embeds3 = a0.embeds;
let numOfSelfHarmEmbeds = embeds3 == null ? void 0 : embeds3.filter($mk104765(r24)).length;
if (numOfSelfHarmEmbeds == null) {
numOfSelfHarmEmbeds = 0;
}
r44.numOfSelfHarmEmbeds = numOfSelfHarmEmbeds;
};
}
function $mk104760($env) {
return (a0) => {
const r1 = $env;
const r6 = r1[0];
const r5 = r1[2];
return r6(r5[11]).isMediaFlaggedForHarmType(r6(r5[12]).ContentHarmType.EXPLICIT, {
type: r6(r5[13]).ObscuredMediaTypes.Attachment,
media: a0
});
};
}
function $mk104761($env) {
return (a0) => {
const r1 = $env;
const r6 = r1[0];
const r5 = r1[2];
return r6(r5[11]).isMediaFlaggedForHarmType(r6(r5[12]).ContentHarmType.EXPLICIT, {
type: r6(r5[13]).ObscuredMediaTypes.Embed,
media: a0
});
};
}
function $mk104762($env) {
return (a0) => {
const r1 = $env;
const r6 = r1[0];
const r5 = r1[2];
return r6(r5[11]).isMediaFlaggedForHarmType(r6(r5[12]).ContentHarmType.GORE, {
type: r6(r5[13]).ObscuredMediaTypes.Attachment,
media: a0
});
};
}
function $mk104763($env) {
return (a0) => {
const r1 = $env;
const r6 = r1[0];
const r5 = r1[2];
return r6(r5[11]).isMediaFlaggedForHarmType(r6(r5[12]).ContentHarmType.GORE, {
type: r6(r5[13]).ObscuredMediaTypes.Embed,
media: a0
});
};
}
function $mk104764($env) {
return (a0) => {
const r1 = $env;
const r6 = r1[0];
const r5 = r1[2];
return r6(r5[11]).isMediaFlaggedForHarmType(r6(r5[12]).ContentHarmType.SELF_HARM, {
type: r6(r5[13]).ObscuredMediaTypes.Attachment,
media: a0
});
};
}
function $mk104765($env) {
return (a0) => {
const r1 = $env;
const r6 = r1[0];
const r5 = r1[2];
return r6(r5[11]).isMediaFlaggedForHarmType(r6(r5[12]).ContentHarmType.SELF_HARM, {
type: r6(r5[13]).ObscuredMediaTypes.Embed,
media: a0
});
};
}
let maybeCancelTimeout, withoutScheduledTimeout, handleUnscannedMessages, processMessagesFromAction, handleMessageUpdate, handleMessageCreate, handleMessagesLoad, handleSearchMessagesSuccess, handleLoadPinnedMessages, handleForumPostsLoad, handleThreadsLoad, handleSidebarViewChannel, handleChannelSelect, handleUserSettingsUpdate, handleVoiceChannelChatOpen, maybeScanMessagesForChannelId, c3675_32;
let env3675 = {};
const resetManager = function resetManager() {
Object.values(env3675[14]).forEach((item) => {
clearTimeout(item.timeout);
});
env3675[14] = {};
};
maybeCancelTimeout = function maybeCancelTimeout(a0, a1) {
if (a0.id != null && a0.channel_id != null) {
const r22 = `${a0.channel_id}:${a0.id}`;
if (env3675[14][r22] != null) {
const r26 = env3675[14][r22];
const { timeout, setAt } = r26;
if (a1 === TimeoutCancelSource.UPDATE) {
let attachments = a0.attachments;
if (attachments == null) {
attachments = [];
}
let embeds = a0.embeds;
if (embeds == null) {
embeds = [];
}
trackExplicitMediaScanComplete({
messageId: a0.id,
channelId: a0.channel_id,
numOfAttachments: attachments.length,
numOfEmbeds: embeds.length,
numOfExplicitAttachments: attachments.filter((attachment) => isMediaFlaggedForHarmType(ContentHarmType.EXPLICIT, {
type: ObscuredMediaTypes.Attachment,
media: attachment
})).length,
numOfExplicitEmbeds: embeds.filter((embed) => isMediaFlaggedForHarmType(ContentHarmType.EXPLICIT, {
type: ObscuredMediaTypes.Embed,
media: embed
})).length
});
}
trackScanTiming(setAt, a1);
clearTimeout(timeout);
delete env3675[14][r22];
return true;
}
return false;
}
return false;
};
withoutScheduledTimeout = function withoutScheduledTimeout(a0) {
return env3675[14][`${a0.channel_id}:${a0.id}`] == null;
};
handleUnscannedMessages = function handleUnscannedMessages(a0, a1) {
const r3 = a1 == null ? {} : a1;
const forceBatchScan = r3.forceBatchScan;
let r4 = forceBatchScan !== void 0 && forceBatchScan;
const jitter = r3.jitter;
const r7 = jitter !== void 0 && jitter;
const isMessageUpdate = a1?.isMessageUpdate;
const filter = a0.filter;
const r21 = isMessageUpdate ? filter.call(a0, (a0) => isEligibleForScanning(a0) && hasUnscannedMedia(a0)).filter(withoutScheduledTimeout) : filter.call(a0, (a0) => isEligibleForScanning(a0)).filter(withoutScheduledTimeout);
let c15224_1;
let c15224_0 = r21;
r21.forEach((item) => {
const r13 = `${item.channel_id}:${item.id}`;
if (env3675[14][r13] == null) {
MonitoringAgent.increment({
name: MetricEvents.EXPLICIT_MEDIA_SCAN_CLIENT_TIMEOUT_CREATE
});
env3675[14][r13] = {
setAt: Date.now(),
timeout: setTimeout(() => {
if (maybeCancelTimeout(item, TimeoutCancelSource.TIMEOUT)) {
const message = MessageStore.getMessage(item.channel_id, item.id);
if (message != null) {
const unscannedMediaIds = getUnscannedMediaIds(message);
trackScanningTimedOut({
channelId: item.channel_id,
messageId: item.id,
attachmentIds: unscannedMediaIds.attachmentIds,
embedIds: unscannedMediaIds.embedIds
});
}
Dispatcher.dispatch({
type: "MESSAGE_EXPLICIT_CONTENT_SCAN_TIMEOUT",
messageId: item.id,
channelId: item.channel_id
});
}
}, 3000)
};
}
});
if (!r4) {
r4 = new Set(r21.map((item) => item.channel_id)).size > 1;
}
c15224_1 = r4;
if (r7) {
setTimeout(() => {
const r8 = c15224_0.filter((item) => env3675[14][`${item.channel_id}:${item.id}`] != null);
if (r8.length !== 0) {
if (c15224_1) {
sendMultiChannelMessagesForScanning(r8);
} else {
sendMessagesForScanning(r8[0].channel_id, r8.map($mk77264()));
}
}
}, 800 * Math.random());
} else if (r21.length !== 0) {
if (r4) {
sendMultiChannelMessagesForScanning(r21);
} else {
sendMessagesForScanning(r21[0].channel_id, r21.map($mk77264()));
}
}
};
processMessagesFromAction = function processMessagesFromAction(a0, a1) {
const r7 = a0.filter((item) => {
let r9 = hasAttachmentsEmbedsComponentsOrSnapshots(item);
const enabledHarmTypesForMessage = getEnabledHarmTypesForMessage(item);
if (r9) {
r9 = enabledHarmTypesForMessage !== 0;
}
return r9;
});
const r21 = a0.map((item) => {
if (item != null && "referenced_message" in item && item.referenced_message != null) {
if (hasAttachmentsEmbedsComponentsOrSnapshots(item.referenced_message) && getEnabledHarmTypesForMessage(item.referenced_message) !== 0) {
return item.referenced_message;
}
}
}).filter(function(item) {
return item != null;
});
const r9 = r21.length > 0 ? [...r7, ...r21] : r7;
let env15225;
const r12 = uniqWith(r9, (a0, a1) => a0.id === a1.id && a0.channel_id === a1.channel_id);
const r34 = r12.filter((item) => hasUnscannedMedia(item));
const r35 = env15225 = {
$parent: env3675
};
const r11 = {};
env15225[0] = r11;
const r36 = {};
env15225[1] = r36;
r12.forEach($mk77270(r35));
SnowflakeUtils.entries(r11).forEach((item) => {
const [channelId, r22] = item;
trackExplicitMediaRedactableMessagedLoaded({
channelId,
numOfAttachments: r22.numOfAttachments,
numOfAttachmentsPendingScan: r22.numOfAttachmentsPendingScan,
numOfEmbeds: r22.numOfEmbeds,
numOfEmbedsPendingScan: r22.numOfEmbedsPendingScan
});
});
SnowflakeUtils.entries(r36).forEach((item) => {
const [messageId, r22] = item;
trackRedactableMessageLoaded({
messageId,
channelId: r22.channelId,
numOfAttachments: r22.numOfAttachments,
numOfGoreAttachments: r22.numOfGoreAttachments,
numOfExplicitAttachments: r22.numOfExplicitAttachments,
numOfSelfHarmAttachments: r22.numOfSelfHarmAttachments,
numOfEmbeds: r22.numOfEmbeds,
numOfGoreEmbeds: r22.numOfGoreEmbeds,
numOfExplicitEmbeds: r22.numOfExplicitEmbeds,
numOfSelfHarmEmbeds: r22.numOfSelfHarmEmbeds
});
});
let r54 = r34.length > 0;
if (r54) {
handleUnscannedMessages(r34, a1);
r54 = true;
}
return r54;
};
handleMessageUpdate = function handleMessageUpdate({ message }) {
if (message.channel_id != null && message.id != null) {
if (getChannelIdAndAuthorIdFromMessage(message).authorId !== AuthenticationStore.getId()) {
if (message.embeds == null && message.attachments == null && !hasMessageSnapshotsWithAttachmentsOrEmbeds(message)) {
return false;
}
if (message.embeds?.length === 0) {
if (message.attachments?.length === 0 && !hasMessageSnapshotsWithAttachmentsOrEmbeds(message)) {
return false;
}
}
if (!hasUnscannedMedia(message)) {
let r46 = MessageStore.getMessage(message.channel_id, message.id);
if (r46 == null) {
r46 = ExplicitMediaSearchStore.getMessage(message.id, message.channel_id);
}
if (r46 == null) {
r46 = ReferencedMessageStore.getMessage(message.channel_id, message.id)?.message;
}
if (!(r46 == null || hasUnscannedMedia(updateMessageRecord(r46, message)))) {
maybeCancelTimeout(r46, TimeoutCancelSource.UPDATE);
}
}
const channelId = SelectedChannelStore.getChannelId();
const currentSidebarChannelId = ChannelSectionStore.getCurrentSidebarChannelId(channelId);
if (message.channel_id !== channelId && message.channel_id !== currentSidebarChannelId) {
return false;
}
const message2 = MessageStore.getMessage(message.channel_id, message.id);
return message2 != null && processMessagesFromAction([message2], {
isMessageUpdate: true
});
}
}
return false;
};
handleMessageCreate = function handleMessageCreate({ channelId, message, optimistic, isPushNotification }) {
if (!optimistic && !isPushNotification && channelId != null && getChannelIdAndAuthorIdFromMessage(message).authorId !== AuthenticationStore.getId()) {
const channelId2 = SelectedChannelStore.getChannelId();
const currentSidebarChannelId = ChannelSectionStore.getCurrentSidebarChannelId(channelId2);
const channel = ChannelStore.getChannel(channelId);
let r1 = channelId === channelId2 || channelId === currentSidebarChannelId;
if (r1) {
const r31 = [message];
let jitter = channel == null ? void 0 : channel.isPrivate();
if (jitter == null) {
jitter = true;
}
if (jitter) {
jitter = channel?.memberCount == null || channel?.memberCount > 100;
}
r1 = processMessagesFromAction(r31, {
jitter
});
}
return r1;
}
return false;
};
handleMessagesLoad = function handleMessagesLoad({ channelId, messages }) {
if (channelId != null && messages != null) {
const channelId2 = SelectedChannelStore.getChannelId();
const currentSidebarChannelId = ChannelSectionStore.getCurrentSidebarChannelId(channelId2);
return (channelId === channelId2 || channelId === currentSidebarChannelId) && processMessagesFromAction(messages);
}
return false;
};
handleSearchMessagesSuccess = function handleSearchMessagesSuccess({ data }) {
let c15226_0 = false;
data.forEach((item) => {
c15226_0 = processMessagesFromAction(uniqWith(flatten(item.messages), (a0, a1) => a0.id === a1.id && a0.channel_id === a1.channel_id)) || c15226_0;
});
return c15226_0;
};
handleLoadPinnedMessages = function handleLoadPinnedMessages(a0) {
return processMessagesFromAction(a0.pins.map((pin) => pin.message));
};
handleForumPostsLoad = function handleForumPostsLoad({ guildId, threads }) {
return threads != null && (SelectedGuildStore.getGuildId() === guildId && processMessagesFromAction(SnowflakeUtils.keys(threads).map((item) => threads[item].first_message)));
};
handleThreadsLoad = function handleThreadsLoad({ guildId, firstMessages }) {
return firstMessages != null && (!(SelectedGuildStore.getGuildId() !== guildId) && processMessagesFromAction(firstMessages, {
forceBatchScan: true
}));
};
handleSidebarViewChannel = function handleSidebarViewChannel({ channelId }) {
return channelId != null && maybeScanMessagesForChannelId(channelId);
};
handleChannelSelect = function handleChannelSelect({ channelId }) {
return channelId != null && (!(channelId !== SelectedChannelStore.getChannelId()) && maybeScanMessagesForChannelId(channelId));
};
handleUserSettingsUpdate = function handleUserSettingsUpdate(a0) {
const settings = a0.settings;
if (a0.local && settings.type === UserSettingsTypes.PRELOADED_USER_SETTINGS) {
const channelId = SelectedChannelStore.getChannelId();
return channelId != null && maybeScanMessagesForChannelId(channelId);
}
return false;
};
handleVoiceChannelChatOpen = function handleVoiceChannelChatOpen(a0) {
const channelId = a0.channelId;
return !!a0.chatOpen && maybeScanMessagesForChannelId(channelId);
};
maybeScanMessagesForChannelId = function maybeScanMessagesForChannelId(a0) {
const messages = MessageStore.getMessages(a0);
let r3 = messages.length !== 0;
if (r3) {
const r20 = messages.filter((message) => hasAttachmentsEmbedsComponentsOrSnapshots(message) && getEnabledHarmTypesForMessage(message) !== 0);
const r26 = messages.map((message) => {
if (MessageTypesWithLazyLoadedReferences.has(message.type) && message.messageReference != null) {
const messageByReference = ReferencedMessageStore.getMessageByReference(message.messageReference);
if (messageByReference.state === ReferencedMessageState.LOADED && messageByReference.message != null) {
if (hasAttachmentsEmbedsComponentsOrSnapshots(messageByReference.message) && getEnabledHarmTypesForMessage(messageByReference.message) !== 0) {
return messageByReference.message;
}
}
}
}).filter(function(item) {
return item != null;
});
const r10 = r26.length > 0 ? [...r20, ...r26] : r20;
let env15228;
const r13 = uniqWith(r10, (a0, a1) => a0.id === a1.id && a0.channel_id === a1.channel_id);
const r39 = r13.filter((item) => hasUnscannedMedia(item));
const r40 = env15228 = {
$parent: env3675
};
const r12 = {};
env15228[0] = r12;
const r41 = {};
env15228[1] = r41;
r13.forEach($mk77270(r40));
SnowflakeUtils.entries(r12).forEach((item) => {
const [channelId, r22] = item;
trackExplicitMediaRedactableMessagedLoaded({
channelId,
numOfAttachments: r22.numOfAttachments,
numOfAttachmentsPendingScan: r22.numOfAttachmentsPendingScan,
numOfEmbeds: r22.numOfEmbeds,
numOfEmbedsPendingScan: r22.numOfEmbedsPendingScan
});
});
SnowflakeUtils.entries(r41).forEach((item) => {
const [messageId, r22] = item;
trackRedactableMessageLoaded({
messageId,
channelId: r22.channelId,
numOfAttachments: r22.numOfAttachments,
numOfGoreAttachments: r22.numOfGoreAttachments,
numOfSelfHarmAttachments: r22.numOfSelfHarmAttachments,
numOfExplicitAttachments: r22.numOfExplicitAttachments,
numOfEmbeds: r22.numOfEmbeds,
numOfGoreEmbeds: r22.numOfGoreEmbeds,
numOfExplicitEmbeds: r22.numOfExplicitEmbeds,
numOfSelfHarmEmbeds: r22.numOfSelfHarmEmbeds
});
});
let r59 = r39.length > 0;
if (r59) {
handleUnscannedMessages(r39);
r59 = true;
}
r3 = r59;
}
return r3;
};
env3675[14] = {};
class ExplicitMediaManager extends AutomaticLifecycleManager {
constructor() {
super(...arguments);
this.actions = {
LOAD_MESSAGES_SUCCESS: handleMessagesLoad,
LOAD_FORUM_POSTS: handleForumPostsLoad,
LOAD_THREADS_SUCCESS: handleThreadsLoad,
LOAD_ARCHIVED_THREADS_SUCCESS: handleThreadsLoad,
SIDEBAR_VIEW_CHANNEL: handleSidebarViewChannel,
MESSAGE_CREATE: handleMessageCreate,
MESSAGE_UPDATE: handleMessageUpdate,
LOGOUT: resetManager,
SEARCH_MESSAGES_SUCCESS: handleSearchMessagesSuccess,
MOD_VIEW_SEARCH_MESSAGES_SUCCESS: handleSearchMessagesSuccess,
CHANNEL_SELECT: handleChannelSelect,
LOAD_PINNED_MESSAGES_SUCCESS: handleLoadPinnedMessages,
USER_SETTINGS_PROTO_UPDATE: handleUserSettingsUpdate,
CHANNEL_RTC_UPDATE_CHAT_OPEN: handleVoiceChannelChatOpen
};
}
}
c3675_32 = ExplicitMediaManager;
const r63 = new ExplicitMediaManager();
export default r63;
export const MESSAGE_SCAN_TIMEOUT = 3000;
export const MAX_TIMEOUT_FOR_JITTER = 800;