512kg / dima
Personal

Automatizo cosas

Un bot de Telegram que maneja mi Mac: bloquearlo, hacer una captura, grabar una reunión, poner un recordatorio, vigilar una habitación con la cámara.

Un núcleo que no sabe que Telegram existe

Las 41 acciones viven en un núcleo que no importa ninguna librería de red. Eso está verificado ejecutándolo con la librería de Telegram bloqueada. Telegram es una interfaz más encima de ese núcleo, con 46 comandos. Una interfaz de línea de comandos usa el mismo núcleo, así que un atajo en el teléfono puede ejecutar una acción por SSH y recibir la misma respuesta que daría Telegram.

El motivo es práctico. Las acciones son la parte que merece conservarse, y no deben depender de un servicio de mensajería. Añadir otra interfaz es escribir un transporte, sin tocar las acciones.

Los botones y los comandos escritos comparten una sola tabla que asocia cada comando con su función. No pueden desincronizarse, porque no hay nada que mantener a la par.

Reiniciar borraba los recordatorios, en silencio

En las primeras versiones los recordatorios vivían en memoria. Reiniciar el bot los borraba, y nada lo decía. Es el peor tipo de fallo: el sistema parece sano y ha olvidado lo que le pediste.

Ahora todo está en SQLite. Al arrancar, el bot reprograma lo que sigue pendiente y me avisa de lo que venció mientras el Mac estaba apagado, en vez de tragárselo.

  • Las notas de voz las transcribe Whisper en el propio equipo. El audio no sale de él.
  • Un cerrojo de fichero garantiza que solo hay una instancia.
  • Una pequeña aplicación en Swift, en la barra de menús, arranca el bot, lo reinicia si se cae y puede mantener el Mac despierto.

Un buzón que no sabe nada

Con el Mac apagado, un mensaje se queda sin respuesta. El arreglo opcional es un Worker pequeño, de 153 líneas, que guarda los mensajes mientras el Mac está apagado y contesta «lo hago cuando despierte».

Importa más lo que no hace. No ejecuta comandos ni guarda ninguno de mis datos: ni recordatorios, ni notas, ni listas. El Mac sigue siendo la fuente de verdad. Viene desactivado, porque lo normal debe ser un bot enteramente local; activarlo compra una respuesta inmediata a cambio de que los mensajes pasen por un tercero.

Usa D1 y no KV. Una cola necesita que lo escrito se vea en la lectura siguiente, y KV es de consistencia eventual.

Una regla que añadí después de que me fallara

Una vez mandé una orden con la tapa cerrada. El Mac dormía, el mensaje esperó en la cola de Telegram y se atendió dos horas después, cuando ya no tenía sentido.

Una orden es una instrucción para un momento. Ejecutada tarde, una orden correcta se convierte en una equivocada. Ahora todo lo que llega con más de diez minutos de retraso se descarta, y el bot lo dice en vez de ejecutarlo.

La explicación completa, con todos los comandos (en inglés).

  • Python66.8%
  • HTML18.1%
  • Swift8.7%
  • JavaScript5.1%
  • Shell1.3%