import logging import random import json import os import telegram from telegram import Update, ReplyKeyboardMarkup, ParseMode from telegram.ext import Updater, CommandHandler, CallbackContext, MessageHandler, Filters # Defina o token do seu bot aqui TOKEN = '6332248399:AAHmP8FjIPYx1gCpeIJmSsdAgor11H2k0cw' # Configuração do logger (opcional, mas útil para depuração) logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) # Dicionário para armazenar os números aleatórios e o estado do jogo para cada chat_id game_data = {} # Lista de dicionários para armazenar os melhores jogadores (cada jogador com 'user_id' e 'attempts') top_players = [] # Caminho completo do arquivo para salvar os dados dos melhores jogadores BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TOP_PLAYERS_FILE = os.path.join(BASE_DIR, 'top_players.json') # Função para exibir o menu principal def main_menu(update: Update, context: CallbackContext): chat_id = update.effective_chat.id keyboard = ReplyKeyboardMarkup([["Jogar", "Melhores Jogadores"]], one_time_keyboard=True) context.bot.send_message(chat_id=chat_id, text="Escolha uma opção:", reply_markup=keyboard) # Função para iniciar o jogo def start_game(update: Update, context: CallbackContext): chat_id = update.effective_chat.id # Gerar um número aleatório entre 0 e 500 random_number = random.randint(0, 500) game_data[chat_id] = { 'random_number': random_number, 'playing': True, 'attempts': 0 } context.bot.send_message(chat_id=chat_id, text="Vou pensar em um número entre 0 e 500. Tente adivinhar!") # Função para atualizar a lista de melhores jogadores def update_top_players(user_id, attempts): # Verifica se o jogador já está na lista for player in top_players: if player['user_id'] == user_id: # Atualiza apenas se a nova tentativa for menor player['attempts'] = min(player['attempts'], attempts) return # Se não estiver na lista, adiciona o novo jogador top_players.append({'user_id': user_id, 'attempts': attempts}) # Função para lidar com as tentativas do usuário def guess_number(update: Update, context: CallbackContext): chat_id = update.effective_chat.id user_guess = int(update.message.text) game_info = game_data.get(chat_id) if game_info is None or not game_info['playing']: context.bot.send_message(chat_id=chat_id, text="Por favor, inicie o jogo usando 'Jogar'.") return random_number = game_info['random_number'] attempts = game_info['attempts'] if user_guess == random_number: attempts += 1 context.bot.send_message(chat_id=chat_id, text="Parabéns! Você acertou o número em {} tentativas!".format(attempts)) # Atualiza a pontuação do jogador na lista top_players apenas se for a menor quantidade de tentativas update_top_players(update.effective_user.id, attempts) # Criar teclado personalizado com as opções "Jogar" e "Melhores Jogadores" keyboard = ReplyKeyboardMarkup([["Jogar", "Melhores Jogadores"]], one_time_keyboard=True) context.bot.send_message(chat_id=chat_id, text="Deseja jogar novamente?", reply_markup=keyboard) # Define o estado do jogo como False para aguardar a resposta do usuário game_data[chat_id]['playing'] = False game_data[chat_id]['attempts'] = attempts # Chama a função para salvar os melhores jogadores no arquivo save_top_players() elif user_guess < random_number: context.bot.send_message(chat_id=chat_id, text="Tente um número maior.") game_data[chat_id]['attempts'] += 1 else: context.bot.send_message(chat_id=chat_id, text="Tente um número menor.") game_data[chat_id]['attempts'] += 1 # Função para exibir os melhores jogadores (top 10) def show_top_players(update: Update, context: CallbackContext): chat_id = update.effective_chat.id if not top_players: context.bot.send_message(chat_id=chat_id, text="Ainda não há jogadores na lista de melhores.") else: top_players_text = "🏆 Top 10 dos Melhores Jogadores: 🏆\n\n" # Ordena a lista de jogadores com base no número de tentativas (ou infinito, caso não haja tentativas registradas) sorted_top_players = sorted(top_players, key=lambda x: x.get('attempts', float('inf')))[:10] for idx, player in enumerate(sorted_top_players, 1): try: player_name = context.bot.get_chat(player['user_id']).username except telegram.error.BadRequest: player_name = "Anônimo" player_attempts = player.get('attempts', 'Sem tentativas registradas') top_players_text += f"{idx}. @{player_name}: {player_attempts} tentativas\n" context.bot.send_message(chat_id=chat_id, text=top_players_text, parse_mode=ParseMode.MARKDOWN) # Função para salvar os melhores jogadores em um arquivo def save_top_players(): with open(TOP_PLAYERS_FILE, 'w') as f: json.dump(top_players, f) # Função para carregar os melhores jogadores do arquivo def load_top_players(): global top_players try: with open(TOP_PLAYERS_FILE, 'r') as f: top_players = json.load(f) except FileNotFoundError: top_players = [] # Função para lidar com a resposta do usuário após o jogo def handle_response(update: Update, context: CallbackContext): chat_id = update.effective_chat.id response = update.message.text.lower() if response == "jogar": # Reiniciar o jogo se o usuário escolher "Jogar" start_game(update, context) elif response == "melhores jogadores": # Atualiza a lista dos melhores jogadores e exibe load_top_players() show_top_players(update, context) else: context.bot.send_message(chat_id=chat_id, text="Por favor, escolha uma opção válida.") # Função principal para executar o bot def main(): load_top_players() # Carregar os melhores jogadores do arquivo (se existir) updater = Updater(TOKEN, use_context=True) dp = updater.dispatcher # Handlers dp.add_handler(CommandHandler("start", main_menu)) dp.add_handler(CommandHandler("jogar", start_game)) dp.add_handler(CommandHandler("melhoresjogadores", show_top_players)) dp.add_handler(MessageHandler(Filters.text & ~Filters.command & ~Filters.regex(r'^Jogar|Melhores Jogadores$'), guess_number)) dp.add_handler(MessageHandler(Filters.text & ~Filters.command & Filters.regex(r'^Jogar|Melhores Jogadores$'), handle_response)) updater.start_polling() try: updater.idle() finally: # Salvar os melhores jogadores antes de encerrar o bot save_top_players() if __name__ == '__main__': main()