Compare commits
No commits in common. "main" and "v1.5.3" have entirely different histories.
20 changed files with 1288 additions and 1802 deletions
69
.eslintrc.json
Normal file
69
.eslintrc.json
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
{
|
||||||
|
"root": true,
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"ignorePatterns": ["dist", "node_modules"],
|
||||||
|
"plugins": [
|
||||||
|
"@typescript-eslint",
|
||||||
|
"license-header",
|
||||||
|
"simple-import-sort",
|
||||||
|
"unused-imports",
|
||||||
|
"path-alias",
|
||||||
|
"prettier"
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"import/resolver": {
|
||||||
|
"alias": {
|
||||||
|
"map": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"license-header/header": ["error", "scripts/header.txt"],
|
||||||
|
"eqeqeq": ["error", "always", { "null": "ignore" }],
|
||||||
|
"spaced-comment": ["error", "always", { "markers": ["!"] }],
|
||||||
|
"yoda": "error",
|
||||||
|
"prefer-destructuring": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"VariableDeclarator": { "array": false, "object": true },
|
||||||
|
"AssignmentExpression": { "array": false, "object": false }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"operator-assignment": ["error", "always"],
|
||||||
|
"no-useless-computed-key": "error",
|
||||||
|
"no-unneeded-ternary": ["error", { "defaultAssignment": false }],
|
||||||
|
"no-invalid-regexp": "error",
|
||||||
|
"no-constant-condition": ["error", { "checkLoops": false }],
|
||||||
|
"no-duplicate-imports": "error",
|
||||||
|
"no-extra-semi": "error",
|
||||||
|
"dot-notation": "error",
|
||||||
|
"no-useless-escape": "error",
|
||||||
|
"no-fallthrough": "error",
|
||||||
|
"for-direction": "error",
|
||||||
|
"no-async-promise-executor": "error",
|
||||||
|
"no-cond-assign": "error",
|
||||||
|
"no-dupe-else-if": "error",
|
||||||
|
"no-duplicate-case": "error",
|
||||||
|
"no-irregular-whitespace": "error",
|
||||||
|
"no-loss-of-precision": "error",
|
||||||
|
"no-misleading-character-class": "error",
|
||||||
|
"no-prototype-builtins": "error",
|
||||||
|
"no-regex-spaces": "error",
|
||||||
|
"no-shadow-restricted-names": "error",
|
||||||
|
"no-unexpected-multiline": "error",
|
||||||
|
"no-unsafe-optional-chaining": "error",
|
||||||
|
"no-useless-backreference": "error",
|
||||||
|
"use-isnan": "error",
|
||||||
|
"prefer-const": "error",
|
||||||
|
"prefer-spread": "error",
|
||||||
|
|
||||||
|
"simple-import-sort/imports": "error",
|
||||||
|
"simple-import-sort/exports": "error",
|
||||||
|
|
||||||
|
"unused-imports/no-unused-imports": "error",
|
||||||
|
|
||||||
|
"path-alias/no-relative": "error",
|
||||||
|
|
||||||
|
"prettier/prettier": "error"
|
||||||
|
}
|
||||||
|
}
|
33
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
33
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -11,32 +11,18 @@ body:
|
||||||
|
|
||||||
Make sure a similar issue doesn't already exist by [searching the existing issues](https://github.com/Vencord/Vesktop/issues?q=is%3Aissue) for keywords!
|
Make sure a similar issue doesn't already exist by [searching the existing issues](https://github.com/Vencord/Vesktop/issues?q=is%3Aissue) for keywords!
|
||||||
|
|
||||||
Make sure both Vesktop and Vencord are fully up to date. You can update Vencord by right-clicking the Vesktop tray icon and pressing "Repair Vencord"
|
Make sure both Vesktop and Vencord are fully up to date. You can update Vencord by right-clicking the Vesktop tray icon and pressing "Update Vencord"
|
||||||
|
|
||||||
**DO NOT REPORT** any of the following issues:
|
**DO NOT REPORT** any of the following issues:
|
||||||
- Purely graphical glitches like flickering, scaling issues[^1]
|
- Purely graphical glitches like flickering, scaling issues, etc: Issue with your gpu. Nothing we can do, update drivers or disable hardware acceleration
|
||||||
- App crashing / not showing window with mentions of the gpu process in the stacktrace[^1]
|
|
||||||
- Screenshare not starting, black screening or crashing[^2]
|
|
||||||
- Vencord related issues: This is the Vesktop repo, not Vencord
|
- Vencord related issues: This is the Vesktop repo, not Vencord
|
||||||
- Captchas[^3]
|
- **SCREENSHARE NOT STARTING** / black screening on Linux: Issue with your desktop environment, specifically its xdg-desktop-portal.
|
||||||
- Issues with opening URLs[^4]
|
If you're on flatpak, try using native version. If that also doesn't work, you have to fix your systen. Inspect errors and google around.
|
||||||
- Issues with Notifications[^4]
|
|
||||||
- Issues with Input Methods[^4]
|
|
||||||
- Issues with File Drag and Drop[^5]
|
|
||||||
- Network Errors[^6]
|
|
||||||
|
|
||||||
Linux users: Please only report issues with supported packages (flatpak and any builds from the README / releases).
|
Linux users: Please only report issues with supported packages (flatpak and any builds from the README / releases).
|
||||||
We do not support other packages, like the AUR or Nix packages, so please first make sure your issue is reproducible with official releases,
|
We do not support other packages, like the AUR or Nix packages, so please first make sure your issue is reproducible with official releases,
|
||||||
like [our Flatpak](https://flathub.org/apps/dev.vencord.Vesktop) or [AppImage](https://vencord.dev/download/vesktop/amd64/appimage)
|
like [our Flatpak](https://flathub.org/apps/dev.vencord.Vesktop) or [AppImage](https://vencord.dev/download/vesktop/amd64/appimage)
|
||||||
|
|
||||||
|
|
||||||
[^1]: GPU issue. Disable hardware acceleration in Vesktop Settings or run with `--disable-gpu`
|
|
||||||
[^2]: System issue. You will have to fix it
|
|
||||||
[^3]: If you are receiving a lot of captchas, it means Discord thinks you might be a bot. Make sure you're not using a VPN/Proxy
|
|
||||||
[^4]: These things are handled by Chromium / Electron, not us. If they don't work, it's either an issue with your system or a bug with Chromium.
|
|
||||||
[^5]: You are likely using the Vesktop flatpak and trying to drop a file the flatpak can't access. You can fix this by installing Flatseal and using it to grant Vesktop full access to your files
|
|
||||||
[^6]: Issue on your end, you have to fix it. Try changing your DNS to [1.1.1.1 (Cloudflare DNS)](https://developers.cloudflare.com/1.1.1.1/setup/)
|
|
||||||
|
|
||||||
- type: input
|
- type: input
|
||||||
id: discord
|
id: discord
|
||||||
attributes:
|
attributes:
|
||||||
|
@ -64,15 +50,6 @@ body:
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
- type: input
|
|
||||||
id: install-type
|
|
||||||
attributes:
|
|
||||||
label: Package Type
|
|
||||||
description: What kind of Vesktop package are you using? (Setup exe, Portable, Flatpak, AppImage, Deb, etc)
|
|
||||||
placeholder: Flatpak
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: bug-description
|
id: bug-description
|
||||||
attributes:
|
attributes:
|
||||||
|
@ -108,7 +85,7 @@ body:
|
||||||
id: debug-logs
|
id: debug-logs
|
||||||
attributes:
|
attributes:
|
||||||
label: Debug Logs
|
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
|
description: Run vesktop from the command line. Include the relevant command line output here
|
||||||
value: |
|
value: |
|
||||||
```
|
```
|
||||||
Replace this text with your crash-log. Do not remove the backticks
|
Replace this text with your crash-log. Do not remove the backticks
|
||||||
|
|
2
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
2
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
|
@ -14,8 +14,6 @@ body:
|
||||||
This form is only meant for **Vesktop feature requests**.
|
This form is only meant for **Vesktop feature requests**.
|
||||||
For plugin requests or Vencord feature requests, go [here](https://github.com/Vencord/plugin-requests/issues/new?template=request.yml) instead!
|
For plugin requests or Vencord feature requests, go [here](https://github.com/Vencord/plugin-requests/issues/new?template=request.yml) instead!
|
||||||
|
|
||||||
**DO NOT** make any icon related requests or you will be blocked.
|
|
||||||
|
|
||||||
- type: input
|
- type: input
|
||||||
id: discord
|
id: discord
|
||||||
attributes:
|
attributes:
|
||||||
|
|
2
.github/workflows/meta.yml
vendored
2
.github/workflows/meta.yml
vendored
|
@ -33,6 +33,6 @@ jobs:
|
||||||
git add 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 commit -m "Insert release changes for ${{ github.event.release.tag_name }}"
|
||||||
git push origin ci/meta-update
|
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 }}."
|
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 }}. @lewisakura @Vendicated"
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
10
.github/workflows/release.yml
vendored
10
.github/workflows/release.yml
vendored
|
@ -47,13 +47,7 @@ jobs:
|
||||||
- name: Run Electron Builder
|
- name: Run Electron Builder
|
||||||
if: ${{ matrix.platform == 'mac' }}
|
if: ${{ matrix.platform == 'mac' }}
|
||||||
run: |
|
run: |
|
||||||
echo "$API_KEY" > apple.p8
|
|
||||||
pnpm electron-builder --${{ matrix.platform }} --publish always
|
pnpm electron-builder --${{ matrix.platform }} --publish always
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
CSC_LINK: ${{ secrets.APPLE_SIGNING_CERT }}
|
CSC_LINK: ${{ secrets.APPLE_SIGNING_CERT }}
|
||||||
CSC_KEY_PASSWORD: ${{ secrets.APPLE_SIGNING_CERT_PASSWORD }}
|
|
||||||
API_KEY: ${{ secrets.APPLE_API_KEY }}
|
|
||||||
APPLE_API_KEY: apple.p8
|
|
||||||
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
|
|
||||||
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
|
|
||||||
|
|
2
.github/workflows/winget-submission.yml
vendored
2
.github/workflows/winget-submission.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Submit package to Winget Community Repo
|
- name: Submit package to Winget Community Repo
|
||||||
uses: vedantmgoyal2009/winget-releaser@0db4f0a478166abd0fa438c631849f0b8dcfb99f
|
uses: vedantmgoyal2009/winget-releaser@4614300d5812e5df91cb02ef0edbece623d5dea8
|
||||||
with:
|
with:
|
||||||
identifier: Vencord.Vesktop
|
identifier: Vencord.Vesktop
|
||||||
token: ${{ secrets.WINGET_PAT }}
|
token: ${{ secrets.WINGET_PAT }}
|
||||||
|
|
13
README.md
13
README.md
|
@ -21,14 +21,15 @@ Vesktop is a custom Discord desktop app
|
||||||
|
|
||||||
If you don't know the difference, pick the Installer.
|
If you don't know the difference, pick the Installer.
|
||||||
|
|
||||||
- [Installer](https://vencord.dev/download/vesktop/universal/windows)
|
- [Installer](https://vencord.dev/download/vesktop/amd64/windows)
|
||||||
- Portable:
|
- [Portable](https://vencord.dev/download/vesktop/amd64/windows-portable)
|
||||||
- [x64 / amd64](https://vencord.dev/download/vesktop/amd64/windows-portable)
|
|
||||||
- [Arm® 64](https://vencord.dev/download/vesktop/arm64/windows-portable)
|
|
||||||
|
|
||||||
### Mac
|
### Mac
|
||||||
|
|
||||||
[Vesktop.dmg](https://vencord.dev/download/vesktop/universal/dmg)
|
If you don't know the difference, pick the Intel build.
|
||||||
|
|
||||||
|
- [Intel build (amd64)](https://vencord.dev/download/vesktop/amd64/dmg)
|
||||||
|
- [Apple Silicon (arm64)](https://vencord.dev/download/vesktop/arm64/dmg)
|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
|
@ -41,7 +42,7 @@ If you don't know the difference, pick amd64.
|
||||||
- [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/amd64/deb)
|
- [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/amd64/deb)
|
||||||
- [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/amd64/rpm)
|
- [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/amd64/rpm)
|
||||||
- [tarball](https://vencord.dev/download/vesktop/amd64/tar)
|
- [tarball](https://vencord.dev/download/vesktop/amd64/tar)
|
||||||
- Arm® 64 / aarch64
|
- arm64 / aarch64
|
||||||
- [AppImage](https://vencord.dev/download/vesktop/arm64/appimage)
|
- [AppImage](https://vencord.dev/download/vesktop/arm64/appimage)
|
||||||
- [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/arm64/deb)
|
- [Ubuntu/Debian (.deb)](https://vencord.dev/download/vesktop/arm64/deb)
|
||||||
- [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/arm64/rpm)
|
- [Fedora/RHEL (.rpm)](https://vencord.dev/download/vesktop/arm64/rpm)
|
||||||
|
|
|
@ -1,102 +0,0 @@
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
//@ts-check
|
|
||||||
|
|
||||||
import stylistic from "@stylistic/eslint-plugin";
|
|
||||||
import pathAlias from "eslint-plugin-path-alias";
|
|
||||||
import header 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";
|
|
||||||
import prettier from "eslint-plugin-prettier";
|
|
||||||
|
|
||||||
export default tseslint.config(
|
|
||||||
{ ignores: ["dist"] },
|
|
||||||
|
|
||||||
{
|
|
||||||
files: ["src/**/*.{tsx,ts,mts,mjs,js,jsx}"],
|
|
||||||
plugins: {
|
|
||||||
header,
|
|
||||||
stylistic,
|
|
||||||
importSort,
|
|
||||||
unusedImports,
|
|
||||||
pathAlias,
|
|
||||||
prettier
|
|
||||||
},
|
|
||||||
settings: {
|
|
||||||
"import/resolver": {
|
|
||||||
alias: {
|
|
||||||
map: []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
languageOptions: {
|
|
||||||
parser: tseslint.parser,
|
|
||||||
parserOptions: {
|
|
||||||
project: true,
|
|
||||||
tsconfigRootDir: import.meta.dirname
|
|
||||||
}
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
"header/header": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
files: ["scripts/header.txt"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
|
|
||||||
// ESLint Rules
|
|
||||||
|
|
||||||
yoda: "error",
|
|
||||||
eqeqeq: ["error", "always", { null: "ignore" }],
|
|
||||||
"prefer-destructuring": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
VariableDeclarator: { array: false, object: true },
|
|
||||||
AssignmentExpression: { array: false, object: false }
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"operator-assignment": ["error", "always"],
|
|
||||||
"no-useless-computed-key": "error",
|
|
||||||
"no-unneeded-ternary": ["error", { defaultAssignment: false }],
|
|
||||||
"no-invalid-regexp": "error",
|
|
||||||
"no-constant-condition": ["error", { checkLoops: false }],
|
|
||||||
"no-duplicate-imports": "error",
|
|
||||||
"dot-notation": "error",
|
|
||||||
"no-useless-escape": "error",
|
|
||||||
"no-fallthrough": "error",
|
|
||||||
"for-direction": "error",
|
|
||||||
"no-async-promise-executor": "error",
|
|
||||||
"no-cond-assign": "error",
|
|
||||||
"no-dupe-else-if": "error",
|
|
||||||
"no-duplicate-case": "error",
|
|
||||||
"no-irregular-whitespace": "error",
|
|
||||||
"no-loss-of-precision": "error",
|
|
||||||
"no-misleading-character-class": "error",
|
|
||||||
"no-prototype-builtins": "error",
|
|
||||||
"no-regex-spaces": "error",
|
|
||||||
"no-shadow-restricted-names": "error",
|
|
||||||
"no-unexpected-multiline": "error",
|
|
||||||
"no-unsafe-optional-chaining": "error",
|
|
||||||
"no-useless-backreference": "error",
|
|
||||||
"use-isnan": "error",
|
|
||||||
"prefer-const": "error",
|
|
||||||
"prefer-spread": "error",
|
|
||||||
|
|
||||||
// Styling Rules
|
|
||||||
"stylistic/spaced-comment": ["error", "always", { markers: ["!"] }],
|
|
||||||
"stylistic/no-extra-semi": "error",
|
|
||||||
|
|
||||||
// Plugin Rules
|
|
||||||
"importSort/imports": "error",
|
|
||||||
"importSort/exports": "error",
|
|
||||||
"unusedImports/no-unused-imports": "error",
|
|
||||||
"pathAlias/no-relative": "error",
|
|
||||||
"prettier/prettier": "error"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
|
@ -28,34 +28,6 @@
|
||||||
</screenshot>
|
</screenshot>
|
||||||
</screenshots>
|
</screenshots>
|
||||||
<releases>
|
<releases>
|
||||||
<release version="1.5.3" date="2024-07-04" type="stable">
|
|
||||||
<url>https://github.com/Vencord/Vesktop/releases/tag/v1.5.3</url>
|
|
||||||
<description>
|
|
||||||
<p>Features</p>
|
|
||||||
<ul>
|
|
||||||
<li>added arm64 Windows support</li>
|
|
||||||
<li>windows & macOS builds are now universal</li>
|
|
||||||
<li>added option to configure spellcheck languages</li>
|
|
||||||
<li>will auto-update from now on</li>
|
|
||||||
<li>updated electron to 31 & Chromium to 126</li>
|
|
||||||
<li>macOS: Added customized dmg background by @khcrysalis</li>
|
|
||||||
<li>Windows Portable: store settings in portable folder by @MrGarlic1</li>
|
|
||||||
<li>linux audioshare: added granular selection, more options, better ui by @Curve</li>
|
|
||||||
<li>changed default screen-sharing quality to 720p 30 FPS by @Tiagoquix</li>
|
|
||||||
</ul>
|
|
||||||
<p>Fixes</p>
|
|
||||||
<ul>
|
|
||||||
<li>macOS: Added workaround for making things in draggable area clickable by @HAHALOSAH</li>
|
|
||||||
<li>fixed Screenshare UI for non-linux systems by @PolisanTheEasyNick</li>
|
|
||||||
<li>fixed opening on screen that was disconnected by @MrGarlic1</li>
|
|
||||||
<li>mac: hide native window controls with custom titlebar enabled by @MrGarlic1</li>
|
|
||||||
<li>fixed some broken patches by @D3SOX</li>
|
|
||||||
<li>fixed framerate in constraints by @kittykel</li>
|
|
||||||
<li>fixed some first launch switches not applying</li>
|
|
||||||
<li>fixed potential sandbox escape via custom vencord location</li>
|
|
||||||
</ul>
|
|
||||||
</description>
|
|
||||||
</release>
|
|
||||||
<release version="1.5.2" date="2024-05-01" type="stable">
|
<release version="1.5.2" date="2024-05-01" type="stable">
|
||||||
<url>https://github.com/Vencord/Vesktop/releases/tag/v1.5.2</url>
|
<url>https://github.com/Vencord/Vesktop/releases/tag/v1.5.2</url>
|
||||||
<description>
|
<description>
|
||||||
|
@ -236,4 +208,4 @@
|
||||||
<keyword>Privacy</keyword>
|
<keyword>Privacy</keyword>
|
||||||
<keyword>Mod</keyword>
|
<keyword>Mod</keyword>
|
||||||
</keywords>
|
</keywords>
|
||||||
</component>
|
</component>
|
||||||
|
|
58
package.json
58
package.json
|
@ -2,7 +2,7 @@
|
||||||
"name": "vesktop",
|
"name": "vesktop",
|
||||||
"version": "1.5.3",
|
"version": "1.5.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Vesktop is a custom Discord desktop app",
|
"description": "",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"homepage": "https://vencord.dev/",
|
"homepage": "https://vencord.dev/",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
"build:dev": "pnpm build --dev",
|
"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",
|
"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 .",
|
||||||
|
@ -24,36 +24,37 @@
|
||||||
"updateMeta": "tsx scripts/utils/updateMeta.mts"
|
"updateMeta": "tsx scripts/utils/updateMeta.mts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"arrpc": "github:OpenAsar/arrpc#5aadc307cb9bf4479f0a12364a253b07a77ace22",
|
"arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24",
|
||||||
"electron-updater": "^6.3.4"
|
"electron-updater": "^6.2.1"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@vencord/venmic": "^6.1.0"
|
"@vencord/venmic": "^6.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@fal-works/esbuild-plugin-global-externals": "^2.1.2",
|
"@fal-works/esbuild-plugin-global-externals": "^2.1.2",
|
||||||
"@stylistic/eslint-plugin": "^2.8.0",
|
"@types/node": "^20.11.26",
|
||||||
"@types/node": "^22.5.5",
|
"@types/react": "^18.2.0",
|
||||||
"@types/react": "^18.3.8",
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
||||||
|
"@typescript-eslint/parser": "^7.2.0",
|
||||||
"@vencord/types": "^1.8.4",
|
"@vencord/types": "^1.8.4",
|
||||||
"dotenv": "^16.4.5",
|
"dotenv": "^16.4.5",
|
||||||
"electron": "^33.0.2",
|
"electron": "^31.1.0",
|
||||||
"electron-builder": "^25.0.5",
|
"electron-builder": "^24.13.3",
|
||||||
"esbuild": "^0.23.1",
|
"esbuild": "^0.20.1",
|
||||||
"eslint": "^9.11.0",
|
"eslint": "^8.57.0",
|
||||||
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-import-resolver-alias": "^1.1.2",
|
"eslint-import-resolver-alias": "^1.1.2",
|
||||||
"eslint-plugin-path-alias": "^2.1.0",
|
"eslint-plugin-license-header": "^0.6.0",
|
||||||
"eslint-plugin-prettier": "^5.2.1",
|
"eslint-plugin-path-alias": "^1.0.0",
|
||||||
"eslint-plugin-simple-header": "^1.2.1",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-simple-import-sort": "^12.1.1",
|
"eslint-plugin-simple-import-sort": "^12.0.0",
|
||||||
"eslint-plugin-unused-imports": "^4.1.4",
|
"eslint-plugin-unused-imports": "^3.1.0",
|
||||||
"prettier": "^3.3.3",
|
"prettier": "^3.2.5",
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"tsx": "^4.19.1",
|
"tsx": "^4.7.1",
|
||||||
"type-fest": "^4.26.1",
|
"type-fest": "^4.12.0",
|
||||||
"typescript": "^5.6.2",
|
"typescript": "^5.4.2",
|
||||||
"typescript-eslint": "^8.6.0",
|
"xml-formatter": "^3.6.2"
|
||||||
"xml-formatter": "^3.6.3"
|
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@9.1.0",
|
"packageManager": "pnpm@9.1.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -123,15 +124,13 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"category": "public.app-category.social-networking",
|
"category": "Network",
|
||||||
"darkModeSupport": true,
|
|
||||||
"extendInfo": {
|
"extendInfo": {
|
||||||
"NSMicrophoneUsageDescription": "This app needs access to the microphone",
|
"NSMicrophoneUsageDescription": "This app needs access to the microphone",
|
||||||
"NSCameraUsageDescription": "This app needs access to the camera",
|
"NSCameraUsageDescription": "This app needs access to the camera",
|
||||||
"com.apple.security.device.audio-input": true,
|
"com.apple.security.device.audio-input": true,
|
||||||
"com.apple.security.device.camera": true
|
"com.apple.security.device.camera": true
|
||||||
},
|
}
|
||||||
"notarize": true
|
|
||||||
},
|
},
|
||||||
"dmg": {
|
"dmg": {
|
||||||
"background": "build/background.tiff",
|
"background": "build/background.tiff",
|
||||||
|
@ -178,16 +177,11 @@
|
||||||
},
|
},
|
||||||
"publish": {
|
"publish": {
|
||||||
"provider": "github"
|
"provider": "github"
|
||||||
},
|
|
||||||
"rpm": {
|
|
||||||
"fpm": [
|
|
||||||
"--rpm-rpmbuild-define=_build_id_links none"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pnpm": {
|
"pnpm": {
|
||||||
"patchedDependencies": {
|
"patchedDependencies": {
|
||||||
"arrpc@3.5.0": "patches/arrpc@3.5.0.patch"
|
"arrpc@3.4.0": "patches/arrpc@3.4.0.patch"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2660
pnpm-lock.yaml
2660
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
|
@ -61,11 +61,11 @@ export const DEFAULT_HEIGHT = 720;
|
||||||
|
|
||||||
export const DISCORD_HOSTNAMES = ["discord.com", "canary.discord.com", "ptb.discord.com"];
|
export const DISCORD_HOSTNAMES = ["discord.com", "canary.discord.com", "ptb.discord.com"];
|
||||||
|
|
||||||
const VersionString = `AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${process.versions.chrome.split(".")[0]}.0.0.0 Safari/537.36`;
|
|
||||||
const BrowserUserAgents = {
|
const BrowserUserAgents = {
|
||||||
darwin: `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ${VersionString}`,
|
darwin: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
|
||||||
linux: `Mozilla/5.0 (X11; Linux x86_64) ${VersionString}`,
|
linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
|
||||||
windows: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) ${VersionString}`
|
windows:
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
|
||||||
};
|
};
|
||||||
|
|
||||||
export const BrowserUserAgent = BrowserUserAgents[process.platform] || BrowserUserAgents.windows;
|
export const BrowserUserAgent = BrowserUserAgents[process.platform] || BrowserUserAgents.windows;
|
||||||
|
|
|
@ -60,9 +60,6 @@ function init() {
|
||||||
// WidgetLayering (Vencord Added): Fix DevTools context menus https://github.com/electron/electron/issues/38790
|
// WidgetLayering (Vencord Added): Fix DevTools context menus https://github.com/electron/electron/issues/38790
|
||||||
disabledFeatures.push("WinRetrieveSuggestionsOnlyOnDemand", "HardwareMediaKeyHandling", "MediaSessionService");
|
disabledFeatures.push("WinRetrieveSuggestionsOnlyOnDemand", "HardwareMediaKeyHandling", "MediaSessionService");
|
||||||
|
|
||||||
// Support TTS on Linux using speech-dispatcher
|
|
||||||
app.commandLine.appendSwitch("enable-speech-dispatcher");
|
|
||||||
|
|
||||||
app.commandLine.appendSwitch("enable-features", [...new Set(enabledFeatures)].filter(Boolean).join(","));
|
app.commandLine.appendSwitch("enable-features", [...new Set(enabledFeatures)].filter(Boolean).join(","));
|
||||||
app.commandLine.appendSwitch("disable-features", [...new Set(disabledFeatures)].filter(Boolean).join(","));
|
app.commandLine.appendSwitch("disable-features", [...new Set(disabledFeatures)].filter(Boolean).join(","));
|
||||||
|
|
||||||
|
|
|
@ -499,17 +499,5 @@ export async function createWindows() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// evil hack to fix electron 32 regression that makes devtools always light theme
|
|
||||||
// https://github.com/electron/electron/issues/43367
|
|
||||||
// TODO: remove once fixed
|
|
||||||
mainWin.webContents.on("devtools-opened", () => {
|
|
||||||
if (!nativeTheme.shouldUseDarkColors) return;
|
|
||||||
|
|
||||||
nativeTheme.themeSource = "light";
|
|
||||||
setTimeout(() => {
|
|
||||||
nativeTheme.themeSource = "dark";
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
|
|
||||||
initArRPC();
|
initArRPC();
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => {
|
||||||
const { granularSelect } = Settings.store.audio ?? {};
|
const { granularSelect } = Settings.store.audio ?? {};
|
||||||
|
|
||||||
const targets = obtainVenmic()
|
const targets = obtainVenmic()
|
||||||
?.list(granularSelect ? ["node.name"] : undefined)
|
?.list(granularSelect ? ["application.process.id"] : undefined)
|
||||||
.filter(s => s["application.process.id"] !== audioPid);
|
.filter(s => s["application.process.id"] !== audioPid);
|
||||||
|
|
||||||
return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated };
|
return targets ? { ok: true, targets, hasPipewirePulse } : { ok: false, isGlibCxxOutdated };
|
||||||
|
|
|
@ -254,13 +254,7 @@ function AudioSettingsModal({
|
||||||
</Switch>
|
</Switch>
|
||||||
<Switch
|
<Switch
|
||||||
hideBorder
|
hideBorder
|
||||||
onChange={v =>
|
onChange={v => (Settings.audio = { ...Settings.audio, ignoreDevices: v })}
|
||||||
(Settings.audio = {
|
|
||||||
...Settings.audio,
|
|
||||||
ignoreDevices: v,
|
|
||||||
deviceSelect: v ? false : Settings.audio?.deviceSelect
|
|
||||||
})
|
|
||||||
}
|
|
||||||
value={Settings.audio?.ignoreDevices ?? true}
|
value={Settings.audio?.ignoreDevices ?? true}
|
||||||
note={<>Exclude device nodes, such as nodes belonging to microphones or speakers.</>}
|
note={<>Exclude device nodes, such as nodes belonging to microphones or speakers.</>}
|
||||||
>
|
>
|
||||||
|
@ -277,23 +271,6 @@ function AudioSettingsModal({
|
||||||
>
|
>
|
||||||
Granular Selection
|
Granular Selection
|
||||||
</Switch>
|
</Switch>
|
||||||
<Switch
|
|
||||||
hideBorder
|
|
||||||
onChange={value => {
|
|
||||||
Settings.audio = { ...Settings.audio, deviceSelect: value };
|
|
||||||
setAudioSources("None");
|
|
||||||
}}
|
|
||||||
value={Settings.audio?.deviceSelect ?? false}
|
|
||||||
disabled={Settings.audio?.ignoreDevices}
|
|
||||||
note={
|
|
||||||
<>
|
|
||||||
Allow to select devices such as microphones. Requires <b>Ignore Devices</b> to be turned
|
|
||||||
off.
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
Device Selection
|
|
||||||
</Switch>
|
|
||||||
</Modals.ModalContent>
|
</Modals.ModalContent>
|
||||||
<Modals.ModalFooter className="vcd-screen-picker-footer">
|
<Modals.ModalFooter className="vcd-screen-picker-footer">
|
||||||
<Button color={Button.Colors.TRANSPARENT} onClick={close}>
|
<Button color={Button.Colors.TRANSPARENT} onClick={close}>
|
||||||
|
@ -446,7 +423,6 @@ function StreamSettings({
|
||||||
openSettings={openSettings}
|
openSettings={openSettings}
|
||||||
includeSources={settings.includeSources}
|
includeSources={settings.includeSources}
|
||||||
excludeSources={settings.excludeSources}
|
excludeSources={settings.excludeSources}
|
||||||
deviceSelect={Settings.audio?.deviceSelect}
|
|
||||||
granularSelect={Settings.audio?.granularSelect}
|
granularSelect={Settings.audio?.granularSelect}
|
||||||
setIncludeSources={sources => setSettings(s => ({ ...s, includeSources: sources }))}
|
setIncludeSources={sources => setSettings(s => ({ ...s, includeSources: sources }))}
|
||||||
setExcludeSources={sources => setSettings(s => ({ ...s, excludeSources: sources }))}
|
setExcludeSources={sources => setSettings(s => ({ ...s, excludeSources: sources }))}
|
||||||
|
@ -465,23 +441,13 @@ function hasMatchingProps(value: Node, other: Node) {
|
||||||
return Object.keys(value).every(key => value[key] === other[key]);
|
return Object.keys(value).every(key => value[key] === other[key]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: boolean): AudioItem[] {
|
function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[] {
|
||||||
if (isSpecialSource(node)) {
|
if (isSpecialSource(node)) {
|
||||||
return [{ name: node, value: node }];
|
return [{ name: node, value: node }];
|
||||||
}
|
}
|
||||||
|
|
||||||
const rtn: AudioItem[] = [];
|
const rtn: AudioItem[] = [];
|
||||||
|
|
||||||
const mediaClass = node["media.class"];
|
|
||||||
|
|
||||||
if (mediaClass?.includes("Video") || mediaClass?.includes("Midi")) {
|
|
||||||
return rtn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!deviceSelect && node["device.id"]) {
|
|
||||||
return rtn;
|
|
||||||
}
|
|
||||||
|
|
||||||
const name = node["application.name"];
|
const name = node["application.name"];
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
|
@ -492,15 +458,9 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelec
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
const rawName = node["node.name"];
|
|
||||||
|
|
||||||
if (!name) {
|
|
||||||
rtn.push({ name: rawName, value: { "node.name": rawName } });
|
|
||||||
}
|
|
||||||
|
|
||||||
const binary = node["application.process.binary"];
|
const binary = node["application.process.binary"];
|
||||||
|
|
||||||
if (!name && binary) {
|
if (!name) {
|
||||||
rtn.push({ name: binary, value: { "application.process.binary": binary } });
|
rtn.push({ name: binary, value: { "application.process.binary": binary } });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,12 +469,10 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelec
|
||||||
const first = rtn[0];
|
const first = rtn[0];
|
||||||
const firstValues = first.value as Node;
|
const firstValues = first.value as Node;
|
||||||
|
|
||||||
if (pid) {
|
rtn.push({
|
||||||
rtn.push({
|
name: `${first.name} (${pid})`,
|
||||||
name: `${first.name} (${pid})`,
|
value: { ...firstValues, "application.process.id": pid }
|
||||||
value: { ...firstValues, "application.process.id": pid }
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const mediaName = node["media.name"];
|
const mediaName = node["media.name"];
|
||||||
|
|
||||||
|
@ -525,13 +483,17 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelec
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mediaClass) {
|
const mediaClass = node["media.class"];
|
||||||
rtn.push({
|
|
||||||
name: `${first.name} [${mediaClass}]`,
|
if (!mediaClass) {
|
||||||
value: { ...firstValues, "media.class": mediaClass }
|
return rtn;
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rtn.push({
|
||||||
|
name: `${first.name} [${mediaClass}]`,
|
||||||
|
value: { ...firstValues, "media.class": mediaClass }
|
||||||
|
});
|
||||||
|
|
||||||
return rtn;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,7 +535,6 @@ function updateItems(setSources: (s: AudioSources) => void, sources?: AudioSourc
|
||||||
function AudioSourcePickerLinux({
|
function AudioSourcePickerLinux({
|
||||||
includeSources,
|
includeSources,
|
||||||
excludeSources,
|
excludeSources,
|
||||||
deviceSelect,
|
|
||||||
granularSelect,
|
granularSelect,
|
||||||
openSettings,
|
openSettings,
|
||||||
setIncludeSources,
|
setIncludeSources,
|
||||||
|
@ -581,7 +542,6 @@ function AudioSourcePickerLinux({
|
||||||
}: {
|
}: {
|
||||||
includeSources?: AudioSources;
|
includeSources?: AudioSources;
|
||||||
excludeSources?: AudioSources;
|
excludeSources?: AudioSources;
|
||||||
deviceSelect?: boolean;
|
|
||||||
granularSelect?: boolean;
|
granularSelect?: boolean;
|
||||||
openSettings: () => void;
|
openSettings: () => void;
|
||||||
setIncludeSources: (s: AudioSources) => void;
|
setIncludeSources: (s: AudioSources) => void;
|
||||||
|
@ -632,7 +592,7 @@ function AudioSourcePickerLinux({
|
||||||
|
|
||||||
const allSources = sources.ok
|
const allSources = sources.ok
|
||||||
? [...specialSources, ...sources.targets]
|
? [...specialSources, ...sources.targets]
|
||||||
.map(target => mapToAudioItem(target, granularSelect, deviceSelect))
|
.map(target => mapToAudioItem(target, granularSelect))
|
||||||
.flat()
|
.flat()
|
||||||
.filter(uniqueName)
|
.filter(uniqueName)
|
||||||
: [];
|
: [];
|
||||||
|
|
|
@ -33,16 +33,15 @@
|
||||||
|
|
||||||
.vcd-screen-picker-grid label {
|
.vcd-screen-picker-grid label {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 8px;
|
padding: 4px 0px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
display: grid;
|
|
||||||
justify-items: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.vcd-screen-picker-grid label:hover {
|
.vcd-screen-picker-grid label:hover {
|
||||||
outline: 2px solid var(--brand-500);
|
outline: 2px solid var(--brand-500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.vcd-screen-picker-grid div {
|
.vcd-screen-picker-grid div {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
@ -102,6 +101,7 @@
|
||||||
.vcd-screen-picker-quality {
|
.vcd-screen-picker-quality {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 1em;
|
gap: 1em;
|
||||||
|
|
||||||
margin-bottom: 0.5em;
|
margin-bottom: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ const SettingsOptions: Record<string, Array<BooleanSetting | SettingsComponent>>
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
Notifications: [NotificationBadgeToggle],
|
Notifications: [NotificationBadgeToggle],
|
||||||
Miscellaneous: [
|
Miscelleanous: [
|
||||||
{
|
{
|
||||||
key: "arRPC",
|
key: "arRPC",
|
||||||
title: "Rich Presence",
|
title: "Rich Presence",
|
||||||
|
|
2
src/shared/settings.d.ts
vendored
2
src/shared/settings.d.ts
vendored
|
@ -30,8 +30,6 @@ export interface Settings {
|
||||||
|
|
||||||
audio?: {
|
audio?: {
|
||||||
workaround?: boolean;
|
workaround?: boolean;
|
||||||
|
|
||||||
deviceSelect?: boolean;
|
|
||||||
granularSelect?: boolean;
|
granularSelect?: boolean;
|
||||||
|
|
||||||
ignoreVirtual?: boolean;
|
ignoreVirtual?: boolean;
|
||||||
|
|
Reference in a new issue