Equicord/src/plugins/experiments/index.tsx

172 lines
6.4 KiB
TypeScript
Raw Normal View History

2022-10-22 01:17:06 +02:00
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { definePluginSettings } from "@api/Settings";
import { disableStyle, enableStyle } from "@api/Styles";
import ErrorBoundary from "@components/ErrorBoundary";
import { ErrorCard } from "@components/ErrorCard";
import { Paragraph } from "@components/Paragraph";
import { Devs, IS_MAC } from "@utils/constants";
import { Margins } from "@utils/margins";
import definePlugin, { OptionType } from "@utils/types";
import { findByPropsLazy, findLazy } from "@webpack";
import { Forms, React } from "@webpack/common";
import hideBugReport from "./hideBugReport.css?managed";
const KbdStyles = findByPropsLazy("key", "combo");
const BugReporterExperiment = findLazy(m => m?.definition?.id === "2024-09_bug_reporter");
const modKey = IS_MAC ? "cmd" : "ctrl";
const altKey = IS_MAC ? "opt" : "alt";
const settings = definePluginSettings({
toolbarDevMenu: {
type: OptionType.BOOLEAN,
description: "Change the Help (?) toolbar button (top right in chat) to Discord's developer menu",
default: false,
restartNeeded: true
}
});
export default definePlugin({
name: "Experiments",
description: "Enable Access to Experiments & other dev-only features in Discord!",
authors: [
Devs.Megu,
Devs.Ven,
Devs.Nickyux,
Devs.BanTheNons,
Devs.Nuckyz,
],
settings,
patches: [
{
find: "Object.defineProperties(this,{isDeveloper",
replacement: {
2023-10-25 20:34:00 +07:00
match: /(?<={isDeveloper:\{[^}]+?,get:\(\)=>)\i/,
replace: "true"
}
},
{
find: 'type:"user",revision',
replacement: {
match: /!(\i)(?=&&"CONNECTION_OPEN")/,
replace: "!($1=true)"
}
},
{
2025-10-10 17:42:12 -04:00
find: 'placeholder:"Search experiments"',
replacement: {
2025-10-10 17:42:12 -04:00
match: /(?<=children:\[)(?=\(0,\i\.jsx?\)\(\i\.\i,{placeholder:"Search experiments")/,
replace: "$self.WarningCard(),"
}
},
// Change top right toolbar button from the help one to the dev one
{
find: '?"BACK_FORWARD_NAVIGATION":',
replacement: {
match: /hasBugReporterAccess:(\i)/,
replace: "_hasBugReporterAccess:$1=true"
},
predicate: () => settings.store.toolbarDevMenu
},
// Disable opening the bug report menu when clicking the top right toolbar dev button
{
find: 'navId:"staff-help-popout"',
replacement: {
match: /(isShown.+?)onClick:\i/,
replace: (_, rest) => `${rest}onClick:()=>{}`
}
},
// Make the Favourites Server experiment allow favouriting DMs and threads
{
find: "useCanFavoriteChannel",
replacement: {
2024-07-12 16:40:26 -03:00
match: /\i\.isDM\(\)\|\|\i\.isThread\(\)/,
replace: "false",
}
},
// Enable experiment embed on sent experiment links
{
2026-02-04 17:42:47 -05:00
find: "`Clear Treatment ${",
replacement: [
{
2026-02-04 17:42:47 -05:00
// TODO: stable compat optional chaining remove once some time has passed
match: /\i\??\.isStaff\(\)/,
replace: "true"
},
// Fix some tricky experiments name causing a client crash
{
2025-11-04 13:18:30 -05:00
match: /\.isStaffPersonal\(\).+?if\(null==(\i)\|\|null==\i(?=\)return null;)/,
2025-07-14 17:07:43 -03:00
replace: "$&||({})[$1]!=null"
}
]
},
2025-07-14 17:07:43 -03:00
// Fix another function which cases crashes with tricky experiment names and the experiment embed
{
find: "}getServerAssignment(",
replacement: {
match: /}getServerAssignment\((\i),\i,\i\){/,
replace: "$&if($1==null)return;"
}
}
],
start: () => !BugReporterExperiment.getCurrentConfig().hasBugReporterAccess && enableStyle(hideBugReport),
stop: () => disableStyle(hideBugReport),
settingsAboutComponent: () => {
return (
<React.Fragment>
<Forms.FormTitle tag="h3">More Information</Forms.FormTitle>
<Paragraph size="md">
You can open Discord's DevTools via {" "}
<div className={KbdStyles.combo} style={{ display: "inline-flex" }}>
<kbd className={KbdStyles.key}>{modKey}</kbd> +{" "}
<kbd className={KbdStyles.key}>{altKey}</kbd> +{" "}
<kbd className={KbdStyles.key}>O</kbd>{" "}
</div>
</Paragraph>
</React.Fragment>
);
},
WarningCard: ErrorBoundary.wrap(() => (
<ErrorCard id="vc-experiments-warning-card" className={Margins.bottom16}>
<Forms.FormTitle tag="h2">Hold on!!</Forms.FormTitle>
<Forms.FormText>
Experiments are unreleased Discord features. They might not work, or even break your client or get your account disabled.
</Forms.FormText>
<Forms.FormText className={Margins.top8}>
Only use experiments if you know what you're doing. Vencord is not responsible for any damage caused by enabling experiments.
If you don't know what an experiment does, ignore it. Do not ask us what experiments do either, we probably don't know.
</Forms.FormText>
<Forms.FormText className={Margins.top8}>
No, you cannot use server-side features like checking the "Send to Client" box.
</Forms.FormText>
</ErrorCard>
), { noop: true })
});