Merge remote-tracking branch 'origin/max/be-8890'

This commit is contained in:
Tulir Asokan
2023-04-16 13:23:32 +03:00
3 changed files with 57 additions and 0 deletions

View File

@@ -70,6 +70,11 @@ func (mq *MessageQuery) GetLastInThread(key PortalKey, threadID string) *Message
return mq.New().Scan(mq.db.QueryRow(query, key.ChannelID, key.Receiver, threadID))
}
func (mq *MessageQuery) GetLast(key PortalKey) *Message {
query := messageSelect + " WHERE dc_chan_id=$1 AND dc_chan_receiver=$2 AND dc_edit_index=0 ORDER BY timestamp DESC LIMIT 1"
return mq.New().Scan(mq.db.QueryRow(query, key.ChannelID, key.Receiver))
}
func (mq *MessageQuery) DeleteAll(key PortalKey) {
query := "DELETE FROM message WHERE dc_chan_id=$1 AND dc_chan_receiver=$2"
_, err := mq.db.Exec(query, key.ChannelID, key.Receiver)

View File

@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"reflect"
"sort"
"strconv"
"strings"
"sync"
@@ -1974,3 +1975,52 @@ func (portal *Portal) UpdateInfo(source *User, meta *discordgo.Channel) *discord
}
return meta
}
func (portal *Portal) ForwardBackfill(source *User, meta *discordgo.Channel) error {
portal.log.Debugln("Checking for missing messages to fill")
lastMessage := portal.bridge.DB.Message.GetLast(portal.Key)
if lastMessage == nil {
return nil
}
metaLastMessageID, err := strconv.ParseInt(meta.LastMessageID, 10, 0)
if err != nil {
portal.log.Errorfln("Last message ID %s isn't integer", meta.LastMessageID)
return err
}
dbLastMessageID, err := strconv.ParseInt(lastMessage.DiscordID, 10, 0)
if err != nil {
portal.log.Errorfln("Last message ID %s isn't integer", lastMessage.DiscordID)
return err
}
if metaLastMessageID <= dbLastMessageID {
return nil
}
// Get up to 50 messages at a time until everything is fetched
for {
messages, err := source.Session.ChannelMessages(portal.Key.ChannelID, 50, "", lastMessage.DiscordID, "")
if err != nil {
portal.log.Debugln("Error getting messages to forward backfill", err)
return err
}
// Discord seems to return messages in reverse order,
// but no specific order is guaranteed by their API docs?
sort.Slice(messages, func(i, j int) bool {
return messages[i].Timestamp.Before(messages[j].Timestamp)
})
for _, msg := range messages {
portal.handleDiscordMessageCreate(source, msg, nil)
}
if len(messages) < 100 {
// Assume that was all the missing messages
return nil
}
lastMessage = portal.bridge.DB.Message.GetLast(portal.Key)
if lastMessage == nil {
return nil
}
}
}

View File

@@ -728,6 +728,7 @@ func (user *User) handlePrivateChannel(portal *Portal, meta *discordgo.Channel,
}
} else {
portal.UpdateInfo(user, meta)
portal.ForwardBackfill(user, meta)
}
user.MarkInPortal(database.UserPortal{
DiscordID: portal.Key.ChannelID,
@@ -842,6 +843,7 @@ func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSp
}
} else {
portal.UpdateInfo(user, ch)
portal.ForwardBackfill(user, ch)
}
}
}