Changed markdown to html

This commit is contained in:
Joan
2025-09-17 17:57:44 +02:00
parent 16776f8766
commit b02e327aaf
4 changed files with 66 additions and 75 deletions

View File

@@ -24,6 +24,9 @@ logger = logging.getLogger(__name__)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
user = update.message.from_user
args = context.args
if not user.username:
await update.message.reply_text("Por favor, configura un nombre de usuario en Telegram para participar. ¡Es necesario para notificarte si ganas!")
return
if args and args[0].startswith("join_"):
try:
raffle_id = int(args[0].split("_")[1])
@@ -75,9 +78,9 @@ async def new_raffle_start(update: Update, context: ContextTypes.DEFAULT_TYPE) -
keyboard = generate_channel_selection_keyboard()
await update.message.reply_text(
"Vamos a crear un nuevo sorteo.\n\n"
"**Paso 1:** Selecciona el canal donde se publicará el sorteo.",
"<b>Paso 1:</b> Selecciona el canal donde se publicará el sorteo.",
reply_markup=keyboard,
parse_mode=ParseMode.MARKDOWN
parse_mode=ParseMode.HTML
)
return SELECTING_CHANNEL
@@ -93,8 +96,8 @@ async def select_channel(update: Update, context: ContextTypes.DEFAULT_TYPE) ->
context.user_data['new_raffle']['channel'] = channel_id
await query.edit_message_text(
"Canal seleccionad. Ahora, por favor, envía el **título** del sorteo.",
parse_mode=ParseMode.MARKDOWN
"Canal seleccionad. Ahora, por favor, envía el <b>título</b> del sorteo.",
parse_mode=ParseMode.HTML
)
return TYPING_TITLE
@@ -110,7 +113,7 @@ async def receive_title(update: Update, context: ContextTypes.DEFAULT_TYPE) -> i
return TYPING_TITLE
context.user_data['new_raffle']['title'] = title
await update.message.reply_text("Título guardado. Ahora envía la **descripción** del sorteo.", parse_mode=ParseMode.MARKDOWN)
await update.message.reply_text("Título guardado. Ahora envía la <b>descripción</b> del sorteo.", parse_mode=ParseMode.HTML)
return TYPING_DESCRIPTION
async def receive_description(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
@@ -121,7 +124,7 @@ async def receive_description(update: Update, context: ContextTypes.DEFAULT_TYPE
return TYPING_DESCRIPTION
context.user_data['new_raffle']['description'] = description
await update.message.reply_text("Descripción guardada. Ahora envía la **imagen** para el sorteo.", parse_mode=ParseMode.MARKDOWN)
await update.message.reply_text("Descripción guardada. Ahora envía la <b>imagen</b> para el sorteo.", parse_mode=ParseMode.HTML)
return SENDING_IMAGE
async def receive_image(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
@@ -135,7 +138,7 @@ async def receive_image(update: Update, context: ContextTypes.DEFAULT_TYPE) -> i
await update.message.reply_text(
"Imagen guardada. Ahora, ¿el sorteo permite envíos internacionales? Responde con '' o 'No'.",
parse_mode=ParseMode.MARKDOWN
parse_mode=ParseMode.HTML
)
return INTERNATIONAL_SHIPPING
@@ -152,7 +155,7 @@ async def receive_international_shipping(update: Update, context: ContextTypes.D
await update.message.reply_text(
"Perfecto. Ahora, introduce el precio por número para el canal seleccionado (solo el número, ej: 5).",
parse_mode=ParseMode.MARKDOWN
parse_mode=ParseMode.HTML
)
return TYPING_PRICE_FOR_CHANNEL
@@ -183,13 +186,13 @@ async def _show_creation_confirmation(update: Update, context: ContextTypes.DEFA
price = raffle_data.get('price', 0)
confirmation_text = (
"¡Perfecto! Revisa los datos del sortoe:\n\n"
f"📌 **Título:** {raffle_data.get('title', 'N/A')}\n"
f"📝 **Descripción:** {raffle_data.get('description', 'N/A')}\n"
f"📺 **Canal:** {REVERSE_CHANNELS.get(channel_id, channel_id)}\n"
f"🌍 **Envío internacional:** {'Sí ✅' if raffle_data.get('international_shipping', 0) else 'No ❌'}\n"
f"💶 **Donación mínima:** {price}\n"
f"🖼️ **Imagen:** (Adjunta)\n\n"
"¡Perfecto! Revisa los datos del sorteo:\n\n"
f"📌 <b>Título:</b> {raffle_data.get('title', 'N/A')}\n"
f"📝 <b>Descripción:</b> {raffle_data.get('description', 'N/A')}\n"
f"📺 <b>Canal:</b> {REVERSE_CHANNELS.get(channel_id, channel_id)}\n"
f"🌍 <b>Envío internacional:</b> {'Sí ✅' if raffle_data.get('international_shipping', 0) else 'No ❌'}\n"
f"💶 <b>Donación mínima:</b> {price}\n"
f"🖼️ <b>Imagen:</b> (Adjunta)\n\n"
"¿Confirmas la creación de este sorteo?"
)
keyboard = generate_confirmation_keyboard()
@@ -200,7 +203,7 @@ async def _show_creation_confirmation(update: Update, context: ContextTypes.DEFA
photo=raffle_data['image_file_id'],
caption=confirmation_text,
reply_markup=keyboard,
parse_mode=ParseMode.MARKDOWN
parse_mode=ParseMode.HTML
)
async def confirm_creation(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
@@ -330,7 +333,11 @@ async def number_callback(update: Update, context: CallbackContext):
"""Handles clicks on the number buttons in the private chat."""
query = update.callback_query
user_id = query.from_user.id
username = query.from_user.username or query.from_user.first_name
if not query.from_user.username:
await query.answer("Por favor, configura un nombre de usuario en Telegram para participar.")
return
username = query.from_user.username
try:
data = query.data.split(':')
@@ -642,9 +649,9 @@ async def end_raffle_logic(context: ContextTypes.DEFAULT_TYPE, raffle_id: int, w
winners_str = get_winners(raffle_id, winner_numbers)
formatted_winner_numbers = ", ".join(f"{n:02}" for n in sorted(winner_numbers))
announcement = f"🎯🏆🎯 **¡Resultados del Sorteo '{raffle_name}'!** 🎯🏆🎯\n\n"
announcement = f"🎯🏆🎯 <b>¡Resultados del Sorteo '{raffle_name}'!</b> 🎯🏆🎯\n\n"
announcement += f"Detalles del sorteo: https://t.me/{channel_alias}/{get_main_message_id(raffle_id)}\n"
announcement += f"Participaciones ganadoras: **{formatted_winner_numbers}**\n\n" if len(winner_numbers) > 1 else f"Participación ganadora: **{formatted_winner_numbers}**\n\n"
announcement += f"Participaciones ganadoras: <b>{formatted_winner_numbers}</b>\n\n" if len(winner_numbers) > 1 else f"Participación ganadora: <b>{formatted_winner_numbers}</b>\n\n"
if winners_str: # Ensure winners_str is not empty or a "no winners" message itself
announcement += f"Ganadores:\n{winners_str}\n\n¡Felicidades!" if len(winner_numbers) > 1 else f"Ganador:\n{winners_str}\n\n¡Felicidades!"
else:
@@ -652,16 +659,16 @@ async def end_raffle_logic(context: ContextTypes.DEFAULT_TYPE, raffle_id: int, w
announcement += f"\nPuedes comprobar los resultados en {JUEGOS_ONCE_URL}"
announcement += "\n\nGracias a todos por participar. Mantente atento a futuros sorteos."
main_announcement = f"🎯🏆🎯 **Sorteo '{raffle_name}' terminado** 🎯🏆🎯\n\n"
main_announcement = f"🎯🏆🎯 <b>Sorteo '{raffle_name}' terminado</b> 🎯🏆🎯\n\n"
main_announcement += f"{raffle_details['description']}\n\n"
main_announcement += f"🌍 **Envío internacional:** {'Sí ✅' if raffle_details['international_shipping'] else 'No ❌'}\n"
main_announcement += f"💵 **Donación mínima:** {raffle_details['price']}\n"
main_announcement += f"📜 Normas y condiciones: {TYC_DOCUMENT_URL}"
main_announcement += f"🌍 <b>Envío internacional:</b> {'Sí ✅' if raffle_details['international_shipping'] else 'No ❌'}\n"
main_announcement += f"💵 <b>Donación mínima:</b> {raffle_details['price']}\n"
main_announcement += f"📜 <b>Normas y condiciones:</b> {TYC_DOCUMENT_URL}"
main_message_id = get_main_message_id(raffle_id)
try:
await context.bot.send_message(chat_id=int(channel_id_str), text=announcement, parse_mode=ParseMode.MARKDOWN)
await context.bot.edit_message_caption(chat_id=int(channel_id_str), message_id=main_message_id, caption=main_announcement, reply_markup=None, parse_mode=ParseMode.MARKDOWN)
await context.bot.send_message(chat_id=int(channel_id_str), text=announcement, parse_mode=ParseMode.HTML)
await context.bot.edit_message_caption(chat_id=int(channel_id_str), message_id=main_message_id, caption=main_announcement, reply_markup=None, parse_mode=ParseMode.HTML)
logger.info(f"Announced winners for raffle {raffle_id} in channel {channel_alias} (ID: {channel_id_str})")
except Forbidden:
logger.error(f"Permission error announcing winners in channel {channel_alias} (ID: {channel_id_str}).")
@@ -719,7 +726,7 @@ async def admin_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
logger.info(f"Admin {user.id} accessed /menu")
keyboard = generate_admin_main_menu_keyboard()
await update.message.reply_text("🛠️ **Menú de Administrador** 🛠️", reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN)
await update.message.reply_text("🛠️ <b>Menú de Administrador</b> 🛠️", reply_markup=keyboard, parse_mode=ParseMode.HTML)
async def admin_menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Handles callbacks from the admin menus."""
@@ -747,12 +754,12 @@ async def admin_menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE
logger.info(f"Admin {user_id} requested raffle list.")
keyboard = generate_admin_list_raffles_keyboard()
active_raffles = get_active_raffles()
message_text = "**Sorteos Activos**\n\nSelecciona un sorteo para ver detalles, anunciar o terminar:" if active_raffles else "**Sorteos Activas**\n\nNo hay sorteos activos."
await query.edit_message_text(message_text, reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN)
message_text = "<b>Sorteos Activos</b>\n\nSelecciona un sorteo para ver detalles, anunciar o terminar:" if active_raffles else "<b>Sorteos Activas</b>\n\nNo hay sorteos activos."
await query.edit_message_text(message_text, reply_markup=keyboard, parse_mode=ParseMode.HTML)
elif data == ADMIN_MENU_BACK_MAIN:
keyboard = generate_admin_main_menu_keyboard()
await query.edit_message_text("🛠️ **Menú de Administrador** 🛠️", reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN)
await query.edit_message_text("🛠️ <b>Menú de Administrador</b> 🛠️", reply_markup=keyboard, parse_mode=ParseMode.HTML)
# --- Raffle Specific Actions ---
elif data.startswith(ADMIN_VIEW_RAFFLE_PREFIX):
@@ -800,10 +807,10 @@ async def admin_menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE
keyboard = generate_admin_cancel_end_keyboard()
await query.edit_message_text(
f"Vas a terminar el sorteo: **{raffle['name']}**\n\n"
"Por favor, envía ahora las **participaciones ganadoras** separadas por espacios (ej: `7 23 81`).",
f"Vas a terminar el sorteo: <b>{raffle['name']}</b>\n\n"
"Por favor, envía ahora las <b>participaciones ganadoras</b> separadas por espacios (ej: <code>7 23 81</code>).",
reply_markup=keyboard,
parse_mode=ParseMode.MARKDOWN
parse_mode=ParseMode.HTML
)
elif data == ADMIN_CANCEL_END_PROCESS:
# Clear the flags
@@ -812,7 +819,7 @@ async def admin_menu_callback(update: Update, context: ContextTypes.DEFAULT_TYPE
logger.info(f"Admin {user_id} cancelled the raffle end process.")
# Go back to the raffle list
keyboard = generate_admin_list_raffles_keyboard()
await query.edit_message_text("**Sorteos Activos**\n\nSelecciona un sorteo para terminarlo:", reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN)
await query.edit_message_text("<b>Sorteos Activos</b>\n\nSelecciona un sorteo para terminarlo:", reply_markup=keyboard, parse_mode=ParseMode.HTML)
elif data == ADMIN_NO_OP:
# Just ignore clicks on placeholder buttons like "No hay sorteos activos"
@@ -854,9 +861,9 @@ async def admin_receive_winner_numbers(update: Update, context: ContextTypes.DEF
keyboard = generate_admin_cancel_end_keyboard()
await update.message.reply_text(
f"❌ Participaciones inválidas: {e}\n\n"
"Por favor, envía las participaciones ganadoras (0-99) separadas por espacios (ej: `7 23 81`).",
"Por favor, envía las participaciones ganadoras (0-99) separadas por espacios (ej: <code>7 23 81</code>).",
reply_markup=keyboard,
parse_mode=ParseMode.MARKDOWN
parse_mode=ParseMode.HTML
)
# Keep expecting input
return
@@ -906,16 +913,16 @@ async def _announce_raffle_in_channels(context: ContextTypes.DEFAULT_TYPE, raffl
channel_alias = REVERSE_CHANNELS.get(channel_id_str, f"ID:{channel_id_str}")
announce_caption = (
f"🏆 **¡{'Nuevo ' if initial_announcement else ''}Sorteo Disponible!** 🏆\n\n"
f"🌟 **{raffle_name}** 🌟\n\n"
f"🏆 <b>¡{'Nuevo ' if initial_announcement else ''}Sorteo Disponible!</b> 🏆\n\n"
f"🌟 <b>{raffle_name}</b> 🌟\n\n"
f"{raffle_description}\n\n"
f"🌍 **Envío internacional:** {'Sí ✅' if raffle['international_shipping'] else 'No ❌'}\n"
f"💵 **Donación mínima:** {price}\n"
f"🎟️ **Participaciones disponibles:** {remaining_count if remaining_count >= 0 else 'N/A'}\n\n"
f"🌍 <b>Envío internacional:</b> {'Sí ✅' if raffle['international_shipping'] else 'No ❌'}\n"
f"💵 <b>Donación mínima:</b> {price}\n"
f"🎟️ <b>Participaciones disponibles:</b> {remaining_count if remaining_count >= 0 else 'N/A'}\n\n"
f"📜 Normas y condiciones: {TYC_DOCUMENT_URL}"
)
message_args = {"parse_mode": ParseMode.MARKDOWN}
message_args = {"parse_mode": ParseMode.HTML}
if image_file_id:
message_args["photo"] = image_file_id
message_args["caption"] = announce_caption
@@ -960,7 +967,7 @@ async def _announce_raffle_in_channels(context: ContextTypes.DEFAULT_TYPE, raffl
try:
msg_to_admin = "Anuncio enviado con éxito."
await context.bot.send_message(admin_user_id, msg_to_admin, parse_mode=ParseMode.MARKDOWN)
await context.bot.send_message(admin_user_id, msg_to_admin, parse_mode=ParseMode.HTML)
except Exception as e:
logger.error(f"Failed to send announcement summary to admin {admin_user_id}: {e}")