Compare commits

..

6 Commits

Author SHA1 Message Date
V
98a03c8862 bump to 1.4.5 2023-08-19 01:44:11 +02:00
V
72ce7a5ad1 themes: ignore non theme files 2023-08-19 01:33:39 +02:00
Syncx
e699ea63c7 feat(plugin): PreviewMessage (#1607)
Co-authored-by: V <vendicated@riseup.net>
2023-08-19 01:19:10 +02:00
VMGuy23
97e1e9eb7a messageLogger: apply deleted style to ephemeral messages (#1608)
Co-authored-by: V <vendicated@riseup.net>
2023-08-19 01:14:51 +02:00
bb010g
4c4036546a new plugin: NormalizeMessageLinks (#1641) 2023-08-19 01:10:59 +02:00
CanadaHonk
d582e61ec3 Fix patching Win32 updater with OpenAsar (#1667)
This is more generic rewrite allowing for more paths to be added in the future for whatever reason (like a rename in future Discord versions).

(The "OpenAsar" code previously was completely wrong)
2023-08-19 00:54:35 +02:00
9 changed files with 174 additions and 19 deletions

View File

@ -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": {

View File

@ -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;

View File

@ -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
}; }
} }
} }

View File

@ -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;

View 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");
},
});

View 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 }),
});

View File

@ -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

View File

@ -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);

View File

@ -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;
}