(new): PollTimeout config, RateLimiter.Cleanup
Golang lint / lint (pull_request) Successful in 3m4s
Golang lint / lint (push) Successful in 3m5s

(fix): compact payload escape, Draft.push validation, plugin logger ownership, worker StopAndWait, getChatLimiter deadlock, runner ctx-after-tick
(refactor): remove NewPayload, buildSceneKey from sceneRuntime, unify ToJSON fallback
(tests): compact round-trip, Draft.push state, RateLimiter.Cleanup eviction
(doc): changelog v1.0.0 rewrite, NewCommand dual-use godoc
This commit is contained in:
2026-05-18 17:27:14 +03:00
parent 09fb9261df
commit affb802a7b
38 changed files with 697 additions and 345 deletions
+10 -1
View File
@@ -36,7 +36,7 @@ type AppData any
// data.
//
// Use Bot[NoData] to indicate no shared dependency injection is required.
type NoData struct{ AppData }
type NoData struct{}
// AppDataLogger builds a sneklog.LoggerWriter from injected application data.
//
@@ -89,10 +89,12 @@ type Bot[T AppData] struct {
token string
debug bool
errorTemplate string
userID int64
username string
payloadType BotPayloadType
strictPayloadType bool
maxWorkers int
pollTimeout int // Long-polling timeout in seconds for getUpdates
logFormat utils.LogFormat
logFormatter *sneklog.Formatter
@@ -184,12 +186,18 @@ func NewBot[T any](opts *BotOpts) (*Bot[T], error) {
workers = opts.MaxWorkers
}
pollTimeout := 30
if opts.PollTimeout > 0 {
pollTimeout = opts.PollTimeout
}
bot := &Bot[T]{
updateOffset: 0,
errorTemplate: "%s",
payloadType: BotPayloadBase64,
strictPayloadType: opts.StrictPayloadType,
maxWorkers: workers,
pollTimeout: pollTimeout,
updateQueue: updateQueue,
api: api,
uploader: uploader,
@@ -239,6 +247,7 @@ func NewBot[T any](opts *BotOpts) (*Bot[T], error) {
return nil, err
}
bot.username = Val(u.Username, "")
bot.userID = u.ID
if bot.username == "" {
bot.logger.Warn("Can't get bot username. Named command handlers won't work!")
}