Merge branch 'main' into updater-init

This commit is contained in:
V 2023-04-10 22:06:57 +02:00 committed by GitHub
commit a269389766
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 179 additions and 61 deletions

6
.env.example Normal file
View file

@ -0,0 +1,6 @@
# githubs api has a rate limit of 60/h if not authorised.
# you may quickly hit that and get rate limited. To counteract this, you can provide a github token
# here and it will be used. To do so, create a token at the following links and just leave
# all permissions at the defaults (public repos read only, 0 permissions):
# https://github.com/settings/personal-access-tokens/new
GITHUB_TOKEN=

View file

@ -1,42 +1,42 @@
name: Release name: Release
on: on:
push: push:
tags: tags:
- v* - v*
jobs: jobs:
release: release:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
os: [macos-latest, ubuntu-latest, windows-latest] os: [macos-latest, ubuntu-latest, windows-latest]
steps: steps:
- name: Check out Git repository - name: Check out Git repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- uses: actions/setup-node@v3 - uses: actions/setup-node@v3
with: with:
node-version: 18 node-version: 18
- name: Run Electron Builder - name: Run Electron Builder
uses: samuelmeuli/action-electron-builder@e4b12cd06ddf023422f1ac4e39632bd76f6e6928 uses: samuelmeuli/action-electron-builder@e4b12cd06ddf023422f1ac4e39632bd76f6e6928
with: with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE: true RELEASE: true
- name: Update AUR package - name: Update AUR package
if: ${{ matrix.os == 'ubuntu-latest' }} if: ${{ matrix.os == 'ubuntu-latest' }}
run: | run: |
sudo apt install makepkg sudo apt install makepkg
echo $SSH_KEY > ~/.ssh/aur echo $SSH_KEY > ~/.ssh/aur
echo $SSH_PUB_KEY > ~/.ssh/aur.pub echo $SSH_PUB_KEY > ~/.ssh/aur.pub
export GIT_SSH_COMMAND="ssh -i ~/.ssh/aur" export GIT_SSH_COMMAND="ssh -i ~/.ssh/aur"
./scripts/aur_bump.sh ./scripts/aur_bump.sh
with: env:
SSH_KEY: ${{ secrets.AUR_SSH_KEY }} SSH_KEY: ${{ secrets.AUR_SSH_KEY }}
SSH_PUB_KEY: ${{ secrets.AUR_SSH_PUB_KEY }} SSH_PUB_KEY: ${{ secrets.AUR_SSH_PUB_KEY }}

32
.github/workflows/test.yml vendored Normal file
View file

@ -0,0 +1,32 @@
name: test
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pnpm/action-setup@v2 # Install pnpm using packageManager key in package.json
- name: Use Node.js 18
uses: actions/setup-node@v3
with:
node-version: 18
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run tests
run: pnpm test
- name: Test if it compiles
run: |
pnpm build
pnpm build --dev

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
dist dist
node_modules node_modules
.env

View file

@ -1,6 +1,6 @@
{ {
"name": "VencordDesktop", "name": "VencordDesktop",
"version": "0.1.3", "version": "0.1.5",
"private": true, "private": true,
"description": "", "description": "",
"keywords": [], "keywords": [],
@ -10,13 +10,14 @@
"main": "dist/js/main.js", "main": "dist/js/main.js",
"scripts": { "scripts": {
"build": "tsx scripts/build/build.mts", "build": "tsx scripts/build/build.mts",
"build:dev": "pnpm build --dev",
"package": "pnpm build && electron-builder", "package": "pnpm build && electron-builder",
"package:dir": "pnpm build && electron-builder --dir", "package:dir": "pnpm build && electron-builder --dir",
"lint": "eslint . --ext .js,.jsx,.ts,.tsx", "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.mts,.mjs",
"lint:fix": "pnpm lint --fix", "lint:fix": "pnpm lint --fix",
"start": "pnpm build && electron .", "start": "pnpm build && electron .",
"start:dev": "pnpm build --dev && electron .", "start:dev": "pnpm build:dev && electron .",
"start:watch": "tsx scripts/startWatch.mts", "start:watch": "pnpm build:dev && tsx scripts/startWatch.mts",
"test": "pnpm lint && pnpm testTypes", "test": "pnpm lint && pnpm testTypes",
"testTypes": "tsc --noEmit", "testTypes": "tsc --noEmit",
"watch": "pnpm build --watch" "watch": "pnpm build --watch"
@ -26,6 +27,7 @@
"@types/react": "^18.0.33", "@types/react": "^18.0.33",
"@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/eslint-plugin": "^5.57.1",
"@typescript-eslint/parser": "^5.57.1", "@typescript-eslint/parser": "^5.57.1",
"dotenv": "^16.0.3",
"electron": "^23.2.0", "electron": "^23.2.0",
"electron-builder": "^23.6.0", "electron-builder": "^23.6.0",
"esbuild": "^0.17.14", "esbuild": "^0.17.14",
@ -79,7 +81,6 @@
"category": "Network" "category": "Network"
}, },
"nsis": { "nsis": {
"allowToChangeInstallationDirectory": true,
"include": "build/installer.nsh", "include": "build/installer.nsh",
"oneClick": false "oneClick": false
} }

View file

@ -13,6 +13,9 @@ devDependencies:
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^5.57.1 specifier: ^5.57.1
version: 5.57.1(eslint@8.38.0)(typescript@5.0.2) version: 5.57.1(eslint@8.38.0)(typescript@5.0.2)
dotenv:
specifier: ^16.0.3
version: 16.0.3
electron: electron:
specifier: ^23.2.0 specifier: ^23.2.0
version: 23.2.0 version: 23.2.0
@ -1390,6 +1393,11 @@ packages:
resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==}
dev: true dev: true
/dotenv@16.0.3:
resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
engines: {node: '>=12'}
dev: true
/dotenv@9.0.2: /dotenv@9.0.2:
resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==}
engines: {node: '>=10'} engines: {node: '>=10'}

View file

@ -1,3 +1,9 @@
/*
* SPDX-License-Identifier: GPL-3.0
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
export const VencordFragment = /* #__PURE__*/ Symbol.for("react.fragment"); export const VencordFragment = /* #__PURE__*/ Symbol.for("react.fragment");
export let VencordCreateElement = export let VencordCreateElement = (...args) =>
(...args) => (VencordCreateElement = Vencord.Webpack.Common.React.createElement)(...args); (VencordCreateElement = Vencord.Webpack.Common.React.createElement)(...args);

11
scripts/start.ts Normal file
View file

@ -0,0 +1,11 @@
/*
* SPDX-License-Identifier: GPL-3.0
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
import "./utils/dotenv";
import { spawnNodeModuleBin } from "./utils/spawn.mjs";
spawnNodeModuleBin("electron", ["."]);

View file

@ -1,15 +1,10 @@
import { spawn as cpSpawn, SpawnOptions } from "child_process"; /*
import { join } from "path"; * SPDX-License-Identifier: GPL-3.0
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
const EXT = process.platform === "win32" ? ".cmd" : ""; import "./start";
const OPTS: SpawnOptions = { import { spawnNodeModuleBin } from "./utils/spawn.mjs";
stdio: "inherit", spawnNodeModuleBin("tsx", ["scripts/build/build.mts", "--", "--watch", "--dev"]);
};
function spawn(bin: string, args: string[]) {
cpSpawn(join("node_modules", ".bin", bin + EXT), args, OPTS);
}
spawn("tsx", ["scripts/build/build.mts", "--", "--watch", "--dev"]);
spawn("electron", ["."]);

9
scripts/utils/dotenv.ts Normal file
View file

@ -0,0 +1,9 @@
/*
* SPDX-License-Identifier: GPL-3.0
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
import { config } from "dotenv";
config();

18
scripts/utils/spawn.mts Normal file
View file

@ -0,0 +1,18 @@
/*
* SPDX-License-Identifier: GPL-3.0
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
* Copyright (c) 2023 Vendicated and Vencord contributors
*/
import { spawn as spaaawn, SpawnOptions } from "child_process";
import { join } from "path";
const EXT = process.platform === "win32" ? ".cmd" : "";
const OPTS: SpawnOptions = {
stdio: "inherit"
};
export function spawnNodeModuleBin(bin: string, args: string[]) {
spaaawn(join("node_modules", ".bin", bin + EXT), args, OPTS);
}

View file

@ -14,7 +14,8 @@ export const VENCORD_SETTINGS_FILE = join(VENCORD_SETTINGS_DIR, "settings.json")
// needs to be inline require because of circular dependency // needs to be inline require because of circular dependency
// as otherwise "DATA_DIR" (which is used by ./settings) will be uninitialised // as otherwise "DATA_DIR" (which is used by ./settings) will be uninitialised
export const VENCORD_FILES_DIR = require("./settings").Settings.vencordDir || join(DATA_DIR, "vencordDist"); export const VENCORD_FILES_DIR =
(require("./settings") as typeof import("./settings")).Settings.store.vencordDir || join(DATA_DIR, "vencordDist");
export const USER_AGENT = `VencordDesktop/${app.getVersion()} (https://github.com/Vencord/Electron)`; export const USER_AGENT = `VencordDesktop/${app.getVersion()} (https://github.com/Vencord/Electron)`;

View file

@ -15,6 +15,7 @@ import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally";
import { downloadVencordFiles } from "./utils/vencordLoader"; import { downloadVencordFiles } from "./utils/vencordLoader";
let isQuitting = false; let isQuitting = false;
let tray: Tray;
app.on("before-quit", () => { app.on("before-quit", () => {
isQuitting = true; isQuitting = true;
@ -62,7 +63,7 @@ function initTray(win: BrowserWindow) {
} }
]); ]);
const tray = new Tray(ICON_PATH); tray = new Tray(ICON_PATH);
tray.setToolTip("Vencord Desktop"); tray.setToolTip("Vencord Desktop");
tray.setContextMenu(trayMenu); tray.setContextMenu(trayMenu);
tray.on("click", () => win.show()); tray.on("click", () => win.show());
@ -213,6 +214,10 @@ function initWindowBoundsListeners(win: BrowserWindow) {
} }
function initSettingsListeners(win: BrowserWindow) { function initSettingsListeners(win: BrowserWindow) {
Settings.addChangeListener("tray", enable => {
if (enable) initTray(win);
else tray?.destroy();
});
Settings.addChangeListener("disableMinSize", disable => { Settings.addChangeListener("disableMinSize", disable => {
if (disable) { if (disable) {
// 0 no work // 0 no work
@ -227,6 +232,16 @@ function initSettingsListeners(win: BrowserWindow) {
}); });
} }
}); });
VencordSettings.addChangeListener("macosTranslucency", enabled => {
if (enabled) {
win.setVibrancy("sidebar");
win.setBackgroundColor("#ffffff00");
} else {
win.setVibrancy(null);
win.setBackgroundColor("#ffffff");
}
});
} }
export function createMainWindow() { export function createMainWindow() {
@ -242,11 +257,17 @@ export function createMainWindow() {
}, },
icon: ICON_PATH, icon: ICON_PATH,
frame: VencordSettings.store.frameless !== true, frame: VencordSettings.store.frameless !== true,
...(VencordSettings.store.macosTranslucency
? {
vibrancy: "sidebar",
backgroundColor: "#ffffff00"
}
: {}),
...getWindowBoundsOptions() ...getWindowBoundsOptions()
})); }));
win.on("close", e => { win.on("close", e => {
if (isQuitting || Settings.store.minimizeToTray === false) return; if (isQuitting || Settings.store.minimizeToTray === false || Settings.store.tray === false) return;
e.preventDefault(); e.preventDefault();
win.hide(); win.hide();
@ -255,7 +276,7 @@ export function createMainWindow() {
}); });
initWindowBoundsListeners(win); initWindowBoundsListeners(win);
initTray(win); if (Settings.store.tray ?? true) initTray(win);
initMenuBar(win); initMenuBar(win);
makeLinksOpenExternally(win); makeLinksOpenExternally(win);
initSettingsListeners(win); initSettingsListeners(win);

View file

@ -5,6 +5,7 @@
*/ */
import { existsSync, mkdirSync } from "fs"; import { existsSync, mkdirSync } from "fs";
import type { RequestOptions } from "https";
import { join } from "path"; import { join } from "path";
import { USER_AGENT, VENCORD_FILES_DIR } from "../constants"; import { USER_AGENT, VENCORD_FILES_DIR } from "../constants";
@ -25,12 +26,16 @@ export interface ReleaseData {
} }
export async function githubGet(endpoint: string) { export async function githubGet(endpoint: string) {
return simpleGet(API_BASE + endpoint, { const opts: RequestOptions = {
headers: { headers: {
Accept: "application/vnd.github+json", Accept: "application/vnd.github+json",
"User-Agent": USER_AGENT "User-Agent": USER_AGENT
} }
}); };
if (process.env.GITHUB_TOKEN) opts.headers!.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
return simpleGet(API_BASE + endpoint, opts);
} }
export async function downloadVencordFiles() { export async function downloadVencordFiles() {

View file

@ -21,12 +21,14 @@ export default function SettingsUi() {
Button Button
} = Common; } = Common;
const switches: [keyof typeof Settings, string, string, boolean?][] = [ const switches: [keyof typeof Settings, string, string, boolean?, (() => boolean)?][] = [
["tray", "Tray Icon", "Add a tray icon for Vencord Desktop", true],
[ [
"minimizeToTray", "minimizeToTray",
"Minimize to tray", "Minimize to tray",
"Hitting X will make Vencord Desktop minimize to the tray instead of closing", "Hitting X will make Vencord Desktop minimize to the tray instead of closing",
true true,
() => Settings.tray ?? true
], ],
[ [
"disableMinSize", "disableMinSize",
@ -62,9 +64,10 @@ export default function SettingsUi() {
<FormDivider className={Margins.top16 + " " + Margins.bottom16} /> <FormDivider className={Margins.top16 + " " + Margins.bottom16} />
{switches.map(([key, text, note, def]) => ( {switches.map(([key, text, note, def, predicate]) => (
<FormSwitch <FormSwitch
value={Settings[key] ?? def ?? false} value={(Settings[key] ?? def ?? false) && (!predicate || predicate())}
disabled={predicate && !predicate()}
onChange={v => (Settings[key] = v)} onChange={v => (Settings[key] = v)}
note={note} note={note}
key={key} key={key}

View file

@ -9,4 +9,4 @@ import "./fixes";
console.log("read if cute :3"); console.log("read if cute :3");
export * as Components from "./components"; export * as Components from "./components";
export { PlainSettings, Settings } from "./settings"; export { Settings } from "./settings";

View file

@ -14,5 +14,6 @@ export interface Settings {
openLinksWithElectron?: boolean; openLinksWithElectron?: boolean;
vencordDir?: string; vencordDir?: string;
disableMinSize?: boolean; disableMinSize?: boolean;
tray?: boolean;
minimizeToTray?: boolean; minimizeToTray?: boolean;
} }