diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b96345d..7a0d099 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -112,10 +112,8 @@ body: attributes: label: Debug Logs description: Run vesktop from the command line. Include the relevant command line output here. If there are any lines that seem relevant, try googling them or searching existing issues - value: | - ``` - Replace this text with your crash-log. Do not remove the backticks - ``` + placeholder: Paste your crash-log here. + render: shell validations: required: true diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 71f68b4..baabcf9 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -6,6 +6,9 @@ on: - published workflow_dispatch: +permissions: + contents: write + jobs: update: runs-on: ubuntu-latest @@ -29,10 +32,11 @@ jobs: run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git checkout -b ci/meta-update + + gh release upload "${{ github.event.release.tag_name }}" meta/dev.vencord.Vesktop.metainfo.xml + git add meta/dev.vencord.Vesktop.metainfo.xml - git commit -m "Insert release changes for ${{ github.event.release.tag_name }}" - git push origin ci/meta-update - gh pr create -B main -H ci/meta-update -t "Metainfo for ${{ github.event.release.tag_name }}" -b "This PR updates the metainfo for release ${{ github.event.release.tag_name }}." + git commit -m "metainfo: add entry for ${{ github.event.release.tag_name }}" + git push origin main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/eslint.config.mjs b/eslint.config.mjs index 04db88f..baf299c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,14 +1,14 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ //@ts-check import stylistic from "@stylistic/eslint-plugin"; import pathAlias from "eslint-plugin-path-alias"; -import header from "eslint-plugin-simple-header"; +import simpleHeader from "eslint-plugin-simple-header"; import importSort from "eslint-plugin-simple-import-sort"; import unusedImports from "eslint-plugin-unused-imports"; import tseslint from "typescript-eslint"; @@ -20,7 +20,7 @@ export default tseslint.config( { files: ["src/**/*.{tsx,ts,mts,mjs,js,jsx}"], plugins: { - header, + simpleHeader, stylistic, importSort, unusedImports, @@ -42,10 +42,11 @@ export default tseslint.config( } }, rules: { - "header/header": [ + "simpleHeader/header": [ "error", { - files: ["scripts/header.txt"] + files: ["scripts/header.txt"], + templates: { author: [".*", "Vendicated and Vesktop contributors"] } } ], diff --git a/meta/dev.vencord.Vesktop.metainfo.xml b/meta/dev.vencord.Vesktop.metainfo.xml index ef52535..5339de6 100644 --- a/meta/dev.vencord.Vesktop.metainfo.xml +++ b/meta/dev.vencord.Vesktop.metainfo.xml @@ -28,6 +28,21 @@ + + https://github.com/Vencord/Vesktop/releases/tag/v1.5.5 + +

What's Changed

+
    +
  • Now remembers your previous Screenshare resolution & FPS
  • +
  • You can now disable the splash screen in Vesktop Settings
  • +
  • Now supports deep links (opening Discord Message Links in Vesktop) by @Covkie
  • +
  • Now supports discord:// uri scheme, allowing it to open things like invites from your Browser even while closed by @Covkie
  • +
  • Added 4k resolution to screenshare by @makindotcc
  • +
  • Fixed some performance issues caused by a recent Discord update
  • +
  • Updated Electron to v34 & chromium to v132, bringing new features and fixes
  • +
+
+
https://github.com/Vencord/Vesktop/releases/tag/v1.5.4 diff --git a/package.json b/package.json index 8cdd7f1..3a31179 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "vesktop", - "version": "1.5.4", + "version": "1.5.5", "private": true, "description": "Vesktop is a custom Discord desktop app", "keywords": [], "homepage": "https://vencord.dev/", - "license": "GPL-3.0", + "license": "GPL-3.0-or-later", "author": "Vendicated ", "main": "dist/js/main.js", "scripts": { @@ -34,19 +34,19 @@ }, "devDependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@stylistic/eslint-plugin": "^2.13.0", - "@types/node": "^22.13.0", - "@types/react": "^18.3.18", + "@stylistic/eslint-plugin": "^3.0.1", + "@types/node": "^22.13.1", + "@types/react": "18.3.12", "@vencord/types": "^1.8.4", "dotenv": "^16.4.7", - "electron": "^34.0.2", + "electron": "^34.1.0", "electron-builder": "^25.1.8", "esbuild": "^0.24.2", "eslint": "^9.19.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-path-alias": "^2.1.0", "eslint-plugin-prettier": "^5.2.3", - "eslint-plugin-simple-header": "^1.2.1", + "eslint-plugin-simple-header": "^1.2.2", "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-unused-imports": "^4.1.4", "prettier": "^3.4.2", @@ -54,7 +54,7 @@ "tsx": "^4.19.2", "type-fest": "^4.33.0", "typescript": "^5.7.3", - "typescript-eslint": "^8.22.0", + "typescript-eslint": "^8.23.0", "xml-formatter": "^3.6.4" }, "packageManager": "pnpm@9.1.0", @@ -73,6 +73,12 @@ "package.json", "LICENSE" ], + "protocols": { + "name": "Discord", + "schemes": [ + "discord" + ] + }, "beforePack": "scripts/build/sandboxFix.js", "linux": { "icon": "build/icon.icns", @@ -113,7 +119,8 @@ "GenericName": "Internet Messenger", "Type": "Application", "Categories": "Network;InstantMessaging;Chat;", - "Keywords": "discord;vencord;electron;chat;" + "Keywords": "discord;vencord;electron;chat;", + "MimeType": "x-scheme-handler/discord" } }, "mac": { diff --git a/patches/arrpc@3.5.0.patch b/patches/arrpc@3.5.0.patch index 8dfd9f6..baae84c 100644 --- a/patches/arrpc@3.5.0.patch +++ b/patches/arrpc@3.5.0.patch @@ -1,14 +1,27 @@ diff --git a/src/process/index.js b/src/process/index.js -index 97ea6514b54dd9c5df588c78f0397d31ab5f882a..c2bdbd6aaa5611bc6ff1d993beeb380b1f5ec575 100644 +index 389b0845256a34b4536d6da99edb00d17f13a6b4..f17a0ac687e9110ebfd33cb91fd2f6250d318643 100644 --- a/src/process/index.js +++ b/src/process/index.js -@@ -5,8 +5,7 @@ import fs from 'node:fs'; +@@ -5,8 +5,20 @@ import fs from 'node:fs'; import { dirname, join } from 'path'; import { fileURLToPath } from 'url'; -const __dirname = dirname(fileURLToPath(import.meta.url)); -const DetectableDB = JSON.parse(fs.readFileSync(join(__dirname, 'detectable.json'), 'utf8')); +const DetectableDB = require('./detectable.json'); ++DetectableDB.push( ++ { ++ aliases: ["Obs"], ++ executables: [ ++ { is_launcher: false, name: "obs", os: "linux" }, ++ { is_launcher: false, name: "obs.exe", os: "win32" }, ++ { is_launcher: false, name: "obs.app", os: "darwin" } ++ ], ++ hook: true, ++ id: "STREAMERMODE", ++ name: "OBS" ++ } ++); import * as Natives from './native/index.js'; const Native = Natives[process.platform]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e21611f..a97c567 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: patchedDependencies: arrpc@3.5.0: - hash: biyukfa6dww2wxujy4eyvkhrti + hash: sczviclcirm3d4e2soabfniygq path: patches/arrpc@3.5.0.patch importers: @@ -15,7 +15,7 @@ importers: dependencies: arrpc: specifier: github:OpenAsar/arrpc#2234e9c9111f4c42ebcc3aa6a2215bfd979eef77 - version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=biyukfa6dww2wxujy4eyvkhrti) + version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=sczviclcirm3d4e2soabfniygq) electron-updater: specifier: ^6.3.9 version: 6.3.9 @@ -28,14 +28,14 @@ importers: specifier: ^2.1.2 version: 2.1.2 '@stylistic/eslint-plugin': - specifier: ^2.13.0 - version: 2.13.0(eslint@9.19.0)(typescript@5.7.3) + specifier: ^3.0.1 + version: 3.0.1(eslint@9.19.0)(typescript@5.7.3) '@types/node': - specifier: ^22.13.0 - version: 22.13.0 + specifier: ^22.13.1 + version: 22.13.1 '@types/react': - specifier: ^18.3.18 - version: 18.3.18 + specifier: 18.3.12 + version: 18.3.12 '@vencord/types': specifier: ^1.8.4 version: 1.8.4 @@ -43,8 +43,8 @@ importers: specifier: ^16.4.7 version: 16.4.7 electron: - specifier: ^34.0.2 - version: 34.0.2 + specifier: ^34.1.0 + version: 34.1.0 electron-builder: specifier: ^25.1.8 version: 25.1.8(electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8)) @@ -56,7 +56,7 @@ importers: version: 9.19.0 eslint-import-resolver-alias: specifier: ^1.1.2 - version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)) + version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)) eslint-plugin-path-alias: specifier: ^2.1.0 version: 2.1.0(eslint@9.19.0) @@ -64,14 +64,14 @@ importers: specifier: ^5.2.3 version: 5.2.3(eslint-config-prettier@10.0.1(eslint@9.19.0))(eslint@9.19.0)(prettier@3.4.2) eslint-plugin-simple-header: - specifier: ^1.2.1 - version: 1.2.1(eslint@9.19.0) + specifier: ^1.2.2 + version: 1.2.2(eslint@9.19.0) eslint-plugin-simple-import-sort: specifier: ^12.1.1 version: 12.1.1(eslint@9.19.0) eslint-plugin-unused-imports: specifier: ^4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0) prettier: specifier: ^3.4.2 version: 3.4.2 @@ -88,8 +88,8 @@ importers: specifier: ^5.7.3 version: 5.7.3 typescript-eslint: - specifier: ^8.22.0 - version: 8.22.0(eslint@9.19.0)(typescript@5.7.3) + specifier: ^8.23.0 + version: 8.23.0(eslint@9.19.0)(typescript@5.7.3) xml-formatter: specifier: ^3.6.4 version: 3.6.4 @@ -532,8 +532,8 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@stylistic/eslint-plugin@2.13.0': - resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} + '@stylistic/eslint-plugin@3.0.1': + resolution: {integrity: sha512-rQ3tcT5N2cynofJfbjUsnL4seoewTaOVBLyUEwtNldo7iNMPo3h/GUQk+Cl3iHEWwRxjq2wuH6q0FufQrbVL1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' @@ -576,14 +576,14 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@18.19.74': - resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==} + '@types/node@18.19.75': + resolution: {integrity: sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==} - '@types/node@20.17.16': - resolution: {integrity: sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==} + '@types/node@20.17.17': + resolution: {integrity: sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==} - '@types/node@22.13.0': - resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -599,8 +599,8 @@ packages: '@types/react@17.0.2': resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==} - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -611,51 +611,51 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.22.0': - resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} + '@typescript-eslint/eslint-plugin@8.23.0': + resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.22.0': - resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} + '@typescript-eslint/parser@8.23.0': + resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.22.0': - resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} + '@typescript-eslint/scope-manager@8.23.0': + resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.22.0': - resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} + '@typescript-eslint/type-utils@8.23.0': + resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.22.0': - resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} + '@typescript-eslint/types@8.23.0': + resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.22.0': - resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} + '@typescript-eslint/typescript-estree@8.23.0': + resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.22.0': - resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} + '@typescript-eslint/utils@8.23.0': + resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.22.0': - resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} + '@typescript-eslint/visitor-keys@8.23.0': + resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vencord/types@1.8.4': @@ -1189,8 +1189,8 @@ packages: electron-updater@6.3.9: resolution: {integrity: sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==} - electron@34.0.2: - resolution: {integrity: sha512-u3F+DSUlg9NaGS+9qnYmSRN8VjAnc3LJDDk1ye1uISJnh4gjG76y3681qLowsPMx4obvCP2eBINnmbLo0yT5WA==} + electron@34.1.0: + resolution: {integrity: sha512-ZUid8XrGPA0dfes97PPADc8ecWOUX/qYRNp1glze9coZLEYc+PsMvgjVDCHSvjfHfiI+V3unwngSVpBouX71YQ==} engines: {node: '>= 12.20.55'} hasBin: true @@ -1326,8 +1326,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-simple-header@1.2.1: - resolution: {integrity: sha512-l9eEOpBkd4T6yVE09WADLVPU6eKHjQ7QjowMChsbYwsge+98NxyIlqvYpQQJWVxakgW7uooFGNVEFdFWzEMcVg==} + eslint-plugin-simple-header@1.2.2: + resolution: {integrity: sha512-LO4PejdYPraY5GKd9hutst82yAAL21MGIiFbHKIpoPDOWOW8zz3ZaDdQB3vx/yQGjWd5GifyQ/AGfNkr5c9kPw==} peerDependencies: eslint: '>=8.41.0' @@ -1716,8 +1716,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1765,8 +1765,8 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -1891,8 +1891,8 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} is-weakset@2.0.4: @@ -2230,8 +2230,8 @@ packages: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -2537,8 +2537,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.0: - resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -2759,8 +2759,8 @@ packages: truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -2808,8 +2808,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.22.0: - resolution: {integrity: sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==} + typescript-eslint@8.23.0: + resolution: {integrity: sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3038,7 +3038,7 @@ snapshots: node-gyp: 9.4.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.0 + semver: 7.7.1 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: @@ -3230,7 +3230,7 @@ snapshots: espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -3300,7 +3300,7 @@ snapshots: '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.0 + semver: 7.7.1 '@npmcli/move-file@2.0.1': dependencies: @@ -3316,9 +3316,9 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin@2.13.0(eslint@9.19.0)(typescript@5.7.3)': + '@stylistic/eslint-plugin@3.0.1(eslint@9.19.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) eslint: 9.19.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 @@ -3338,7 +3338,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.13.0 + '@types/node': 22.13.1 '@types/responselike': 1.0.3 '@types/debug@4.1.12': @@ -3349,7 +3349,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 '@types/http-cache-semantics@4.0.4': {} @@ -3359,141 +3359,141 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 '@types/lodash@4.17.15': {} '@types/ms@2.1.0': {} - '@types/node@18.19.74': + '@types/node@18.19.75': dependencies: undici-types: 5.26.5 - '@types/node@20.17.16': + '@types/node@20.17.17': dependencies: undici-types: 6.19.8 - '@types/node@22.13.0': + '@types/node@22.13.1': dependencies: undici-types: 6.20.0 '@types/plist@3.0.5': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 xmlbuilder: 15.1.1 optional: true '@types/prop-types@15.7.14': {} - '@types/react-dom@18.3.5(@types/react@18.3.18)': + '@types/react-dom@18.3.5(@types/react@18.3.12)': dependencies: - '@types/react': 18.3.18 + '@types/react': 18.3.12 '@types/react@17.0.2': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 - '@types/react@18.3.18': + '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.14 csstype: 3.1.3 '@types/responselike@1.0.3': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 '@types/verror@1.10.10': optional: true '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 optional: true - '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.22.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/type-utils': 8.22.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/type-utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.23.0 eslint: 9.19.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.23.0 debug: 4.4.0 eslint: 9.19.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.22.0': + '@typescript-eslint/scope-manager@8.23.0': dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/visitor-keys': 8.23.0 - '@typescript-eslint/type-utils@8.22.0(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.23.0(eslint@9.19.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) debug: 4.4.0 eslint: 9.19.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.22.0': {} + '@typescript-eslint/types@8.23.0': {} - '@typescript-eslint/typescript-estree@8.22.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/visitor-keys': 8.23.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.22.0(eslint@9.19.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.23.0(eslint@9.19.0)(typescript@5.7.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) eslint: 9.19.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.22.0': + '@typescript-eslint/visitor-keys@8.23.0': dependencies: - '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/types': 8.23.0 eslint-visitor-keys: 4.2.0 '@vencord/types@1.8.4': dependencies: '@types/lodash': 4.17.15 - '@types/node': 18.19.74 - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@types/node': 18.19.75 + '@types/react': 18.3.12 + '@types/react-dom': 18.3.5(@types/react@18.3.12) discord-types: 1.3.26 standalone-electron-types: 1.0.0 type-fest: 3.13.1 @@ -3590,7 +3590,7 @@ snapshots: minimatch: 10.0.1 resedit: 1.7.2 sanitize-filename: 1.6.3 - semver: 7.7.0 + semver: 7.7.1 tar: 6.2.1 temp-file: 3.4.0 transitivePeerDependencies: @@ -3695,7 +3695,7 @@ snapshots: get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=biyukfa6dww2wxujy4eyvkhrti): + arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/2234e9c9111f4c42ebcc3aa6a2215bfd979eef77(patch_hash=sczviclcirm3d4e2soabfniygq): dependencies: ws: 8.18.0 transitivePeerDependencies: @@ -3934,7 +3934,7 @@ snapshots: node-api-headers: 1.5.0 npmlog: 6.0.2 rc: 1.2.8 - semver: 7.7.0 + semver: 7.7.1 tar: 6.2.1 url-join: 4.0.1 which: 2.0.2 @@ -4197,15 +4197,15 @@ snapshots: lazy-val: 1.0.5 lodash.escaperegexp: 4.1.2 lodash.isequal: 4.5.0 - semver: 7.7.0 + semver: 7.7.1 tiny-typed-emitter: 2.1.0 transitivePeerDependencies: - supports-color - electron@34.0.2: + electron@34.1.0: dependencies: '@electron/get': 2.0.3 - '@types/node': 20.17.16 + '@types/node': 20.17.17 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -4260,9 +4260,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -4373,9 +4373,9 @@ snapshots: eslint: 9.19.0 optional: true - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)): dependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0) eslint-import-resolver-node@0.3.9: dependencies: @@ -4385,17 +4385,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.22.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) eslint: 9.19.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4406,7 +4406,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.19.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint@9.19.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4418,7 +4418,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.22.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4442,7 +4442,7 @@ snapshots: optionalDependencies: eslint-config-prettier: 10.0.1(eslint@9.19.0) - eslint-plugin-simple-header@1.2.1(eslint@9.19.0): + eslint-plugin-simple-header@1.2.2(eslint@9.19.0): dependencies: eslint: 9.19.0 @@ -4450,11 +4450,11 @@ snapshots: dependencies: eslint: 9.19.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0): dependencies: eslint: 9.19.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) eslint-scope@8.2.0: dependencies: @@ -4768,7 +4768,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.0 + semver: 7.7.1 serialize-error: 7.0.1 optional: true @@ -4918,7 +4918,7 @@ snapshots: ignore@5.3.2: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4971,7 +4971,7 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -5091,7 +5091,7 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 @@ -5375,7 +5375,7 @@ snapshots: node-abi@3.74.0: dependencies: - semver: 7.7.0 + semver: 7.7.1 node-addon-api@1.7.2: optional: true @@ -5388,7 +5388,7 @@ snapshots: node-api-version@0.2.0: dependencies: - semver: 7.7.0 + semver: 7.7.1 node-gyp@9.4.1: dependencies: @@ -5400,7 +5400,7 @@ snapshots: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.0 + semver: 7.7.1 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -5428,7 +5428,7 @@ snapshots: define-property: 0.2.5 kind-of: 3.2.2 - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -5752,7 +5752,7 @@ snapshots: semver@6.3.1: {} - semver@7.7.0: {} + semver@7.7.1: {} serialize-error@7.0.1: dependencies: @@ -5799,27 +5799,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -5830,7 +5830,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.0 + semver: 7.7.1 slice-ansi@3.0.0: dependencies: @@ -5898,7 +5898,7 @@ snapshots: standalone-electron-types@1.0.0: dependencies: - '@types/node': 18.19.74 + '@types/node': 18.19.75 stat-mode@1.0.0: {} @@ -6031,7 +6031,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -6095,11 +6095,11 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.22.0(eslint@9.19.0)(typescript@5.7.3): + typescript-eslint@8.23.0(eslint@9.19.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.22.0(eslint@9.19.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.23.0(eslint@9.19.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0)(typescript@5.7.3) eslint: 9.19.0 typescript: 5.7.3 transitivePeerDependencies: @@ -6173,7 +6173,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -6188,7 +6188,7 @@ snapshots: is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 diff --git a/scripts/build/build.mts b/scripts/build/build.mts index 243381b..b445517 100644 --- a/scripts/build/build.mts +++ b/scripts/build/build.mts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { BuildContext, BuildOptions, context } from "esbuild"; diff --git a/scripts/build/injectReact.mjs b/scripts/build/injectReact.mjs index f9ce52b..4ead9e3 100644 --- a/scripts/build/injectReact.mjs +++ b/scripts/build/injectReact.mjs @@ -1,9 +1,3 @@ -/* - * SPDX-License-Identifier: GPL-3.0 - * Vesktop, 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); diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js index 327ee24..ff04732 100644 --- a/scripts/build/sandboxFix.js +++ b/scripts/build/sandboxFix.js @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ // Based on https://github.com/gergof/electron-builder-sandbox-fix/blob/master/lib/index.js diff --git a/scripts/build/vencordDep.mts b/scripts/build/vencordDep.mts index d285940..ac888c0 100644 --- a/scripts/build/vencordDep.mts +++ b/scripts/build/vencordDep.mts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { globalExternalsWithRegExp } from "@fal-works/esbuild-plugin-global-externals"; diff --git a/scripts/header.txt b/scripts/header.txt index 9fdad8f..744309c 100644 --- a/scripts/header.txt +++ b/scripts/header.txt @@ -1,5 +1,5 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience - * Copyright (c) 2023 Vendicated and Vencord contributors + * Copyright (c) {year} {author} + * SPDX-License-Identifier: GPL-3.0-or-later */ diff --git a/scripts/startWatch.mts b/scripts/startWatch.mts index 4a6f2e5..ae332b6 100644 --- a/scripts/startWatch.mts +++ b/scripts/startWatch.mts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import "./start"; diff --git a/scripts/utils/dotenv.ts b/scripts/utils/dotenv.ts index 1dd697f..cbeaca4 100644 --- a/scripts/utils/dotenv.ts +++ b/scripts/utils/dotenv.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { config } from "dotenv"; diff --git a/scripts/utils/spawn.mts b/scripts/utils/spawn.mts index a2c0a5f..eddb965 100644 --- a/scripts/utils/spawn.mts +++ b/scripts/utils/spawn.mts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { spawn as spaaawn, SpawnOptions } from "child_process"; diff --git a/scripts/utils/updateMeta.mts b/scripts/utils/updateMeta.mts index 44327b7..2771f92 100644 --- a/scripts/utils/updateMeta.mts +++ b/scripts/utils/updateMeta.mts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { promises as fs } from "node:fs"; diff --git a/src/globals.d.ts b/src/globals.d.ts index 4d39c4c..6d95b92 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ declare global { diff --git a/src/main/about.ts b/src/main/about.ts index 4d9f541..88c3d65 100644 --- a/src/main/about.ts +++ b/src/main/about.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { BrowserWindow } from "electron"; diff --git a/src/main/appBadge.ts b/src/main/appBadge.ts index 46abe1d..21bddb2 100644 --- a/src/main/appBadge.ts +++ b/src/main/appBadge.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { app, NativeImage, nativeImage } from "electron"; diff --git a/src/main/arrpc.ts b/src/main/arrpc.ts index 1899d9c..9f6ee32 100644 --- a/src/main/arrpc.ts +++ b/src/main/arrpc.ts @@ -1,13 +1,13 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import Server from "arrpc"; -import { IpcEvents } from "shared/IpcEvents"; +import { IpcCommands } from "shared/IpcEvents"; -import { mainWin } from "./mainWindow"; +import { sendRendererCommand } from "./ipcCommands"; import { Settings } from "./settings"; let server: any; @@ -19,16 +19,15 @@ export async function initArRPC() { try { server = await new Server(); - server.on("activity", (data: any) => mainWin.webContents.send(IpcEvents.ARRPC_ACTIVITY, JSON.stringify(data))); - server.on("invite", (invite: string, callback: (valid: boolean) => void) => { + server.on("activity", (data: any) => sendRendererCommand(IpcCommands.RPC_ACTIVITY, JSON.stringify(data))); + server.on("invite", async (invite: string, callback: (valid: boolean) => void) => { invite = String(invite); if (!inviteCodeRegex.test(invite)) return callback(false); - mainWin.webContents - // Safety: Result of JSON.stringify should always be safe to equal - // Also, just to be super super safe, invite is regex validated above - .executeJavaScript(`Vesktop.openInviteModal(${JSON.stringify(invite)})`) - .then(callback); + await sendRendererCommand(IpcCommands.RPC_INVITE, invite).then(callback); + }); + server.on("link", async (data: any, deepCallback: (valid: boolean) => void) => { + await sendRendererCommand(IpcCommands.RPC_DEEP_LINK, data).then(deepCallback); }); } catch (e) { console.error("Failed to start arRPC server", e); diff --git a/src/main/autoStart.ts b/src/main/autoStart.ts index 19d7e00..958dbb9 100644 --- a/src/main/autoStart.ts +++ b/src/main/autoStart.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { app } from "electron"; diff --git a/src/main/constants.ts b/src/main/constants.ts index 04a2a7c..9e5ab66 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { app } from "electron"; diff --git a/src/main/firstLaunch.ts b/src/main/firstLaunch.ts index dee4882..69e01a0 100644 --- a/src/main/firstLaunch.ts +++ b/src/main/firstLaunch.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { app } from "electron"; @@ -28,6 +28,7 @@ interface Data { export function createFirstLaunchTour() { const win = new BrowserWindow({ ...SplashProps, + transparent: false, frame: true, autoHideMenuBar: true, height: 470, diff --git a/src/main/index.ts b/src/main/index.ts index ed0305f..64b6f5f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import "./ipc"; @@ -24,10 +24,14 @@ if (IS_DEV) { autoUpdater.checkForUpdatesAndNotify(); } +console.log("Vesktop v" + app.getVersion()); + // Make the Vencord files use our DATA_DIR process.env.VENCORD_USER_DATA_DIR = DATA_DIR; function init() { + app.setAsDefaultProtocolClient("discord"); + const { disableSmoothScroll, hardwareAcceleration } = Settings.store; const enabledFeatures = app.commandLine.getSwitchValue("enable-features").split(","); @@ -36,7 +40,12 @@ function init() { if (hardwareAcceleration === false) { app.disableHardwareAcceleration(); } else { - enabledFeatures.push("VaapiVideoDecodeLinuxGL", "VaapiVideoEncoder", "VaapiVideoDecoder"); + enabledFeatures.push( + "AcceleratedVideoDecodeLinuxGL", + "AcceleratedVideoEncoder", + "AcceleratedVideoDecoder", + "AcceleratedVideoDecodeLinuxZeroCopyGL" + ); } if (disableSmoothScroll) { @@ -142,6 +151,12 @@ async function bootstrap() { } } +// MacOS only event +export let darwinURL: string | undefined; +app.on("open-url", (_, url) => { + darwinURL = url; +}); + app.on("window-all-closed", () => { if (process.platform !== "darwin") app.quit(); }); diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 63ec501..64cff41 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ if (process.platform === "linux") import("./venmic"); diff --git a/src/main/ipcCommands.ts b/src/main/ipcCommands.ts new file mode 100644 index 0000000..51332b4 --- /dev/null +++ b/src/main/ipcCommands.ts @@ -0,0 +1,56 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2025 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { randomUUID } from "crypto"; +import { ipcMain } from "electron"; +import { IpcEvents } from "shared/IpcEvents"; + +import { mainWin } from "./mainWindow"; + +const resolvers = new Map void>>(); + +export interface IpcMessage { + nonce: string; + message: string; + data?: any; +} + +export interface IpcResponse { + nonce: string; + ok: boolean; + data?: any; +} + +/** + * Sends a message to the renderer process and waits for a response. + * `data` must be serializable as it will be sent over IPC. + * + * You must add a handler for the message in the renderer process. + */ +export function sendRendererCommand(message: string, data?: any) { + const nonce = randomUUID(); + + const promise = new Promise((resolve, reject) => { + resolvers.set(nonce, { resolve, reject }); + }); + + mainWin.webContents.send(IpcEvents.IPC_COMMAND, { nonce, message, data }); + + return promise; +} + +ipcMain.on(IpcEvents.IPC_COMMAND, (_event, { nonce, ok, data }: IpcResponse) => { + const resolver = resolvers.get(nonce); + if (!resolver) throw new Error(`Unknown message: ${nonce}`); + + if (ok) { + resolver.resolve(data); + } else { + resolver.reject(data); + } + + resolvers.delete(nonce); +}); diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index d860b37..c4159f5 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { @@ -18,7 +18,7 @@ import { } from "electron"; import { rm } from "fs/promises"; import { join } from "path"; -import { IpcEvents } from "shared/IpcEvents"; +import { IpcCommands, IpcEvents } from "shared/IpcEvents"; import { isTruthy } from "shared/utils/guards"; import { once } from "shared/utils/once"; import type { SettingsStore } from "shared/utils/SettingsStore"; @@ -36,6 +36,8 @@ import { MIN_WIDTH, VENCORD_FILES_DIR } from "./constants"; +import { darwinURL } from "./index"; +import { sendRendererCommand } from "./ipcCommands"; import { Settings, State, VencordSettings } from "./settings"; import { createSplashWindow } from "./splash"; import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally"; @@ -198,9 +200,7 @@ function initMenuBar(win: BrowserWindow) { label: "Settings", accelerator: "CmdOrCtrl+,", async click() { - mainWin.webContents.executeJavaScript( - "Vencord.Webpack.Common.SettingsRouter.open('My Account')" - ); + sendRendererCommand(IpcCommands.NAVIGATE_SETTINGS); } }, { @@ -271,7 +271,7 @@ function getWindowBoundsOptions(): BrowserWindowConstructorOptions { height: height ?? DEFAULT_HEIGHT } as BrowserWindowConstructorOptions; - const storedDisplay = screen.getAllDisplays().find(display => display.id === State.store.displayid); + const storedDisplay = screen.getAllDisplays().find(display => display.id === State.store.displayId); if (x != null && y != null && storedDisplay) { options.x = x; @@ -299,7 +299,7 @@ function getDarwinOptions(): BrowserWindowConstructorOptions { options.vibrancy = "sidebar"; options.backgroundColor = "#ffffff00"; } else { - if (splashTheming) { + if (splashTheming !== false) { options.backgroundColor = splashBackground; } else { options.backgroundColor = nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; @@ -321,7 +321,7 @@ function initWindowBoundsListeners(win: BrowserWindow) { const saveBounds = () => { State.store.windowBounds = win.getBounds(); - State.store.displayid = screen.getDisplayMatching(State.store.windowBounds).id; + State.store.displayId = screen.getDisplayMatching(State.store.windowBounds).id; }; win.on("resize", saveBounds); @@ -333,6 +333,7 @@ function initSettingsListeners(win: BrowserWindow) { if (enable) initTray(win); else tray?.destroy(); }); + addSettingsListener("disableMinSize", disable => { if (disable) { // 0 no work @@ -366,7 +367,7 @@ function initSettingsListeners(win: BrowserWindow) { } async function initSpellCheckLanguages(win: BrowserWindow, languages?: string[]) { - languages ??= await win.webContents.executeJavaScript("[...new Set(navigator.languages)]").catch(() => []); + languages ??= await sendRendererCommand(IpcCommands.GET_LANGUAGES); if (!languages) return; const ses = session.defaultSession; @@ -384,19 +385,38 @@ function initSpellCheck(win: BrowserWindow) { initSpellCheckLanguages(win, Settings.store.spellCheckLanguages); } +function initStaticTitle(win: BrowserWindow) { + const listener = (e: { preventDefault: Function }) => e.preventDefault(); + + if (Settings.store.staticTitle) win.on("page-title-updated", listener); + + addSettingsListener("staticTitle", enabled => { + if (enabled) { + win.setTitle("Vesktop"); + win.on("page-title-updated", listener); + } else { + win.off("page-title-updated", listener); + } + }); +} + function createMainWindow() { // Clear up previous settings listeners removeSettingsListeners(); removeVencordSettingsListeners(); - const { staticTitle, transparencyOption, enableMenu, customTitleBar } = Settings.store; + const { staticTitle, transparencyOption, enableMenu, customTitleBar, splashTheming, splashBackground } = + Settings.store; const { frameless, transparent } = VencordSettings.store; const noFrame = frameless === true || customTitleBar === true; + const backgroundColor = + splashTheming !== false ? splashBackground : nativeTheme.shouldUseDarkColors ? "#313338" : "#ffffff"; const win = (mainWin = new BrowserWindow({ - show: false, + show: Settings.store.enableSplashScreen === false, + backgroundColor, webPreferences: { nodeIntegration: false, sandbox: false, @@ -444,44 +464,51 @@ function createMainWindow() { return false; }); - if (Settings.store.staticTitle) win.on("page-title-updated", e => e.preventDefault()); - initWindowBoundsListeners(win); if (!isDeckGameMode && (Settings.store.tray ?? true) && process.platform !== "darwin") initTray(win); initMenuBar(win); makeLinksOpenExternally(win); initSettingsListeners(win); initSpellCheck(win); + initStaticTitle(win); win.webContents.setUserAgent(BrowserUserAgent); - const subdomain = - Settings.store.discordBranch === "canary" || Settings.store.discordBranch === "ptb" - ? `${Settings.store.discordBranch}.` - : ""; - - win.loadURL(`https://${subdomain}discord.com/app`); + // if the open-url event is fired (in index.ts) while starting up, darwinURL will be set. If not fall back to checking the process args (which Windows and Linux use for URI calling.) + loadUrl(darwinURL || process.argv.find(arg => arg.startsWith("discord://"))); return win; } const runVencordMain = once(() => require(join(VENCORD_FILES_DIR, "vencordDesktopMain.js"))); +export function loadUrl(uri: string | undefined) { + const branch = Settings.store.discordBranch; + const subdomain = branch === "canary" || branch === "ptb" ? `${branch}.` : ""; + mainWin.loadURL(`https://${subdomain}discord.com/${uri ? new URL(uri).pathname.slice(1) || "app" : "app"}`); +} + export async function createWindows() { const startMinimized = process.argv.includes("--start-minimized"); - const splash = createSplashWindow(startMinimized); - // SteamOS letterboxes and scales it terribly, so just full screen it - if (isDeckGameMode) splash.setFullScreen(true); + + let splash: BrowserWindow | undefined; + if (Settings.store.enableSplashScreen !== false) { + splash = createSplashWindow(startMinimized); + + // SteamOS letterboxes and scales it terribly, so just full screen it + if (isDeckGameMode) splash.setFullScreen(true); + } + await ensureVencordFiles(); runVencordMain(); mainWin = createMainWindow(); mainWin.webContents.on("did-finish-load", () => { - splash.destroy(); + splash?.destroy(); if (!startMinimized) { - mainWin!.show(); + if (splash) mainWin!.show(); if (State.store.maximized && !isDeckGameMode) mainWin!.maximize(); } @@ -499,5 +526,13 @@ export async function createWindows() { }); }); + mainWin.webContents.on("did-navigate", (_, url: string, responseCode: number) => { + // check url to ensure app doesn't loop + if (responseCode >= 300 && new URL(url).pathname !== `/app`) { + loadUrl(undefined); + console.warn(`'did-navigate': Caught bad page response: ${responseCode}, redirecting to main app`); + } + }); + initArRPC(); } diff --git a/src/main/mediaPermissions.ts b/src/main/mediaPermissions.ts index f7765be..6e7e664 100644 --- a/src/main/mediaPermissions.ts +++ b/src/main/mediaPermissions.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { session, systemPreferences } from "electron"; diff --git a/src/main/screenShare.ts b/src/main/screenShare.ts index 888e41b..5ba93a8 100644 --- a/src/main/screenShare.ts +++ b/src/main/screenShare.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { desktopCapturer, session, Streams } from "electron"; diff --git a/src/main/settings.ts b/src/main/settings.ts index b2aeea9..128ea54 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; diff --git a/src/main/splash.ts b/src/main/splash.ts index 56c83e4..3e03a82 100644 --- a/src/main/splash.ts +++ b/src/main/splash.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { BrowserWindow } from "electron"; @@ -22,7 +22,7 @@ export function createSplashWindow(startMinimized = false) { splash.loadFile(join(VIEW_DIR, "splash.html")); - if (splashTheming) { + if (splashTheming !== false) { if (splashColor) { const semiTransparentSplashColor = splashColor.replace("rgb(", "rgba(").replace(")", ", 0.2)"); diff --git a/src/main/utils/http.ts b/src/main/utils/http.ts index baee81e..7d737b6 100644 --- a/src/main/utils/http.ts +++ b/src/main/utils/http.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { createWriteStream } from "fs"; diff --git a/src/main/utils/ipcWrappers.ts b/src/main/utils/ipcWrappers.ts index eeb4de8..7e8da42 100644 --- a/src/main/utils/ipcWrappers.ts +++ b/src/main/utils/ipcWrappers.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { ipcMain, IpcMainEvent, IpcMainInvokeEvent, WebFrameMain } from "electron"; diff --git a/src/main/utils/makeLinksOpenExternally.ts b/src/main/utils/makeLinksOpenExternally.ts index 12f2c3d..5d6cc75 100644 --- a/src/main/utils/makeLinksOpenExternally.ts +++ b/src/main/utils/makeLinksOpenExternally.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { BrowserWindow, shell } from "electron"; diff --git a/src/main/utils/popout.ts b/src/main/utils/popout.ts index cdeea61..dd26896 100644 --- a/src/main/utils/popout.ts +++ b/src/main/utils/popout.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { BrowserWindow, BrowserWindowConstructorOptions } from "electron"; diff --git a/src/main/utils/steamOS.ts b/src/main/utils/steamOS.ts index e61166c..1029168 100644 --- a/src/main/utils/steamOS.ts +++ b/src/main/utils/steamOS.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { BrowserWindow, dialog } from "electron"; diff --git a/src/main/utils/vencordLoader.ts b/src/main/utils/vencordLoader.ts index c0bac6a..a368c37 100644 --- a/src/main/utils/vencordLoader.ts +++ b/src/main/utils/vencordLoader.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { mkdirSync } from "fs"; diff --git a/src/main/venmic.ts b/src/main/venmic.ts index c127e90..b6a0d08 100644 --- a/src/main/venmic.ts +++ b/src/main/venmic.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import type { LinkData, Node, PatchBay as PatchBayType } from "@vencord/venmic"; diff --git a/src/preload/VesktopNative.ts b/src/preload/VesktopNative.ts index 923174c..bc7739c 100644 --- a/src/preload/VesktopNative.ts +++ b/src/preload/VesktopNative.ts @@ -1,11 +1,12 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { Node } from "@vencord/venmic"; import { ipcRenderer } from "electron"; +import { IpcMessage, IpcResponse } from "main/ipcCommands"; import type { Settings } from "shared/settings"; import { IpcEvents } from "../shared/IpcEvents"; @@ -71,11 +72,6 @@ export const VesktopNative = { startSystem: (exclude: Node[]) => invoke(IpcEvents.VIRT_MIC_START_SYSTEM, exclude), stop: () => invoke(IpcEvents.VIRT_MIC_STOP) }, - arrpc: { - onActivity(cb: (data: string) => void) { - ipcRenderer.on(IpcEvents.ARRPC_ACTIVITY, (_, data: string) => cb(data)); - } - }, clipboard: { copyImage: (imageBuffer: Uint8Array, imageSrc: string) => invoke(IpcEvents.CLIPBOARD_COPY_IMAGE, imageBuffer, imageSrc) @@ -83,5 +79,11 @@ export const VesktopNative = { debug: { launchGpu: () => invoke(IpcEvents.DEBUG_LAUNCH_GPU), launchWebrtcInternals: () => invoke(IpcEvents.DEBUG_LAUNCH_WEBRTC_INTERNALS) + }, + commands: { + onCommand(cb: (message: IpcMessage) => void) { + ipcRenderer.on(IpcEvents.IPC_COMMAND, (_, message) => cb(message)); + }, + respond: (response: IpcResponse) => ipcRenderer.send(IpcEvents.IPC_COMMAND, response) } }; diff --git a/src/preload/index.ts b/src/preload/index.ts index 75bf9cd..5003cc7 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { contextBridge, ipcRenderer, webFrame } from "electron"; diff --git a/src/preload/typedIpc.ts b/src/preload/typedIpc.ts index e8b519c..91129e0 100644 --- a/src/preload/typedIpc.ts +++ b/src/preload/typedIpc.ts @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { ipcRenderer } from "electron"; diff --git a/src/renderer/appBadge.ts b/src/renderer/appBadge.ts index b55d488..97f3e36 100644 --- a/src/renderer/appBadge.ts +++ b/src/renderer/appBadge.ts @@ -1,12 +1,13 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import { filters, waitFor } from "@vencord/types/webpack"; import { RelationshipStore } from "@vencord/types/webpack/common"; +import { VesktopLogger } from "./logger"; import { Settings } from "./settings"; let GuildReadStateStore: any; @@ -26,7 +27,7 @@ export function setBadge() { VesktopNative.app.setBadgeCount(totalCount); } catch (e) { - console.error(e); + VesktopLogger.error("Failed to update badge count", e); } } diff --git a/src/renderer/arrpc.ts b/src/renderer/arrpc.ts new file mode 100644 index 0000000..d19d8e7 --- /dev/null +++ b/src/renderer/arrpc.ts @@ -0,0 +1,68 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2025 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Logger } from "@vencord/types/utils"; +import { findLazy, findStoreLazy, onceReady } from "@vencord/types/webpack"; +import { FluxDispatcher, InviteActions } from "@vencord/types/webpack/common"; +import { IpcCommands } from "shared/IpcEvents"; + +import { onIpcCommand } from "./ipcCommands"; +import { Settings } from "./settings"; + +const logger = new Logger("VesktopRPC", "#5865f2"); +const StreamerModeStore = findStoreLazy("StreamerModeStore"); + +const arRPC = Vencord.Plugins.plugins["WebRichPresence (arRPC)"] as any as { + handleEvent(e: MessageEvent): void; +}; + +onIpcCommand(IpcCommands.RPC_ACTIVITY, async jsonData => { + if (!Settings.store.arRPC) return; + + await onceReady; + + const data = JSON.parse(jsonData); + + if (data.socketId === "STREAMERMODE" && StreamerModeStore.autoToggle) { + FluxDispatcher.dispatch({ + type: "STREAMER_MODE_UPDATE", + key: "enabled", + value: data.activity?.application_id === "STREAMERMODE" + }); + return; + } + + arRPC.handleEvent(new MessageEvent("message", { data: jsonData })); +}); + +onIpcCommand(IpcCommands.RPC_INVITE, async code => { + const { invite } = await InviteActions.resolveInvite(code, "Desktop Modal"); + if (!invite) return false; + + VesktopNative.win.focus(); + + FluxDispatcher.dispatch({ + type: "INVITE_MODAL_OPEN", + invite, + code, + context: "APP" + }); + + return true; +}); + +const { DEEP_LINK } = findLazy(m => m.DEEP_LINK?.handler); + +onIpcCommand(IpcCommands.RPC_DEEP_LINK, async data => { + logger.debug("Opening deep link:", data); + try { + DEEP_LINK.handler({ args: data }); + return true; + } catch (err) { + logger.error("Failed to open deep link:", err); + return false; + } +}); diff --git a/src/renderer/components/ScreenSharePicker.tsx b/src/renderer/components/ScreenSharePicker.tsx index acdc593..dbecfc6 100644 --- a/src/renderer/components/ScreenSharePicker.tsx +++ b/src/renderer/components/ScreenSharePicker.tsx @@ -1,7 +1,7 @@ /* - * SPDX-License-Identifier: GPL-3.0 * Vesktop, a desktop app aiming to give you a snappier Discord Experience * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later */ import "./screenSharePicker.css"; @@ -22,12 +22,14 @@ import { import { Node } from "@vencord/venmic"; import type { Dispatch, SetStateAction } from "react"; import { addPatch } from "renderer/patches/shared"; -import { useSettings } from "renderer/settings"; -import { isLinux, isWindows } from "renderer/utils"; +import { State, useSettings, useVesktopState } from "renderer/settings"; +import { classNameFactory, isLinux, isWindows } from "renderer/utils"; const StreamResolutions = ["480", "720", "1080", "1440", "2160"] as const; const StreamFps = ["15", "30", "60"] as const; +const cl = classNameFactory("vcd-screen-picker-"); + const MediaEngineStore = findStoreLazy("MediaEngineStore"); export type StreamResolution = (typeof StreamResolutions)[number]; @@ -44,8 +46,6 @@ interface AudioItem { } interface StreamSettings { - resolution: StreamResolution; - fps: StreamFps; audio: boolean; contentHint?: string; includeSources?: AudioSources; @@ -77,10 +77,11 @@ addPatch({ } ], patchStreamQuality(opts: any) { - if (!currentSettings) return; + const { screenshareQuality } = State.store; + if (!screenshareQuality) return; - const framerate = Number(currentSettings.fps); - const height = Number(currentSettings.resolution); + const framerate = Number(screenshareQuality.frameRate); + const height = Number(screenshareQuality.resolution); const width = Math.round(height * (16 / 9)); Object.assign(opts, { @@ -161,13 +162,21 @@ export function openScreenSharePicker(screens: Source[], skipPicker: boolean) { function ScreenPicker({ screens, chooseScreen }: { screens: Source[]; chooseScreen: (id: string) => void }) { return ( -
+
{screens.map(({ id, name, url }) => ( -
@@ -187,11 +196,13 @@ function AudioSettingsModal({ return ( - - Venmic Settings + + + Venmic Settings + - + (Settings.audio = { ...Settings.audio, workaround: v })} @@ -295,7 +306,7 @@ function AudioSettingsModal({ Device Selection - + @@ -304,7 +315,35 @@ function AudioSettingsModal({ ); } -function StreamSettings({ +function OptionRadio(props: { + options: Array | ReadonlyArray; + labels?: Array; + settings: Settings; + settingsKey: Key; + onChange: (option: string) => void; +}) { + const { options, settings, settingsKey, labels, onChange } = props; + + return ( +
+ {(options as string[]).map((option, idx) => ( + + ))} +
+ ); +} + +function StreamSettingsUi({ source, settings, setSettings, @@ -316,6 +355,7 @@ function StreamSettings({ skipPicker: boolean; }) { const Settings = useSettings(); + const qualitySettings = State.store.screenshareQuality!; const [thumb] = useAwaiter( () => (skipPicker ? Promise.resolve(source.url) : VesktopNative.capturer.getLargeThumbnail(source.id)), @@ -340,88 +380,47 @@ function StreamSettings({ return (
What you're streaming - - + + {source.name} Stream Settings - -
-
+ +
+
Resolution -
- {StreamResolutions.map(res => ( - - ))} -
+ (qualitySettings.resolution = value)} + />
-
+
Frame Rate -
- {StreamFps.map(fps => ( - - ))} -
+ (qualitySettings.frameRate = value)} + />
-
-
+
+
Content Type
-
- - -
-
+ setSettings(s => ({ ...s, contentHint: option }))} + /> +

Choosing "Prefer Clarity" will result in a significantly lower framerate in exchange for a much sharper and clearer image. @@ -433,7 +432,7 @@ function StreamSettings({ value={settings.audio} onChange={checked => setSettings(s => ({ ...s, audio: checked }))} hideBorder - className="vcd-screen-picker-audio" + className={cl("audio")} > Stream With Audio @@ -639,7 +638,7 @@ function AudioSourcePickerLinux({ return ( <> -

+
{loading ? "Loading Sources..." : "Audio Sources"}