add lookback on start, added parsing for ','s

This commit is contained in:
Blake Ridgway
2026-04-25 19:17:58 -05:00
parent b6ef3a73f2
commit 020a4139b3
4 changed files with 118 additions and 5 deletions

View File

@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"log"
"strconv"
"strings"
"sync"
"time"
@@ -144,6 +145,85 @@ func (b *Bot) RegisterCommands() error {
func (b *Bot) onReady(s *discordgo.Session, r *discordgo.Ready) {
log.Printf("logged in as %s#%s", r.User.Username, r.User.Discriminator)
_ = s.UpdateGameStatus(0, "tracking your KMs 🚴")
go b.recoverMissingLogs(context.Background())
}
func (b *Bot) recoverMissingLogs(ctx context.Context) {
channels, err := b.db.GetAllChannelSettings(ctx)
if err != nil {
log.Printf("recoverMissingLogs: get channels: %v", err)
return
}
cutoff := time.Now().Add(-7 * 24 * time.Hour)
for guildID, channelID := range channels {
recovered := 0
beforeID := ""
for {
msgs, err := b.session.ChannelMessages(channelID, 100, beforeID, "", "")
if err != nil {
log.Printf("recoverMissingLogs: fetch messages %s: %v", channelID, err)
break
}
if len(msgs) == 0 {
break
}
done := false
for _, msg := range msgs {
if msg.Author == nil || msg.Author.Bot {
continue
}
if snowflakeTime(msg.ID).Before(cutoff) {
done = true
continue
}
if hasCheckmark(msg) {
continue
}
km, ok := parser.ParseKM(msg.Content)
if !ok {
continue
}
added, err := b.db.AddLog(ctx, guildID, msg.Author.ID, displayName(msg.Member, msg.Author), msg.ID, channelID, km)
if err != nil {
log.Printf("recoverMissingLogs: AddLog: %v", err)
continue
}
if added {
_ = b.session.MessageReactionAdd(channelID, msg.ID, reactionOK)
recovered++
log.Printf("recoverMissingLogs: recovered %.2f km from %s", km, msg.Author.Username)
}
}
if done {
break
}
beforeID = msgs[len(msgs)-1].ID
}
log.Printf("recoverMissingLogs: guild %s done, recovered %d rides", guildID, recovered)
}
}
func snowflakeTime(id string) time.Time {
sf, err := strconv.ParseInt(id, 10, 64)
if err != nil {
return time.Time{}
}
return time.Unix(0, ((sf>>22)+1420070400000)*int64(time.Millisecond))
}
func hasCheckmark(msg *discordgo.Message) bool {
for _, r := range msg.Reactions {
if r.Emoji.Name == reactionOK && r.Me {
return true
}
}
return false
}
func (b *Bot) onMessageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {