diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ebec903 --- /dev/null +++ b/.env.example @@ -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= diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4742eec..aa939a2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,42 +1,42 @@ name: Release on: - push: - tags: - - v* + push: + tags: + - v* jobs: - release: - runs-on: ${{ matrix.os }} + release: + runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [macos-latest, ubuntu-latest, windows-latest] + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] - steps: - - name: Check out Git repository - uses: actions/checkout@v3 + steps: + - name: Check out Git repository + uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 + - uses: actions/setup-node@v3 + with: + node-version: 18 - - name: Run Electron Builder - uses: samuelmeuli/action-electron-builder@e4b12cd06ddf023422f1ac4e39632bd76f6e6928 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - RELEASE: true + - name: Run Electron Builder + uses: samuelmeuli/action-electron-builder@e4b12cd06ddf023422f1ac4e39632bd76f6e6928 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE: true - - name: Update AUR package - if: ${{ matrix.os == 'ubuntu-latest' }} - run: | - sudo apt install makepkg + - name: Update AUR package + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + sudo apt install makepkg - echo $SSH_KEY > ~/.ssh/aur - echo $SSH_PUB_KEY > ~/.ssh/aur.pub - export GIT_SSH_COMMAND="ssh -i ~/.ssh/aur" + echo $SSH_KEY > ~/.ssh/aur + echo $SSH_PUB_KEY > ~/.ssh/aur.pub + export GIT_SSH_COMMAND="ssh -i ~/.ssh/aur" - ./scripts/aur_bump.sh - with: - SSH_KEY: ${{ secrets.AUR_SSH_KEY }} - SSH_PUB_KEY: ${{ secrets.AUR_SSH_PUB_KEY }} + ./scripts/aur_bump.sh + env: + SSH_KEY: ${{ secrets.AUR_SSH_KEY }} + SSH_PUB_KEY: ${{ secrets.AUR_SSH_PUB_KEY }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..efd7fff --- /dev/null +++ b/.github/workflows/test.yml @@ -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 diff --git a/.gitignore b/.gitignore index de4d1f0..6ee3e11 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dist node_modules +.env diff --git a/package.json b/package.json index cc8b9c8..81018a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "VencordDesktop", - "version": "0.1.3", + "version": "0.1.5", "private": true, "description": "", "keywords": [], @@ -10,13 +10,14 @@ "main": "dist/js/main.js", "scripts": { "build": "tsx scripts/build/build.mts", + "build:dev": "pnpm build --dev", "package": "pnpm build && electron-builder", "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", "start": "pnpm build && electron .", - "start:dev": "pnpm build --dev && electron .", - "start:watch": "tsx scripts/startWatch.mts", + "start:dev": "pnpm build:dev && electron .", + "start:watch": "pnpm build:dev && tsx scripts/startWatch.mts", "test": "pnpm lint && pnpm testTypes", "testTypes": "tsc --noEmit", "watch": "pnpm build --watch" @@ -26,6 +27,7 @@ "@types/react": "^18.0.33", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", + "dotenv": "^16.0.3", "electron": "^23.2.0", "electron-builder": "^23.6.0", "esbuild": "^0.17.14", @@ -79,7 +81,6 @@ "category": "Network" }, "nsis": { - "allowToChangeInstallationDirectory": true, "include": "build/installer.nsh", "oneClick": false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b762f8..4816cd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,9 @@ devDependencies: '@typescript-eslint/parser': specifier: ^5.57.1 version: 5.57.1(eslint@8.38.0)(typescript@5.0.2) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 electron: specifier: ^23.2.0 version: 23.2.0 @@ -1390,6 +1393,11 @@ packages: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} dev: true + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + /dotenv@9.0.2: resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} engines: {node: '>=10'} diff --git a/scripts/build/injectReact.mjs b/scripts/build/injectReact.mjs index 0890ac0..0f1bba2 100644 --- a/scripts/build/injectReact.mjs +++ b/scripts/build/injectReact.mjs @@ -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 let VencordCreateElement = - (...args) => (VencordCreateElement = Vencord.Webpack.Common.React.createElement)(...args); +export let VencordCreateElement = (...args) => + (VencordCreateElement = Vencord.Webpack.Common.React.createElement)(...args); diff --git a/scripts/start.ts b/scripts/start.ts new file mode 100644 index 0000000..c2cc154 --- /dev/null +++ b/scripts/start.ts @@ -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", ["."]); diff --git a/scripts/startWatch.mts b/scripts/startWatch.mts index d30a938..1f72443 100644 --- a/scripts/startWatch.mts +++ b/scripts/startWatch.mts @@ -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 = { - stdio: "inherit", -}; - -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", ["."]); +import { spawnNodeModuleBin } from "./utils/spawn.mjs"; +spawnNodeModuleBin("tsx", ["scripts/build/build.mts", "--", "--watch", "--dev"]); diff --git a/scripts/utils/dotenv.ts b/scripts/utils/dotenv.ts new file mode 100644 index 0000000..73afb64 --- /dev/null +++ b/scripts/utils/dotenv.ts @@ -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(); diff --git a/scripts/utils/spawn.mts b/scripts/utils/spawn.mts new file mode 100644 index 0000000..2d2f2a9 --- /dev/null +++ b/scripts/utils/spawn.mts @@ -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); +} diff --git a/src/main/constants.ts b/src/main/constants.ts index 96c9970..d5937f7 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -14,7 +14,8 @@ export const VENCORD_SETTINGS_FILE = join(VENCORD_SETTINGS_DIR, "settings.json") // needs to be inline require because of circular dependency // 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)`; diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 6188472..d2f9233 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -15,6 +15,7 @@ import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally"; import { downloadVencordFiles } from "./utils/vencordLoader"; let isQuitting = false; +let tray: Tray; app.on("before-quit", () => { 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.setContextMenu(trayMenu); tray.on("click", () => win.show()); @@ -213,6 +214,10 @@ function initWindowBoundsListeners(win: BrowserWindow) { } function initSettingsListeners(win: BrowserWindow) { + Settings.addChangeListener("tray", enable => { + if (enable) initTray(win); + else tray?.destroy(); + }); Settings.addChangeListener("disableMinSize", disable => { if (disable) { // 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() { @@ -242,11 +257,17 @@ export function createMainWindow() { }, icon: ICON_PATH, frame: VencordSettings.store.frameless !== true, + ...(VencordSettings.store.macosTranslucency + ? { + vibrancy: "sidebar", + backgroundColor: "#ffffff00" + } + : {}), ...getWindowBoundsOptions() })); win.on("close", e => { - if (isQuitting || Settings.store.minimizeToTray === false) return; + if (isQuitting || Settings.store.minimizeToTray === false || Settings.store.tray === false) return; e.preventDefault(); win.hide(); @@ -255,7 +276,7 @@ export function createMainWindow() { }); initWindowBoundsListeners(win); - initTray(win); + if (Settings.store.tray ?? true) initTray(win); initMenuBar(win); makeLinksOpenExternally(win); initSettingsListeners(win); diff --git a/src/main/utils/vencordLoader.ts b/src/main/utils/vencordLoader.ts index 6429872..0d88841 100644 --- a/src/main/utils/vencordLoader.ts +++ b/src/main/utils/vencordLoader.ts @@ -5,6 +5,7 @@ */ import { existsSync, mkdirSync } from "fs"; +import type { RequestOptions } from "https"; import { join } from "path"; import { USER_AGENT, VENCORD_FILES_DIR } from "../constants"; @@ -25,12 +26,16 @@ export interface ReleaseData { } export async function githubGet(endpoint: string) { - return simpleGet(API_BASE + endpoint, { + const opts: RequestOptions = { headers: { Accept: "application/vnd.github+json", "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() { diff --git a/src/renderer/components/Settings.tsx b/src/renderer/components/Settings.tsx index dd957ba..6e5760e 100644 --- a/src/renderer/components/Settings.tsx +++ b/src/renderer/components/Settings.tsx @@ -21,12 +21,14 @@ export default function SettingsUi() { Button } = 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", "Minimize to tray", "Hitting X will make Vencord Desktop minimize to the tray instead of closing", - true + true, + () => Settings.tray ?? true ], [ "disableMinSize", @@ -62,9 +64,10 @@ export default function SettingsUi() { - {switches.map(([key, text, note, def]) => ( + {switches.map(([key, text, note, def, predicate]) => ( (Settings[key] = v)} note={note} key={key} diff --git a/src/renderer/index.ts b/src/renderer/index.ts index 8135d45..c2c76ca 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -9,4 +9,4 @@ import "./fixes"; console.log("read if cute :3"); export * as Components from "./components"; -export { PlainSettings, Settings } from "./settings"; +export { Settings } from "./settings"; diff --git a/src/shared/settings.d.ts b/src/shared/settings.d.ts index 34c4035..cae4826 100644 --- a/src/shared/settings.d.ts +++ b/src/shared/settings.d.ts @@ -14,5 +14,6 @@ export interface Settings { openLinksWithElectron?: boolean; vencordDir?: string; disableMinSize?: boolean; + tray?: boolean; minimizeToTray?: boolean; }