From 95c82214c6553a24db7c236285017421dfa7c35a Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Fri, 7 Nov 2025 22:29:13 +0200 Subject: [PATCH 01/12] chore: bump version --- scripts/build.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build.mjs b/scripts/build.mjs index 43283cc..4c16f2e 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -74,7 +74,7 @@ const config = { constModules: { globals: { "bunny-build-info": { - version: `"v1.3.6"` + version: `"v1.3.7"` } } }, From af1718b71e7c6f70e96fa07ab1e6a22f386931cb Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Mon, 10 Nov 2025 22:12:37 +0100 Subject: [PATCH 02/12] plugins: added fix to certain plugins that go against tos --- src/lib/addons/plugins/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index 762e0d9..45a3eae 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -392,6 +392,10 @@ export async function initPlugins() { // Now, start all enabled plugins... Promise.allSettled([...registeredPlugins.keys()].map(async id => { if (isPluginEnabled(id)) { + if (id === "FakeMessageComposer") { + console.log("FakeMessageComposer is broken"); + return; + } startPlugin(id); } })); From 9fdb57ed31ad8c9490a2688832885f9dce4bef0e Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Mon, 10 Nov 2025 22:18:56 +0100 Subject: [PATCH 03/12] Update src/lib/addons/plugins/index.ts --- src/lib/addons/plugins/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index 45a3eae..a7a372d 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -392,6 +392,7 @@ export async function initPlugins() { // Now, start all enabled plugins... Promise.allSettled([...registeredPlugins.keys()].map(async id => { if (isPluginEnabled(id)) { + alert(id) if (id === "FakeMessageComposer") { console.log("FakeMessageComposer is broken"); return; From bbdc32cd84236c398ca3f7a7873fa13f41260844 Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Mon, 10 Nov 2025 22:21:51 +0100 Subject: [PATCH 04/12] Update src/lib/addons/plugins/index.ts --- src/lib/addons/plugins/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index a7a372d..b614182 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -392,11 +392,11 @@ export async function initPlugins() { // Now, start all enabled plugins... Promise.allSettled([...registeredPlugins.keys()].map(async id => { if (isPluginEnabled(id)) { - alert(id) if (id === "FakeMessageComposer") { console.log("FakeMessageComposer is broken"); return; } + alert(id) startPlugin(id); } })); From bf271980d8ed3c4b4708f39a407a28d4e243ed06 Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Mon, 10 Nov 2025 22:28:20 +0100 Subject: [PATCH 05/12] Update src/lib/addons/plugins/index.ts --- src/lib/addons/plugins/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index b614182..8415706 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -396,7 +396,7 @@ export async function initPlugins() { console.log("FakeMessageComposer is broken"); return; } - alert(id) + startPlugin(id); } })); From 4502b6688022b2fe5ba1870bb2bc5e8afa93a6fe Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Mon, 10 Nov 2025 22:42:29 +0100 Subject: [PATCH 06/12] Update src/lib/addons/plugins/index.ts --- src/lib/addons/plugins/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index 8415706..6846b23 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -324,6 +324,7 @@ export async function startPlugin(id: string, { throwIfDisabled = false, disable // Stage three (of external plugins), start the plugin try { + alert(id) pluginInstance.start?.(); pluginSettings[id]!.enabled = true; } catch (error) { From d3b6e9fb637b949062d888c9fde681f76119c902 Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Mon, 10 Nov 2025 22:45:22 +0100 Subject: [PATCH 07/12] Update src/lib/addons/plugins/index.ts --- src/lib/addons/plugins/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index 6846b23..1fc7fed 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -324,7 +324,7 @@ export async function startPlugin(id: string, { throwIfDisabled = false, disable // Stage three (of external plugins), start the plugin try { - alert(id) + pluginInstance.start?.(); pluginSettings[id]!.enabled = true; } catch (error) { From 261326ff22aa4213d7f406661065001ea9f99bf2 Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Tue, 11 Nov 2025 21:44:53 +0200 Subject: [PATCH 08/12] feat(quickinstall): changed repos to kettu and (unrelated) added a check for malicous plugins --- src/core/plugins/quickinstall/forumPost.tsx | 8 ++++---- src/core/vendetta/plugins.ts | 7 ++++++- src/lib/addons/plugins/index.ts | 7 +------ src/lib/addons/plugins/types.ts | 1 + src/lib/utils/constants.ts | 5 ++++- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/core/plugins/quickinstall/forumPost.tsx b/src/core/plugins/quickinstall/forumPost.tsx index 25665ad..9cf8da4 100644 --- a/src/core/plugins/quickinstall/forumPost.tsx +++ b/src/core/plugins/quickinstall/forumPost.tsx @@ -5,7 +5,7 @@ import { installTheme, removeTheme, themes } from "@lib/addons/themes"; import { findAssetId } from "@lib/api/assets"; import { isThemeSupported } from "@lib/api/native/loader"; import { after } from "@lib/api/patcher"; -import { HTTP_REGEX_MULTI, VD_DISCORD_SERVER_ID, VD_PLUGINS_CHANNEL_ID, VD_PROXY_PREFIX, VD_THEMES_CHANNEL_ID } from "@lib/utils/constants"; +import { HTTP_REGEX_MULTI, KETTU_DISCORD_SERVER_ID, KETTU_PLUGINS_CHANNEL_ID, KETTU_THEMES_CHANNEL_ID, VD_DISCORD_SERVER_ID, VD_PLUGINS_CHANNEL_ID, VD_PROXY_PREFIX, VD_THEMES_CHANNEL_ID } from "@lib/utils/constants"; import { lazyDestructure } from "@lib/utils/lazy"; import { Button } from "@metro/common/components"; import { findByProps, findByPropsLazy } from "@metro/wrappers"; @@ -39,13 +39,13 @@ const postMap = { }; function useExtractThreadContent(thread: any, _firstMessage = null, actionSheet = false): ([PostType, string]) | void { - if (thread.guild_id !== VD_DISCORD_SERVER_ID) return; + if (thread.guild_id !== KETTU_DISCORD_SERVER_ID) return; // Determine what type of addon this is. let postType: PostType; - if (thread.parent_id === VD_PLUGINS_CHANNEL_ID) { + if (thread.parent_id === KETTU_PLUGINS_CHANNEL_ID) { postType = "Plugin"; - } else if (thread.parent_id === VD_THEMES_CHANNEL_ID && isThemeSupported()) { + } else if (thread.parent_id === KETTU_THEMES_CHANNEL_ID && isThemeSupported()) { postType = "Theme"; } else return; diff --git a/src/core/vendetta/plugins.ts b/src/core/vendetta/plugins.ts index e8c065c..e47f335 100644 --- a/src/core/vendetta/plugins.ts +++ b/src/core/vendetta/plugins.ts @@ -110,6 +110,11 @@ export const VdPluginManager = { async startPlugin(id: string) { if (!id.endsWith("/")) id += "/"; const plugin = plugins[id]; + // this is to counter a plugin that violates TOS, a true reason will be provided as an error soon but some trolling is fun :3 + if (plugin.id === "https://heartdevv.github.io/plugin-template/template" || plugin.id === "https://heartdevv.github.io/plugin-template/template/") { + alert(`The plugin '${plugin.id}' is broken, please contact the developer to fix it'`); + return + } if (!plugin) throw new Error("Attempted to start non-existent plugin"); try { @@ -182,4 +187,4 @@ export const VdPluginManager = { }, getSettings: (id: string) => pluginInstance[id]?.settings -}; +}; \ No newline at end of file diff --git a/src/lib/addons/plugins/index.ts b/src/lib/addons/plugins/index.ts index 1fc7fed..366d9be 100644 --- a/src/lib/addons/plugins/index.ts +++ b/src/lib/addons/plugins/index.ts @@ -393,12 +393,7 @@ export async function initPlugins() { // Now, start all enabled plugins... Promise.allSettled([...registeredPlugins.keys()].map(async id => { if (isPluginEnabled(id)) { - if (id === "FakeMessageComposer") { - console.log("FakeMessageComposer is broken"); - return; - } - startPlugin(id); } })); -} +} \ No newline at end of file diff --git a/src/lib/addons/plugins/types.ts b/src/lib/addons/plugins/types.ts index 0b6baea..17894ed 100644 --- a/src/lib/addons/plugins/types.ts +++ b/src/lib/addons/plugins/types.ts @@ -24,6 +24,7 @@ export interface PluginSettingsStorage { } export interface BunnyPluginManifest extends BunnyManifest { + name: string; readonly type: "plugin"; readonly spec: 3; readonly main: string; diff --git a/src/lib/utils/constants.ts b/src/lib/utils/constants.ts index 834756d..2cdd23b 100644 --- a/src/lib/utils/constants.ts +++ b/src/lib/utils/constants.ts @@ -8,9 +8,12 @@ export const BUNNY_PROXY_PREFIX = "https://bn-plugins.github.io/vd-proxy"; export const NEXPID_PLUGINS_REPO_URL = "https://revenge.nexpid.xyz"; //export const OFFICIAL_PLUGINS_REPO_URL = "https://bn-plugins.github.io/dist/repo.json"; -export const OFFICIAL_PLUGINS_REPO_URL = "https://raw.githubusercontent.com/Purple-EyeZ/Plugins-List/refs/heads/main/src/plugins-data.json"; +export const OFFICIAL_PLUGINS_REPO_URL = ""; export const VD_PROXY_PREFIX = "https://vd-plugins.github.io/proxy"; export const VD_DISCORD_SERVER_ID = "1015931589865246730"; export const VD_PLUGINS_CHANNEL_ID = "1091880384561684561"; export const VD_THEMES_CHANNEL_ID = "1091880434939482202"; +export const KETTU_DISCORD_SERVER_ID = "1368145952266911755"; +export const KETTU_PLUGINS_CHANNEL_ID = "1432796541210333284"; +export const KETTU_THEMES_CHANNEL_ID = "1408405946434195540"; \ No newline at end of file From 145a74cba543778a0bbaf96478cddbc45795b3d4 Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Tue, 11 Nov 2025 21:46:57 +0200 Subject: [PATCH 09/12] chore: correct spelling --- src/core/vendetta/plugins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/vendetta/plugins.ts b/src/core/vendetta/plugins.ts index e47f335..8fc7d9f 100644 --- a/src/core/vendetta/plugins.ts +++ b/src/core/vendetta/plugins.ts @@ -112,7 +112,7 @@ export const VdPluginManager = { const plugin = plugins[id]; // this is to counter a plugin that violates TOS, a true reason will be provided as an error soon but some trolling is fun :3 if (plugin.id === "https://heartdevv.github.io/plugin-template/template" || plugin.id === "https://heartdevv.github.io/plugin-template/template/") { - alert(`The plugin '${plugin.id}' is broken, please contact the developer to fix it'`); + alert(`The plugin '${plugin.id}' is broken, please contact the developer to fix it`); return } if (!plugin) throw new Error("Attempted to start non-existent plugin"); From 1baece6f632e1d7491a50e2cb1f2390e4ed0bf46 Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Wed, 12 Nov 2025 17:54:00 +0200 Subject: [PATCH 10/12] fix(plugins): update list of plugins blocked in vendetta --- src/core/vendetta/plugins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/vendetta/plugins.ts b/src/core/vendetta/plugins.ts index 8fc7d9f..b6d380a 100644 --- a/src/core/vendetta/plugins.ts +++ b/src/core/vendetta/plugins.ts @@ -111,7 +111,7 @@ export const VdPluginManager = { if (!id.endsWith("/")) id += "/"; const plugin = plugins[id]; // this is to counter a plugin that violates TOS, a true reason will be provided as an error soon but some trolling is fun :3 - if (plugin.id === "https://heartdevv.github.io/plugin-template/template" || plugin.id === "https://heartdevv.github.io/plugin-template/template/") { + if (plugin.id.includes("heartdevv") == true) { alert(`The plugin '${plugin.id}' is broken, please contact the developer to fix it`); return } From a6564e20a4fe4601b1a219d2dd8ca5eca2a913dd Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Thu, 13 Nov 2025 18:03:15 +0200 Subject: [PATCH 11/12] fix(plugins): fix vendetta plugin list --- src/core/vendetta/plugins.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/core/vendetta/plugins.ts b/src/core/vendetta/plugins.ts index b6d380a..f95f0f2 100644 --- a/src/core/vendetta/plugins.ts +++ b/src/core/vendetta/plugins.ts @@ -110,11 +110,9 @@ export const VdPluginManager = { async startPlugin(id: string) { if (!id.endsWith("/")) id += "/"; const plugin = plugins[id]; - // this is to counter a plugin that violates TOS, a true reason will be provided as an error soon but some trolling is fun :3 - if (plugin.id.includes("heartdevv") == true) { - alert(`The plugin '${plugin.id}' is broken, please contact the developer to fix it`); - return - } + if (plugin.id.includes("heartdevv") == true || plugin.id.includes("helloworldsmother") == true || plugin.id.includes("messaging") == true) { + return + } if (!plugin) throw new Error("Attempted to start non-existent plugin"); try { From 022ee030d6e1cf533032770794bc78747db4cc6d Mon Sep 17 00:00:00 2001 From: cocobo1 Date: Fri, 14 Nov 2025 18:34:32 +0200 Subject: [PATCH 12/12] settings: fix settings ui --- src/lib/ui/settings/patches/tabs.tsx | 33 +++++++++++++++++----------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/lib/ui/settings/patches/tabs.tsx b/src/lib/ui/settings/patches/tabs.tsx index afe93b5..04d341d 100644 --- a/src/lib/ui/settings/patches/tabs.tsx +++ b/src/lib/ui/settings/patches/tabs.tsx @@ -80,19 +80,26 @@ export function patchTabsUI(unpatches: (() => void | boolean)[]) { }); }); - unpatches.push(after("default", SettingsOverviewScreen, (_, ret) => { - if (useIsFirstRender()) return; // :shrug: - - const { sections } = findInReactTree(ret, i => i.props?.sections).props; - // Credit to @palmdevs - https://discord.com/channels/1196075698301968455/1243605828783571024/1307940348378742816 - let index = -~sections.findIndex((i: any) => i.settings.includes("ACCOUNT")) || 1; +const createListModule = findByPropsLazy("createList"); +unpatches.push(after("createList", createListModule, function(args, ret) { + const [config] = args; + + if (config?.sections && Array.isArray(config.sections)) { + const sections = config.sections; + let index = -~sections.findIndex((i: any) => i.settings?.includes("ACCOUNT")) || 1; + Object.keys(registeredSections).forEach(sect => { - sections.splice(index++, 0, { - label: sect, - title: sect, - settings: registeredSections[sect].map(a => a.key) - }); + const alreadyExists = sections.some((s: any) => s.label === sect); + if (!alreadyExists) { + sections.splice(index++, 0, { + label: sect, + title: sect, + settings: registeredSections[sect].map(a => a.key) + }); + } }); - })); -} + } + + return ret; +}))}; \ No newline at end of file