Did some modifications...

This commit is contained in:
Joan
2025-10-29 11:14:34 +01:00
parent 8bcf8c8819
commit c012f03cb4
8 changed files with 420 additions and 168 deletions

View File

@@ -33,11 +33,11 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
raffle = get_raffle(raffle_id) # Get raffle details
remaining_numbers_amount = get_remaining_numbers_amount(raffle_id)
if raffle and raffle['active'] and remaining_numbers_amount > 0:
# Check what time is it, if it's between 20:55 and 22:00, users can't join
# Check what time is it, if it's between 21:15 and 22:00, users can't join
madrid_tz = pytz.timezone("Europe/Madrid")
current_time = datetime.now(madrid_tz)
if current_time.time() >= dtime(20, 55) and current_time.time() <= dtime(22, 0):
await update.message.reply_text("Lo siento, no puedes unirte a sorteos entre las 20:55 y las 22:00 (hora de España) para evitar conflictos con el sorteo en directo. Inténtalo de nuevo más tarde.")
if current_time.time() >= dtime(21, 15) and current_time.time() <= dtime(22, 0):
await update.message.reply_text("Lo siento, no puedes unirte a sorteos entre las 21:15 y las 22:00 (hora de España) para evitar conflictos con el sorteo en directo. Inténtalo de nuevo más tarde.")
return
if len(get_reserved_numbers(user.id, raffle_id)) > 0:
await update.message.reply_text("Ya tienes participaciones reservadas para este sorteo. Por favor, completa la donación o espera a que caduquen antes de unirte de nuevo.")
@@ -48,13 +48,23 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
logger.info(f"User {user.id} started bot with join link for raffle {raffle_id}")
context.user_data['joining_raffle_id'] = raffle_id
keyboard = generate_numbers_keyboard(raffle_id, user.id)
await update.message.reply_text(
f"¡Hola! Vamos a unirnos al sorteo '{raffle['name']}'.\n\n"
f"🌍 Envío internacional: {'Sí ✅' if raffle['international_shipping'] else 'No ❌'}\n"
f"La donación mínima es de {raffle['price']}.\n\n"
"Por favor, selecciona tus números:",
reply_markup=keyboard
)
is_vip = is_vip_member_of_homelabs(user.id)
if is_vip:
await update.message.reply_text(
f"¡Hola usuario VIP! Vamos a unirnos al sorteo '{raffle['name']}'.\n\n"
f"🌍 Envío internacional: {'Sí ✅' if raffle['international_shipping'] else 'No ❌'}\n"
f"La donación mínima es de {raffle['price'] - VIP_DISCOUNT_PER_NUMBER}€.\n\n"
"Por favor, selecciona tus números:",
reply_markup=keyboard
)
else:
await update.message.reply_text(
f"¡Hola! Vamos a unirnos al sorteo '{raffle['name']}'.\n\n"
f"🌍 Envío internacional: {'Sí ✅' if raffle['international_shipping'] else 'No ❌'}\n"
f"La donación mínima es de {raffle['price']}€.\n\n"
"Por favor, selecciona tus números:",
reply_markup=keyboard
)
else:
await update.message.reply_text("Este sorteo ya no está activo o no tiene números disponibles.")
except (ValueError, IndexError):
@@ -225,8 +235,24 @@ async def confirm_creation(update: Update, context: ContextTypes.DEFAULT_TYPE) -
channel_id = user_data.get('channel')
international_shipping = user_data.get('international_shipping', 0)
if not all([name, description, image_file_id, price, international_shipping]):
await context.bot.send_message(query.from_user.id, "Faltan datos. Creación cancelada.")
exists_international_shipping = False
if international_shipping != None:
exists_international_shipping = True
if not all([name, description, image_file_id, price, exists_international_shipping]):
missing_fields = []
if not name:
missing_fields.append("título")
if not description:
missing_fields.append("descripción")
if not image_file_id:
missing_fields.append("imagen")
if not price:
missing_fields.append("precio")
if not exists_international_shipping:
missing_fields.append("envío internacional")
await context.bot.send_message(query.from_user.id, f"Faltan datos: {', '.join(missing_fields)}. Creación cancelada.")
context.user_data.pop('new_raffle', None)
return ConversationHandler.END
@@ -528,6 +554,12 @@ async def confirm_callback(update: Update, context: CallbackContext):
return
user_name = participant['user_name']
is_vip = is_vip_member_of_homelabs(user_id)
if is_vip:
price_per_number -= VIP_DISCOUNT_PER_NUMBER
if price_per_number < 1:
price_per_number = 1 # Minimum price
total_price = len(reserved_numbers) * price_per_number
paypal_link, invoice_id = create_paypal_order(get_paypal_access_token(), total_price, raffle_info['id'], reserved_numbers, user_name)
@@ -680,16 +712,19 @@ async def end_raffle_logic(context: ContextTypes.DEFAULT_TYPE, raffle_id: int, w
# Notify admin of success
try:
number_of_participations = get_total_participations(raffle_id)
price_per_number = raffle_details['price']
total_gross = 0
total_net = 0
total_fees = 0
invoice_ids = get_all_invoice_ids(raffle_id)
for inv_id in invoice_ids:
gross, net, fees = get_paypal_amounts_for_invoice(inv_id)
total_gross += gross
total_net += net
total_fees += fees
for admin_user_id in ADMIN_IDS:
await context.bot.send_message(admin_user_id, f"Sorteo '{raffle_name}' terminado y ganadores anunciados.")
number_of_participations = get_total_participations(raffle_id)
price_per_number = raffle_details['price']
invoice_ids = get_all_invoice_ids(raffle_id)
for inv_id in invoice_ids:
gross, net, fees = get_paypal_amounts_for_invoice(inv_id)
total_gross += gross
total_net += net
total_fees += fees
await context.bot.send_message(
admin_user_id,
f"Resumen del sorteo '{raffle_name}':\n"
@@ -788,6 +823,26 @@ async def admin_menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE
logger.error(f"Invalid callback data for announce raffle: {data}")
await query.edit_message_text("Error: ID de sorteo inválido.", reply_markup=generate_admin_list_raffles_keyboard())
elif data.startswith(ADMIN_UPDATE_IMAGE_PREFIX):
try:
raffle_id = int(data[len(ADMIN_UPDATE_IMAGE_PREFIX):])
logger.info(f"Admin {user_id} requested image update for raffle {raffle_id}")
await query.edit_message_text(f"🔄 Actualizando imagen del sorteo {get_raffle_name(raffle_id)}...", reply_markup=None)
# Use the extracted function to send/update the raffle image
if send_raffle_update_image(raffle_id, bot_token=context.bot.token):
await context.bot.send_message(user_id, f"✅ Imagen actualizada correctamente para el sorteo {get_raffle_name(raffle_id)}.")
else:
await context.bot.send_message(user_id, f"❌ Error al actualizar la imagen para el sorteo {get_raffle_name(raffle_id)}.")
# Go back to raffle details
details_text = format_raffle_details(raffle_id)
details_keyboard = generate_admin_raffle_details_keyboard(raffle_id)
await context.bot.send_message(user_id, details_text, reply_markup=details_keyboard, parse_mode=ParseMode.HTML)
except (ValueError, IndexError):
logger.error(f"Invalid callback data for update image: {data}")
await query.edit_message_text("Error: ID de sorteo inválido.", reply_markup=generate_admin_list_raffles_keyboard())
elif data.startswith(ADMIN_END_RAFFLE_PROMPT_PREFIX):
try:
raffle_id = int(data[len(ADMIN_END_RAFFLE_PROMPT_PREFIX):])
@@ -902,7 +957,7 @@ async def _announce_raffle_in_channels(context: ContextTypes.DEFAULT_TYPE, raffl
raffle_name = raffle['name']
image_file_id = raffle['image_file_id']
raffle_description = raffle['description'] # Get description for caption
raffle_description = raffle['description'][:350] # Get description for caption
price = raffle['price']
channel_id_str = raffle['channel_id']