Conversation timeout changed to 120 seconds. Changed list command to send buttons and show details on click

This commit is contained in:
Joan Cano
2023-03-19 23:45:57 +01:00
parent 8dad58f882
commit 7a94f7fa9f
3 changed files with 61 additions and 23 deletions

View File

@@ -9,6 +9,7 @@ services:
- ./data:/app/data - ./data:/app/data
restart: unless-stopped restart: unless-stopped
environment: environment:
- TZ="Europe/Madrid"
- TELEGRAM_TOKEN=${TELEGRAM_TOKEN} - TELEGRAM_TOKEN=${TELEGRAM_TOKEN}
- LATITUDE=${LATITUDE} - LATITUDE=${LATITUDE}
- LONGITUDE=${LONGITUDE} - LONGITUDE=${LONGITUDE}

View File

@@ -4,6 +4,7 @@ import requests
import logging import logging
import constants import constants
import pytz import pytz
import walladb
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
@@ -208,6 +209,20 @@ def create_category_keyboard():
keyboard.append(category_line) keyboard.append(category_line)
return keyboard return keyboard
def create_products_keyboard(telegram_user_id):
count = 0
product_line = []
keyboard = []
for product in walladb.get_products_from_user(telegram_user_id):
product_line.append(InlineKeyboardButton(product['product_name'], callback_data=f"{product['product_name']}"))
count = count + 1
if count % 3 == 0:
keyboard.append(product_line)
product_line = []
if count % 3 != 0:
keyboard.append(product_line)
return keyboard
def create_continue_keyboard(): def create_continue_keyboard():
keyboard = [ keyboard = [
[ [
@@ -225,4 +240,25 @@ def create_continue_keyboard():
InlineKeyboardButton("Distancia", callback_data='distance') InlineKeyboardButton("Distancia", callback_data='distance')
], ],
] ]
return keyboard return keyboard
def generate_categories_string(categories, subcategories):
categories_string = ""
if '0' in categories.split(','):
categories_string = "todas"
elif len(categories) > 1:
for category in categories.split(','):
categories_string = f"{categories_string}{get_category_name(category)}"
if has_subcategory(category):
if len(subcategories) > 1:
subcategories_temp = ""
for subcategory in subcategories.split(','):
if is_subcategory(category, subcategory):
subcategories_temp = f"{subcategories_temp}{get_subcategory_name(subcategory)}, "
if subcategories_temp != "":
categories_string = f"{categories_string} ({subcategories_temp[:-2]})"
categories_string = f"{categories_string}, "
categories_string = categories_string[:-2]
else:
categories_string = "todas"
return categories_string

View File

@@ -83,7 +83,7 @@ async def menu_click_handler(update: Update, context: CallbackContext):
return REMOVE_PRODUCT return REMOVE_PRODUCT
if query.data == 'list': if query.data == 'list':
await send_list(update, context) await send_list(update, context)
return ConversationHandler.END return LIST
else: else:
await context.bot.send_message(chat_id=update.effective_chat.id, await context.bot.send_message(chat_id=update.effective_chat.id,
text=helpers.telegram_escape_characters('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) text=helpers.telegram_escape_characters('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)
@@ -317,31 +317,31 @@ async def remove_product(update: Update, context: ContextTypes.DEFAULT_TYPE) ->
await update.message.reply_text(message) await update.message.reply_text(message)
return ConversationHandler.END return ConversationHandler.END
async def product_details(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.callback_query.edit_message_reply_markup(None)
query = update.callback_query
product_name = query.data
telegram_user_id = helpers.get_telegram_user_id(update)
product = walladb.get_product({'product_name':product_name,'telegram_user_id':telegram_user_id})
if product:
categories = helpers.generate_categories_string(product['category'], product['subcategory'])
text = f"*Nombre del producto:* {helpers.telegram_escape_characters(product['product_name'])}\n\
*Precio desde *{product['min_price']}€ *hasta *{product['max_price']}\n\
*En las coordenadas *{helpers.telegram_escape_characters(product['latitude'])}, {helpers.telegram_escape_characters(product['longitude'])} *y a *{product['distance']}km *de estas*\n\
*En las categorías: *{helpers.telegram_escape_characters(categories)}\n\
*Palabras excluídas del título: *`{helpers.telegram_escape_characters(product['title_exclude'])}`\n\
*Palabras excluídas del título y la descripción: *`{helpers.telegram_escape_characters(product['title_description_exclude'])}`"
await context.bot.send_message(chat_id=update.effective_chat.id, text=text, parse_mode=ParseMode.MARKDOWN_V2)
return ConversationHandler.END
async def send_list(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) telegram_user_id = helpers.get_telegram_user_id(update)
if walladb.is_user_valid(telegram_user_id): if walladb.is_user_valid(telegram_user_id):
if walladb.is_user_testing(telegram_user_id) or walladb.is_user_premium(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) keyboard = helpers.create_products_keyboard(telegram_user_id)
markup = InlineKeyboardMarkup(keyboard)
args = '' await context.bot.send_message(chat_id=update.effective_chat.id, text="Escoge para ver detalles", reply_markup=markup)
found = False
if len(args) > 1:
product = walladb.get_product({'product_name':args[1],'telegram_user_id':telegram_user_id})
if product:
table = prettytable.PrettyTable(['Campo', 'Valor'])
table.align['Campo'] = 'l'
table.align['Valor'] = 'r'
for key in product:
table.add_row([key, product[key]])
found = True
if not found:
table = prettytable.PrettyTable(['Producto', 'Mín', 'Máx'])
table.align['Producto'] = 'l'
table.align['Mín'] = 'r'
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 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: async def admin_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
if helpers.is_user_admin(update.message.chat_id): if helpers.is_user_admin(update.message.chat_id):
@@ -432,7 +432,7 @@ def main()->None:
#application.add_handler(CallbackQueryHandler(pattern="list", callback=send_list())) #application.add_handler(CallbackQueryHandler(pattern="list", callback=send_list()))
conv_handler = ConversationHandler( conv_handler = ConversationHandler(
conversation_timeout=60, conversation_timeout=120,
entry_points=[CommandHandler("menu", main_menu)], entry_points=[CommandHandler("menu", main_menu)],
states={ states={
ACTION: [CallbackQueryHandler(menu_click_handler)], ACTION: [CallbackQueryHandler(menu_click_handler)],
@@ -444,6 +444,7 @@ def main()->None:
CONTINUE_OR_FINISH: [CallbackQueryHandler(continue_or_finish), CONTINUE_OR_FINISH: [CallbackQueryHandler(continue_or_finish),
MessageHandler(filters.TEXT, continue_or_finish)], MessageHandler(filters.TEXT, continue_or_finish)],
REMOVE_PRODUCT: [MessageHandler(filters.TEXT, remove_product)], REMOVE_PRODUCT: [MessageHandler(filters.TEXT, remove_product)],
LIST: [CallbackQueryHandler(product_details)],
ConversationHandler.TIMEOUT: [CallbackQueryHandler(conv_timeout), ConversationHandler.TIMEOUT: [CallbackQueryHandler(conv_timeout),
MessageHandler(filters.TEXT, conv_timeout)], MessageHandler(filters.TEXT, conv_timeout)],
ConversationHandler.END: [MessageHandler(filters.TEXT, conv_finish)], ConversationHandler.END: [MessageHandler(filters.TEXT, conv_finish)],