From 0514afe236e5a22150a8e227296d27b96160fafe Mon Sep 17 00:00:00 2001 From: nin0dev Date: Sat, 17 Feb 2024 05:43:10 -0500 Subject: [PATCH 1/4] Added settings for WebKeybinds You can now customize the keybinds that are readded by the plugin. --- src/plugins/webKeybinds.web/index.ts | 309 ++++++++++++++++++++++++++- 1 file changed, 308 insertions(+), 1 deletion(-) diff --git a/src/plugins/webKeybinds.web/index.ts b/src/plugins/webKeybinds.web/index.ts index 12d485aac..554f726d5 100644 --- a/src/plugins/webKeybinds.web/index.ts +++ b/src/plugins/webKeybinds.web/index.ts @@ -16,17 +16,324 @@ * along with this program. If not, see . */ +import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; -import definePlugin from "@utils/types"; +import definePlugin, { OptionType } from "@utils/types"; import { findByPropsLazy } from "@webpack"; import { ComponentDispatch, FluxDispatcher, NavigationRouter, SelectedGuildStore, SettingsRouter } from "@webpack/common"; +const settings = definePluginSettings({ + mainModifierKey: { + type: OptionType.SELECT, + description: "Main modifier key", + options: [ + { "label": "Ctrl/Cmd", "value": "ctrl", default: true }, + { "label": "Shift", "value": "shift" }, + { "label": "Alt", "value": "alt" } + ] as const + }, + quickSwitcherKey: { + type: OptionType.SELECT, + description: "Quick Switcher key", + options: [ + { "label": "Disable keybind", "value": "off" }, + { "label": "A", "value": "a" }, + { "label": "B", "value": "b" }, + { "label": "C", "value": "c" }, + { "label": "D", "value": "d" }, + { "label": "E", "value": "e" }, + { "label": "F", "value": "f" }, + { "label": "G", "value": "g" }, + { "label": "H", "value": "h" }, + { "label": "I", "value": "i" }, + { "label": "J", "value": "j" }, + { "label": "K", "value": "k" }, + { "label": "L", "value": "l" }, + { "label": "M", "value": "m" }, + { "label": "N", "value": "n" }, + { "label": "O", "value": "o" }, + { "label": "P", "value": "p" }, + { "label": "Q", "value": "q" }, + { "label": "R", "value": "r" }, + { "label": "S", "value": "s" }, + { "label": "T", "value": "t", default: true }, + { "label": "U", "value": "u" }, + { "label": "V", "value": "v" }, + { "label": "W", "value": "w" }, + { "label": "X", "value": "x" }, + { "label": "Y", "value": "y" }, + { "label": "Z", "value": "z" }, + { "label": "0", "value": "0" }, + { "label": "1", "value": "1" }, + { "label": "2", "value": "2" }, + { "label": "3", "value": "3" }, + { "label": "4", "value": "4" }, + { "label": "5", "value": "5" }, + { "label": "6", "value": "6" }, + { "label": "7", "value": "7" }, + { "label": "8", "value": "8" }, + { "label": "9", "value": "9" }, + { "label": "Tab", "value": "tab" }, + { "label": ",", "value": "comma" } + ] as const + }, + quickSwitcherModifierKey: { + type: OptionType.SELECT, + description: "Quick Switcher modifier key", + options: [ + { "label": "None", "value": "none", default: true }, + { "label": "Ctrl/Cmd", "value": "ctrl" }, + { "label": "Shift", "value": "shift" }, + { "label": "Alt", "value": "alt" } + ] as const + }, + createGroupDMKey: { + type: OptionType.SELECT, + description: "Create group DM key", + options: [ + { "label": "Disable keybind", "value": "off" }, + { "label": "A", "value": "a" }, + { "label": "B", "value": "b" }, + { "label": "C", "value": "c" }, + { "label": "D", "value": "d" }, + { "label": "E", "value": "e" }, + { "label": "F", "value": "f" }, + { "label": "G", "value": "g" }, + { "label": "H", "value": "h" }, + { "label": "I", "value": "i" }, + { "label": "J", "value": "j" }, + { "label": "K", "value": "k" }, + { "label": "L", "value": "l" }, + { "label": "M", "value": "m" }, + { "label": "N", "value": "n" }, + { "label": "O", "value": "o" }, + { "label": "P", "value": "p" }, + { "label": "Q", "value": "q" }, + { "label": "R", "value": "r" }, + { "label": "S", "value": "s" }, + { "label": "T", "value": "t", default: true }, + { "label": "U", "value": "u" }, + { "label": "V", "value": "v" }, + { "label": "W", "value": "w" }, + { "label": "X", "value": "x" }, + { "label": "Y", "value": "y" }, + { "label": "Z", "value": "z" }, + { "label": "0", "value": "0" }, + { "label": "1", "value": "1" }, + { "label": "2", "value": "2" }, + { "label": "3", "value": "3" }, + { "label": "4", "value": "4" }, + { "label": "5", "value": "5" }, + { "label": "6", "value": "6" }, + { "label": "7", "value": "7" }, + { "label": "8", "value": "8" }, + { "label": "9", "value": "9" }, + { "label": "Tab", "value": "tab" }, + { "label": ",", "value": "comma" } + ] as const + }, + createGroupDMModifierKey: { + type: OptionType.SELECT, + description: "Create group DM modifier key", + options: [ + { "label": "None", "value": "none" }, + { "label": "Ctrl/Cmd", "value": "ctrl" }, + { "label": "Shift", "value": "shift", default: true }, + { "label": "Alt", "value": "alt" } + ] as const + }, + switchNextServerKey: { + type: OptionType.SELECT, + description: "Switch to next server key", + options: [ + { "label": "Disable keybind", "value": "off" }, + { "label": "A", "value": "a" }, + { "label": "B", "value": "b" }, + { "label": "C", "value": "c" }, + { "label": "D", "value": "d" }, + { "label": "E", "value": "e" }, + { "label": "F", "value": "f" }, + { "label": "G", "value": "g" }, + { "label": "H", "value": "h" }, + { "label": "I", "value": "i" }, + { "label": "J", "value": "j" }, + { "label": "K", "value": "k" }, + { "label": "L", "value": "l" }, + { "label": "M", "value": "m" }, + { "label": "N", "value": "n" }, + { "label": "O", "value": "o" }, + { "label": "P", "value": "p" }, + { "label": "Q", "value": "q" }, + { "label": "R", "value": "r" }, + { "label": "S", "value": "s" }, + { "label": "T", "value": "t" }, + { "label": "U", "value": "u" }, + { "label": "V", "value": "v" }, + { "label": "W", "value": "w" }, + { "label": "X", "value": "x" }, + { "label": "Y", "value": "y" }, + { "label": "Z", "value": "z" }, + { "label": "0", "value": "0" }, + { "label": "1", "value": "1" }, + { "label": "2", "value": "2" }, + { "label": "3", "value": "3" }, + { "label": "4", "value": "4" }, + { "label": "5", "value": "5" }, + { "label": "6", "value": "6" }, + { "label": "7", "value": "7" }, + { "label": "8", "value": "8" }, + { "label": "9", "value": "9" }, + { "label": "Tab", "value": "tab", default: true }, + { "label": ",", "value": "comma" } + ] as const + }, + switchNextServerModifierKey: { + type: OptionType.SELECT, + description: "Switch to next server modifier key", + options: [ + { "label": "None", "value": "none", default: true }, + { "label": "Ctrl/Cmd", "value": "ctrl" }, + { "label": "Shift", "value": "shift" }, + { "label": "Alt", "value": "alt" } + ] as const + }, + switchPreviousServerKey: { + type: OptionType.SELECT, + description: "Switch to previous server key", + options: [ + { "label": "Disable keybind", "value": "off" }, + { "label": "A", "value": "a" }, + { "label": "B", "value": "b" }, + { "label": "C", "value": "c" }, + { "label": "D", "value": "d" }, + { "label": "E", "value": "e" }, + { "label": "F", "value": "f" }, + { "label": "G", "value": "g" }, + { "label": "H", "value": "h" }, + { "label": "I", "value": "i" }, + { "label": "J", "value": "j" }, + { "label": "K", "value": "k" }, + { "label": "L", "value": "l" }, + { "label": "M", "value": "m" }, + { "label": "N", "value": "n" }, + { "label": "O", "value": "o" }, + { "label": "P", "value": "p" }, + { "label": "Q", "value": "q" }, + { "label": "R", "value": "r" }, + { "label": "S", "value": "s" }, + { "label": "T", "value": "t" }, + { "label": "U", "value": "u" }, + { "label": "V", "value": "v" }, + { "label": "W", "value": "w" }, + { "label": "X", "value": "x" }, + { "label": "Y", "value": "y" }, + { "label": "Z", "value": "z" }, + { "label": "0", "value": "0" }, + { "label": "1", "value": "1" }, + { "label": "2", "value": "2" }, + { "label": "3", "value": "3" }, + { "label": "4", "value": "4" }, + { "label": "5", "value": "5" }, + { "label": "6", "value": "6" }, + { "label": "7", "value": "7" }, + { "label": "8", "value": "8" }, + { "label": "9", "value": "9" }, + { "label": "Tab", "value": "tab", default: true }, + { "label": ",", "value": "comma" } + ] as const + }, + switchPreviousServerModifierKey: { + type: OptionType.SELECT, + description: "Switch to previous server modifier key", + options: [ + { "label": "None", "value": "none" }, + { "label": "Ctrl/Cmd", "value": "ctrl" }, + { "label": "Shift", "value": "shift", default: true }, + { "label": "Alt", "value": "alt" } + ] as const + }, + switchServersFrom1To9Key: { + type: OptionType.SELECT, + description: "Switch from 1st to 9th servers key", + options: [ + { "label": "Disable keybind", "value": "off" }, + { "label": "1 to 9", "value": "1to9", default: true } + ] as const + }, + switchServersFrom1To9MModifierKey: { + type: OptionType.SELECT, + description: "Switch from 1st to 9th servers modifier key", + options: [ + { "label": "None", "value": "none", default: true }, + { "label": "Ctrl/Cmd", "value": "ctrl" }, + { "label": "Shift", "value": "shift" }, + { "label": "Alt", "value": "alt" } + ] as const + }, + openUserProfileKey: { + type: OptionType.SELECT, + description: "Open user profile key", + options: [ + { "label": "Disable keybind", "value": "off" }, + { "label": "A", "value": "a" }, + { "label": "B", "value": "b" }, + { "label": "C", "value": "c" }, + { "label": "D", "value": "d" }, + { "label": "E", "value": "e" }, + { "label": "F", "value": "f" }, + { "label": "G", "value": "g" }, + { "label": "H", "value": "h" }, + { "label": "I", "value": "i" }, + { "label": "J", "value": "j" }, + { "label": "K", "value": "k" }, + { "label": "L", "value": "l" }, + { "label": "M", "value": "m" }, + { "label": "N", "value": "n" }, + { "label": "O", "value": "o" }, + { "label": "P", "value": "p" }, + { "label": "Q", "value": "q" }, + { "label": "R", "value": "r" }, + { "label": "S", "value": "s" }, + { "label": "T", "value": "t" }, + { "label": "U", "value": "u" }, + { "label": "V", "value": "v" }, + { "label": "W", "value": "w" }, + { "label": "X", "value": "x" }, + { "label": "Y", "value": "y" }, + { "label": "Z", "value": "z" }, + { "label": "0", "value": "0" }, + { "label": "1", "value": "1" }, + { "label": "2", "value": "2" }, + { "label": "3", "value": "3" }, + { "label": "4", "value": "4" }, + { "label": "5", "value": "5" }, + { "label": "6", "value": "6" }, + { "label": "7", "value": "7" }, + { "label": "8", "value": "8" }, + { "label": "9", "value": "9" }, + { "label": "Tab", "value": "tab" }, + { "label": ",", "value": "comma", default: true } + ] as const + }, + openUserProfileModifierKey: { + type: OptionType.SELECT, + description: "Open user profile modifier key", + options: [ + { "label": "None", "value": "none", default: true }, + { "label": "Ctrl/Cmd", "value": "ctrl" }, + { "label": "Shift", "value": "shift" }, + { "label": "Alt", "value": "alt" } + ] as const + }, +}); + const KeyBinds = findByPropsLazy("JUMP_TO_GUILD", "SERVER_NEXT"); export default definePlugin({ name: "WebKeybinds", description: "Re-adds keybinds missing in the web version of Discord: ctrl+t, ctrl+shift+t, ctrl+tab, ctrl+shift+tab, ctrl+1-9, ctrl+,. Only works fully on Vesktop/ArmCord, not inside your browser", authors: [Devs.Ven], + settings, enabledByDefault: true, onKey(e: KeyboardEvent) { From 9a634ab999f193f1ccdd1f507e1586b34ee93da9 Mon Sep 17 00:00:00 2001 From: nin0dev Date: Sat, 17 Feb 2024 05:47:07 -0500 Subject: [PATCH 2/4] Added nin0-dev (hey thats me!) to the devs list --- src/utils/constants.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 55af93605..1cf4ddb95 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -410,7 +410,12 @@ export const Devs = /* #__PURE__*/ Object.freeze({ coolelectronics: { name: "coolelectronics", id: 696392247205298207n, - } + }, + nin0dev: + { + name: "nin0-dev", + id: 886685857560539176n, + }, } satisfies Record); // iife so #__PURE__ works correctly From 3f3f9677ca5bff347bc5625b7762111102c76d7e Mon Sep 17 00:00:00 2001 From: nin0dev Date: Sat, 17 Feb 2024 05:55:43 -0500 Subject: [PATCH 3/4] Added main modifier key changing --- src/plugins/webKeybinds.web/index.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/plugins/webKeybinds.web/index.ts b/src/plugins/webKeybinds.web/index.ts index 554f726d5..ed08aa3aa 100644 --- a/src/plugins/webKeybinds.web/index.ts +++ b/src/plugins/webKeybinds.web/index.ts @@ -337,9 +337,20 @@ export default definePlugin({ enabledByDefault: true, onKey(e: KeyboardEvent) { - const hasCtrl = e.ctrlKey || (e.metaKey && navigator.platform.includes("Mac")); + let hasModifierKey; + switch (settings.store.mainModifierKey) { + case "ctrl": + hasModifierKey = e.ctrlKey || (e.metaKey && navigator.platform.includes("Mac")); + break; + case "shift": + hasModifierKey = e.shiftKey; + break; + case "alt": + hasModifierKey = e.altKey; + break; + } - if (hasCtrl) switch (e.key) { + if (hasModifierKey) switch (e.key) { case "t": case "T": e.preventDefault(); From 265b580f95a0fd18c3af6ca0efbc99e1bc5f92b0 Mon Sep 17 00:00:00 2001 From: nin0dev Date: Sun, 26 May 2024 16:59:00 -0400 Subject: [PATCH 4/4] Update README.md --- README.md | 68 ++----------------------------------------------------- 1 file changed, 2 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index a43c9f834..d1a4a1e6f 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,3 @@ -# Vencord +# Ninacord -[![Codeberg Mirror](https://img.shields.io/static/v1?style=for-the-badge&label=Codeberg%20Mirror&message=codeberg.org/Vee/cord&color=2185D0&logo=data:image/png;base64,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)](https://codeberg.org/Vee/cord) - -The cutest Discord client mod - -| ![image](https://github.com/Vendicated/Vencord/assets/45497981/706722b1-32de-4d99-bee9-93993b504334) | -|:--:| -| A screenshot of vencord showcasing the [vencord-theme](https://github.com/synqat/vencord-theme) | - -## Features - -- Super easy to install (Download Installer, open, click install button, done) -- 100+ plugins built in: [See a list](https://vencord.dev/plugins) - - Some highlights: SpotifyControls, MessageLogger, Experiments, GameActivityToggle, Translate, NoTrack, QuickReply, Free Emotes/Stickers, PermissionsViewer, CustomCommands, ShowHiddenChannels, PronounDB -- Fairly lightweight despite the many inbuilt plugins -- Excellent Browser Support: Run Vencord in your Browser via extension or UserScript -- Works on any Discord branch: Stable, Canary or PTB all work (though for the best experience I recommend stable!) -- Custom CSS and Themes: Inbuilt css editor with support to import any css files (including BetterDiscord themes) -- Privacy friendly, blocks Discord analytics & crash reporting out of the box and has no telemetry -- Maintained very actively, broken plugins are usually fixed within 12 hours -- Settings sync: Keep your plugins and their settings synchronised between devices / apps (optional) - - -## Installing / Uninstalling - -Visit https://vencord.dev/download - -## Join our Support/Community Server - -https://discord.gg/D9uwnFnqmd - -## Sponsors - -| **Thanks a lot to all Vencord [sponsors](https://github.com/sponsors/Vendicated)!!** | -|:--:| -| [![](https://meow.vendicated.dev/sponsors.png)](https://github.com/sponsors/Vendicated) | -| *generated using [github-sponsor-graph](https://github.com/Vendicated/github-sponsor-graph)* | - - -## Star History - - - - - - Star History Chart - - - -## Disclaimer - -Discord is trademark of Discord Inc. and solely mentioned for the sake of descriptivity. -Mention of it does not imply any affiliation with or endorsement by Discord Inc. - -
-Using Vencord violates Discord's terms of service - -Client modifications are against Discord’s Terms of Service. - -However, Discord is pretty indifferent about them and there are no known cases of users getting banned for using client mods! So you should generally be fine as long as you don’t use any plugins that implement abusive behaviour. But no worries, all inbuilt plugins are safe to use! - -Regardless, if your account is very important to you and it getting disabled would be a disaster for you, you should probably not use any client mods (not exclusive to Vencord), just to be safe - -Additionally, make sure not to post screenshots with Vencord in a server where you might get banned for it - -
+This is [Vencord](https://github.com/Vendicated/Vencord) fork I use to make PRs