(new): sneklog v2
Golang lint / lint (push) Successful in 1m39s

This commit is contained in:
2026-04-27 10:23:54 +03:00
parent 3aee299869
commit a34734366d
23 changed files with 245 additions and 185 deletions
+62 -19
View File
@@ -10,7 +10,7 @@ import (
"git.scuroneko.dev/scuroneko/extypes"
"git.scuroneko.dev/scuroneko/laniakea/tgapi"
"git.scuroneko.dev/scuroneko/laniakea/utils"
"git.scuroneko.dev/scuroneko/slog"
"git.scuroneko.dev/scuroneko/sneklog/v2"
)
// AppData is the generic shared application data type injected into bots,
@@ -38,11 +38,11 @@ type AppData any
// Use Bot[NoData] to indicate no shared dependency injection is required.
type NoData struct{ AppData }
// AppDataLogger builds a slog.LoggerWriter from injected application data.
// AppDataLogger builds a sneklog.LoggerWriter from injected application data.
//
// Use it when shared application data exposes a log sink or adapter that should
// receive framework logs.
type AppDataLogger[T AppData] func(data T) slog.LoggerWriter
type AppDataLogger[T AppData] func(data T) sneklog.LoggerWriter
// BotPayloadType defines the serialization format for callback data payloads.
type BotPayloadType string
@@ -90,10 +90,11 @@ type Bot[T AppData] struct {
strictPayloadType bool
maxWorkers int
logger *slog.Logger // Main bot logger (JSON stdout + optional file)
RequestLogger *slog.Logger // Optional request-level API logging
webHookLogger *slog.Logger // Webhook logger. Available only after Bot.RunWebHookWithContext.
extraLoggers extypes.Slice[*slog.Logger] // API, Uploader, and custom loggers
logger *sneklog.Logger // Main bot logger (JSON stdout + optional file)
requestLogger *sneklog.Logger // Optional request-level API logging
useReqLogger bool
webHookLogger *sneklog.Logger // Webhook logger. Available only after Bot.RunWebHookWithContext.
extraLoggers extypes.Slice[*sneklog.Logger] // API, Uploader, and custom loggers
plugins []Plugin[T] // Command/event handlers
middlewares []Middleware[T] // Pre-processing filters (sorted by order)
@@ -187,12 +188,14 @@ func NewBot[T any](opts *BotOpts) (*Bot[T], error) {
debug: opts.Debug,
prefixes: prefixes,
token: opts.Token,
plugins: make([]Plugin[T], 0),
updateTypes: append([]tgapi.UpdateType{}, opts.UpdateTypes...),
runners: make([]Runner[T], 0),
extraLoggers: make([]*slog.Logger, 0),
l10n: &L10n{},
draftProvider: NewRandomDraftProvider(api),
useReqLogger: opts.UseRequestLogger,
plugins: make([]Plugin[T], 0),
updateTypes: append([]tgapi.UpdateType{}, opts.UpdateTypes...),
runners: make([]Runner[T], 0),
extraLoggers: make([]*sneklog.Logger, 0),
l10n: &L10n{},
draftProvider: NewRandomDraftProvider(api),
sessionStore: NewMemorySessionStore(),
sceneScopePriority: []SceneScope{SceneScopeUserChat, SceneScopeChat, SceneScopeUser},
@@ -235,6 +238,24 @@ func NewBot[T any](opts *BotOpts) (*Bot[T], error) {
return bot, nil
}
// SetLogger replaces the main bot logger.
func (b *Bot[T]) SetLogger(l *sneklog.Logger) *Bot[T] {
b.logger = l
return b
}
// SetRequestLogger replaces the request-level logger.
func (b *Bot[T]) SetRequestLogger(l *sneklog.Logger) *Bot[T] {
b.requestLogger = l
return b
}
// SetWebHookLogger replaces the webhook logger.
func (b *Bot[T]) SetWebHookLogger(l *sneklog.Logger) *Bot[T] {
b.webHookLogger = l
return b
}
// Close gracefully shuts down bot-owned resources.
//
// Close shuts down, in order:
@@ -283,8 +304,8 @@ func (bot *Bot[T]) Close() error {
logCloseErr(err)
}
}
if bot.RequestLogger != nil {
if err := bot.RequestLogger.Close(); err != nil {
if bot.requestLogger != nil {
if err := bot.requestLogger.Close(); err != nil {
logCloseErr(err)
}
}
@@ -322,14 +343,20 @@ func (bot *Bot[T]) SetUpdateOffset(offset int) {
}
// GetLogger returns the main bot logger.
func (bot *Bot[T]) GetLogger() *slog.Logger { return bot.logger }
func (bot *Bot[T]) GetLogger() *sneklog.Logger { return bot.logger }
// GetRequestLogger returns the request-level logger, if configured.
func (bot *Bot[T]) GetRequestLogger() *sneklog.Logger { return bot.requestLogger }
// GetWebHookLogger returns the webhook logger, if configured.
func (bot *Bot[T]) GetWebHookLogger() *sneklog.Logger { return bot.webHookLogger }
// GetLoggerLevel returns the effective log level derived from the bot's debug
// flag.
func (bot *Bot[T]) GetLoggerLevel() slog.LogLevel {
level := slog.FATAL
func (bot *Bot[T]) GetLoggerLevel() sneklog.LogLevel {
level := sneklog.FATAL
if bot.debug {
level = slog.DEBUG
level = sneklog.DEBUG
}
return level
}
@@ -373,6 +400,22 @@ func (bot *Bot[T]) RunWithContext(ctx context.Context) error {
return err
}
defer bot.finishRun()
if !bot.useReqLogger && bot.requestLogger != nil {
bot.logger.Warnln("Opts#UseRequestLogger is false, but Bot#requestLogger present. Remove Bot#SetRequestLogger or set Opts#UseRequestLogger to true!")
err := bot.requestLogger.Close()
if err != nil {
bot.logger.Errorln(err)
}
bot.requestLogger = nil
}
if bot.webHookLogger != nil {
bot.logger.Warnln("Bot#webHookLogger present. You shouldn't set this, if ran in Long Polling mode!")
err := bot.webHookLogger.Close()
if err != nil {
bot.logger.Errorln(err)
}
bot.webHookLogger = nil
}
bot.ExecRunners(ctx)