Pasa de un cron ciego a un servicio en segundo plano. El killswitch lo exige: para poder cancelar un fichaje pendiente desde el movil tiene que haber un proceso escuchando durante la espera. - daemon: bucle propio que duerme exactamente hasta el siguiente evento, con precision de decimas. No usa JobQueue de PTB porque APScheduler 3.6 importa pkg_resources, que ya no existe en Python 3.13; ademas asi no se añade una dependencia. Recupera fichajes perdidos si el equipo estuvo apagado. - bot: /hoy /saldo /plan /fichar /desfichar /off /on /pausa /reanudar /log. Los comandos se registran con setMyCommands para que salgan en el menu del chat. Solo atiende al chat_id configurado. - killswitch: aviso 12 min antes con teclado inline (cancelar / +15 min / fichar ya). - Google Calendar queda solo para ausencias personales; festivos y vacaciones salen del calendario de Timenet. - deploy/autoficher.service: unidad de usuario endurecida (ProtectSystem strict, escritura solo en el propio directorio), Restart=always. - requirements: python-telegram-bot >= 22. La 20.5 tiene un bug de __slots__ en Updater que rompe el polling en Python 3.13. - .gitignore: data/, *.db, .env, __pycache__ en cualquier nivel. tools/test_daemon.py cubre con reloj simulado y sin red: plan, aviso previo, fichaje a su hora, killswitch, retraso de 15 min, pausa, recuperacion tras apagon, fallo de red y dia no laborable. 19 comprobaciones. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
71 lines
1.3 KiB
Plaintext
71 lines
1.3 KiB
Plaintext
anyio==3.7.1
|
|
APScheduler==3.6.3
|
|
attrs==20.3.0
|
|
cached-property==1.5.2
|
|
cachetools==4.2.2
|
|
certifi==2020.6.20
|
|
cffi
|
|
chardet==4.0.0
|
|
charset-normalizer==3.4.3
|
|
cryptography==41.0.5
|
|
decorator==4.4.2
|
|
dnspython==2.0.0
|
|
docker==4.1.0
|
|
docker-compose==1.25.0
|
|
dockerpty==0.4.1
|
|
docopt==0.6.2
|
|
exceptiongroup==1.1.2
|
|
ffmpeg-python==0.2.0
|
|
future==0.18.3
|
|
google-api-core==2.12.0
|
|
google-api-python-client==2.102.0
|
|
google-auth==2.23.2
|
|
google-auth-httplib2==0.1.1
|
|
google-auth-oauthlib==1.1.0
|
|
googleapis-common-protos==1.60.0
|
|
h11==0.14.0
|
|
httpcore==0.17.3
|
|
httplib2==0.22.0
|
|
httpx==0.24.1
|
|
idna==2.10
|
|
imageio==2.31.1
|
|
imageio-ffmpeg==0.4.8
|
|
importlib-metadata==1.6.0
|
|
jsonschema==3.2.0
|
|
more-itertools==4.2.0
|
|
moviepy==1.0.3
|
|
numpy
|
|
oauthlib==3.2.2
|
|
paho-mqtt==1.6.1
|
|
pandas==2.3.3
|
|
Pillow
|
|
proglog==0.1.10
|
|
prompt-toolkit==3.0.39
|
|
protobuf==4.24.4
|
|
pyasn1==0.5.0
|
|
pyasn1-modules==0.3.0
|
|
pycparser==2.21
|
|
pyparsing==3.1.1
|
|
pyrsistent==0.15.5
|
|
python-crontab==3.0.0
|
|
python-dateutil==2.8.2
|
|
python-telegram-bot>=22.0 # <22 rompe en Python 3.13 (__slots__ en Updater)
|
|
pytz
|
|
PyYAML
|
|
requests==2.32.3
|
|
requests-oauthlib==1.3.1
|
|
rsa==4.9
|
|
six==1.16.0
|
|
sniffio==1.3.0
|
|
speedtest-cli==2.1.3
|
|
texttable==1.6.3
|
|
tornado==6.1
|
|
tqdm==4.65.0
|
|
tzdata==2025.2
|
|
tzlocal==5.0.1
|
|
uritemplate==4.1.1
|
|
urllib3==1.26.5
|
|
wcwidth==0.2.8
|
|
websocket-client==0.57.0
|
|
zipp==1.0.0
|