dendrite/syncapi/storage/shared/stream_typing.go
2021-01-06 14:37:09 +00:00

50 lines
1 KiB
Go

package shared
import (
"context"
"encoding/json"
"github.com/matrix-org/dendrite/syncapi/types"
"github.com/matrix-org/gomatrixserverlib"
)
type TypingStreamProvider struct {
StreamProvider
}
func (p *TypingStreamProvider) Range(
ctx context.Context,
req *types.SyncRequest,
from, to types.StreamPosition,
) types.StreamPosition {
var err error
for roomID, membership := range req.Rooms {
if membership != gomatrixserverlib.Join {
continue
}
// This may have already been set by a previous stream, so
// reuse it if it exists.
jr := req.Response.Rooms.Join[roomID]
if users, updated := p.DB.EDUCache.GetTypingUsersIfUpdatedAfter(
roomID, int64(from),
); updated {
ev := gomatrixserverlib.ClientEvent{
Type: gomatrixserverlib.MTyping,
}
ev.Content, err = json.Marshal(map[string]interface{}{
"user_ids": users,
})
if err != nil {
return to
}
jr.Ephemeral.Events = append(jr.Ephemeral.Events, ev)
req.Response.Rooms.Join[roomID] = jr
}
}
return to
}