diff --git a/docker-compose.yml b/docker-compose.yml index 85a9bae..0d03a54 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,6 @@ services: - ./data:/app/data restart: unless-stopped environment: - - TELEGRAM_CHANNEL_ID=${TELEGRAM_CHANNEL_ID} - TELEGRAM_TOKEN=${TELEGRAM_TOKEN} - LATITUDE=${LATITUDE} - LONGITUDE=${LONGITUDE} diff --git a/wallamanta/constants.py b/wallamanta/constants.py index 06ded67..35a7144 100644 --- a/wallamanta/constants.py +++ b/wallamanta/constants.py @@ -1,7 +1,8 @@ import os #TELEGRAM_ESCAPE_CHARACTERS = ['_', '*', '[', ']', '(', ')', '~', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'] -TELEGRAM_ESCAPE_CHARACTERS = ['_', '*', '[', ']', '(', ')', '~', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'] +TELEGRAM_ESCAPE_CHARACTERS = ['_', '*', '[', ']', '(', ')', '~', '>', '+', '-', '=', '|', '{', '}', '.', '!'] +TELEGRAM_REMOVE_CHARACTERS = ['#'] ADMIN_IDS = [10101691] TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN") DB = "/app/data/wallamanta.db" diff --git a/wallamanta/helpers.py b/wallamanta/helpers.py index 6bb4291..d935bb2 100644 --- a/wallamanta/helpers.py +++ b/wallamanta/helpers.py @@ -2,11 +2,11 @@ import time import random import requests import logging -import os import constants from PIL import Image, ImageDraw, ImageFont from datetime import datetime, timedelta +from telegram import InlineKeyboardButton # Enable logging logging.basicConfig( @@ -21,13 +21,19 @@ def telegram_escape_characters(text): text = text.replace(character, f'\\{character}') except: pass + for character in constants.TELEGRAM_REMOVE_CHARACTERS: + try: + text = text.replace(character, '') + except: + pass return text def is_user_admin(telegram_user_id): return telegram_user_id in constants.ADMIN_IDS def get_telegram_user_id(update): - return update.message.chat_id + #return update.message.chat_id + return update.effective_chat.id def get_date_ahead(add_days): date_ahead = datetime.today() + timedelta(days=add_days) @@ -99,11 +105,69 @@ def create_image(article): def send_article(article, product): create_image(article) - text = f"*{telegram_escape_characters(article['title'])}*\n\n*Descripción*: {telegram_escape_characters(article['description'])}\\nn*Precio*: {telegram_escape_characters(str(article['price']))} {telegram_escape_characters(article['currency'])}\n\n[IR AL ANUNCIO](https://es\.wallapop\.com/item/{telegram_escape_characters(article['web_slug'])})" + text = f"*{telegram_escape_characters(article['title'])}*\n\n*Descripción*: {telegram_escape_characters(article['description'])}\n\n*Precio*: {telegram_escape_characters(str(article['price']))} {telegram_escape_characters(article['currency'])}\n\n[IR AL ANUNCIO](https://es\.wallapop\.com/item/{telegram_escape_characters(article['web_slug'])})" url = f"https://api.telegram.org/bot{constants.TELEGRAM_TOKEN}/sendPhoto?chat_id={product['telegram_user_id']}&caption={text}&parse_mode=MarkdownV2" files = {'photo':open(f"/app/data/images/products/{article['id']}_composed.png", 'rb')} logging.info(requests.post(url, files=files).content) def get_category_id(category): ret = constants.CATEGORIES.get(category, '') - return ret \ No newline at end of file + return ret + +def create_category_keyboard(): + keyboard = [ + [ + InlineKeyboardButton("🖥 Informática", callback_data='15000'), + InlineKeyboardButton("Motor", callback_data='12800'), + InlineKeyboardButton("Coches", callback_data='100'), + ], + [ + InlineKeyboardButton("Motos", callback_data='14000'), + InlineKeyboardButton("Moda", callback_data='12465'), + InlineKeyboardButton("Inmobiliaria", callback_data='200'), + ], + [ + InlineKeyboardButton("TV, audio y foto", callback_data='12545'), + InlineKeyboardButton("Móviles", callback_data='16000'), + InlineKeyboardButton("Deportes y ocio", callback_data='12579'), + ], + [ + InlineKeyboardButton("Bicicletas", callback_data='17000'), + InlineKeyboardButton("Consolas y videojuegos", callback_data='12900'), + InlineKeyboardButton("Hogar y jardín", callback_data='12467'), + ], + [ + InlineKeyboardButton("Electrodomésticos", callback_data='13100'), + InlineKeyboardButton("Cine, libros y música", callback_data='12463'), + InlineKeyboardButton("Niños y bebés", callback_data='12461'), + ], + [ + InlineKeyboardButton("Coleccionismo", callback_data='18000'), + InlineKeyboardButton("Construcción y reformas", callback_data='19000'), + InlineKeyboardButton("Industria y agricultura", callback_data='20000'), + ], + [ + InlineKeyboardButton("Empleo", callback_data='21000'), + InlineKeyboardButton("Servicios", callback_data='13200'), + InlineKeyboardButton("Otros", callback_data='12485'), + ], + [ + InlineKeyboardButton("Todos", callback_data='0'), + ], + ] + return keyboard + +def create_continue_keyboard(): + keyboard = [ + [ + InlineKeyboardButton("Finalizar", callback_data='add'), + InlineKeyboardButton("Descartar", callback_data='remove') + ],[ + InlineKeyboardButton("Exclusión de título", callback_data='title_exclude'), + InlineKeyboardButton("Exclusión de descripción", callback_data='description_exclude') + ],[ + InlineKeyboardButton("Coordenadas", callback_data='coords'), + InlineKeyboardButton("Distancia", callback_data='distance') + ], + ] + return keyboard \ No newline at end of file diff --git a/wallamanta/walladb.py b/wallamanta/walladb.py index a94ad04..0561fb3 100644 --- a/wallamanta/walladb.py +++ b/wallamanta/walladb.py @@ -5,7 +5,7 @@ import constants # Enable logging logging.basicConfig( - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) @@ -145,7 +145,7 @@ def get_all_products(): def add_product(product): condition = 'all' - product_name = product.get('product_name') + product_name = product.get('product_name').lower() distance = product.get('distance', 0) latitude = product.get('latitude', constants.LATITUDE) longitude = product.get('longitude', constants.LONGITUDE) @@ -154,6 +154,8 @@ def add_product(product): title_exclude = product.get('title_exclude', '') title_description_exclude = product.get('title_description_exclude', '') category = product.get('category', '') + if category == '0': + category = '' telegram_user_id = product.get('telegram_user_id') params = (product_name, \ distance, latitude, longitude, condition, min_price, \ @@ -162,8 +164,8 @@ def add_product(product): con = sqlite3.connect(constants.DB) cur = con.cursor() - res = cur.execute(f"SELECT * FROM products WHERE telegram_user_id={product.get('telegram_user_id')} \ - AND product_name='{product.get('product_name')}'") + res = cur.execute(f"SELECT * FROM products WHERE telegram_user_id={telegram_user_id} \ + AND product_name='{product_name}'") if res.fetchone() is None: cur.execute("INSERT INTO products VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", params) con.commit() @@ -175,7 +177,7 @@ def remove_product(product): con = sqlite3.connect(constants.DB) cur = con.cursor() res = cur.execute(f"DELETE FROM products WHERE telegram_user_id={product.get('telegram_user_id')} \ - AND product_name='{product.get('product_name')}'") + AND product_name='{product.get('product_name').lower()}'") con.commit() con.close() logging.info(f"Removed product {product['product_name']}") diff --git a/wallamanta/wallamanta.py b/wallamanta/wallamanta.py index d9c468e..e02bf7b 100644 --- a/wallamanta/wallamanta.py +++ b/wallamanta/wallamanta.py @@ -1,5 +1,4 @@ import json -import os import threading import logging import prettytable @@ -8,8 +7,22 @@ import walladb import constants from worker import Worker -from telegram import Update -from telegram.ext import Application, CommandHandler, ContextTypes +from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup, ForceReply +from telegram.constants import ParseMode +from telegram.ext import ( + Application, + CallbackQueryHandler, + CallbackContext, + CommandHandler, + ContextTypes, + ConversationHandler, + MessageHandler, + filters +) + +ACTION, ADD_PRODUCT_NAME, ADD_PRODUCT_MIN_PRICE, ADD_PRODUCT_MAX_PRICE, \ + ADD_PRODUCT_CATEGORY, ADD_PRODUCT_TITLE_EXCLUDE, ADD_PRODUCT_DESCRIPTION_EXCLUDE, \ + ADD_PRODUCT_COORDS, ADD_PRODUCT_DISTANCE, REMOVE_PRODUCT, LIST, FINISH, CONTINUE_OR_FINISH = range(13) # Enable logging logging.basicConfig( @@ -42,82 +55,229 @@ Borra un producto con `/remove nombre del producto`\n message = """Activa tu periodo de prueba de 7 días con `/test` o contacta con @jocarduck para más información.""" await update.message.reply_markdown_v2(helpers.telegram_escape_characters(message)) -async def categories_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: - if walladb.is_user_valid(helpers.get_telegram_user_id(update)): - message = '' - for category in constants.CATEGORIES: - message = f"{message}, {category}" - await update.message.reply_markdown_v2(f"```{helpers.telegram_escape_characters(message)}```") +async def main_menu(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + context.user_data.clear() + keyboard = [ + [ + InlineKeyboardButton("Añadir", callback_data='add'), + InlineKeyboardButton("Listar", callback_data='list'), + InlineKeyboardButton("Borrar", callback_data='remove')] + ] + markup = InlineKeyboardMarkup(keyboard) + await update.message.reply_text('Selecciona una acción a realizar', reply_markup=markup) + return ACTION -async def add_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: +async def menu_click_handler(update: Update, context: CallbackContext): telegram_user_id = helpers.get_telegram_user_id(update) if walladb.is_user_valid(telegram_user_id): - number_of_products = walladb.count_user_products(telegram_user_id) - message = """Tienes que pasar el número correcto de parámetros: `/add producto;precio_mínimo;precio_máximo,categoría,excluir_título(opcional, separado por comas);excluir_descripción_y_título(opciona, separado por comas);latitud(opcional);longitud(opcional),distancia(opcional)`\n -Ejemplo: `/add placa base itx;0;150`\n -Ejemplo 2: `/add cpu;10;30;;intel,core 2 duo,celeron;;;100`\n -Los campos opcionales que se dejen vacíos tomarán el valor configurado en el archivo `.env`""" - valid = False - if walladb.is_user_testing(telegram_user_id): - valid = True - if number_of_products >= 5: - message = "Ya tienes 5 productos en seguimiento. Con premium puedes tener hasta 20." - valid = False - elif walladb.is_user_premium(telegram_user_id): - valid = True - if number_of_products >= 20: - message = "Ya tienes 20 productos en seguimiento. Borra algunos para añadir más." - valid = False - if valid: - args = update.message.text.split("/add ") - if len(args) == 1: - pass - elif len(args[1].split(";")) > 2: - product = dict() - product['telegram_user_id'] = telegram_user_id - args = args[1].split(";") - product['product_name'], product['min_price'], product['max_price'] = args[0:3] - if len(args) > 3 and args[3]: - product['category'] = helpers.get_category_id(args[3]) - if len(args) > 4 and args[4]: - product['title_exclude'] = args[4] - if len(args) > 5 and args[5]: - product['title_description_exclude'] = args[5] - if len(args) > 6 and args[6]: - product['latitude'] = args[6] - if len(args) > 7 and args[7]: - product['longitude'] = args[7] - if len(args) > 8 and args[8]: - product['distance'] = args[8] - - logging.info(f'Adding: {product}') - if not walladb.get_product(product): - walladb.add_product(product) - p = threading.Thread(target=Worker.run, args=(walladb.get_product(product), )) - p.start() - message = f"Añadido {walladb.get_product(product)['product_name']} a seguimiento." - else: - message = f"¡{walladb.get_product(product)['product_name']} ya está en seguimiento!" - await update.message.reply_markdown_v2(helpers.telegram_escape_characters(message)) + context.user_data['telegram_user_id'] = telegram_user_id + query = update.callback_query + if query.data == 'add': + valid = False + if walladb.is_user_testing(telegram_user_id): + number_of_products = walladb.count_user_products(telegram_user_id) + valid = True + if number_of_products >= 5: + message = "Ya tienes 5 productos en seguimiento. Con premium puedes tener hasta 20." + valid = False + elif walladb.is_user_premium(telegram_user_id): + valid = True + if number_of_products >= 20: + message = "Ya tienes 20 productos en seguimiento. Borra algunos para añadir más." + valid = False + if valid: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Escribe el nombre del producto a buscar', reply_markup=ForceReply()) + return ADD_PRODUCT_NAME + else: + await context.bot.send_message(chat_id=update.effective_chat.id, text=f'{message}') + return ConversationHandler.END + if query.data == 'remove': + await send_list(update, context) + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Escribe el nombre del producto a borrar, tal y como aparece en la lista', reply_markup=ForceReply()) + return REMOVE_PRODUCT + if query.data == 'list': + await send_list(update, context) + #await context.bot.send_message(chat_id=update.effective_chat.id, text='Send your name', reply_markup=ForceReply()) + return ConversationHandler.END + else: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Activa tu periodo de prueba de 7 días con `/test` o contacta con @jocarduck para más información.', parse_mode=ParseMode.MARKDOWN_V2) + return ConversationHandler.END + +async def add_product_name(update: Update, context: CallbackContext): + if context.user_data.get('product_name', '') == '': + answer = update.message.text + context.user_data['product_name'] = answer + if not walladb.get_product(context.user_data): + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Escribe el precio mínimo', reply_markup=ForceReply()) + return ADD_PRODUCT_MIN_PRICE + else: + await context.bot.send_message(chat_id=update.effective_chat.id, + text=f"¡{walladb.get_product(context.user_data)['product_name']} ya está en seguimiento!") + return ConversationHandler.END -async def remove_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: +async def add_product_min_price(update: Update, context: CallbackContext): + if context.user_data.get('min_price', '') == '': + answer = update.message.text + try: + min_price = int(answer) + except: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Pon un precio mínimo en números', reply_markup=ForceReply()) + return ADD_PRODUCT_MIN_PRICE + if min_price < 0: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Pon un precio mínimo en números que no sean negativos', reply_markup=ForceReply()) + return ADD_PRODUCT_MIN_PRICE + context.user_data['min_price'] = min_price + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Escribe el precio máximo', reply_markup=ForceReply()) + return ADD_PRODUCT_MAX_PRICE + +async def add_product_max_price(update: Update, context: CallbackContext): + if context.user_data.get('max_price', '') == '': + answer = update.message.text + try: + max_price = int(answer) + except: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Pon un precio máximo en números', reply_markup=ForceReply()) + return ADD_PRODUCT_MAX_PRICE + if max_price < 0: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Pon un precio máximo en números que no sean negativos', reply_markup=ForceReply()) + return ADD_PRODUCT_MAX_PRICE + context.user_data['max_price'] = max_price + keyboard = [ + [ + InlineKeyboardButton("Añadir", callback_data='add'), + InlineKeyboardButton("Descartar", callback_data='remove') + ], [InlineKeyboardButton("Escoge una categoría", callback_data='category'),], + ] + markup = InlineKeyboardMarkup(keyboard) + await update.message.reply_text(f'{context.user_data["product_name"]} de {context.user_data["min_price"]}€ a {context.user_data["max_price"]}€', reply_markup=markup) + return ADD_PRODUCT_CATEGORY + +async def add_product_category(update: Update, context: CallbackContext): + query = update.callback_query + if query.data == 'category': + markup = InlineKeyboardMarkup(helpers.create_category_keyboard()) + context.user_data['last_step'] = 'category' + await context.bot.send_message(chat_id=update.effective_chat.id, text='Escoge la categoría', reply_markup=markup) + return CONTINUE_OR_FINISH + elif query.data == 'add': + await add_to_db_and_send(update, context) + return ConversationHandler.END + elif query.data == 'remove': + context.user_data.clear() + await context.bot.send_message(chat_id=update.effective_chat.id, text=f'Borrado') + return ConversationHandler.END + +async def continue_or_finish(update: Update, context: CallbackContext): + markup = InlineKeyboardMarkup(helpers.create_continue_keyboard()) + last_step = context.user_data.get('last_step', '') + query = update.callback_query + try: + qd = query.data + except: + qd = '' + + if qd == 'add': + await add_to_db_and_send(update, context) + return ConversationHandler.END + if qd == 'remove': + context.user_data.clear() + await context.bot.send_message(chat_id=update.effective_chat.id, text=f'Borrado') + return ConversationHandler.END + + if last_step == 'category': + category = int(query.data) + context.user_data['category'] = category + context.user_data['last_step'] = '' + + if qd == 'title_exclude': + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Exclusión de título', reply_markup=ForceReply()) + context.user_data['last_step'] = 'title_exclude' + return CONTINUE_OR_FINISH + if last_step == 'title_exclude': + context.user_data['title_exclude'] = update.message.text + context.user_data['last_step'] = '' + + if qd == 'description_exclude': + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Exclusión de descripción', reply_markup=ForceReply()) + context.user_data['last_step'] = 'description_exclude' + return CONTINUE_OR_FINISH + if last_step == 'description_exclude': + context.user_data['description_exclude'] = update.message.text + context.user_data['last_step'] = '' + + if qd == 'coords': + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Coordenadas', reply_markup=ForceReply()) + context.user_data['last_step'] = 'coords' + return CONTINUE_OR_FINISH + if last_step == 'coords': + answer = update.message.text + try: + latitude = float(answer.split(',')[0]) + longitude = float(answer.split(',')[1]) + except: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Pon las coordenadas siguiendo el ejemplo: 41.34, 0.65', reply_markup=ForceReply()) + return CONTINUE_OR_FINISH + context.user_data['latitude'] = latitude + context.user_data['longitude'] = longitude + context.user_data['last_step'] = '' + + if qd == 'distance': + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Distancia', reply_markup=ForceReply()) + context.user_data['last_step'] = 'distance' + return CONTINUE_OR_FINISH + if last_step == 'distance': + answer = update.message.text + try: + latitude = int(answer) + except: + await context.bot.send_message(chat_id=update.effective_chat.id, + text='Pon la distancia en km, por ejemplo: 100', reply_markup=ForceReply()) + return CONTINUE_OR_FINISH + context.user_data['distance'] = answer + context.user_data['last_step'] = '' + + if context.user_data['last_step'] == '': + await context.bot.send_message(chat_id=update.effective_chat.id, text=f'Añadir?', reply_markup=markup) + return CONTINUE_OR_FINISH + +async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + context.user_data.clear() + await context.bot.send_message(chat_id=update.effective_chat.id, text="Cancelado.") + return ConversationHandler.END + +async def remove_product(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: telegram_user_id = helpers.get_telegram_user_id(update) if walladb.is_user_valid(telegram_user_id): if walladb.is_user_testing(telegram_user_id) or walladb.is_user_premium(telegram_user_id): - product_to_remove = update.message.text[len('/remove '):] + product_to_remove = update.message.text message = f"¡{product_to_remove} no está en seguimiento!" if walladb.remove_product({'product_name' : product_to_remove, \ 'telegram_user_id' : telegram_user_id}): message = f"¡{product_to_remove} borrado de la lista de seguimiento!" await update.message.reply_text(message) + return ConversationHandler.END -async def list_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: +async def send_list(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: telegram_user_id = helpers.get_telegram_user_id(update) if walladb.is_user_valid(telegram_user_id): if walladb.is_user_testing(telegram_user_id) or walladb.is_user_premium(telegram_user_id): products = walladb.get_products_from_user(telegram_user_id) - args = update.message.text.split("/list ") + args = '' found = False if len(args) > 1: product = walladb.get_product({'product_name':args[1],'telegram_user_id':telegram_user_id}) @@ -135,7 +295,7 @@ async def list_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> No table.align['Máx'] = 'r' for product in products: table.add_row([helpers.telegram_escape_characters(product['product_name']), f"{helpers.telegram_escape_characters(product['min_price'])}€", f"{helpers.telegram_escape_characters(product['max_price'])}€"]) - await update.message.reply_markdown_v2(f'```{(table)}```') + await context.bot.send_message(chat_id=update.effective_chat.id, text=f'```{(table)}```', parse_mode=ParseMode.MARKDOWN_V2) async def admin_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: if helpers.is_user_admin(update.message.chat_id): @@ -185,6 +345,16 @@ async def test_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> No message = "Ya eres premium. No puedes volver al periodo de prueba." await update.message.reply_markdown_v2(helpers.telegram_escape_characters(message)) +async def add_to_db_and_send(update, context): + logging.info(f"Adding product with context: {context.user_data}") + walladb.add_product(context.user_data) + p = threading.Thread(target=Worker.run, args=(walladb.get_product(context.user_data), )) + p.start() + await context.bot.send_message(chat_id=update.effective_chat.id, text=f"¡*{context.user_data['product_name']}* añadido correctamente\!", parse_mode=ParseMode.MARKDOWN_V2) + +def error(update, context): + logging.error(f'Update ---{update}--- caused error ---{context.error}---') + def main()->None: walladb.setup_db() products = walladb.get_all_products() @@ -200,16 +370,34 @@ def main()->None: # on different commands - answer in Telegram application.add_handler(CommandHandler("help", help_command)) - application.add_handler(CommandHandler("categories", categories_command)) - application.add_handler(CommandHandler("add", add_command)) - application.add_handler(CommandHandler("remove", remove_command)) - application.add_handler(CommandHandler("list", list_command)) application.add_handler(CommandHandler("admin", admin_command)) application.add_handler(CommandHandler("add_premium_user", add_premium_user_command)) application.add_handler(CommandHandler("remove_user", remove_user_command)) application.add_handler(CommandHandler("status", status_command)) application.add_handler(CommandHandler("test", test_command)) + conv_handler = ConversationHandler( + entry_points=[CommandHandler("menu", main_menu)], + states={ + ACTION: [CallbackQueryHandler(menu_click_handler)], + ADD_PRODUCT_NAME: [MessageHandler(filters.TEXT, add_product_name), + CallbackQueryHandler(add_product_name)], + ADD_PRODUCT_MIN_PRICE: [MessageHandler(filters.TEXT, add_product_min_price)], + ADD_PRODUCT_MAX_PRICE: [MessageHandler(filters.TEXT, add_product_max_price)], + ADD_PRODUCT_CATEGORY: [CallbackQueryHandler(add_product_category)], + CONTINUE_OR_FINISH: [CallbackQueryHandler(continue_or_finish), + MessageHandler(filters.TEXT, continue_or_finish)], + REMOVE_PRODUCT: [MessageHandler(filters.TEXT, remove_product)], + }, + fallbacks=[CommandHandler("cancel", cancel)], + ) + + # Add ConversationHandler to application that will be used for handling updates + application.add_handler(conv_handler) + + #application.bot.set_chat_menu_button('Menú') + + application.add_error_handler(error) # on non command i.e message - echo the message on Telegram #application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo)) diff --git a/wallamanta/worker.py b/wallamanta/worker.py index 72ec4db..26c7329 100644 --- a/wallamanta/worker.py +++ b/wallamanta/worker.py @@ -1,9 +1,6 @@ import time import requests -import telegram -import os import logging -import json import helpers import walladb import constants