tiennm99 958da76d33 fix(modules): reserve reply budget and cap price-fetch timeouts in stats handlers
Stats handlers reused the single bounded update context for both upstream
price fetches and the final Telegram reply, while per-upstream HTTP timeouts
equalled the whole-handler budget. One slow upstream drained the deadline and
the reply failed with "context deadline exceeded" (observed on /stock_stats).

- add chathelper.FetchContext: fetches run under a child context that reserves
  a tail of the deadline for the reply, which is sent on the original context
- cap kbs/coin/gold/vnappmob HTTP timeouts at 3s so one hung upstream cannot
  consume the reply budget
- fetch held stock/coin prices concurrently (bounded) so total latency tracks
  the slowest single fetch instead of their sum; per-symbol failures degrade to
  a "no price" line and the summary still sends
2026-06-25 14:07:59 +07:00
2026-05-15 22:18:27 +07:00

miti99bot

Plug-n-play Telegram bot framework in Go. Runs on AWS Lambda + DynamoDB + EventBridge Scheduler. Strictly free-tier.

Modules

Module What it does
util /help, /info, /stickerid
misc /ping, /mstats, /trongtruonghop disclaimer
wordle Daily Wordle game
loldle League-of-Legends "guess the champion"
lolschedule Pro-match schedule + daily push
twentyq 20-questions game (requires Gemini API key)
stock VN-stocks paper trading
gold Gold paper trading (opt-in; primary VNAppMob SJC buy/sell VND/luong, fallback spot XAU)
coin Crypto paper trading in USD (Binance -> Coinbase -> CoinGecko price fallback)
stats /stats (top commands), /stats users, /stats user <name>, /stats cmd <name>

Disable any module by editing MODULES in template.yaml.

Layout

cmd/server/             entrypoint
internal/server/        HTTP routes (/, /webhook, /cron/{name})
internal/telegram/      Telegram webhook + bot wrapper
internal/modules/       Module framework, registry, dispatchers, modules
internal/storage/       KVStore interface; memory + dynamodb providers
internal/ai/            Gemini client (used by twentyq)
template.yaml           AWS SAM IaC (Lambda + Function URL + DynamoDB + Logs + Budget)
docs/deploy-aws-free-tier-guide.md   Full onboarding guide
docs/deploy-aws.md                   Steady-state operations
aws/README.md                        One-time AWS account setup

Run locally

In-memory KV (no AWS required):

TELEGRAM_BOT_TOKEN=\
TELEGRAM_WEBHOOK_SECRET=local \
PORT=8080 \
MODULES= \
go run ./cmd/server

End-to-end smoke test against a Telegram dev bot needs ngrok (local) or a deployed Function URL. The dev bot is created manually; token injected via env vars only.

For DynamoDB integration tests:

make dynamodb-local      # docker run amazon/dynamodb-local on :8001
make test-dynamodb       # runs internal/storage tests against DDB Local

Test

make vet              # go vet
make test             # full unit suite (no emulator)
make test-dynamodb    # storage tests against DynamoDB Local (requires Docker)

Deploy

First-time onboarding: see docs/deploy-aws-free-tier-guide.md.

Steady-state operations: docs/deploy-aws.md.

After the initial setup, every push to main triggers .github/workflows/deploy.yml (GitHub Actions OIDC → SAM deploy). No long-lived AWS keys.

License

Apache-2.0.

S
Description
Plug-n-play Telegram bot framework in Go, self-hosted on Coolify + MongoDB Atlas with cron, games, schedules, and paper trading modules.
Readme Apache-2.0
4.7 MiB
Languages
Go 99.8%
Dockerfile 0.2%