Making a mini-game in Telegram: Bot for collecting resources and fighting

import logging
import random
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, CallbackContext
# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    level=logging.INFO)
logger = logging.getLogger(__name__)
# Game state (simple example)
user_data = {}
# Main menu (including game actions)
def get_main_menu():
    keyboard = [
        [InlineKeyboardButton("Collect Resources", callback_data='collect_resources')],
        [InlineKeyboardButton("Upgrade Character", callback_data='upgrade_character')],
        [InlineKeyboardButton("Fight Enemy", callback_data='fight_enemy')],
        [InlineKeyboardButton("Rewards", callback_data='rewards')],
        [InlineKeyboardButton("Referrals", callback_data='referrals')],
        [InlineKeyboardButton("Wheel of Fortune", callback_data='fortune')]
    ]
    return InlineKeyboardMarkup(keyboard)
# Player initialization
def init_user(user_id):
    if user_id not in user_data:
        user_data[user_id] = {
            'resources': 0,
            'level': 1,
            'health': 100
        }
# Function for starting the game
async def start(update: Update, context: CallbackContext):
    user_id = update.message.from_user.id
    init_user(user_id)
    await update.message.reply_text('Welcome to the mini-game! Choose an action:', reply_markup=get_main_menu())
# Function for collecting resources
async def collect_resources(update: Update, context: CallbackContext):
    user_id = update.callback_query.from_user.id
    init_user(user_id)
    resources_collected = random.randint(5, 20)
    user_data[user_id]['resources'] += resources_collected
    await update.callback_query.answer()
    await update.callback_query.edit_message_text(
        f"You collected {resources_collected} resources! You now have {user_data[user_id]['resources']} resources."
    )
# Function for upgrading character
async def upgrade_character(update: Update, context: CallbackContext):
    user_id = update.callback_query.from_user.id
    init_user(user_id)
    if user_data[user_id]['resources'] < 10:
        await update.callback_query.answer()
        await update.callback_query.edit_message_text(
            "Not enough resources for upgrade! Need at least 10 resources."
        )
    else:
        user_data[user_id]['resources'] -= 10
        user_data[user_id]['level'] += 1
        await update.callback_query.answer()
        await update.callback_query.edit_message_text(
            f"Your character is upgraded! Level: {user_data[user_id]['level']}. Resources: {user_data[user_id]['resources']}"
        )
# Function for fighting enemy
async def fight_enemy(update: Update, context: CallbackContext):
    user_id = update.callback_query.from_user.id
    init_user(user_id)
    if user_data[user_id]['health'] <= 0:
        await update.callback_query.answer()
        await update.callback_query.edit_message_text(
            "Your character is dead and cannot fight. Upgrade it first!"
        )
    else:
        enemy_health = random.randint(20, 50)
        damage_dealt = random.randint(10, 30)
        user_data[user_id]['health'] -= damage_dealt
        if user_data[user_id]['health'] <= 0:
            await update.callback_query.answer()
            await update.callback_query.edit_message_text(
                f"You fought the enemy! The enemy dealt {damage_dealt} damage. You died. Your level: {user_data[user_id]['level']}. "
                "Start over!"
            )
            user_data[user_id]['health'] = 100 # reset health
        else:
            await update.callback_query.answer()
            await update.callback_query.edit_message_text(
                f"You fought the enemy! The enemy dealt {damage_dealt} damage. Your health: {user_data[user_id]['health']}."
            )
# Handling menu button presses
async def button(update: Update, context: CallbackContext):
    query = update.callback_query
    await query.answer()
    if query.data == 'rewards':
        await query.edit_message_text("This section will display the rewards you can receive.")
    elif query.data == 'referrals':
        await query.edit_message_text("In this section, you can invite friends!")
    elif query.data == 'fortune':
        result = random.choice(['You won a bonus!', 'Better luck next time!', 'Congratulations, receive your reward!'])
        await query.edit_message_text(f"Wheel of Fortune Result: {result}")
    elif query.data == 'collect_resources':
        await collect_resources(update, context)
    elif query.data == 'upgrade_character':
        await upgrade_character(update, context)
    elif query.data == 'fight_enemy':
        await fight_enemy(update, context)
# Main function
def main():
    application = Application.builder().token("your_token").build()
    # Commands
    application.add_handler(CommandHandler("start", start))
    # Handlers for menu buttons
    application.add_handler(CallbackQueryHandler(button))
    # Start the bot
    application.run_polling()
if __name__ == '__main__':
    main()