diff --git a/bot.go b/bot.go index 79087da..0f16a53 100644 --- a/bot.go +++ b/bot.go @@ -100,6 +100,7 @@ func NewBot(settings *BotSettings) *Bot { level = DEBUG } bot.logger = CreateLogger().Level(level).OpenFile(fmt.Sprintf("%s/main.log", strings.TrimRight(settings.LoggerBasePath, "/"))) + bot.logger = bot.logger.PrintTraceback(true) if settings.UseRequestLogger { bot.requestLogger = CreateLogger().Level(level).Prefix("REQUESTS").OpenFile(fmt.Sprintf("%s/requests.log", strings.TrimRight(settings.LoggerBasePath, "/"))) } @@ -120,6 +121,14 @@ func (b *Bot) InitDatabaseContext(ctx *DatabaseContext) *Bot { b.dbContext = ctx return b } +func (b *Bot) AddDatabaseLogger(writer func(db *DatabaseContext) LoggerWriter) *Bot { + w := []LoggerWriter{writer(b.dbContext)} + b.logger.AddWriters(w) + if b.requestLogger != nil { + b.requestLogger.AddWriters(w) + } + return b +} func (b *Bot) UpdateTypes(t ...string) *Bot { b.updateTypes = make([]string, 0) @@ -283,7 +292,8 @@ func (b *Bot) handleCallback(update *Update) { for _, plugin := range b.plugins { if plugin.UpdateListener != nil { - (*plugin.UpdateListener)(ctx, b.dbContext) + lis := *plugin.UpdateListener + lis(ctx, b.dbContext) } } @@ -310,7 +320,7 @@ func (ctx *MsgContext) Answer(text string) { _, err := ctx.Bot.SendMessage(&SendMessageP{ ChatID: ctx.Msg.Chat.ID, Text: text, - ParseMode: "markdown", + ParseMode: ParseMD, }) if err != nil { ctx.Bot.logger.Error(err) diff --git a/logger.go b/logger.go index 2960fde..496e279 100644 --- a/logger.go +++ b/logger.go @@ -11,11 +11,14 @@ import ( "github.com/fatih/color" ) +type LoggerWriter func(level LogLevel, prefix, traceback string, message []any) + type Logger struct { prefix string level LogLevel printTraceback bool printTime bool + writers []LoggerWriter f *os.File } @@ -26,6 +29,10 @@ type LogLevel struct { c color.Attribute } +func (l *LogLevel) GetName() string { + return l.t +} + type MethodTraceback struct { Package string Method string @@ -36,11 +43,11 @@ type MethodTraceback struct { } var ( - INFO LogLevel = LogLevel{n: 0, t: "info", c: color.FgWhite} - WARN LogLevel = LogLevel{n: 1, t: "warn", c: color.FgHiYellow} - ERROR LogLevel = LogLevel{n: 2, t: "error", c: color.FgHiRed} - FATAL LogLevel = LogLevel{n: 3, t: "fatal", c: color.FgRed} - DEBUG LogLevel = LogLevel{n: 4, t: "debug", c: color.FgGreen} + INFO = LogLevel{n: 0, t: "info", c: color.FgWhite} + WARN = LogLevel{n: 1, t: "warn", c: color.FgHiYellow} + ERROR = LogLevel{n: 2, t: "error", c: color.FgHiRed} + FATAL = LogLevel{n: 3, t: "fatal", c: color.FgRed} + DEBUG = LogLevel{n: 4, t: "debug", c: color.FgGreen} ) func CreateLogger() *Logger { @@ -76,6 +83,14 @@ func (l *Logger) PrintTraceback(b bool) *Logger { l.printTraceback = b return l } +func (l *Logger) PrintTime(b bool) *Logger { + l.printTime = b + return l +} +func (l *Logger) AddWriters(writers []LoggerWriter) *Logger { + l.writers = append(l.writers, writers...) + return l +} func (l *Logger) Info(m ...any) { l.print(INFO, m) @@ -152,7 +167,15 @@ func (l *Logger) print(level LogLevel, m []any) { if l.level.n < level.n { return } - color.New(level.c).Println(l.buildString(level, m)) + _, err := color.New(level.c).Println(l.buildString(level, m)) + if err != nil { + l.Fatal(err) + return + } + + for _, writer := range l.writers { + writer(level, l.prefix, l.formatTraceback(l.getTraceback()), m) + } if l.f != nil { if _, err := l.f.Write([]byte(l.buildString(level, m) + "\n")); err != nil {