CursorBuddy: oneko & friend(s) (#620)

* FatassHorse: add the horse

* CursorBuddy: wowie

* FatassHorse: removed !!

* Update index.tsx

---------

Co-authored-by: thororen1234 <78185467+thororen1234@users.noreply.github.com>
This commit is contained in:
nexpid 2026-01-01 02:33:05 +01:00 • committed by GitHub
parent c68f9e5d49
commit 5f3854284a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 139 additions and 69 deletions

View file

@ -0,0 +1,139 @@
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { definePluginSettings, migratePluginSettings } from "@api/Settings";
import { Devs, EquicordDevs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
const ONEKO_IMAGE = "https://raw.githubusercontent.com/adryd325/oneko.js/c4ee66353b11a44e4a5b7e914a81f8d33111555e/oneko.gif";
const ONEKO_SCRIPT = "https://raw.githubusercontent.com/adryd325/oneko.js/c4ee66353b11a44e4a5b7e914a81f8d33111555e/oneko.js";
const FATASS_HORSE = "https://raw.githubusercontent.com/nexpid/fatass-horse/351f158bfd8fafd44d9c17faad61f2a80bcd33e3/horse.js";
const settings = definePluginSettings({
buddy: {
description: "Pick a cursor buddy",
type: OptionType.SELECT,
options: [
{
label: "Oneko",
value: "oneko",
default: true
},
{
label: "Fatass Horse",
value: "fathorse"
}
],
onChange: load,
},
speed: {
description: "Speed of Da Cat :3",
type: OptionType.NUMBER,
default: 10,
isValid: (value: number) => value >= 0 || "Speed must be bigger than 0",
onChange: load,
},
fps: {
description: "Framerate of the fatass horse",
type: OptionType.NUMBER,
default: 24,
isValid: (value: number) => value > 0 || "Framerate must be bigger than 0",
onChange: load
},
size: {
description: "Size of the fatass horse",
type: OptionType.NUMBER,
default: 120,
isValid: (value: number) => value > 0 || "Size must be bigger than 0",
onChange: load
},
fade: {
description: "If the horse should fade when the cursor is near",
type: OptionType.BOOLEAN,
default: true,
onChange: load
},
freeroam: {
description: "If the horse should roam freely when idle",
type: OptionType.BOOLEAN,
default: true,
onChange: load
},
shake: {
description: "If the horse should shake the window when it's walking",
type: OptionType.BOOLEAN,
default: false,
onChange: load
},
}, {
fps: {
disabled() { return this.store.buddy !== "fathorse"; },
},
size: {
disabled() { return this.store.buddy !== "fathorse"; },
},
fade: {
disabled() { return this.store.buddy !== "fathorse"; },
},
freeroam: {
disabled() { return this.store.buddy !== "fathorse"; },
},
shake: {
disabled() { return this.store.buddy !== "fathorse"; },
}
});
function unload() {
if (settings.store.buddy === "oneko") document.getElementById("oneko")?.remove();
if (settings.store.buddy === "fathorse") document.getElementById("fathorse")?.remove();
}
function load() {
switch (settings.store.buddy) {
case "oneko": {
fetch(ONEKO_SCRIPT)
.then(x => x.text())
.then(s => s.replace("const nekoSpeed = 10;", `const nekoSpeed = ${settings.store.speed};`))
.then(s => s.replace("./oneko.gif", ONEKO_IMAGE)
.replace("(isReducedMotion)", "(false)"))
.then(eval);
break;
}
case "fathorse": {
fetch(FATASS_HORSE).then(x => x.text()).then(s => (0, eval)(s)({
speed: settings.store.speed,
fps: settings.store.fps,
size: settings.store.size,
fade: settings.store.fade,
freeroam: settings.store.freeroam,
shake: settings.store.shake
}));
}
}
}
migratePluginSettings("CursorBuddy", "Oneko", "oneko");
export default definePlugin({
name: "CursorBuddy",
description: "only a slightly annoying plugin",
authors: [Devs.Ven, Devs.adryd, EquicordDevs.nexpid],
settings,
start: load,
stop: unload,
});

View file

@ -1,69 +0,0 @@
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import { isPluginEnabled } from "@api/PluginManager";
import { definePluginSettings, migratePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";
const settings = definePluginSettings({
speed: {
description: "Speed of Da Cat :3",
type: OptionType.NUMBER,
default: 10,
isValid: (value: number) => {
if (value && value < 0) return "The number must be bigger than 0";
return true;
},
onChange: () => {
// note: cant call the start() function from here. so i just copy pasted it (This was pointed out in the last commit i made. So this is to just clear stuff up for any future devs that work on this :D )
if (isPluginEnabled("Oneko")) {
document.getElementById("oneko")?.remove();
fetch("https://raw.githubusercontent.com/adryd325/oneko.js/c4ee66353b11a44e4a5b7e914a81f8d33111555e/oneko.js")
.then(x => x.text())
.then(s => s.replace("const nekoSpeed = 10;", `const nekoSpeed = ${settings.store.speed};`))
.then(s => s.replace("./oneko.gif", "https://raw.githubusercontent.com/adryd325/oneko.js/c4ee66353b11a44e4a5b7e914a81f8d33111555e/oneko.gif")
.replace("(isReducedMotion)", "(false)"))
.then(eval);
}
return;
}
}
});
migratePluginSettings("Oneko", "oneko");
export default definePlugin({
name: "Oneko",
description: "cat follow mouse (real)",
// Listing adryd here because this literally just evals her script
authors: [Devs.Ven, Devs.adryd],
settings,
start() {
fetch("https://raw.githubusercontent.com/adryd325/oneko.js/c4ee66353b11a44e4a5b7e914a81f8d33111555e/oneko.js")
.then(x => x.text())
.then(s => s.replace("const nekoSpeed = 10;", `const nekoSpeed = ${settings.store.speed};`))
.then(s => s.replace("./oneko.gif", "https://raw.githubusercontent.com/adryd325/oneko.js/c4ee66353b11a44e4a5b7e914a81f8d33111555e/oneko.gif")
.replace("(isReducedMotion)", "(false)"))
.then(eval);
},
stop() {
document.getElementById("oneko")?.remove();
}
});