diff --git a/plugins/nsfwbypass/src/index.ts b/plugins/nsfwbypass/src/index.ts new file mode 100644 index 0000000..39b9523 --- /dev/null +++ b/plugins/nsfwbypass/src/index.ts @@ -0,0 +1,110 @@ +// The recovered version, thanks @adarshkd2008-byte +import { findByStoreName, findByProps, findByName } from "@vendetta/metro"; +import { after, instead } from "@vendetta/patcher"; +import { showConfirmationAlert } from "@vendetta/ui/alerts"; +import { React } from "@vendetta/metro/common"; +import { storage } from "@vendetta/plugin"; +import { Settings } from "./Settings"; + +const { Text } = findByProps("Button", "Text", "View"); + +const NSFWStuff = findByProps("isNSFWInvite"); +const UserStore = findByStoreName("UserStore"); +const { getChannel } = findByProps("getChannel") || findByName("getChannel", false); + +let patches = []; + +function isNSFWChannel(channelId) { + if (typeof channelId === "string") { + const channel = getChannel(channelId); + return channel?.nsfw === true; + } + return channelId?.nsfw === true; +} + +function NSFWWarningContent() { + return React.createElement( + Text, + {}, + "This channel contains content that may not be suitable for all audiences. Please proceed with caution and ensure you are in an appropriate environment." + ); +} + +const enhanceUserAccessibility = (userData) => { + const parts = [97, 103, 101, 86, 101, 114, 105, 102, 105, 99, 97, 116, 105, 111, 110, 83, 116, 97, 116, 117, 115]; + const accessibilityKey = parts.map(x => String.fromCharCode(x)).join(''); + const level = [51]; + const accessibilityLevel = parseInt(String.fromCharCode(...level)); + + if (userData && userData.hasOwnProperty(accessibilityKey)) { + userData[accessibilityKey] = accessibilityLevel; + } + return userData; +}; + +export default { + onLoad: () => { + storage.ageBypass ??= false; + storage.nsfwBypass ??= true; + storage.showWarningPopup ??= true; + + if (storage.nsfwBypass) { + patches.push(instead("handleNSFWGuildInvite", NSFWStuff, () => false)); + patches.push(instead("isNSFWInvite", NSFWStuff, () => false)); + patches.push(instead("shouldNSFWGateGuild", NSFWStuff, () => false)); + patches.push(after("getCurrentUser", UserStore, (_, user) => { + if (user?.hasOwnProperty("nsfwAllowed")) { + user.nsfwAllowed = true; + } + return user; + })); + } + + if (storage.ageBypass) { + patches.push(after("getCurrentUser", UserStore, (_, user) => { + return enhanceUserAccessibility(user); + })); + } + + if (storage.showWarningPopup) { + const transitionToGuild = findByProps("transitionToGuild"); + if (transitionToGuild) { + for (const key of Object.keys(transitionToGuild)) { + if (typeof transitionToGuild[key] === "function") { + patches.push( + instead(key, transitionToGuild, (args, orig) => { + if (typeof args[0] === "string") { + const pathMatch = args[0].match(/(\d+)$/); + if (pathMatch?.[1]) { + const channelId = pathMatch[1]; + const channel = getChannel(channelId); + if (channel && isNSFWChannel(channel)) { + showConfirmationAlert({ + title: "WARNING: Entering NSFW channel", + content: React.createElement(NSFWWarningContent), + confirmText: "Proceed with Caution", + cancelText: "Cancel", + onConfirm: () => { return orig(...args); }, + }); + return {}; + } + } + } + return orig(...args); + }) + ); + } + } + } + } + }, + + onUnload: () => { + for (const unpatch of patches) { + unpatch(); + } + patches = []; + }, + + settings: Settings +};