mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-18 10:57:04 -04:00
Updates
This commit is contained in:
commit
61a355980f
22 changed files with 641 additions and 275 deletions
|
@ -77,8 +77,7 @@ export default definePlugin({
|
|||
// Because of that, its WebpackInstance doesnt export wreq.m or wreq.c
|
||||
|
||||
// To circuvent this and disable Sentry we are gonna hook when wreq.g of its WebpackInstance is set.
|
||||
// When that happens we are gonna obtain a reference to its internal module cache (wreq.c) and proxy its prototype,
|
||||
// so, when the first require to initialize the Sentry is attempted, we are gonna forcefully throw an error and abort everything.
|
||||
// When that happens we are gonna forcefully throw an error and abort everything.
|
||||
Object.defineProperty(Function.prototype, "g", {
|
||||
configurable: true,
|
||||
|
||||
|
@ -93,35 +92,30 @@ export default definePlugin({
|
|||
// Ensure this is most likely the Sentry WebpackInstance.
|
||||
// Function.g is a very generic property and is not uncommon for another WebpackInstance (or even a React component: <g></g>) to include it
|
||||
const { stack } = new Error();
|
||||
if (!(stack?.includes("discord.com") || stack?.includes("discordapp.com")) || this.c != null || !String(this).includes("exports:{}")) {
|
||||
if (!(stack?.includes("discord.com") || stack?.includes("discordapp.com")) || !String(this).includes("exports:{}") || this.c != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
const cacheExtractSym = Symbol("vencord.cacheExtract");
|
||||
Object.defineProperty(Object.prototype, cacheExtractSym, {
|
||||
configurable: true,
|
||||
const assetPath = stack?.match(/\/assets\/.+?\.js/)?.[0];
|
||||
if (!assetPath) {
|
||||
return;
|
||||
}
|
||||
|
||||
get() {
|
||||
// One more condition to check if this is the Sentry WebpackInstance
|
||||
if (Array.isArray(this)) {
|
||||
return { exports: {} };
|
||||
}
|
||||
const srcRequest = new XMLHttpRequest();
|
||||
srcRequest.open("GET", assetPath, false);
|
||||
srcRequest.send();
|
||||
|
||||
new Logger("NoTrack", "#8caaee").info("Disabling Sentry by proxying its WebpackInstance cache");
|
||||
Object.setPrototypeOf(this, new Proxy(this, {
|
||||
get() {
|
||||
throw new Error("Sentry successfully disabled");
|
||||
}
|
||||
}));
|
||||
// Final condition to see if this is the Sentry WebpackInstance
|
||||
if (!srcRequest.responseText.includes("window.DiscordSentry=")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Reflect.deleteProperty(Object.prototype, cacheExtractSym);
|
||||
Reflect.deleteProperty(window, "DiscordSentry");
|
||||
return { exports: {} };
|
||||
}
|
||||
});
|
||||
new Logger("NoTrack", "#8caaee").info("Disabling Sentry by erroring its WebpackInstance");
|
||||
|
||||
// WebpackRequire our fake module id
|
||||
this(cacheExtractSym);
|
||||
Reflect.deleteProperty(Function.prototype, "g");
|
||||
Reflect.deleteProperty(window, "DiscordSentry");
|
||||
|
||||
throw new Error("Sentry successfully disabled");
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -130,6 +124,8 @@ export default definePlugin({
|
|||
|
||||
set() {
|
||||
new Logger("NoTrack", "#8caaee").error("Failed to disable Sentry. Falling back to deleting window.DiscordSentry");
|
||||
|
||||
Reflect.deleteProperty(Function.prototype, "g");
|
||||
Reflect.deleteProperty(window, "DiscordSentry");
|
||||
}
|
||||
});
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
import { addAccessory } from "@api/MessageAccessories";
|
||||
import { definePluginSettings } from "@api/Settings";
|
||||
import { getUserSettingLazy } from "@api/UserSettings";
|
||||
import ErrorBoundary from "@components/ErrorBoundary";
|
||||
import { Flex } from "@components/Flex";
|
||||
|
@ -32,12 +33,12 @@ import { onlyOnce } from "@utils/onlyOnce";
|
|||
import { makeCodeblock } from "@utils/text";
|
||||
import definePlugin from "@utils/types";
|
||||
import { checkForUpdates, isOutdated, update } from "@utils/updater";
|
||||
import { Alerts, Button, Card, ChannelStore, Forms, GuildMemberStore, Parser, RelationshipStore, showToast, Toasts, UserStore } from "@webpack/common";
|
||||
import { Alerts, Button, Card, ChannelStore, Forms, GuildMemberStore, Parser, RelationshipStore, showToast, Text, Toasts, UserStore } from "@webpack/common";
|
||||
|
||||
import gitHash from "~git-hash";
|
||||
import plugins, { PluginMeta } from "~plugins";
|
||||
|
||||
import settings from "./settings";
|
||||
import SettingsPlugin from "./settings";
|
||||
|
||||
const VENCORD_GUILD_ID = "1015060230222131221";
|
||||
const EQUICORD_GUILD_ID = "1015060230222131221";
|
||||
|
@ -90,7 +91,7 @@ async function generateDebugInfoMessage() {
|
|||
const info = {
|
||||
Equicord:
|
||||
`v${VERSION} • [${gitHash}](<https://github.com/Equicord/Equicord/commit/${gitHash}>)` +
|
||||
`${settings.additionalInfo} - ${Intl.DateTimeFormat("en-GB", { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}`,
|
||||
`${SettingsPlugin.additionalInfo} - ${Intl.DateTimeFormat("en-GB", { dateStyle: "medium" }).format(BUILD_TIMESTAMP)}`,
|
||||
Client: `${RELEASE_CHANNEL} ~ ${client}`,
|
||||
Platform: window.navigator.platform
|
||||
};
|
||||
|
@ -136,6 +137,10 @@ function generatePluginList() {
|
|||
|
||||
const checkForUpdatesOnce = onlyOnce(checkForUpdates);
|
||||
|
||||
const settings = definePluginSettings({}).withPrivateSettings<{
|
||||
dismissedDevBuildWarning?: boolean;
|
||||
}>();
|
||||
|
||||
export default definePlugin({
|
||||
name: "SupportHelper",
|
||||
required: true,
|
||||
|
@ -143,6 +148,8 @@ export default definePlugin({
|
|||
authors: [Devs.Ven, EquicordDevs.thororen],
|
||||
dependencies: ["CommandsAPI", "UserSettingsAPI", "MessageAccessoriesAPI"],
|
||||
|
||||
settings,
|
||||
|
||||
patches: [{
|
||||
find: ".BEGINNING_DM.format",
|
||||
replacement: {
|
||||
|
@ -224,17 +231,22 @@ export default definePlugin({
|
|||
});
|
||||
}
|
||||
|
||||
const repo = await VencordNative.updater.getRepo();
|
||||
if (repo.ok && !repo.value.includes("Vendicated/Vencord") && Vencord.Plugins.isPluginEnabled("VCSupport")) {
|
||||
if (!IS_STANDALONE && !settings.store.dismissedDevBuildWarning) {
|
||||
return Alerts.show({
|
||||
title: "Hold on!",
|
||||
body: <div>
|
||||
<Forms.FormText>You are running a modified version of Vencord.</Forms.FormText>
|
||||
<Forms.FormText>You are using a custom build of Vencord, which we do not provide support for!</Forms.FormText>
|
||||
|
||||
<Forms.FormText className={Margins.top8}>
|
||||
Please join the <Link href="https://discord.gg/5Xh2W87egW">Equicord Server </Link> for support,
|
||||
or if this issue persists on Vencord, continue on.
|
||||
We only provide support for <Link href="https://vencord.dev/download">official builds</Link>.
|
||||
Either <Link href="https://vencord.dev/download">switch to an official build</Link> or figure your issue out yourself.
|
||||
</Forms.FormText>
|
||||
</div>
|
||||
|
||||
<Text variant="text-md/bold" className={Margins.top8}>You will be banned from receiving support if you ignore this rule.</Text>
|
||||
</div>,
|
||||
confirmText: "Understood",
|
||||
secondaryConfirmText: "Don't show again",
|
||||
onConfirmSecondary: () => settings.store.dismissedDevBuildWarning = true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,9 +40,9 @@ export default definePlugin({
|
|||
}),
|
||||
patches: [
|
||||
{
|
||||
find: ".ENTER&&(!",
|
||||
find: "!this.hasOpenCodeBlock()",
|
||||
replacement: {
|
||||
match: /(?<=(\i)\.which===\i\.\i.ENTER&&).{0,100}(\(0,\i\.\i\)\(\i\)).{0,100}(?=&&\(\i\.preventDefault)/,
|
||||
match: /!(\i).shiftKey&&!(this.hasOpenCodeBlock\(\))&&\(.{0,100}?\)/,
|
||||
replace: "$self.shouldSubmit($1, $2)"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,50 +4,64 @@
|
|||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import { classNameFactory } from "@api/Styles";
|
||||
import ErrorBoundary from "@components/ErrorBoundary";
|
||||
import { Devs } from "@utils/constants";
|
||||
import { getCurrentChannel } from "@utils/discord";
|
||||
import { Logger } from "@utils/Logger";
|
||||
import { classes } from "@utils/misc";
|
||||
import definePlugin from "@utils/types";
|
||||
import { findByCodeLazy, findByPropsLazy } from "@webpack";
|
||||
import { Heading, React, RelationshipStore, Text } from "@webpack/common";
|
||||
import { findByCodeLazy, findByPropsLazy, findLazy } from "@webpack";
|
||||
import { Heading, RelationshipStore, Text } from "@webpack/common";
|
||||
|
||||
const container = findByPropsLazy("memberSinceWrapper");
|
||||
const containerWrapper = findByPropsLazy("memberSinceWrapper");
|
||||
const container = findByPropsLazy("memberSince");
|
||||
const getCreatedAtDate = findByCodeLazy('month:"short",day:"numeric"');
|
||||
const locale = findByPropsLazy("getLocale");
|
||||
const lastSection = findByPropsLazy("lastSection");
|
||||
|
||||
const cl = classNameFactory("vc-friendssince-");
|
||||
const section = findLazy((m: any) => m.section !== void 0 && Object.values(m).length === 1);
|
||||
|
||||
export default definePlugin({
|
||||
name: "FriendsSince",
|
||||
description: "Shows when you became friends with someone in the user popout",
|
||||
authors: [Devs.Elvyra],
|
||||
authors: [Devs.Elvyra, Devs.Antti],
|
||||
patches: [
|
||||
// User popup
|
||||
// User popup - old layout
|
||||
{
|
||||
find: ".USER_PROFILE}};return",
|
||||
replacement: {
|
||||
match: /,{userId:(\i.id).{0,30}}\)/,
|
||||
replace: "$&,$self.friendsSince({ userId: $1 })"
|
||||
replace: "$&,$self.friendsSinceOld({ userId: $1 })"
|
||||
}
|
||||
},
|
||||
// User DMs "User Profile" popup in the right
|
||||
// DM User Sidebar - old layout
|
||||
{
|
||||
find: ".PROFILE_PANEL,",
|
||||
replacement: {
|
||||
match: /,{userId:([^,]+?)}\)/,
|
||||
replace: "$&,$self.friendsSince({ userId: $1 })"
|
||||
replace: "$&,$self.friendsSinceOld({ userId: $1 })"
|
||||
}
|
||||
},
|
||||
// User Profile Modal
|
||||
// User Profile Modal - old layout
|
||||
{
|
||||
find: ".userInfoSectionHeader,",
|
||||
replacement: {
|
||||
match: /(\.Messages\.USER_PROFILE_MEMBER_SINCE.+?userId:(.+?),textClassName:)(\i\.userInfoText)}\)/,
|
||||
replace: (_, rest, userId, textClassName) => `${rest}!$self.getFriendSince(${userId}) ? ${textClassName} : void 0 }), $self.friendsSince({ userId: ${userId}, textClassName: ${textClassName} })`
|
||||
replace: (_, rest, userId, textClassName) => `${rest}!$self.getFriendSince(${userId}) ? ${textClassName} : void 0 }), $self.friendsSinceOld({ userId: ${userId}, textClassName: ${textClassName} })`
|
||||
}
|
||||
},
|
||||
// DM User Sidebar - new layout
|
||||
{
|
||||
find: ".PANEL}),nicknameIcons",
|
||||
replacement: {
|
||||
match: /USER_PROFILE_MEMBER_SINCE,.{0,100}userId:(\i\.id)}\)}\)/,
|
||||
replace: "$&,$self.friendsSinceNew({userId:$1,isSidebar:true})"
|
||||
}
|
||||
},
|
||||
// User Profile Modal - new layout
|
||||
{
|
||||
find: "action:\"PRESS_APP_CONNECTION\"",
|
||||
replacement: {
|
||||
match: /USER_PROFILE_MEMBER_SINCE,.{0,100}userId:(\i\.id),.{0,100}}\)}\),/,
|
||||
replace: "$&,$self.friendsSinceNew({userId:$1,isSidebar:false}),"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
@ -63,7 +77,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
|
||||
friendsSince: ErrorBoundary.wrap(({ userId, textClassName }: { userId: string; textClassName?: string; }) => {
|
||||
friendsSinceOld: ErrorBoundary.wrap(({ userId, textClassName }: { userId: string; textClassName?: string; }) => {
|
||||
if (!RelationshipStore.isFriend(userId)) return null;
|
||||
|
||||
const friendsSince = RelationshipStore.getSince(userId);
|
||||
|
@ -71,11 +85,11 @@ export default definePlugin({
|
|||
|
||||
return (
|
||||
<div className={lastSection.section}>
|
||||
<Heading variant="eyebrow" className={cl("title")}>
|
||||
<Heading variant="eyebrow">
|
||||
Friends Since
|
||||
</Heading>
|
||||
|
||||
<div className={container.memberSinceWrapper}>
|
||||
<div className={containerWrapper.memberSinceWrapper}>
|
||||
{!!getCurrentChannel()?.guild_id && (
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
|
@ -88,11 +102,55 @@ export default definePlugin({
|
|||
<path d="M3 5v-.75C3 3.56 3.56 3 4.25 3s1.24.56 1.33 1.25C6.12 8.65 9.46 12 13 12h1a8 8 0 0 1 8 8 2 2 0 0 1-2 2 .21.21 0 0 1-.2-.15 7.65 7.65 0 0 0-1.32-2.3c-.15-.2-.42-.06-.39.17l.25 2c.02.15-.1.28-.25.28H9a2 2 0 0 1-2-2v-2.22c0-1.57-.67-3.05-1.53-4.37A15.85 15.85 0 0 1 3 5Z" />
|
||||
</svg>
|
||||
)}
|
||||
<Text variant="text-sm/normal" className={classes(cl("body"), textClassName)}>
|
||||
<Text variant="text-sm/normal" className={textClassName}>
|
||||
{getCreatedAtDate(friendsSince, locale.getLocale())}
|
||||
</Text>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}, { noop: true })
|
||||
}, { noop: true }),
|
||||
|
||||
friendsSinceNew: ErrorBoundary.wrap(({ userId, isSidebar }: { userId: string; isSidebar: boolean; }) => {
|
||||
if (!RelationshipStore.isFriend(userId)) return null;
|
||||
|
||||
const friendsSince = RelationshipStore.getSince(userId);
|
||||
if (!friendsSince) return null;
|
||||
|
||||
return (
|
||||
<section className={section.section}>
|
||||
<Heading variant="text-xs/semibold" style={isSidebar ? {} : { color: "var(--header-secondary)" }}>
|
||||
Friends Since
|
||||
</Heading>
|
||||
|
||||
{
|
||||
isSidebar ? (
|
||||
<Text variant="text-sm/normal">
|
||||
{getCreatedAtDate(friendsSince, locale.getLocale())}
|
||||
</Text>
|
||||
) : (
|
||||
<div className={containerWrapper.memberSinceWrapper}>
|
||||
<div className={container.memberSince}>
|
||||
{!!getCurrentChannel()?.guild_id && (
|
||||
<svg
|
||||
aria-hidden="true"
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 24 24"
|
||||
fill="var(--interactive-normal)"
|
||||
>
|
||||
<path d="M13 10a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z" />
|
||||
<path d="M3 5v-.75C3 3.56 3.56 3 4.25 3s1.24.56 1.33 1.25C6.12 8.65 9.46 12 13 12h1a8 8 0 0 1 8 8 2 2 0 0 1-2 2 .21.21 0 0 1-.2-.15 7.65 7.65 0 0 0-1.32-2.3c-.15-.2-.42-.06-.39.17l.25 2c.02.15-.1.28-.25.28H9a2 2 0 0 1-2-2v-2.22c0-1.57-.67-3.05-1.53-4.37A15.85 15.85 0 0 1 3 5Z" />
|
||||
</svg>
|
||||
)}
|
||||
<Text variant="text-sm/normal">
|
||||
{getCreatedAtDate(friendsSince, locale.getLocale())}
|
||||
</Text>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
</section>
|
||||
);
|
||||
}, { noop: true }),
|
||||
});
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
/* copy pasted from discord */
|
||||
|
||||
.vc-friendssince-title {
|
||||
display: flex;
|
||||
font-weight: 700;
|
||||
margin-bottom: 6px
|
||||
}
|
||||
|
||||
.vc-friendssince-body {
|
||||
font-size: 14px;
|
||||
line-height: 18px
|
||||
}
|
23
src/plugins/showAllRoles/index.ts
Normal file
23
src/plugins/showAllRoles/index.ts
Normal file
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Vencord, a Discord client mod
|
||||
* Copyright (c) 2024 Vendicated and contributors
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
import { Devs } from "@utils/constants";
|
||||
import definePlugin from "@utils/types";
|
||||
|
||||
export default definePlugin({
|
||||
name: "ShowAllRoles",
|
||||
description: "Show all roles in new profiles.",
|
||||
authors: [Devs.Luna],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.VIEW_ALL_ROLES",
|
||||
replacement: {
|
||||
match: /return null!=\i(?=\?\i\.slice)/,
|
||||
replace: "return false"
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
|
@ -477,12 +477,17 @@ export default definePlugin({
|
|||
],
|
||||
|
||||
isHiddenChannel(channel: Channel & { channelId?: string; }, checkConnect = false) {
|
||||
if (!channel) return false;
|
||||
try {
|
||||
if (!channel) return false;
|
||||
|
||||
if (channel.channelId) channel = ChannelStore.getChannel(channel.channelId);
|
||||
if (!channel || channel.isDM() || channel.isGroupDM() || channel.isMultiUserDM()) return false;
|
||||
if (channel.channelId) channel = ChannelStore.getChannel(channel.channelId);
|
||||
if (!channel || channel.isDM() || channel.isGroupDM() || channel.isMultiUserDM()) return false;
|
||||
|
||||
return !PermissionStore.can(PermissionsBits.VIEW_CHANNEL, channel) || checkConnect && !PermissionStore.can(PermissionsBits.CONNECT, channel);
|
||||
return !PermissionStore.can(PermissionsBits.VIEW_CHANNEL, channel) || checkConnect && !PermissionStore.can(PermissionsBits.CONNECT, channel);
|
||||
} catch (e) {
|
||||
console.error("[ViewHiddenChannels#isHiddenChannel]: ", e);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
resolveGuildChannels(channels: Record<string | number, Array<{ channel: Channel; comparator: number; }> | string | number>, shouldIncludeHidden: boolean) {
|
||||
|
|
|
@ -200,6 +200,34 @@ export default definePlugin({
|
|||
match: /supports\(\i\)\{switch\(\i\)\{(case (\i).\i)/,
|
||||
replace: "$&.DISABLE_VIDEO:return true;$1"
|
||||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.SEARCH_WITH_GOOGLE",
|
||||
replacement: {
|
||||
match: /\i\.isPlatformEmbedded/,
|
||||
replace: "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.COPY,hint:",
|
||||
replacement: [
|
||||
{
|
||||
match: /\i\.isPlatformEmbedded/,
|
||||
replace: "true"
|
||||
},
|
||||
{
|
||||
match: /\i\.\i\.copy/,
|
||||
replace: "Vencord.Webpack.Common.Clipboard.copy"
|
||||
}]
|
||||
},
|
||||
// Automod add filter words
|
||||
{
|
||||
find: '("interactionUsernameProfile',
|
||||
replacement:
|
||||
{
|
||||
match: /\i\.isPlatformEmbedded(?=.{0,50}\.tagName)/,
|
||||
replace: "true"
|
||||
},
|
||||
}
|
||||
],
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue