import logging from telegram import Update from telegram.ext import ( ApplicationBuilder, CommandHandler, MessageHandler, filters, CallbackContext, ) import json import datetime import pytz # Define la zona horaria TIMEZONE = pytz.timezone("Europe/Madrid") # Configuración del logging logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO ) logger = logging.getLogger(__name__) # Archivo para almacenar los IDs de los usuarios de guardia GUARDIA_FILE = 'guardia.json' # IDs de los usuarios que pueden estar de guardia USUARIOS_GUARDIA = [132308323, 127382235, 884077168, 569107396, 1110851005] # m4gn3to: 132308323 # david andueza: 884077168 # david berberia: 569107396 # susana: 1110851005 # victor: 127382235 # IDs de los usuarios que nunca deben ser expulsados USUARIOS_EXCLUIDOS = [132308323, 127382235] # ID del grupo de alertas GRUPO_ALERTAS_ID = -1002252938840 # El enlace de invitación al grupo: ENLACE_INVITACION = "https://t.me/+mejk7iBHZQA3NDY0" # Función para cargar los datos de guardia desde el archivo def cargar_guardia(): try: with open(GUARDIA_FILE, 'r') as f: return json.load(f) except FileNotFoundError: return {"ultimo_guardia": None} # Función para guardar los datos de guardia en el archivo def guardar_guardia(data): with open(GUARDIA_FILE, 'w') as f: json.dump(data, f) # Función para enviar el mensaje de guardia los lunes a las 8:00 AM async def enviar_mensaje_guardia(context: CallbackContext): data = cargar_guardia() ultimo_guardia = data.get("ultimo_guardia") for usuario in USUARIOS_GUARDIA: await context.bot.send_message(chat_id=usuario, text="¿Estás de guardia esta semana? Responde con un '1' o un 'sí' si esta semana te toca guardia o con un '0' o un 'no' en caso contrario. Gracias.") # Función para manejar las respuestas de los usuarios async def manejar_respuesta(update: Update, context: CallbackContext): usuario = update.message.from_user.id respuesta = update.message.text.lower() if respuesta in ['sí', 'Sí', 'Si', 'si', '1']: data = cargar_guardia() ultimo_guardia = data.get("ultimo_guardia") if ultimo_guardia and ultimo_guardia not in USUARIOS_EXCLUIDOS: # Expulsar al último guardia del grupo de alertas (si no está excluido) try: await context.bot.ban_chat_member(chat_id=GRUPO_ALERTAS_ID, user_id=ultimo_guardia) except Exception as e: logger.error(f"Error al expulsar al usuario {ultimo_guardia}: {e}") # Invitar al nuevo guardia al grupo de alertas try: await context.bot.unban_chat_member(chat_id=GRUPO_ALERTAS_ID, user_id=usuario) mensaje = ( "¡Gracias por confirmar que estás de guardia esta semana!\n\n" f"Únete al grupo de alertas usando este enlace: {ENLACE_INVITACION}" ) await context.bot.send_message(chat_id=usuario, text=mensaje) except Exception as e: logger.error(f"Error al invitar al usuario {usuario}: {e}") # Guardar el ID del nuevo guardia data["ultimo_guardia"] = usuario guardar_guardia(data) elif respuesta in ['no', 'No', '0']: await context.bot.send_message(chat_id=usuario, text="Gracias por responder. Como no estás de guardia esta semana, te sacamos del grupo.") await context.bot.ban_chat_member(chat_id=GRUPO_ALERTAS_ID, user_id=usuario) else: await context.bot.send_message(chat_id=usuario, text="No entiendo tu respuesta. Responde con un 1 o un Si, si estás de guardia. Con un 0 o un No en caso contrario. Gracias") # Función principal para iniciar el bot def main(): # El token del bot application = ApplicationBuilder().token("1859561736:AAESVsdzTXmO8GjbifI4GihIQZuGqA3tNuk").build() # Manejar las respuestas de los usuarios application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, manejar_respuesta)) # Programar el mensaje de guardia ahora = datetime.datetime.now(TIMEZONE) proximo_lunes = ahora #+ datetime.timedelta(days=(0 - ahora.weekday())) proximo_lunes = proximo_lunes.replace(hour=8, minute=25, second=0, microsecond=0) logger.info(f"La fecha actual es {ahora} y el mensaje se enviará {proximo_lunes}") application.job_queue.run_repeating(enviar_mensaje_guardia, interval=datetime.timedelta(weeks=1), first=proximo_lunes) # Iniciar el bot application.run_polling() # Punto de entrada del script if __name__ == '__main__': main()