Backlog several pages of messages if not initial backlog

This commit is contained in:
Alex 2020-02-26 15:44:08 +01:00
parent e6fa715b81
commit 495a6303dc
1 changed files with 50 additions and 17 deletions

View File

@ -27,6 +27,9 @@ type Mattermost struct {
username string
teams map[string]bool
initial_members int // How many room members (maximum) to load when first joining a channel
initial_backlog int // How many previous messages (maximum) to load when first joining a channel
conn *matterclient.MMClient
handlerStopChan chan bool
@ -66,6 +69,16 @@ func (mm *Mattermost) Configure(c Configuration) error {
return err
}
mm.initial_members, err = c.GetInt("initial_members", 1000)
if err != nil {
return err
}
mm.initial_backlog, err = c.GetInt("initial_backlog", 1000)
if err != nil {
return err
}
teams, err := c.GetString("teams")
if err != nil {
return err
@ -385,7 +398,7 @@ func (mm *Mattermost) initSyncChannel(ch *model.Channel) {
// Update member list
// TODO (when this will be slow, i.e. hundreds of members): do only a diff
members, resp := mm.conn.Client.GetChannelMembers(ch.Id, 0, 1000, "")
members, resp := mm.conn.Client.GetChannelMembers(ch.Id, 0, mm.initial_members, "")
if resp.Error == nil {
for _, mem := range *members {
if mem.UserId == mm.conn.User.Id {
@ -405,26 +418,45 @@ func (mm *Mattermost) initSyncChannel(ch *model.Channel) {
}
// Read backlog
var backlog *model.PostList
var resp *model.Response
last_seen_post := mm.handler.CacheGet(fmt.Sprintf("last_seen_%s", ch.Id))
if last_seen_post != "" {
backlog, resp = mm.conn.Client.GetPostsAfter(ch.Id, last_seen_post, 0, 1000, "")
// TODO: if there are more than 1000, loop around
} else {
backlog, resp = mm.conn.Client.GetPostsForChannel(ch.Id, 0, 1000, "")
}
if resp.Error == nil {
for i := 0; i < len(backlog.Order); i++ {
post_id := backlog.Order[len(backlog.Order)-i-1]
post := backlog.Posts[post_id]
post_time := time.Unix(post.CreateAt/1000, 0)
post.Message = fmt.Sprintf("[%s] %s",
post_time.Format("2006-01-02 15:04:05 MST"), post.Message)
mm.handlePost(ch.Name, post, true)
const NUM_PER_PAGE = 100
page := 0
backlogs := []*model.PostList{}
for {
backlog, resp := mm.conn.Client.GetPostsAfter(ch.Id, last_seen_post, page, NUM_PER_PAGE, "")
if resp.Error == nil {
backlogs = append(backlogs, backlog)
if len(backlog.Order) == NUM_PER_PAGE {
page += 1
} else {
break
}
} else {
break
}
}
for i := 0; i < len(backlogs); i++ {
mm.processBacklog(ch, backlogs[i])
}
} else {
log.Warnf("Could not get channel backlog: %s", resp.Error)
backlog, resp := mm.conn.Client.GetPostsForChannel(ch.Id, 0, mm.initial_backlog, "")
if resp.Error == nil {
mm.processBacklog(ch, backlog)
} else {
log.Warnf("Could not get channel backlog: %s", resp.Error)
}
}
}
func (mm *Mattermost) processBacklog(ch *model.Channel, backlog *model.PostList) {
for i := 0; i < len(backlog.Order); i++ {
post_id := backlog.Order[len(backlog.Order)-i-1]
post := backlog.Posts[post_id]
post_time := time.Unix(post.CreateAt/1000, 0)
post.Message = fmt.Sprintf("[%s] %s",
post_time.Format("2006-01-02 15:04:05 MST"), post.Message)
mm.handlePost(ch.Name, post, true)
}
}
@ -569,6 +601,7 @@ func (mm *Mattermost) handlePost(channel_name string, post *model.Post, only_mes
}
mm.handler.Event(msg_ev)
mm.handler.CachePut(fmt.Sprintf("last_seen_%s", post.ChannelId), post.Id)
} else {
interested, roomId := mm.reverseRoomId(post.ChannelId)
if !interested {