"errors"
"fmt"
"io"
- "log"
+ "log/slog"
"net/http"
"os"
"path/filepath"
// newTelegramBot returns the bot of owner on api. The offset file is at
// offsetPath, and logger gets the failures. No log line holds the text of a
// message.
-func newTelegramBot(api *TelegramAPI, owner int64, offsetPath string, logger *log.Logger) *TelegramBot {
+func newTelegramBot(api *TelegramAPI, owner int64, offsetPath string, logger *slog.Logger) *TelegramBot {
return &TelegramBot{
api: api,
owner: owner,
api *TelegramAPI
owner int64
offsetPath string
- logger *log.Logger
+ logger *slog.Logger
minWait time.Duration
maxWait time.Duration
func (b *TelegramBot) handle(ctx context.Context, l *TurnLoop, whatsapp *WhatsApp, update TelegramUpdate) error {
message := update.Message
if message == nil || message.Chat.Type != "private" || message.Chat.ID != b.owner || message.From == nil || message.From.ID != b.owner {
- b.logger.Print("message ignored: not from the owner")
+ b.logger.Info("message ignored: not from the owner")
return nil
}
var answer *TelegramError
if len(part.entities) > 0 && errors.As(err, &answer) && answer.Status == http.StatusBadRequest {
- b.logger.Printf("reply sent as plain text: %v", err)
+ b.logger.Warn("reply sent as plain text", "err", err)
part.entities = nil
}
if !retry {
- b.logger.Printf("reply lost: %v", err)
+ b.logger.Error("reply lost", "err", err)
return
}
}
if telegramRejected(err) {
- b.logger.Printf("reply sent with simple formatting: %v", err)
+ b.logger.Warn("reply sent with simple formatting", "err", err)
for _, part := range telegramReplyParts(telegramUnescapeTags(markdown)) {
b.deliver(ctx, part)
}
if !retry {
- b.logger.Printf("reply lost: %v", err)
+ b.logger.Error("reply lost", "err", err)
return
}
// nothing. The next answer of Telegram logs back and the length of the outage.
// loss and back say what the user loses and gets again.
type TelegramOutage struct {
- logger *log.Logger
+ logger *slog.Logger
loss string
back string
start time.Time
}
o.start = time.Now()
- o.logger.Printf("%s: %v (retry in %s)", o.loss, err, durationText(delay))
+ o.logger.Warn(o.loss, "err", err, "retry", delay)
}
// End logs the end of the outage that runs, with its length.
return
}
- o.logger.Printf("%s after %s", o.back, durationText(time.Since(o.start)))
+ o.logger.Info(o.back, "after", time.Since(o.start))
o.start = time.Time{}
}