Feat: Genre system with per-genre daily puzzles

This commit is contained in:
Hördle Bot
2025-11-22 11:56:16 +01:00
parent dc69fd1498
commit 8c720e287f
9 changed files with 294 additions and 155 deletions

View File

@@ -16,12 +16,13 @@ interface GameProps {
artist: string;
coverImage: string | null;
} | null;
genre?: string | null;
}
const UNLOCK_STEPS = [2, 4, 7, 11, 16, 30, 60];
export default function Game({ dailyPuzzle }: GameProps) {
const { gameState, statistics, addGuess } = useGameState();
export default function Game({ dailyPuzzle, genre = null }: GameProps) {
const { gameState, statistics, addGuess } = useGameState(genre);
const [hasWon, setHasWon] = useState(false);
const [hasLost, setHasLost] = useState(false);
const [shareText, setShareText] = useState('Share Result');
@@ -42,7 +43,7 @@ export default function Game({ dailyPuzzle }: GameProps) {
<div className="game-container" style={{ textAlign: 'center', padding: '2rem' }}>
<h2>No Puzzle Available</h2>
<p>Could not generate a daily puzzle.</p>
<p>Please ensure there are songs in the database.</p>
<p>Please ensure there are songs in the database{genre ? ` for genre "${genre}"` : ''}.</p>
<a href="/admin" style={{ color: 'var(--primary)', textDecoration: 'underline' }}>Go to Admin Dashboard</a>
</div>
);
@@ -58,6 +59,7 @@ export default function Game({ dailyPuzzle }: GameProps) {
addGuess(song.title, false);
if (gameState.guesses.length + 1 >= 7) {
setHasLost(true);
setHasWon(false); // Ensure won is false
sendGotifyNotification(7, 'lost', dailyPuzzle.id);
}
}
@@ -72,6 +74,7 @@ export default function Game({ dailyPuzzle }: GameProps) {
setLastAction('SKIP');
addGuess("SKIPPED", false);
setHasLost(true);
setHasWon(false);
sendGotifyNotification(7, 'lost', dailyPuzzle.id);
};
@@ -98,7 +101,8 @@ export default function Game({ dailyPuzzle }: GameProps) {
}
const speaker = hasWon ? '🔉' : '🔇';
const text = `Hördle #${dailyPuzzle.id}\n\n${speaker}${emojiGrid}\n\n#Hördle #Music\n\nhttps://hoerdle.elpatron.me`;
const genreText = genre ? `Genre: ${genre}\n` : '';
const text = `Hördle #${dailyPuzzle.id}\n${genreText}\n${speaker}${emojiGrid}\n\n#Hördle #Music\n\nhttps://hoerdle.elpatron.me`;
// Fallback method for copying to clipboard
const textarea = document.createElement('textarea');