Files
python-utilities/telegram-bot-guardias.py

161 lines
5.8 KiB
Python

import logging
from telegram import Update
from telegram.ext import (
ApplicationBuilder,
CommandHandler,
MessageHandler,
filters,
CallbackContext,
)
import json
import datetime
import pytz
import sys
# 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:
if usuario not in USUARIOS_EXCLUIDOS:
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)
else:
mensaje = (
"Muy gracioso. Si tu siempre estás de guardia parguelas!!!"
)
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']:
if usuario not in USUARIOS_EXCLUIDOS:
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="Gracias por responder, pero estás en la lista de pringaos que no se escapan de las notificaciones. Te quedas en el grupo.")
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")
def next_monday():
# Obtener la fecha actual
hoy = datetime.datetime.now(TIMEZONE)
# Calcular cuántos días faltan para el próximo lunes
# weekday() devuelve 0 para lunes, 1 para martes, ..., 6 para domingo
dias_para_lunes = (0 - hoy.weekday()) % 7
# Si hoy es lunes, dias_para_lunes será 0, por lo que devolvemos hoy
# Si no, sumamos los días que faltan para el próximo lunes
if dias_para_lunes == 0:
return hoy
else:
return hoy + datetime.timedelta(days=dias_para_lunes)
# Función principal para iniciar el bot
def main():
# si ya es martes, paramos la ejecución del bot hasta el lunes que viene:
# Obtener la fecha actual
hoy = datetime.datetime.now(TIMEZONE)
if hoy == 1:
sys.exit()
# 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 = next_monday()
proximo_lunes = proximo_lunes.replace(hour=8, minute=30, 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()