Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
98a03c8862 | ||
|
72ce7a5ad1 | ||
|
e699ea63c7 | ||
|
97e1e9eb7a | ||
|
4c4036546a | ||
|
d582e61ec3 |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "vencord",
|
"name": "vencord",
|
||||||
"private": "true",
|
"private": "true",
|
||||||
"version": "1.4.4",
|
"version": "1.4.5",
|
||||||
"description": "The cutest Discord client mod",
|
"description": "The cutest Discord client mod",
|
||||||
"homepage": "https://github.com/Vendicated/Vencord#readme",
|
"homepage": "https://github.com/Vendicated/Vencord#readme",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
|
@ -53,10 +53,12 @@ async function listThemes(): Promise<UserThemeHeader[]> {
|
|||||||
const themeInfo: UserThemeHeader[] = [];
|
const themeInfo: UserThemeHeader[] = [];
|
||||||
|
|
||||||
for (const fileName of files) {
|
for (const fileName of files) {
|
||||||
|
if (!fileName.endsWith(".css")) continue;
|
||||||
|
|
||||||
const data = await getThemeData(fileName).then(stripBOM).catch(() => null);
|
const data = await getThemeData(fileName).then(stripBOM).catch(() => null);
|
||||||
if (!data) continue;
|
if (data == null) continue;
|
||||||
const parsed = getThemeInfo(data, fileName);
|
|
||||||
themeInfo.push(parsed);
|
themeInfo.push(getThemeInfo(data, fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
return themeInfo;
|
return themeInfo;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { app, autoUpdater } from "electron";
|
import { app } from "electron";
|
||||||
import { existsSync, mkdirSync, readdirSync, renameSync, statSync, writeFileSync } from "fs";
|
import { existsSync, mkdirSync, readdirSync, renameSync, statSync, writeFileSync } from "fs";
|
||||||
import { basename, dirname, join } from "path";
|
import { basename, dirname, join } from "path";
|
||||||
|
|
||||||
@ -80,20 +80,22 @@ function patchLatest() {
|
|||||||
// Windows Host Updates install to a new folder app-{HOST_VERSION}, so we
|
// Windows Host Updates install to a new folder app-{HOST_VERSION}, so we
|
||||||
// need to reinject
|
// need to reinject
|
||||||
function patchUpdater() {
|
function patchUpdater() {
|
||||||
try {
|
// Array of autoStart paths to try
|
||||||
const autoStartScript = join(require.main!.filename, "..", "autoStart", "win32.js");
|
const autoStartPaths = [
|
||||||
const { update } = require(autoStartScript);
|
join(require.main!.filename, "..", "autoStart", "win32.js"), // Vanilla
|
||||||
|
join(require.main!.filename, "..", "autoStart.js") // OpenAsar
|
||||||
|
];
|
||||||
|
|
||||||
require.cache[autoStartScript]!.exports.update = function () {
|
for (const path of autoStartPaths) {
|
||||||
update.apply(this, arguments);
|
try {
|
||||||
patchLatest();
|
const { update } = require(path);
|
||||||
};
|
|
||||||
} catch {
|
require.cache[path]!.exports.update = function () {
|
||||||
// OpenAsar uses electrons autoUpdater on Windows
|
update.apply(this, arguments);
|
||||||
const { quitAndInstall } = autoUpdater;
|
patchLatest();
|
||||||
autoUpdater.quitAndInstall = function () {
|
};
|
||||||
patchLatest();
|
} catch {
|
||||||
quitAndInstall.call(this);
|
// Ignore as non-critical
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,11 @@
|
|||||||
color: #f04747 !important;
|
color: #f04747 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Bot "thinking" text highlighting */
|
||||||
|
.messagelogger-deleted [class*="colorStandard-"] {
|
||||||
|
color: #f04747 !important;
|
||||||
|
}
|
||||||
|
|
||||||
/* Embed highlighting */
|
/* Embed highlighting */
|
||||||
.messagelogger-deleted article :is(div, span, h1, h2, h3, p) {
|
.messagelogger-deleted article :is(div, span, h1, h2, h3, p) {
|
||||||
color: #f04747 !important;
|
color: #f04747 !important;
|
||||||
|
26
src/plugins/normalizeMessageLinks/index.ts
Normal file
26
src/plugins/normalizeMessageLinks/index.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Vencord, a Discord client mod
|
||||||
|
* Copyright (c) 2023 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: "NormalizeMessageLinks",
|
||||||
|
description: "Strip canary/ptb from message links",
|
||||||
|
authors: [Devs.bb010g],
|
||||||
|
patches: [
|
||||||
|
{
|
||||||
|
find: ".Messages.COPY_MESSAGE_LINK,",
|
||||||
|
replacement: {
|
||||||
|
match: /\.concat\(location\.host\)/,
|
||||||
|
replace: ".concat($self.normalizeHost(location.host))",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
normalizeHost(host: string) {
|
||||||
|
return host.replace(/(^|\b)(canary\.|ptb\.)(discord.com)$/, "$1$3");
|
||||||
|
},
|
||||||
|
});
|
83
src/plugins/previewMessage.tsx
Normal file
83
src/plugins/previewMessage.tsx
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Vencord, a modification for Discord's desktop app
|
||||||
|
* Copyright (c) 2023 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 { sendBotMessage } from "@api/Commands";
|
||||||
|
import ErrorBoundary from "@components/ErrorBoundary";
|
||||||
|
import { Devs } from "@utils/constants";
|
||||||
|
import definePlugin from "@utils/types";
|
||||||
|
import { Button, ButtonLooks, ButtonWrapperClasses, DraftStore, DraftType, SelectedChannelStore, Tooltip, UserStore } from "@webpack/common";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
type: {
|
||||||
|
analyticsName: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const getDraft = (channelId: string) => DraftStore.getDraft(channelId, DraftType.ChannelMessage);
|
||||||
|
|
||||||
|
export function PreviewButton(chatBoxProps: Props) {
|
||||||
|
if (chatBoxProps.type.analyticsName !== "normal") return null;
|
||||||
|
const channelId = SelectedChannelStore.getChannelId();
|
||||||
|
const draft = getDraft(channelId);
|
||||||
|
|
||||||
|
if (!draft) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Tooltip text="Preview Message">
|
||||||
|
{tooltipProps => (
|
||||||
|
<Button
|
||||||
|
{...tooltipProps}
|
||||||
|
onClick={() =>
|
||||||
|
sendBotMessage(
|
||||||
|
channelId,
|
||||||
|
{
|
||||||
|
content: getDraft(channelId),
|
||||||
|
author: UserStore.getCurrentUser()
|
||||||
|
}
|
||||||
|
)}
|
||||||
|
size=""
|
||||||
|
look={ButtonLooks.BLANK}
|
||||||
|
innerClassName={ButtonWrapperClasses.button}
|
||||||
|
style={{ padding: "0 2px", height: "100%" }}
|
||||||
|
>
|
||||||
|
<div className={ButtonWrapperClasses.buttonWrapper}>
|
||||||
|
<img width={24} height={24} src="https://discord.com/assets/4c5a77a89716352686f590a6f014770c.svg" />
|
||||||
|
</div>
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export default definePlugin({
|
||||||
|
name: "PreviewMessage",
|
||||||
|
description: "Lets you preview your message before sending it",
|
||||||
|
authors: [Devs.Aria],
|
||||||
|
patches: [
|
||||||
|
{
|
||||||
|
find: ".activeCommandOption",
|
||||||
|
replacement: {
|
||||||
|
match: /(.)\.push.{1,30}disabled:(\i),.{1,20}\},"gift"\)\)/,
|
||||||
|
replace: "$&;try{$2||$1.unshift($self.previewIcon(arguments[0]))}catch{}",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
previewIcon: ErrorBoundary.wrap(PreviewButton, { noop: true }),
|
||||||
|
});
|
@ -347,6 +347,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({
|
|||||||
name: "arrow",
|
name: "arrow",
|
||||||
id: 958158495302176778n
|
id: 958158495302176778n
|
||||||
},
|
},
|
||||||
|
bb010g: {
|
||||||
|
name: "bb010g",
|
||||||
|
id: 72791153467990016n,
|
||||||
|
},
|
||||||
} satisfies Record<string, Dev>);
|
} satisfies Record<string, Dev>);
|
||||||
|
|
||||||
// iife so #__PURE__ works correctly
|
// iife so #__PURE__ works correctly
|
||||||
|
@ -27,6 +27,13 @@ export const Flux: t.Flux = findByPropsLazy("connectStores");
|
|||||||
|
|
||||||
export type GenericStore = t.FluxStore & Record<string, any>;
|
export type GenericStore = t.FluxStore & Record<string, any>;
|
||||||
|
|
||||||
|
export enum DraftType {
|
||||||
|
ChannelMessage = 0,
|
||||||
|
ThreadSettings = 1,
|
||||||
|
FirstThreadMessage = 2,
|
||||||
|
ApplicationLauncherCommand = 3
|
||||||
|
}
|
||||||
|
|
||||||
export let MessageStore: Omit<Stores.MessageStore, "getMessages"> & {
|
export let MessageStore: Omit<Stores.MessageStore, "getMessages"> & {
|
||||||
getMessages(chanId: string): any;
|
getMessages(chanId: string): any;
|
||||||
};
|
};
|
||||||
@ -52,6 +59,7 @@ export let RelationshipStore: Stores.RelationshipStore & t.FluxStore & {
|
|||||||
|
|
||||||
export let EmojiStore: t.EmojiStore;
|
export let EmojiStore: t.EmojiStore;
|
||||||
export let WindowStore: t.WindowStore;
|
export let WindowStore: t.WindowStore;
|
||||||
|
export let DraftStore: t.DraftStore;
|
||||||
|
|
||||||
export const MaskedLinkStore = mapMangledModuleLazy('"MaskedLinkStore"', {
|
export const MaskedLinkStore = mapMangledModuleLazy('"MaskedLinkStore"', {
|
||||||
openUntrustedLink: filters.byCode(".apply(this,arguments)")
|
openUntrustedLink: filters.byCode(".apply(this,arguments)")
|
||||||
@ -76,6 +84,7 @@ export const useStateFromStores: <T>(
|
|||||||
) => T
|
) => T
|
||||||
= findByCodeLazy("useStateFromStores");
|
= findByCodeLazy("useStateFromStores");
|
||||||
|
|
||||||
|
waitForStore("DraftStore", s => DraftStore = s);
|
||||||
waitForStore("UserStore", s => UserStore = s);
|
waitForStore("UserStore", s => UserStore = s);
|
||||||
waitForStore("ChannelStore", m => ChannelStore = m);
|
waitForStore("ChannelStore", m => ChannelStore = m);
|
||||||
waitForStore("SelectedChannelStore", m => SelectedChannelStore = m);
|
waitForStore("SelectedChannelStore", m => SelectedChannelStore = m);
|
||||||
|
24
src/webpack/common/types/stores.d.ts
vendored
24
src/webpack/common/types/stores.d.ts
vendored
@ -16,6 +16,7 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { DraftType } from "@webpack/common";
|
||||||
import { Channel } from "discord-types/general";
|
import { Channel } from "discord-types/general";
|
||||||
|
|
||||||
import { FluxDispatcher, FluxEvents } from "./utils";
|
import { FluxDispatcher, FluxEvents } from "./utils";
|
||||||
@ -148,3 +149,26 @@ export class EmojiStore extends FluxStore {
|
|||||||
get favoriteEmojisWithoutFetchingLatest(): Emoji[];
|
get favoriteEmojisWithoutFetchingLatest(): Emoji[];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DraftObject {
|
||||||
|
channelId: string;
|
||||||
|
timestamp: number;
|
||||||
|
draft: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DraftState {
|
||||||
|
[userId: string]: {
|
||||||
|
[channelId: string]: {
|
||||||
|
[key in DraftType]?: Omit<DraftObject, "channelId">;
|
||||||
|
} | undefined;
|
||||||
|
} | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export class DraftStore extends FluxStore {
|
||||||
|
getDraft(channelId: string, type: DraftType): string;
|
||||||
|
getRecentlyEditedDrafts(type: DraftType): DraftObject[];
|
||||||
|
getState(): DraftState;
|
||||||
|
getThreadDraftWithParentMessageId?(arg: any): any;
|
||||||
|
getThreadSettings(channelId: string): any | null;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user