db123 834c318271 feat: add /summary, /setbreak, weekly totals, and fix command dispatch for arg-bearing commands
- Add /summary [YYYY-MM] command for monthly work/break/day-off totals

- Add weekly totals row to main menu status

- Add /setbreak <minutes> for configurable daily break threshold

- Fix HandleMessage routing: extract command name instead of exact match (fixes /export YYYY-MM, /edit, /note, /summary, /setbreak)

- Update README with full command table and configurable break docs
2026-06-24 20:39:51 +03:30

WorkTime Bot

A single-user Telegram time-tracking bot with multi-calendar support (Gregorian, Jalali/Persian, Hijri). Clock in/out, toggle remote/onsite, mark day off, get daily reports at a configurable time, browse history by month, and export monthly .xlsx reports.

Quick Start

cp .env.example .env
# edit .env — set BOT_TOKEN and BOT_ALLOWED_USERS
docker compose up -d

Environment Variables

Variable Default Purpose
BOT_TOKEN Telegram Bot API token (required)
BOT_ALLOWED_USERS (all) Comma-separated Telegram user IDs (empty = allow all)
HTTP_PROXY Outbound HTTP proxy for Telegram API
HTTPS_PROXY Outbound HTTPS proxy for Telegram API
DB_PATH db.sqlite3 Path to SQLite database file
BOT_WEBHOOK_URL Set for webhook mode (omit for long-polling)
BOT_LISTEN :8080 Listen address for webhook mode
BOT_TLS_CERT TLS certificate path (webhook HTTPS)
BOT_TLS_KEY TLS key path (webhook HTTPS)

Calendar Support

Users can choose between three calendars via /settings:

  • Gregorian — standard international calendar
  • Jalali (Persian/Solar Hijri) — official calendar of Iran and Afghanistan
  • Hijri (Islamic lunar) — used in many Muslim-majority countries

The history view, export month picker, and date displays all adapt to the user's chosen calendar. The /export and /edit commands accept dates in the user's calendar. Internally, all dates are stored as Gregorian.

Usage

Persistent reply keyboard at the bottom of the chat: Clock In / Clock Out

Inline menu on /start:

Button Action
Clock In / Clock Out Record work event
Report Today's work & break summary
Export Pick a month → download .xlsx
History Browse past days in calendar view
Toggle Remote/Onsite Switch work type
Day Off Mark today as day off
Settings Timezone, accent, calendar type

Commands

Command Action
/start Show inline menu
/clockin Record clock-in
/clockout Record clock-out
/remote Toggle remote/onsite
/report Today's work & break summary
/export [YYYY-MM] Export monthly report (optional YYYY-MM in your calendar)
/summary [YYYY-MM] Show monthly summary (optional YYYY-MM)
/dayoff Toggle today as day off
/edit YYYY-MM-DD View/edit events for a specific date
/note [DATE] HH:MM <text> Set note for an event at a specific time
/settimezone <IANA> Set timezone (e.g. Asia/Tehran)
/setbreak <minutes> Set minimum break threshold (0-480, default 5)
/setaccent Select export accent color
/setreporttime HH:MM Set daily auto-report time
/reporttoggle Enable/disable daily auto-report
/settings Open settings menu

Daily Report

A daily summary is sent automatically at the user's configured report time (default 23:00). The scheduler checks every 30 seconds.

How Break Time Works

The gap between a clock-out and the next clock-in is counted as break. Gaps shorter than the min break threshold (default 5 minutes) are absorbed into work time. Use /setbreak <minutes> to adjust per day (0-480).

09:00 Clock In     → work starts
12:00 Clock Out    → work: 3h, break starts
13:00 Clock In     → break: 1h, work resumes
17:00 Clock Out    → work: 4h
                    total: 7h work, 1h break

Export

The /export command opens a month picker. Select any month in your calendar and download an .xlsx file with columns: Date, Clock In, Clock Out, Type, Work, Break.

Four color themes are available in settings: Ocean, Beach, Rose, Catppuccin.

Project Structure

├── cmd/bot/
│   ├── main.go              Entrypoint, polling/webhook, scheduler
│   └── webhook.go           Webhook mode with TLS support
├── internal/
│   ├── bot/
│   │   ├── handlers.go      Message/callback routing, views, menu builders
│   │   ├── totals.go        Break/work computation state machine
│   │   ├── export.go        Excel (.xlsx) report generation
│   │   └── dateutil.go      Gregorian/Jalali/Hijri conversions & calendars
│   └── db/
│       ├── store.go         SQLite store
│       └── migrations/      Goose-managed SQL migrations
│           └── 001_init.sql Initial schema
├── .gitea/workflows/
│   └── ci.yml               Gitea Actions CI
├── Dockerfile
├── docker-compose.yml
├── Makefile
├── .env.example
└── README.md

Build & Run

# Local (requires Go 1.26+ and CGo-free SQLite)
make run

# Docker
docker compose up -d --build
Description
No description provided
Readme 375 KiB
Languages
Go 99.6%
Makefile 0.2%
Dockerfile 0.2%