import logging
import random
import json
from telegram import Update, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler, CallbackContext
TOKEN = '6468624010:AAFIhnhZV10MgYKfJmCIzFWSgGu23jYpuec'
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
categorias_arquivos = {
'frutas': 'fruta.json',
'objetos': 'objeto.json',
'cores': 'cor.json',
'animais': 'animal.json',
'países': 'pais.json',
'profissões': 'profissao.json',
'alimentos': 'alimento.json',
'esportes': 'esporte.json',
'filmes': 'filme.json',
'carros': 'carro.json'
}
START, CHOOSE_CATEGORY, PLAYING, PLAY_AGAIN = range(4)
END = ConversationHandler.END
def read_words_from_json(file_name):
with open(file_name, 'r') as file:
return json.load(file)
def remove_accents(input_str):
accents_map = {
'á': 'a', 'à': 'a', 'ã': 'a', 'â': 'a',
'é': 'e', 'è': 'e', 'ê': 'e',
'í': 'i', 'ì': 'i', 'î': 'i',
'ó': 'o', 'ò': 'o', 'õ': 'o', 'ô': 'o',
'ú': 'u', 'ù': 'u', 'û': 'u',
'ç': 'c', 'Á': 'A', 'É': 'E', 'Í': 'I',
'Ó': 'O', 'Ú': 'U', 'Ñ': 'N',
'ñ': 'n',
}
return ''.join(accents_map.get(char, char) for char in input_str)
def start(update: Update, context: CallbackContext):
user = update.message.from_user
categories_keyboard = [[category.capitalize()] for category in categorias_arquivos.keys()]
reply_markup = ReplyKeyboardMarkup(categories_keyboard, one_time_keyboard=True)
update.message.reply_text(
f"Olá, {user.first_name}! Vamos jogar o jogo da Forca. Escolha uma categoria:",
reply_markup=reply_markup,
)
return CHOOSE_CATEGORY
def choose_category(update: Update, context: CallbackContext):
user_category = update.message.text.lower()
if user_category in categorias_arquivos:
context.user_data['categoria'] = user_category
return play(update, context)
else:
update.message.reply_text("Categoria inválida. Por favor, escolha uma das categorias disponíveis.")
return CHOOSE_CATEGORY
def choose_word(categoria):
file_name = categorias_arquivos[categoria]
words = [remove_accents(word) for word in read_words_from_json(file_name)]
return random.choice(words).upper()
def play(update: Update, context: CallbackContext):
categoria = context.user_data['categoria']
word = choose_word(categoria)
attempts = 8
guessed_letters = set()
blanks = ['_' if letter.isalpha() else letter for letter in word]
context.user_data['word'] = word
context.user_data['attempts'] = attempts
context.user_data['guessed_letters'] = guessed_letters
context.user_data['blanks'] = blanks
update.message.reply_text(f"Dica: A palavra tem {len(word)} letras: {' '.join(blanks)}")
return PLAYING
def check_letter(update: Update, context: CallbackContext):
user_input = update.message.text.strip().upper()
if len(user_input) == 1:
letter = user_input
return check_single_letter(update, context, letter)
else:
return check_word(update, context, user_input)
def check_single_letter(update: Update, context: CallbackContext, letter: str):
letter = remove_accents(letter).upper()
word = context.user_data['word']
attempts = context.user_data['attempts']
guessed_letters = context.user_data['guessed_letters']
if letter in guessed_letters:
update.message.reply_text(f"A letra '{letter}' já foi tentada antes.")
elif any(letter in remove_accents(original_letter).upper() for original_letter in word):
update.message.reply_text(f"Boa! A letra '{letter}' está na palavra.")
guessed_letters.add(letter)
else:
update.message.reply_text(f"A letra '{letter}' não está na palavra.")
guessed_letters.add(letter)
attempts -= 1
blanks = [original_letter if original_letter in guessed_letters or not original_letter.isalpha() else '_' for original_letter in word]
if attempts > 0 and '_' in blanks:
update.message.reply_text(f"Tentativas restantes: {attempts}\n{' '.join(blanks)}")
context.user_data['attempts'] = attempts
context.user_data['guessed_letters'] = guessed_letters
elif '_' not in blanks:
update.message.reply_text(f"Parabéns! Você adivinhou a palavra '{word}' corretamente.")
return ask_play_again(update, context)
else:
update.message.reply_text(f"Suas tentativas acabaram. A palavra correta era '{word}'.")
return ask_play_again(update, context)
return PLAYING
def check_word(update: Update, context: CallbackContext, user_word: str):
user_word = remove_accents(user_word).upper()
word = context.user_data['word']
attempts = context.user_data['attempts']
if user_word == word:
update.message.reply_text(f"Parabéns! Você adivinhou a palavra '{word}' corretamente.")
return ask_play_again(update, context)
else:
update.message.reply_text("A palavra está incorreta.")
attempts -= 1
context.user_data['attempts'] = attempts
blanks = [original_letter if original_letter in context.user_data['guessed_letters'] or not original_letter.isalpha() else '_' for original_letter in word]
if attempts > 0:
update.message.reply_text(f"Tentativas restantes: {attempts}\n{' '.join(blanks)}")
else:
update.message.reply_text(f"Suas tentativas acabaram. A palavra correta era '{word}'.")
return ask_play_again(update, context)
return PLAYING
def ask_play_again(update: Update, context: CallbackContext):
reply_markup = ReplyKeyboardMarkup([['Sim', 'Não']], one_time_keyboard=True)
update.message.reply_text("Deseja jogar novamente?", reply_markup=reply_markup)
return PLAY_AGAIN
def check_play_again(update: Update, context: CallbackContext):
user_answer = update.message.text.lower()
if user_answer == 'sim':
update.message.reply_text("Legal! Vamos jogar novamente!")
return start(update, context)
else:
user = update.message.from_user
categories_keyboard = [[category.capitalize()] for category in categorias_arquivos.keys()]
reply_markup = ReplyKeyboardMarkup(categories_keyboard, one_time_keyboard=True)
update.message.reply_text(
f"{user.first_name}, escolha uma categoria:",
reply_markup=reply_markup,
)
return CHOOSE_CATEGORY
def unknown(update: Update, context: CallbackContext):
update.message.reply_text("Desculpe, não entendi essa mensagem.")
def main():
updater = Updater(TOKEN, use_context=True)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
CHOOSE_CATEGORY: [MessageHandler(Filters.text & ~Filters.command, choose_category)],
PLAYING: [MessageHandler(Filters.text & ~Filters.command, check_letter)],
PLAY_AGAIN: [MessageHandler(Filters.regex(r'^(Sim|Não)$'), check_play_again)],
},
fallbacks=[MessageHandler(Filters.command, unknown)],
)
dp.add_handler(conv_handler)
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()