mirror of
https://github.com/lukaszraczylo/go-telegram.git
synced 2026-06-05 22:43:59 +00:00
0ee539e991
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].
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 buttonsOnCallback("^page:(\\d+)$")parses page number from callback data viac.Values["regex_match"]api.EditMessageTextedits the message in-place on each page turnapi.AnswerCallbackQuerydismisses 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.