This bot stores calendar credentials and amateur-radio identifiers on the operator’s machine. Treat the host like a small identity provider.
SQLite (default data/bot.db):
| Data | Encrypted at rest? |
|---|---|
Telegram user id and optional @username |
No |
| DAPNET callsign, RIC numbers, RIC owner callsigns, core, TX groups | No |
| Nextcloud URL and username | No |
| Nextcloud app password | Yes (Fernet, ENCRYPTION_KEY) |
| Calendar names and CalDAV URLs | No |
| Cached event summaries, locations, start times | No |
| Which reminder offsets were already sent | No |
The operator DAPNET password lives only in .env, not in SQLite.
/delete removes that user’s calendars, events, sent-reminder rows, RIC links, and the encrypted Nextcloud secret. The shared RIC catalog (rics) remains so other users can still resolve that RIC to a callsign.
ENCRYPTION_KEY is a Fernet key. Generate it with:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
bot.db./register again..env. .gitignore excludes .env, data/, and *.db.The bot does not log app passwords or DAPNET_PASSWORD. Do not raise LOG_LEVEL=DEBUG in a setup that might print full HTTP bodies to a shared log.
/register the bot tries to delete the message that contained the app password. Users should still delete it if it remains.Admins see Nextcloud URL and username on registration notices, not the password.
Every page is sent as the operator account. Recipients are callsigns, not raw RIC numbers. Do not approve users you do not trust: they can cause pages to be sent (within DAPNET’s own limits) using your operator credentials.
emergency is always false. There is no broadcast or /send.
The process connects outbound to:
https://radioid.net/…) during RIC suggestionsIt does not require inbound ports. CalDAV URLs are restricted to http and https (file: is rejected).
.env and data/.bot.db and ENCRYPTION_KEY together.If you run this for other people, tell them:
/delete;This is not legal advice.