mirror of
https://github.com/HugeFrog24/shakethefrog.git
synced 2026-03-02 08:24:33 +00:00
RCE fix
This commit is contained in:
@@ -1,14 +1,36 @@
|
||||
export const appConfig = {
|
||||
name: 'Shake the Frog',
|
||||
description: 'A fun interactive frog that reacts to shaking!',
|
||||
url: 'https://shakethefrog.vercel.app',
|
||||
url: 'https://shakethefrog.com',
|
||||
assets: {
|
||||
favicon: '/images/frog.svg',
|
||||
ogImage: {
|
||||
width: 1200,
|
||||
height: 630,
|
||||
bgColor: '#f0fdf4',
|
||||
textColor: '#374151'
|
||||
bgColor: '#c9ffda',
|
||||
textColor: '#000000'
|
||||
}
|
||||
}
|
||||
} as const
|
||||
},
|
||||
skins: {
|
||||
frog: {
|
||||
id: 'frog',
|
||||
name: 'Frog',
|
||||
normal: '/images/frog.svg',
|
||||
shaken: '/images/frog-shaken.svg'
|
||||
},
|
||||
mandarin: {
|
||||
id: 'mandarin',
|
||||
name: 'Mandarin',
|
||||
normal: '/images/mandarin.svg',
|
||||
// TODO: Create a proper shaken version of the mandarin skin
|
||||
shaken: '/images/mandarin.svg' // Using the same image for both states until a shaken version is created
|
||||
},
|
||||
beaver: {
|
||||
id: 'beaver',
|
||||
name: 'Beaver',
|
||||
normal: '/images/beaver.svg',
|
||||
shaken: '/images/beaver-shaken.svg'
|
||||
}
|
||||
},
|
||||
defaultSkin: 'frog'
|
||||
} as const
|
||||
14
app/config/emojis.ts
Normal file
14
app/config/emojis.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
// Define our curated emoji pool
|
||||
const emojiPool = [
|
||||
'💫', '💝', '💘', '💖', '💕',
|
||||
'💓', '💗', '💞', '✨', '🌟',
|
||||
'🔥', '👼', '⭐', '💎', '💨',
|
||||
'🎉', '🕸️', '🤗', '💋', '😘',
|
||||
'🫂', '👫', '💟', '💌', '🥰',
|
||||
'😍', '🥺', '😢', '😭'
|
||||
];
|
||||
|
||||
// Helper function to get a random emoji
|
||||
export function getRandomEmoji(): string {
|
||||
return emojiPool[Math.floor(Math.random() * emojiPool.length)];
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
export const frogMessages = [
|
||||
"Again! Again! ",
|
||||
"Almost got me! ",
|
||||
"Can't catch your breath? ",
|
||||
"Catch me if you can! ",
|
||||
"Chase me! ",
|
||||
"Claim me! ",
|
||||
"Come closer! ",
|
||||
"Do it again! ",
|
||||
"Don't stop now! ",
|
||||
"Faster! Faster! ",
|
||||
"Give me all you've got! ",
|
||||
"Higher! Higher! ",
|
||||
"I can dance all day! ",
|
||||
"I can't get enough! ",
|
||||
"I can't resist you! ",
|
||||
"I crave your touch! ",
|
||||
"I feel dizzy! ",
|
||||
"I like your style! ",
|
||||
"I love this game! ",
|
||||
"I need you! ",
|
||||
"I surrender to you! ",
|
||||
"I want more! ",
|
||||
"I yearn for your touch! ",
|
||||
"I'm a furnace for you! ",
|
||||
"I'm a raging inferno! ",
|
||||
"I'm addicted to you! ",
|
||||
"I'm all yours! ",
|
||||
"I'm burning up! ",
|
||||
"I'm completely yours! ",
|
||||
"I'm consumed by you! ",
|
||||
"I'm floating on air! ",
|
||||
"I'm getting dizzy! ",
|
||||
"I'm getting excited! ",
|
||||
"I'm getting hot! ",
|
||||
"I'm having a blast! ",
|
||||
"I'm having a blast! ",
|
||||
"I'm hooked on you! ",
|
||||
"I'm in a tizzy! ",
|
||||
"I'm in heaven! ",
|
||||
"I'm in paradise! ",
|
||||
"I'm lost in you! ",
|
||||
"I'm melting! ",
|
||||
"I'm on fire! ",
|
||||
"I'm on the edge! ",
|
||||
"I'm overflowing! ",
|
||||
"I'm quivering with desire! ",
|
||||
"I'm seeing stars! ",
|
||||
"I'm shaking with anticipation! ",
|
||||
"I'm so happy! ",
|
||||
"I'm trembling! ",
|
||||
"I'm under your spell! ",
|
||||
"I'm yours for the taking! ",
|
||||
"I'm yours forever! ",
|
||||
"I'm yours to command! ",
|
||||
"I'm yours! ",
|
||||
"I'm yours, body and soul! ",
|
||||
"I'm yours, now and forever! ",
|
||||
"Is that all you've got? ",
|
||||
"Keep shaking! ",
|
||||
"Keep the rhythm going! ",
|
||||
"Let's party! ",
|
||||
"Let's play more! ",
|
||||
"Like a record baby! ",
|
||||
"Make me yours! ",
|
||||
"Make me yours, completely! ",
|
||||
"Missed me! ",
|
||||
"More, more, more! ",
|
||||
"My heart's racing! ",
|
||||
"Neither can I! ",
|
||||
"One more time! ",
|
||||
"Playing hard to get? ",
|
||||
"Round and round we go! ",
|
||||
"Shake me harder! ",
|
||||
"Show me what you've got! ",
|
||||
"Show me your moves! ",
|
||||
"So close! ",
|
||||
"Spin me right round! ",
|
||||
"Stop tickling! ",
|
||||
"Take me to the edge! ",
|
||||
"Take me! ",
|
||||
"Take me, I'm yours! ",
|
||||
"That tickles! ",
|
||||
"That was fun! ",
|
||||
"Too slow! ",
|
||||
"Unleash me! ",
|
||||
"Wait till I catch you! ",
|
||||
"What a rush! ",
|
||||
"Wheeee! ",
|
||||
"Wheeeeeee! ",
|
||||
"You drive me wild! ",
|
||||
"You found me! ",
|
||||
"You got me! ",
|
||||
"You know how to party! ",
|
||||
"You know what I like! ",
|
||||
"You make me feel alive! ",
|
||||
"You're absolute perfection! ",
|
||||
"You're amazing! ",
|
||||
"You're beyond incredible! ",
|
||||
"You're driving me insane! ",
|
||||
"You're driving me wild! ",
|
||||
"You're fun! ",
|
||||
"You're getting better! ",
|
||||
"You're good at this! ",
|
||||
"You're incredible! ",
|
||||
"You're irresistible! ",
|
||||
"You're making me blush! ",
|
||||
"You're making me bounce! ",
|
||||
"You're making me bounce! ",
|
||||
"You're making me crazy! ",
|
||||
"You're making me giddy! ",
|
||||
"You're making me spin! ",
|
||||
"You're making me swoon! ",
|
||||
"You're making me twirl! ",
|
||||
"You're my addiction! ",
|
||||
"You're my desire! ",
|
||||
"You're my dream! ",
|
||||
"You're my everything and more! ",
|
||||
"You're my everything! ",
|
||||
"You're my fantasy! ",
|
||||
"You're my heart's desire! ",
|
||||
"You're my masterpiece! ",
|
||||
"You're my obsession! ",
|
||||
"You're my obsession! ",
|
||||
"You're my temptation! ",
|
||||
"You're my ultimate fantasy! ",
|
||||
"You're my weakness! ",
|
||||
"You're perfect! ",
|
||||
"You're so good! ",
|
||||
"You're so playful! ",
|
||||
"You're such a tease! ",
|
||||
"You're unstoppable! ",
|
||||
"You've got the magic touch! ",
|
||||
"Your touch is electric! "
|
||||
];
|
||||
100
app/config/skin-names.ts
Normal file
100
app/config/skin-names.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
import { type Locale } from '../../i18n/request';
|
||||
|
||||
// Define grammatical cases for languages that need them
|
||||
type GrammaticalCase = 'nominative' | 'accusative' | 'dative' | 'genitive' | 'instrumental' | 'prepositional';
|
||||
|
||||
// Define which languages need grammatical cases
|
||||
const languagesWithCases: Partial<Record<Locale, boolean>> = {
|
||||
ru: true,
|
||||
ka: true
|
||||
};
|
||||
|
||||
// Localized skin names for different languages with grammatical cases
|
||||
const skinNames: Record<string, Record<Locale, string | Record<GrammaticalCase, string>>> = {
|
||||
frog: {
|
||||
en: 'Frog',
|
||||
de: 'Frosch',
|
||||
ru: {
|
||||
nominative: 'Лягушка',
|
||||
accusative: 'Лягушку',
|
||||
dative: 'Лягушке',
|
||||
genitive: 'Лягушки',
|
||||
instrumental: 'Лягушкой',
|
||||
prepositional: 'Лягушке'
|
||||
},
|
||||
ka: {
|
||||
nominative: 'ბაყაყი',
|
||||
accusative: 'ბაყაყს',
|
||||
dative: 'ბაყაყს',
|
||||
genitive: 'ბაყაყის',
|
||||
instrumental: 'ბაყაყით',
|
||||
prepositional: 'ბაყაყზე'
|
||||
},
|
||||
ar: 'ضفدع'
|
||||
},
|
||||
mandarin: {
|
||||
en: 'Mandarin',
|
||||
de: 'Mandarine',
|
||||
ru: {
|
||||
nominative: 'Мандарин',
|
||||
accusative: 'Мандарин',
|
||||
dative: 'Мандарину',
|
||||
genitive: 'Мандарина',
|
||||
instrumental: 'Мандарином',
|
||||
prepositional: 'Мандарине'
|
||||
},
|
||||
ka: {
|
||||
nominative: 'მანდარინი',
|
||||
accusative: 'მანდარინს',
|
||||
dative: 'მანდარინს',
|
||||
genitive: 'მანდარინის',
|
||||
instrumental: 'მანდარინით',
|
||||
prepositional: 'მანდარინზე'
|
||||
},
|
||||
ar: 'ماندرين'
|
||||
},
|
||||
beaver: {
|
||||
en: 'Beaver',
|
||||
de: 'Biber',
|
||||
ru: {
|
||||
nominative: 'Бобр',
|
||||
accusative: 'Бобра',
|
||||
dative: 'Бобру',
|
||||
genitive: 'Бобра',
|
||||
instrumental: 'Бобром',
|
||||
prepositional: 'Бобре'
|
||||
},
|
||||
ka: {
|
||||
nominative: 'თახვი',
|
||||
accusative: 'თახვს',
|
||||
dative: 'თახვს',
|
||||
genitive: 'თახვის',
|
||||
instrumental: 'თახვით',
|
||||
prepositional: 'თახვზე'
|
||||
},
|
||||
ar: 'قندس'
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the localized name for a skin with the appropriate grammatical case
|
||||
* @param skinId The skin ID
|
||||
* @param language The language code
|
||||
* @param grammaticalCase The grammatical case to use (for languages that need it)
|
||||
* @returns The localized skin name
|
||||
*/
|
||||
export function getLocalizedSkinName(
|
||||
skinId: string,
|
||||
language: Locale,
|
||||
grammaticalCase: GrammaticalCase = 'nominative'
|
||||
): string {
|
||||
const skinName = skinNames[skinId]?.[language];
|
||||
|
||||
// If the language doesn't use cases or we don't have cases for this skin
|
||||
if (!skinName || typeof skinName === 'string' || !languagesWithCases[language]) {
|
||||
return typeof skinName === 'string' ? skinName : skinNames[skinId]?.en as string || skinId;
|
||||
}
|
||||
|
||||
// Return the appropriate case, or fallback to nominative if the case doesn't exist
|
||||
return skinName[grammaticalCase] || skinName.nominative;
|
||||
}
|
||||
Reference in New Issue
Block a user