alien-riddle / src /alien_obfuscator /ui /challenge.py
Huba179's picture
deploy from GitHub
733b6a1 verified
Raw
History Blame Contribute Delete
3.45 kB
"""Challenge tab callbacks and types for the Alien Obfuscator.
This module provides the function that generates a random challenge riddle
and the NamedTuple result types used by the challenge event handlers.
"""
import json
import random
from typing import Any, NamedTuple
from alien_obfuscator.config import CHALLENGE_PHRASES, THEME_KEYS
from alien_obfuscator.ui.helpers import riddle_generator
# ---------------------------------------------------------------------------
# NamedTuple result types
# ---------------------------------------------------------------------------
class GameOverResult(NamedTuple):
"""Result returned by the game over event handler.
Attributes
----------
timer_display : str
Display string for the timer, typically set to "00:00".
state_json : str
JSON-encoded game state.
game_row : Any
Gradio update dict for the game row visibility.
game_over_row : Any
Gradio update dict for the game over row visibility.
final_score : Any
The final score component.
"""
timer_display: str
state_json: str
game_row: Any
game_over_row: Any
final_score: Any
class ChallengeAnswerResult(NamedTuple):
"""Result returned by the challenge answer event handler.
Attributes
----------
feedback : str
Response message regarding correctness and points.
correct_update : Any
Gradio update combining value and visibility properties.
updated_state : str
Updated JSON-serialized game state.
interactive_update : Any
Gradio update dict to disable challenge options.
score_update : str
The updated score to display.
streak_update : str
The updated streak to display.
"""
feedback: str
correct_update: Any # Combines both value and visibility properties
updated_state: str
interactive_update: Any
score_update: str
streak_update: str
class NextChallengeResult(NamedTuple):
"""Result returned by the next challenge event handler.
Attributes
----------
riddle : str
The new riddle question.
options_update : Any
Gradio update containing new answer options.
feedback : Any
Cleared feedback message or updated component.
reveal : str
Cleared correct answer reveal message.
updated_state : str
Updated JSON-serialized game state.
"""
riddle: str
options_update: Any
feedback: Any
reveal: str
updated_state: str
# ---------------------------------------------------------------------------
# Challenge riddle generator
# ---------------------------------------------------------------------------
def generate_challenge_riddle(theme_filter: str) -> tuple[str, str, str]:
"""Generate a random challenge riddle for game mode.
Parameters
----------
theme_filter : str
"All" or a specific theme key.
Returns
-------
tuple[str, str, str]
(riddle_text, options_json, correct_index)
"""
if theme_filter == "All":
theme = random.choice(THEME_KEYS)
else:
theme = theme_filter
plaintext = random.choice(CHALLENGE_PHRASES)
try:
result = riddle_generator.generate(plaintext, theme)
return result["riddle"], json.dumps(result["options"]), str(result["correct_index"])
except Exception as exc:
return f"Error: {exc}", "[]", "-1"