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.6 kB

HITS: 564

  1. import logging
  2. import random
  3. import json
  4. from telegram import Update, ReplyKeyboardMarkup, ReplyKeyboardRemove
  5. from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler, CallbackContext
  6. TOKEN = '6468624010:AAFIhnhZV10MgYKfJmCIzFWSgGu23jYpuec'
  7. logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
  8. categorias_arquivos = {
  9. 'frutas': 'fruta.json',
  10. 'objetos': 'objeto.json',
  11. 'cores': 'cor.json',
  12. 'animais': 'animal.json',
  13. 'países': 'pais.json',
  14. 'profissões': 'profissao.json',
  15. 'alimentos': 'alimento.json',
  16. 'esportes': 'esporte.json',
  17. 'filmes': 'filme.json',
  18. 'carros': 'carro.json'
  19. }
  20. START, CHOOSE_CATEGORY, PLAYING, PLAY_AGAIN = range(4)
  21. END = ConversationHandler.END
  22. def read_words_from_json(file_name):
  23. with open(file_name, 'r') as file:
  24. return json.load(file)
  25. def remove_accents(input_str):
  26. accents_map = {
  27. 'á': 'a', 'à': 'a', 'ã': 'a', 'â': 'a',
  28. 'é': 'e', 'è': 'e', 'ê': 'e',
  29. 'í': 'i', 'ì': 'i', 'î': 'i',
  30. 'ó': 'o', 'ò': 'o', 'õ': 'o', 'ô': 'o',
  31. 'ú': 'u', 'ù': 'u', 'û': 'u',
  32. 'ç': 'c', 'Á': 'A', 'É': 'E', 'Í': 'I',
  33. 'Ó': 'O', 'Ú': 'U', 'Ñ': 'N',
  34. 'ñ': 'n',
  35. }
  36. return ''.join(accents_map.get(char, char) for char in input_str)
  37. def start(update: Update, context: CallbackContext):
  38. user = update.message.from_user
  39. categories_keyboard = [[category.capitalize()] for category in categorias_arquivos.keys()]
  40. reply_markup = ReplyKeyboardMarkup(categories_keyboard, one_time_keyboard=True)
  41. update.message.reply_text(
  42. f"Olá, {user.first_name}! Vamos jogar o jogo da Forca. Escolha uma categoria:",
  43. reply_markup=reply_markup,
  44. )
  45. return CHOOSE_CATEGORY
  46. def choose_category(update: Update, context: CallbackContext):
  47. user_category = update.message.text.lower()
  48. if user_category in categorias_arquivos:
  49. context.user_data['categoria'] = user_category
  50. return play(update, context)
  51. else:
  52. update.message.reply_text("Categoria inválida. Por favor, escolha uma das categorias disponíveis.")
  53. return CHOOSE_CATEGORY
  54. def choose_word(categoria):
  55. file_name = categorias_arquivos[categoria]
  56. words = [remove_accents(word) for word in read_words_from_json(file_name)]
  57. return random.choice(words).upper()
  58. def play(update: Update, context: CallbackContext):
  59. categoria = context.user_data['categoria']
  60. word = choose_word(categoria)
  61. attempts = 8
  62. guessed_letters = set()
  63. blanks = ['_' if letter.isalpha() else letter for letter in word]
  64. context.user_data['word'] = word
  65. context.user_data['attempts'] = attempts
  66. context.user_data['guessed_letters'] = guessed_letters
  67. context.user_data['blanks'] = blanks
  68. update.message.reply_text(f"Dica: A palavra tem {len(word)} letras: {' '.join(blanks)}")
  69. return PLAYING
  70. def check_letter(update: Update, context: CallbackContext):
  71. user_input = update.message.text.strip().upper()
  72. if len(user_input) == 1:
  73. letter = user_input
  74. return check_single_letter(update, context, letter)
  75. else:
  76. return check_word(update, context, user_input)
  77. def check_single_letter(update: Update, context: CallbackContext, letter: str):
  78. letter = remove_accents(letter).upper()
  79. word = context.user_data['word']
  80. attempts = context.user_data['attempts']
  81. guessed_letters = context.user_data['guessed_letters']
  82. if letter in guessed_letters:
  83. update.message.reply_text(f"A letra '{letter}' já foi tentada antes.")
  84. elif any(letter in remove_accents(original_letter).upper() for original_letter in word):
  85. update.message.reply_text(f"Boa! A letra '{letter}' está na palavra.")
  86. guessed_letters.add(letter)
  87. else:
  88. update.message.reply_text(f"A letra '{letter}' não está na palavra.")
  89. guessed_letters.add(letter)
  90. attempts -= 1
  91. blanks = [original_letter if original_letter in guessed_letters or not original_letter.isalpha() else '_' for original_letter in word]
  92. if attempts > 0 and '_' in blanks:
  93. update.message.reply_text(f"Tentativas restantes: {attempts}\n{' '.join(blanks)}")
  94. context.user_data['attempts'] = attempts
  95. context.user_data['guessed_letters'] = guessed_letters
  96. elif '_' not in blanks:
  97. update.message.reply_text(f"Parabéns! Você adivinhou a palavra '{word}' corretamente.")
  98. return ask_play_again(update, context)
  99. else:
  100. update.message.reply_text(f"Suas tentativas acabaram. A palavra correta era '{word}'.")
  101. return ask_play_again(update, context)
  102. return PLAYING
  103. def check_word(update: Update, context: CallbackContext, user_word: str):
  104. user_word = remove_accents(user_word).upper()
  105. word = context.user_data['word']
  106. attempts = context.user_data['attempts']
  107. if user_word == word:
  108. update.message.reply_text(f"Parabéns! Você adivinhou a palavra '{word}' corretamente.")
  109. return ask_play_again(update, context)
  110. else:
  111. update.message.reply_text("A palavra está incorreta.")
  112. attempts -= 1
  113. context.user_data['attempts'] = attempts
  114. blanks = [original_letter if original_letter in context.user_data['guessed_letters'] or not original_letter.isalpha() else '_' for original_letter in word]
  115. if attempts > 0:
  116. update.message.reply_text(f"Tentativas restantes: {attempts}\n{' '.join(blanks)}")
  117. else:
  118. update.message.reply_text(f"Suas tentativas acabaram. A palavra correta era '{word}'.")
  119. return ask_play_again(update, context)
  120. return PLAYING
  121. def ask_play_again(update: Update, context: CallbackContext):
  122. reply_markup = ReplyKeyboardMarkup([['Sim', 'Não']], one_time_keyboard=True)
  123. update.message.reply_text("Deseja jogar novamente?", reply_markup=reply_markup)
  124. return PLAY_AGAIN
  125. def check_play_again(update: Update, context: CallbackContext):
  126. user_answer = update.message.text.lower()
  127. if user_answer == 'sim':
  128. update.message.reply_text("Legal! Vamos jogar novamente!")
  129. return start(update, context)
  130. else:
  131. user = update.message.from_user
  132. categories_keyboard = [[category.capitalize()] for category in categorias_arquivos.keys()]
  133. reply_markup = ReplyKeyboardMarkup(categories_keyboard, one_time_keyboard=True)
  134. update.message.reply_text(
  135. f"{user.first_name}, escolha uma categoria:",
  136. reply_markup=reply_markup,
  137. )
  138. return CHOOSE_CATEGORY
  139. def unknown(update: Update, context: CallbackContext):
  140. update.message.reply_text("Desculpe, não entendi essa mensagem.")
  141. def main():
  142. updater = Updater(TOKEN, use_context=True)
  143. dp = updater.dispatcher
  144. conv_handler = ConversationHandler(
  145. entry_points=[CommandHandler('start', start)],
  146. states={
  147. CHOOSE_CATEGORY: [MessageHandler(Filters.text & ~Filters.command, choose_category)],
  148. PLAYING: [MessageHandler(Filters.text & ~Filters.command, check_letter)],
  149. PLAY_AGAIN: [MessageHandler(Filters.regex(r'^(Sim|Não)$'), check_play_again)],
  150. },
  151. fallbacks=[MessageHandler(Filters.command, unknown)],
  152. )
  153. dp.add_handler(conv_handler)
  154. updater.start_polling()
  155. updater.idle()
  156. if __name__ == '__main__':
  157. main()

comments powered by Disqus