add lookback on start, added parsing for ','s
This commit is contained in:
80
bot/bot.go
80
bot/bot.go
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user