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 }