Merge branch 'main' into main
This commit is contained in:
		
						commit
						d99adcc951
					
				
					 8 changed files with 1481 additions and 722 deletions
				
			
		
							
								
								
									
										31
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -14,15 +14,29 @@ body: | ||||||
|               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" |               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, etc: Issue with your gpu. Nothing we can do, update drivers or disable hardware acceleration |               - Purely graphical glitches like flickering, scaling issues[^1] | ||||||
|  |               - 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 | ||||||
|               - **SCREENSHARE NOT STARTING** / black screening on Linux: Issue with your desktop environment, specifically its xdg-desktop-portal. |               - Captchas[^3] | ||||||
|                 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 opening URLs[^4] | ||||||
|  |               - 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: | ||||||
|  | @ -50,6 +64,15 @@ 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: | ||||||
|  | @ -85,7 +108,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 |           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: | |           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 | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							|  | @ -47,7 +47,12 @@ 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 }} | ||||||
|  |                 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@4614300d5812e5df91cb02ef0edbece623d5dea8 |         uses: vedantmgoyal2009/winget-releaser@0db4f0a478166abd0fa438c631849f0b8dcfb99f | ||||||
|         with: |         with: | ||||||
|           identifier: Vencord.Vesktop |           identifier: Vencord.Vesktop | ||||||
|           token: ${{ secrets.WINGET_PAT }} |           token: ${{ secrets.WINGET_PAT }} | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								package.json
									
									
									
									
									
								
							|  | @ -2,7 +2,7 @@ | ||||||
|     "name": "vesktop", |     "name": "vesktop", | ||||||
|     "version": "1.5.3", |     "version": "1.5.3", | ||||||
|     "private": true, |     "private": true, | ||||||
|     "description": "", |     "description": "Vesktop is a custom Discord desktop app", | ||||||
|     "keywords": [], |     "keywords": [], | ||||||
|     "homepage": "https://vencord.dev/", |     "homepage": "https://vencord.dev/", | ||||||
|     "license": "GPL-3.0", |     "license": "GPL-3.0", | ||||||
|  | @ -32,29 +32,29 @@ | ||||||
|     }, |     }, | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
|         "@fal-works/esbuild-plugin-global-externals": "^2.1.2", |         "@fal-works/esbuild-plugin-global-externals": "^2.1.2", | ||||||
|         "@types/node": "^20.11.26", |         "@types/node": "^20.14.11", | ||||||
|         "@types/react": "^18.2.0", |         "@types/react": "^18.3.3", | ||||||
|         "@typescript-eslint/eslint-plugin": "^7.2.0", |         "@typescript-eslint/eslint-plugin": "^7.17.0", | ||||||
|         "@typescript-eslint/parser": "^7.2.0", |         "@typescript-eslint/parser": "^7.17.0", | ||||||
|         "@vencord/types": "^1.8.4", |         "@vencord/types": "^1.8.4", | ||||||
|         "dotenv": "^16.4.5", |         "dotenv": "^16.4.5", | ||||||
|         "electron": "^31.1.0", |         "electron": "^31.2.1", | ||||||
|         "electron-builder": "^24.13.3", |         "electron-builder": "^25.0.1", | ||||||
|         "esbuild": "^0.20.1", |         "esbuild": "^0.20.2", | ||||||
|         "eslint": "^8.57.0", |         "eslint": "^8.57.0", | ||||||
|         "eslint-config-prettier": "^9.1.0", |         "eslint-config-prettier": "^9.1.0", | ||||||
|         "eslint-import-resolver-alias": "^1.1.2", |         "eslint-import-resolver-alias": "^1.1.2", | ||||||
|         "eslint-plugin-license-header": "^0.6.0", |         "eslint-plugin-license-header": "^0.6.1", | ||||||
|         "eslint-plugin-path-alias": "^1.0.0", |         "eslint-plugin-path-alias": "^1.1.0", | ||||||
|         "eslint-plugin-prettier": "^5.1.3", |         "eslint-plugin-prettier": "^5.2.1", | ||||||
|         "eslint-plugin-simple-import-sort": "^12.0.0", |         "eslint-plugin-simple-import-sort": "^12.1.1", | ||||||
|         "eslint-plugin-unused-imports": "^3.1.0", |         "eslint-plugin-unused-imports": "^3.2.0", | ||||||
|         "prettier": "^3.2.5", |         "prettier": "^3.3.3", | ||||||
|         "source-map-support": "^0.5.21", |         "source-map-support": "^0.5.21", | ||||||
|         "tsx": "^4.7.1", |         "tsx": "^4.16.2", | ||||||
|         "type-fest": "^4.12.0", |         "type-fest": "^4.23.0", | ||||||
|         "typescript": "^5.4.2", |         "typescript": "^5.5.4", | ||||||
|         "xml-formatter": "^3.6.2" |         "xml-formatter": "^3.6.3" | ||||||
|     }, |     }, | ||||||
|     "packageManager": "pnpm@9.1.0", |     "packageManager": "pnpm@9.1.0", | ||||||
|     "engines": { |     "engines": { | ||||||
|  | @ -124,13 +124,15 @@ | ||||||
|                     ] |                     ] | ||||||
|                 } |                 } | ||||||
|             ], |             ], | ||||||
|             "category": "Network", |             "category": "public.app-category.social-networking", | ||||||
|  |             "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", | ||||||
|  |  | ||||||
							
								
								
									
										2039
									
								
								pnpm-lock.yaml
									
									
									
									
									
								
							
							
						
						
									
										2039
									
								
								pnpm-lock.yaml
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -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 ? ["application.process.id"] : undefined) |         ?.list(granularSelect ? ["node.name"] : 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,7 +254,13 @@ function AudioSettingsModal({ | ||||||
|                 </Switch> |                 </Switch> | ||||||
|                 <Switch |                 <Switch | ||||||
|                     hideBorder |                     hideBorder | ||||||
|                     onChange={v => (Settings.audio = { ...Settings.audio, ignoreDevices: v })} |                     onChange={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.</>} | ||||||
|                 > |                 > | ||||||
|  | @ -271,6 +277,23 @@ 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}> | ||||||
|  | @ -423,6 +446,7 @@ 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 }))} | ||||||
|  | @ -441,13 +465,23 @@ 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): AudioItem[] { | function mapToAudioItem(node: AudioSource, granularSelect?: boolean, deviceSelect?: 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) { | ||||||
|  | @ -458,9 +492,15 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[ | ||||||
|         return rtn; |         return rtn; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const binary = node["application.process.binary"]; |     const rawName = node["node.name"]; | ||||||
| 
 | 
 | ||||||
|     if (!name) { |     if (!name) { | ||||||
|  |         rtn.push({ name: rawName, value: { "node.name": rawName } }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const binary = node["application.process.binary"]; | ||||||
|  | 
 | ||||||
|  |     if (!name && binary) { | ||||||
|         rtn.push({ name: binary, value: { "application.process.binary": binary } }); |         rtn.push({ name: binary, value: { "application.process.binary": binary } }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -469,10 +509,12 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[ | ||||||
|     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"]; | ||||||
| 
 | 
 | ||||||
|  | @ -483,16 +525,12 @@ function mapToAudioItem(node: AudioSource, granularSelect?: boolean): AudioItem[ | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const mediaClass = node["media.class"]; |     if (mediaClass) { | ||||||
| 
 |  | ||||||
|     if (!mediaClass) { |  | ||||||
|         return rtn; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|         rtn.push({ |         rtn.push({ | ||||||
|             name: `${first.name} [${mediaClass}]`, |             name: `${first.name} [${mediaClass}]`, | ||||||
|             value: { ...firstValues, "media.class": mediaClass } |             value: { ...firstValues, "media.class": mediaClass } | ||||||
|         }); |         }); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     return rtn; |     return rtn; | ||||||
| } | } | ||||||
|  | @ -535,6 +573,7 @@ function updateItems(setSources: (s: AudioSources) => void, sources?: AudioSourc | ||||||
| function AudioSourcePickerLinux({ | function AudioSourcePickerLinux({ | ||||||
|     includeSources, |     includeSources, | ||||||
|     excludeSources, |     excludeSources, | ||||||
|  |     deviceSelect, | ||||||
|     granularSelect, |     granularSelect, | ||||||
|     openSettings, |     openSettings, | ||||||
|     setIncludeSources, |     setIncludeSources, | ||||||
|  | @ -542,6 +581,7 @@ 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; | ||||||
|  | @ -592,7 +632,7 @@ function AudioSourcePickerLinux({ | ||||||
| 
 | 
 | ||||||
|     const allSources = sources.ok |     const allSources = sources.ok | ||||||
|         ? [...specialSources, ...sources.targets] |         ? [...specialSources, ...sources.targets] | ||||||
|               .map(target => mapToAudioItem(target, granularSelect)) |               .map(target => mapToAudioItem(target, granularSelect, deviceSelect)) | ||||||
|               .flat() |               .flat() | ||||||
|               .filter(uniqueName) |               .filter(uniqueName) | ||||||
|         : []; |         : []; | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								src/shared/settings.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/shared/settings.d.ts
									
									
									
									
										vendored
									
									
								
							|  | @ -30,6 +30,8 @@ export interface Settings { | ||||||
| 
 | 
 | ||||||
|     audio?: { |     audio?: { | ||||||
|         workaround?: boolean; |         workaround?: boolean; | ||||||
|  | 
 | ||||||
|  |         deviceSelect?: boolean; | ||||||
|         granularSelect?: boolean; |         granularSelect?: boolean; | ||||||
| 
 | 
 | ||||||
|         ignoreVirtual?: boolean; |         ignoreVirtual?: boolean; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Tuxinal
						Tuxinal