thiagormagalhaes/search-deals-playstation-telegram-bot

View on GitHub
src/bot.py

Summary

Maintainability
A
0 mins
Test Coverage
import datetime
import logging
import dotenv

from telegram.ext import Updater, CommandHandler
from config.settings import TOKEN
from src.store import Store


# Habilitar o logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    level=logging.INFO)

LOGGER = logging.getLogger(__name__)


STORE = Store()


def now_str():
    _now = datetime.datetime.now()
    return _now.strftime("[%H:%M:%S]")


def debug_log(msg):
    """ Printa uma mensagem de debug no console informando o tempo """
    print(now_str(), " - ", msg)


def start(bot, update):
    """ Mensagem inicial do comando / start """
    update.message.reply_text("""
    Bem-vindo ao meu primeiro bot!

    Digite /about para ver uma lista de comandos uteis.
    """)


def about(bot, update):
    update.message.reply_text(STORE.about())


def listDeals(bot, update, args):
    """ Handler consulta lista de produtos /list """
    products = STORE.deals()
    response = STORE.list_header(args)
    update.message.reply_text(text=response, parse_mode="markdown")

    response = ""
    for product in products:
        response += product + "\n"
        response += "\n"

    update.message.reply_text(response)


def search(bot, update, args):
    if (len(args) == 0):
        update.message.reply_text(
            "É necessário informar uma palavra para realizar a busca.")
        return

    response = STORE.url(STORE.total_games())
    update.message.reply_text(
        "Aguarde... buscando em " + str(len(response["links"])) + " produtos")

    _list = STORE.format_list(response, args[0])

    for item in _list:
        update.message.reply_text(text=item, parse_mode="markdown")

    if (len(_list) == 0):
        update.message.reply_text(
            "Nenhum resultado para a palavra: " + args[0])
    else:
        update.message.reply_text(
            str(len(_list)) + " resultado(s) encontrados para a palavra: " + args[0])


def product(bot, update, args):

    try:
        response = STORE.product(args)
        update.message.reply_text(text=response, parse_mode="markdown")
    except ValueError:
        update.message.reply_text(
            "Não foi encontrado produto com o código informado")


def echo(bot, update):
    """ Responder comandos invalidos """
    update.message.reply_text("Comando inválido - ver lista de comandos")


def error(bot, update, error):
    """ Log de Erros """
    LOGGER.warning('Update "%s" caused error "%s"', update, error)


def config_token():
    """ Se a(key=TOKEN) não existir ou estiver None no
        .env -> Criar token
    """
    if not TOKEN:
        token = input("Copie aqui o token dado pelo @botfather: ")

        if not dotenv.find_dotenv():
            file = open(".env", "w+")
            file.write("TOKEN=")
            file.close()

        dotenv.set_key('.env', 'TOKEN', token)
        return token

    return TOKEN


def main():
    """Iniciar o bot"""
    # Criar o EventHandler
    updater = Updater(config_token())

    # Obter o dispatcher para registrar os handlers
    dipatcher = updater.dispatcher

    # comandos habilitados
    dipatcher.add_handler(CommandHandler("start", start))
    dipatcher.add_handler(CommandHandler("about", about))
    dipatcher.add_handler(CommandHandler("list", listDeals, pass_args=True))
    dipatcher.add_handler(CommandHandler("search", search, pass_args=True))
    dipatcher.add_handler(CommandHandler("product", product, pass_args=True))

    # log de erros
    dipatcher.add_error_handler(error)

    # Informar inicialização do bot no console
    debug_log("Bot inicializado com sucesso!")
    # Iniciar o Bot
    updater.start_polling()

    updater.idle()