Smsapp


SUBMITTED BY: johninfinitynet

DATE: Oct. 8, 2022, 8:06 p.m.

UPDATED: Aug. 19, 2023, 1:38 a.m.

FORMAT: Text only

SIZE: 7.0 kB

HITS: 564

  1. import logging
  2. import random
  3. import json
  4. import os
  5. import telegram
  6. from telegram import Update, ReplyKeyboardMarkup, ParseMode
  7. from telegram.ext import Updater, CommandHandler, CallbackContext, MessageHandler, Filters
  8. # Defina o token do seu bot aqui
  9. TOKEN = '6332248399:AAHmP8FjIPYx1gCpeIJmSsdAgor11H2k0cw'
  10. # Configuração do logger (opcional, mas útil para depuração)
  11. logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
  12. # Dicionário para armazenar os números aleatórios e o estado do jogo para cada chat_id
  13. game_data = {}
  14. # Lista de dicionários para armazenar os melhores jogadores (cada jogador com 'user_id' e 'attempts')
  15. top_players = []
  16. # Caminho completo do arquivo para salvar os dados dos melhores jogadores
  17. BASE_DIR = os.path.dirname(os.path.abspath(__file__))
  18. TOP_PLAYERS_FILE = os.path.join(BASE_DIR, 'top_players.json')
  19. # Função para exibir o menu principal
  20. def main_menu(update: Update, context: CallbackContext):
  21. chat_id = update.effective_chat.id
  22. keyboard = ReplyKeyboardMarkup([["Jogar", "Melhores Jogadores"]], one_time_keyboard=True)
  23. context.bot.send_message(chat_id=chat_id, text="Escolha uma opção:", reply_markup=keyboard)
  24. # Função para iniciar o jogo
  25. def start_game(update: Update, context: CallbackContext):
  26. chat_id = update.effective_chat.id
  27. # Gerar um número aleatório entre 0 e 500
  28. random_number = random.randint(0, 500)
  29. game_data[chat_id] = {
  30. 'random_number': random_number,
  31. 'playing': True,
  32. 'attempts': 0
  33. }
  34. context.bot.send_message(chat_id=chat_id, text="Vou pensar em um número entre 0 e 500. Tente adivinhar!")
  35. # Função para atualizar a lista de melhores jogadores
  36. def update_top_players(user_id, attempts):
  37. # Verifica se o jogador já está na lista
  38. for player in top_players:
  39. if player['user_id'] == user_id:
  40. # Atualiza apenas se a nova tentativa for menor
  41. player['attempts'] = min(player['attempts'], attempts)
  42. return
  43. # Se não estiver na lista, adiciona o novo jogador
  44. top_players.append({'user_id': user_id, 'attempts': attempts})
  45. # Função para lidar com as tentativas do usuário
  46. def guess_number(update: Update, context: CallbackContext):
  47. chat_id = update.effective_chat.id
  48. user_guess = int(update.message.text)
  49. game_info = game_data.get(chat_id)
  50. if game_info is None or not game_info['playing']:
  51. context.bot.send_message(chat_id=chat_id, text="Por favor, inicie o jogo usando 'Jogar'.")
  52. return
  53. random_number = game_info['random_number']
  54. attempts = game_info['attempts']
  55. if user_guess == random_number:
  56. attempts += 1
  57. context.bot.send_message(chat_id=chat_id, text="Parabéns! Você acertou o número em {} tentativas!".format(attempts))
  58. # Atualiza a pontuação do jogador na lista top_players apenas se for a menor quantidade de tentativas
  59. update_top_players(update.effective_user.id, attempts)
  60. # Criar teclado personalizado com as opções "Jogar" e "Melhores Jogadores"
  61. keyboard = ReplyKeyboardMarkup([["Jogar", "Melhores Jogadores"]], one_time_keyboard=True)
  62. context.bot.send_message(chat_id=chat_id, text="Deseja jogar novamente?", reply_markup=keyboard)
  63. # Define o estado do jogo como False para aguardar a resposta do usuário
  64. game_data[chat_id]['playing'] = False
  65. game_data[chat_id]['attempts'] = attempts
  66. # Chama a função para salvar os melhores jogadores no arquivo
  67. save_top_players()
  68. elif user_guess < random_number:
  69. context.bot.send_message(chat_id=chat_id, text="Tente um número maior.")
  70. game_data[chat_id]['attempts'] += 1
  71. else:
  72. context.bot.send_message(chat_id=chat_id, text="Tente um número menor.")
  73. game_data[chat_id]['attempts'] += 1
  74. # Função para exibir os melhores jogadores (top 10)
  75. def show_top_players(update: Update, context: CallbackContext):
  76. chat_id = update.effective_chat.id
  77. if not top_players:
  78. context.bot.send_message(chat_id=chat_id, text="Ainda não há jogadores na lista de melhores.")
  79. else:
  80. top_players_text = "🏆 Top 10 dos Melhores Jogadores: 🏆\n\n"
  81. # Ordena a lista de jogadores com base no número de tentativas (ou infinito, caso não haja tentativas registradas)
  82. sorted_top_players = sorted(top_players, key=lambda x: x.get('attempts', float('inf')))[:10]
  83. for idx, player in enumerate(sorted_top_players, 1):
  84. try:
  85. player_name = context.bot.get_chat(player['user_id']).username
  86. except telegram.error.BadRequest:
  87. player_name = "Anônimo"
  88. player_attempts = player.get('attempts', 'Sem tentativas registradas')
  89. top_players_text += f"{idx}. @{player_name}: {player_attempts} tentativas\n"
  90. context.bot.send_message(chat_id=chat_id, text=top_players_text, parse_mode=ParseMode.MARKDOWN)
  91. # Função para salvar os melhores jogadores em um arquivo
  92. def save_top_players():
  93. with open(TOP_PLAYERS_FILE, 'w') as f:
  94. json.dump(top_players, f)
  95. # Função para carregar os melhores jogadores do arquivo
  96. def load_top_players():
  97. global top_players
  98. try:
  99. with open(TOP_PLAYERS_FILE, 'r') as f:
  100. top_players = json.load(f)
  101. except FileNotFoundError:
  102. top_players = []
  103. # Função para lidar com a resposta do usuário após o jogo
  104. def handle_response(update: Update, context: CallbackContext):
  105. chat_id = update.effective_chat.id
  106. response = update.message.text.lower()
  107. if response == "jogar":
  108. # Reiniciar o jogo se o usuário escolher "Jogar"
  109. start_game(update, context)
  110. elif response == "melhores jogadores":
  111. # Atualiza a lista dos melhores jogadores e exibe
  112. load_top_players()
  113. show_top_players(update, context)
  114. else:
  115. context.bot.send_message(chat_id=chat_id, text="Por favor, escolha uma opção válida.")
  116. # Função principal para executar o bot
  117. def main():
  118. load_top_players() # Carregar os melhores jogadores do arquivo (se existir)
  119. updater = Updater(TOKEN, use_context=True)
  120. dp = updater.dispatcher
  121. # Handlers
  122. dp.add_handler(CommandHandler("start", main_menu))
  123. dp.add_handler(CommandHandler("jogar", start_game))
  124. dp.add_handler(CommandHandler("melhoresjogadores", show_top_players))
  125. dp.add_handler(MessageHandler(Filters.text & ~Filters.command & ~Filters.regex(r'^Jogar|Melhores Jogadores$'), guess_number))
  126. dp.add_handler(MessageHandler(Filters.text & ~Filters.command & Filters.regex(r'^Jogar|Melhores Jogadores$'), handle_response))
  127. updater.start_polling()
  128. try:
  129. updater.idle()
  130. finally:
  131. # Salvar os melhores jogadores antes de encerrar o bot
  132. save_top_players()
  133. if __name__ == '__main__':
  134. main()

comments powered by Disqus