Tarde o temprano tu bot necesita hacer algo sin que se lo pidan: publicar un mensaje diario, limpiar un canal viejo, comprobar un servicio externo. Todas las librerías lo ponen fácil, y los tres errores habituales van todos de qué pasa cuando el bot no está corriendo.
Las herramientas
| Enfoque | Bueno para |
|---|---|
| El bucle de tareas de la propia librería | Cualquier cosa a intervalo fijo. Arranca y para con el bot. |
| Un programador estilo cron | «Todos los días a las nueve» en vez de «cada 24 horas». |
| Una tarea del panel ejecutando un comando | Cosas que deben pasar aunque el proceso del bot no esté sano. |
Los tres errores
- Confundir un intervalo con un reloj
«Cada 86400 segundos» va derivando: cuenta desde que arrancó el bot, así que un reinicio a las tres de la tarde mueve tu publicación de las nueve a las tres para siempre. Si la hora importa, usa un programador que entienda de horas, no de intervalos.
- No saber en qué zona horaria estás
Un servidor no corre necesariamente en tu hora local. «Las nueve de la mañana» son las nueve en algún sitio; comprueba en cuál, y ponlo explícito en vez de descubrirlo por la mañana.
- Perder la ejecución que tocaba mientras estaba caído
Un bot que estaba reiniciándose a las nueve simplemente se salta las nueve. Si una tarea no se puede saltar, guarda la última ejecución correcta y comprueba al arrancar si hay alguna pendiente.
Un trabajo de limpieza que borra mensajes de uno en uno, o un anuncio que publica en cincuenta canales en un bucle apretado, choca con los límites del artículo correspondiente. Agrupa donde la API lo permita, y espacia lo que no puedas agrupar: la tarea no es urgente, así que deja que sea lenta.
«Tarea diaria completada a las 09:00» es una línea y responde al instante y para siempre a «¿se ejecutó?». Sin ella, la única prueba de que una tarea corrió es si su efecto se ve, que no es lo mismo en absoluto.
Pon la tarea a un minuto de ahora, míralo dispararse, y luego reinicia el bot y comprueba que sigue disparándose a su hora y no un minuto después del arranque.