Files
lukaszraczylo 0ee539e991 perf(dispatch): typed Context.Command/CommandArgs/RegexMatch fields
Move the three conventional Values keys ("command", "command_args", "regex_match") to typed fields on Context. Router and group routing write the fields directly; the Values map is allocated lazily via the new Set method and reserved for user-defined custom keys.

Allocation impact (M4 Max, b.Loop()):

  DispatchCommand:   5 allocs/op -> 1, 153ns -> 69ns (-55%)

  DispatchTextRegex: 5 allocs/op -> 2, 181ns -> 107ns (-41%)

  DispatchFilter:    2 allocs/op -> 1, 32ns -> 19ns (-41%)

  NewContext:        5.79ns -> 1.60ns

Trade-off: Context struct grew from ~48B to ~96B (three new fields), so filter-only paths pay ~50B more per dispatch. Command/regex paths save ~320B + 4 allocs each, which dominates for typical bot workloads.

Handlers reading c.Values["command"], c.Values["command_args"], or c.Values["regex_match"] now get nil; the typed fields c.Command, c.CommandArgs, c.RegexMatch are the new accessors. Custom keys still work via c.Set(k, v) and c.Values[k].
2026-05-10 02:35:24 +01:00
..
2026-05-09 13:09:27 +01:00

pagination

Multi-page inline keyboard for browsing a list. No server-side session required — page state is encoded in callback data.

What it shows

  • OnCommand("/list") sends the first page with inline navigation buttons
  • OnCallback("^page:(\\d+)$") parses page number from callback data via c.Values["regex_match"]
  • api.EditMessageText edits the message in-place on each page turn
  • api.AnswerCallbackQuery dismisses the loading spinner

Pattern

Callback data format: page:<n> where n is the 0-based page index.

The renderPage helper builds both the text content and the keyboard in one call. Only [« Prev] or [Next »] buttons that make sense for the current page are rendered, so the keyboard is always minimal.

Running

export TELEGRAM_BOT_TOKEN=123456:ABC...
go run ./examples/pagination

Send /list to the bot. Tap Next/Prev to navigate 20 sample items, 5 per page.

Extending

To paginate dynamic data (database results, API responses), replace sampleItems with a function that takes (page, pageSize) and returns items + total count.