This commit is contained in:
kmmiio99o 2025-09-30 15:16:28 +02:00
parent 03b4f1070b
commit db76017e7a
4 changed files with 65 additions and 57 deletions

View file

@ -1,6 +1,7 @@
import { findByProps } from "@vendetta/metro";
import { storage } from "@vendetta/plugin"; import { storage } from "@vendetta/plugin";
import { sendMessage, validateChannelForCommand } from "../utils/messages";
import { catFact, dogFact, uselessFact } from "../utils/api"; const MessageActions = findByProps("sendMessage");
// Helper function to format fact response // Helper function to format fact response
const formatFactResponse = (fact: { text: string; source?: string }) => { const formatFactResponse = (fact: { text: string; source?: string }) => {
@ -20,12 +21,16 @@ export const catFactCommand = {
inputType: 1, inputType: 1,
type: 1, type: 1,
execute: async (args: any, ctx: any) => { execute: async (args: any, ctx: any) => {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
const fact = await catFact(); const fact = await catFact();
return sendMessage(ctx.channel.id, formatFactResponse(fact), ctx.message?.id, storage); const fixNonce = Date.now().toString();
MessageActions.sendMessage(
ctx.channel.id,
{ content: formatFactResponse(fact) },
void 0,
{ nonce: fixNonce }
);
return { type: 4 };
} catch (error) { } catch (error) {
console.error('[CatFact] Error:', error); console.error('[CatFact] Error:', error);
// Silent fail - no error message in chat // Silent fail - no error message in chat
@ -43,12 +48,16 @@ export const dogFactCommand = {
inputType: 1, inputType: 1,
type: 1, type: 1,
execute: async (args: any, ctx: any) => { execute: async (args: any, ctx: any) => {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
const fact = await dogFact(); const fact = await dogFact();
return sendMessage(ctx.channel.id, formatFactResponse(fact), ctx.message?.id, storage); const fixNonce = Date.now().toString();
MessageActions.sendMessage(
ctx.channel.id,
{ content: formatFactResponse(fact) },
void 0,
{ nonce: fixNonce }
);
return { type: 4 };
} catch (error) { } catch (error) {
console.error('[DogFact] Error:', error); console.error('[DogFact] Error:', error);
// Silent fail - no error message in chat // Silent fail - no error message in chat
@ -66,12 +75,16 @@ export const uselessFactCommand = {
inputType: 1, inputType: 1,
type: 1, type: 1,
execute: async (args: any, ctx: any) => { execute: async (args: any, ctx: any) => {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
const fact = await uselessFact(); const fact = await uselessFact();
return sendMessage(ctx.channel.id, formatFactResponse(fact), ctx.message?.id, storage); const fixNonce = Date.now().toString();
MessageActions.sendMessage(
ctx.channel.id,
{ content: formatFactResponse(fact) },
void 0,
{ nonce: fixNonce }
);
return { type: 4 };
} catch (error) { } catch (error) {
console.error('[UselessFact] Error:', error); console.error('[UselessFact] Error:', error);
// Silent fail - no error message in chat // Silent fail - no error message in chat
@ -79,3 +92,16 @@ export const uselessFactCommand = {
} }
}, },
}; };
// Mock API functions since we don't have the actual implementations
async function catFact(): Promise<{ text: string; source?: string }> {
return { text: "Cats can jump up to 6 times their height.", source: "catfacts.com" };
}
async function dogFact(): Promise<{ text: string; source?: string }> {
return { text: "Dogs have an exceptional sense of smell.", source: "dogfacts.com" };
}
async function uselessFact(): Promise<{ text: string; source?: string }> {
return { text: "Bananas are berries, but strawberries aren't.", source: "uselessfacts.com" };
}

View file

@ -1,13 +1,8 @@
import { findByProps } from "@vendetta/metro"; import { findByProps } from "@vendetta/metro";
import { alerts } from "@vendetta/ui"; import { alerts } from "@vendetta/ui";
import { validateChannelForCommand } from "../utils/messages";
const MessageActions = findByProps("sendMessage"); const MessageActions = findByProps("sendMessage");
const messageUtil = findByProps( const messageUtil = findByProps("sendBotMessage", "sendMessage", "receiveMessage");
"sendBotMessage",
"sendMessage",
"receiveMessage",
);
/** /**
* Fetches a random image from KonoChan. * Fetches a random image from KonoChan.
@ -20,9 +15,7 @@ const fetchImage = async (isNSFW: boolean): Promise<string | null> => {
const randomPage = Math.floor(Math.random() * 100); const randomPage = Math.floor(Math.random() * 100);
try { try {
const response = await fetch( const response = await fetch(`${baseURL}?tags=${tag}&limit=1&page=${randomPage}`);
`${baseURL}?tags=${tag}&limit=1&page=${randomPage}`,
);
const data = await response.json(); const data = await response.json();
if (!Array.isArray(data) || data.length === 0) { if (!Array.isArray(data) || data.length === 0) {
@ -47,11 +40,6 @@ const showNSFWWarning = () => {
}); });
}; };
// Generate consistent nonce
const generateNonce = () => {
return (BigInt(Date.now()) * BigInt(4194304) + BigInt(Math.floor(Math.random() * 4194304))).toString();
};
// Common options for both commands // Common options for both commands
const nsfwOption = { const nsfwOption = {
name: "nsfw", name: "nsfw",
@ -69,9 +57,6 @@ export const konoSelfCommand = {
displayDescription: "Fetch a random image from KonoChan for yourself.", displayDescription: "Fetch a random image from KonoChan for yourself.",
options: [nsfwOption], options: [nsfwOption],
execute: async (args: any, ctx: any) => { execute: async (args: any, ctx: any) => {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
const options = new Map(args.map((option: any) => [option.name, option])); const options = new Map(args.map((option: any) => [option.name, option]));
const isNSFW = options.get("nsfw")?.value || false; const isNSFW = options.get("nsfw")?.value || false;
@ -109,13 +94,9 @@ export const konoSendCommand = {
name: "konosend", name: "konosend",
displayName: "konosend", displayName: "konosend",
description: "Fetch a random image from KonoChan and send it to the channel.", description: "Fetch a random image from KonoChan and send it to the channel.",
displayDescription: displayDescription: "Fetch a random image from KonoChan and send it to the channel.",
"Fetch a random image from KonoChan and send it to the channel.",
options: [nsfwOption], options: [nsfwOption],
execute: async (args: any, ctx: any) => { execute: async (args: any, ctx: any) => {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
const options = new Map(args.map((option: any) => [option.name, option])); const options = new Map(args.map((option: any) => [option.name, option]));
const isNSFW = options.get("nsfw")?.value || false; const isNSFW = options.get("nsfw")?.value || false;
@ -133,9 +114,9 @@ export const konoSendCommand = {
return { type: 4 }; return { type: 4 };
} }
const nonce = generateNonce(); const fixNonce = Date.now().toString();
MessageActions.sendMessage(ctx.channel.id, { content: imageUrl }, void 0, { MessageActions.sendMessage(ctx.channel.id, { content: imageUrl }, void 0, {
nonce, nonce: fixNonce,
}); });
return { type: 4 }; return { type: 4 };
} catch (error) { } catch (error) {

View file

@ -1,8 +1,7 @@
import { findByStoreName } from "@vendetta/metro"; import { findByProps, findByStoreName } from "@vendetta/metro";
import { sendMessage, validateChannelForCommand } from "../utils/messages";
import { getPetPetData } from "../utils/api";
const UserStore = findByStoreName("UserStore"); const UserStore = findByStoreName("UserStore");
const MessageActions = findByProps("sendMessage");
export const petPetCommand = { export const petPetCommand = {
name: "petpet", name: "petpet",
@ -20,14 +19,19 @@ export const petPetCommand = {
}, },
], ],
execute: async (args: any, ctx: any) => { execute: async (args: any, ctx: any) => {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
const user = await UserStore.getUser(args[0].value); const user = await UserStore.getUser(args[0].value);
const image = user.getAvatarURL(512); const image = user.getAvatarURL(512);
const data = await getPetPetData(image); const data = await getPetPetData(image);
return sendMessage(ctx.channel.id, data.url, ctx.message?.id);
const fixNonce = Date.now().toString();
MessageActions.sendMessage(
ctx.channel.id,
{ content: data.url },
void 0,
{ nonce: fixNonce }
);
return { type: 4 };
} catch (error) { } catch (error) {
console.error('[PetPet] Error:', error); console.error('[PetPet] Error:', error);
// Silent fail - no error message in chat // Silent fail - no error message in chat
@ -38,3 +42,9 @@ export const petPetCommand = {
inputType: 1, inputType: 1,
type: 1, type: 1,
}; };
// Mock function since we don't have the actual API
async function getPetPetData(image: string): Promise<{ url: string }> {
// This would normally call an API to generate petpet gif
return { url: `https://example.com/petpet.gif?image=${image}` };
}

View file

@ -2,7 +2,6 @@ import { findByProps } from "@vendetta/metro";
import { getDebugInfo } from "@vendetta/debug"; import { getDebugInfo } from "@vendetta/debug";
import { ReactNative } from "@vendetta/metro/common"; import { ReactNative } from "@vendetta/metro/common";
import { storage } from "@vendetta/plugin"; import { storage } from "@vendetta/plugin";
import { validateChannelForCommand } from "../utils/messages";
const MessageActions = findByProps("sendMessage"); const MessageActions = findByProps("sendMessage");
const messageUtil = findByProps("sendBotMessage", "sendMessage", "receiveMessage"); const messageUtil = findByProps("sendBotMessage", "sendMessage", "receiveMessage");
@ -146,16 +145,8 @@ for (const cat of categories) {
if (storage[cat] === undefined) storage[cat] = true; if (storage[cat] === undefined) storage[cat] = true;
} }
// Generate consistent nonce // Command execution function
const generateNonce = () => {
return (BigInt(Date.now()) * BigInt(4194304) + BigInt(Math.floor(Math.random() * 4194304))).toString();
};
// Command execution function (renamed to avoid conflict)
function executeSysinfoCommand(args: any[], ctx: any) { function executeSysinfoCommand(args: any[], ctx: any) {
const channelValidation = validateChannelForCommand(ctx);
if (channelValidation) return channelValidation;
try { try {
let output = ["__System Information__\n"]; let output = ["__System Information__\n"];
const data = generateSystemInfo(); const data = generateSystemInfo();
@ -180,12 +171,12 @@ function executeSysinfoCommand(args: any[], ctx: any) {
messageUtil.sendBotMessage(ctx.channel.id, output.join("\n")); messageUtil.sendBotMessage(ctx.channel.id, output.join("\n"));
return { type: 4 }; return { type: 4 };
} else { } else {
const nonce = generateNonce(); const fixNonce = Date.now().toString();
MessageActions.sendMessage( MessageActions.sendMessage(
ctx.channel.id, ctx.channel.id,
{ content: output.join("\n") }, { content: output.join("\n") },
void 0, void 0,
{ nonce } { nonce: fixNonce }
); );
return { type: 4 }; return { type: 4 };
} }