Untitled

 avatar
unknown
python
a year ago
5.9 kB
7
Indexable
if server_var("devinette") == "True":
    set_error(f"❌ {user.mention}, A game is already in progress. Please wait until the current game is finished.")
else:
    update_server_var("devinette", "True")

riddles = [
    {
        "question": "I am the most famous Italian plumber in video game history, often seen with a red hat. Who am I?",
        "answers": ["mario"]
    },
    {
        "question": "I am a life simulation game developed by Maxis, where players can create and control virtual characters. What is my name?",
        "answers": ["the sims", "sims", "les sims"]
    },
    {
        "question": "I am a video game franchise developed by Mojang, where players can build and explore blocky worlds. What is my name?",
        "answers": ["minecraft"]
    },
    {
        "question": "I am a kart racing game where players can choose from iconic Nintendo characters. What is my name?",
        "answers": ["mario kart"]
    },
]

MAX_PASSES = 3
MAX_ATTEMPTS = 3
RESPONSE_TIMEOUT = 65

CORRECT_ANSWER_PREFIX = "✅ Correct answer! Here is the next one:"
INCORRECT_ANSWER_MSG = "❌ Incorrect answer. Try again! Attempts remaining: `{}`"

PASS_ANSWER_PREFIX = "🔄 You have skipped this riddle. Here is the next one:"
LAST_RIDDLE_PASS_WARNING = "⚠️ You can no longer skip; this is the last riddle. You must answer it."

END_GAME_TIMEOUT_MSG = "⏰ Time is up, {user}. **Game over.**"
END_GAME_MAX_PASSES_MSG = f"❌ You have reached the maximum number of passes (`{MAX_PASSES}`). Game over."
END_GAME_MAX_ATTEMPTS_MSG = f"❌ You have reached the maximum number of attempts (`{MAX_ATTEMPTS}`). **Game over.**"
CONGRATULATIONS_MSG = "## 🎉 Congratulations! You have answered all the riddles correctly!"


################################################ ADD THIS IN POST HOOK #########################################

class UserData:
    def __init__(self, riddles):
        self.riddles = riddles.copy()
        self.passed = []
        self.current_index = 0
        self.attempts = 0
        self.passes = 0

def get_remaining_info(user_data):
    remaining_riddles = (len(user_data.riddles) - user_data.current_index - 1) + len(user_data.passed)
    passes_remaining = MAX_PASSES - user_data.passes
    return remaining_riddles, passes_remaining

async def start_game(interaction, user, channel):
    pyrandom.shuffle(riddles)
    user_data = UserData(riddles)
    respond_interaction(interaction, embed=load_embed("clyzurbw903hpcza7h4354w0p"))
    await send_riddle(channel, user_data)
    await handle_user_response(user, channel, user_data)

async def send_riddle(channel, user_data, prefix=""):
    async def send_riddle_message():
        question = user_data.riddles[user_data.current_index]['question']
        remaining_riddles, passes_remaining = get_remaining_info(user_data)
        message = f"{prefix}\n> 👉 **{question}**\nRemaining riddles: `{remaining_riddles}` | Passes remaining: `{passes_remaining}`"
        send_message(channel.id, message)

    if user_data.current_index < len(user_data.riddles):
        await send_riddle_message()
    elif user_data.passed:
        user_data.riddles = user_data.passed
        user_data.passed = []
        user_data.current_index = 0
        pyrandom.shuffle(user_data.riddles)
        await send_riddle_message()
    else:
        await end_game(channel, CONGRATULATIONS_MSG)
        return True

    return False

async def handle_user_response(user, channel, user_data):
    if user_data.current_index >= len(user_data.riddles) and not user_data.passed:
        return
    response = await get_answer(user, channel)
    if not response:
        await end_game(channel, END_GAME_TIMEOUT_MSG.format(user=user.mention))
    else:
        await process_answer(user, channel, response.content.lower(), user_data)

async def get_answer(user, channel):
    def predicate(event):
        return event.author_id == user.id and event.channel_id == channel.id
    
    return await wait_for("message", timeout=RESPONSE_TIMEOUT, predicate=predicate)

async def end_game(channel, message):
    update_server_var("devinette", "False")
    send_message(channel.id, message)

async def process_answer(user, channel, answer, user_data):
    current_riddle = user_data.riddles[user_data.current_index]
    correct_answers = current_riddle["answers"]

    if answer in ["pass", "p"]:
        await handle_pass(user, channel, user_data)
    elif answer in correct_answers:
        await handle_correct_answer(user, channel, user_data)
    else:
        await handle_incorrect_answer(user, channel, user_data)

async def handle_pass(user, channel, user_data):
    if user_data.passes >= MAX_PASSES:
        await end_game(channel, END_GAME_MAX_PASSES_MSG)
        return
    
    remaining_riddles, _ = get_remaining_info(user_data)
    if remaining_riddles == 0:
        send_message(channel.id, LAST_RIDDLE_PASS_WARNING)
    else:
        user_data.passes += 1
        user_data.passed.append(user_data.riddles[user_data.current_index])
        user_data.attempts = 0
        user_data.current_index += 1
        await send_riddle(channel, user_data, prefix=PASS_ANSWER_PREFIX)

    await handle_user_response(user, channel, user_data)

async def handle_correct_answer(user, channel, user_data):
    user_data.current_index += 1
    user_data.attempts = 0
    if await send_riddle(channel, user_data, prefix=CORRECT_ANSWER_PREFIX):
        return
    await handle_user_response(user, channel, user_data)

async def handle_incorrect_answer(user, channel, user_data):
    user_data.attempts += 1
    if user_data.attempts >= MAX_ATTEMPTS:
        await end_game(channel, END_GAME_MAX_ATTEMPTS_MSG)
    else:
        attempts_remaining = MAX_ATTEMPTS - user_data.attempts
        send_message(channel.id, INCORRECT_ANSWER_MSG.format(attempts_remaining))
        await handle_user_response(user, channel, user_data)

await start_game(interaction, user, channel)
Editor is loading...
Leave a Comment