dyzur-bot/README.md

59 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Dyżur-bot
A telegram bot for managing the cleaning rota in hackerspace.
Bot offers weekly reminders about cleaning duties as well as on demand informations.
Backend read the schedule from a Google sheet, store it in local JSON file.
## Running
Requires `GOOGLE_API_KEY`, `GOOGLE_SHEETS_ID`, and `BOT_TOKEN` in the
environment or a `.env` file (see `service.go`/`sheet.go` for optional
`SHEET_RANGE`, `ROTA_CACHE_PATH`, `SYNC_INTERVAL`). Then:
```sh
go run ./cmd/dyzur-bot
```
The service loads the cached rota, syncs from Google Sheets in the background on
`SYNC_INTERVAL` (default 30m), and runs the Telegram bot via long polling until
interrupted (Ctrl-C / SIGTERM).
When `SHEET_RANGE` is unset, the bot reads the current year's tab (e.g.
`2026!A1:G100`), resolved on every sync — so it follows the New Year rollover
automatically without a restart. A sync that fails, or that returns no duty
weeks (e.g. a next-year tab that exists but hasn't been filled in yet), keeps
the last-good cache instead of clearing it; if no sync succeeds for 6h the bot
logs a loud stale-cache error.
> **Run exactly one instance per bot token.** The bot uses long polling
> (`getUpdates`); two concurrent pollers on the same token make Telegram return
> HTTP 409 Conflict and updates get dropped. Do not scale this to multiple
> replicas.
### Docker
```sh
docker build -t dyzur-bot .
docker run --rm --env-file .env -v dyzur-data:/data dyzur-bot
```
The image is a static binary on `distroless` (timezone data is embedded, so
reminders work without system `tzdata`). The rota cache lives at
`/data/rota.json` (`ROTA_CACHE_PATH`); mount a volume at `/data` to persist it
across restarts.
### Commands
- `/kto_sprzata` — who is on cleaning duty this week.
- `/sync` — refresh the rota from Google Sheets now (throttled to once per
minute across the chat to avoid spamming the Sheets API).
### Reminders
If `GROUP_CHAT_ID` is set, the bot posts a weekly duty reminder to that chat.
Schedule (all optional, with defaults): `REMINDER_WEEKDAY` (default `Monday`),
`REMINDER_HOUR` (default `9`, 023), `DUTY_AHEAD_DAYS` (default `14`). The hour
is interpreted in Europe/Warsaw time. The reminder announces who is on duty
`DUTY_AHEAD_DAYS` from the fire time — e.g. every Monday 09:00, who cleans two
weeks out. Leave `GROUP_CHAT_ID` unset to disable reminders.