aboutsummaryrefslogtreecommitdiff
path: root/roomserver/api/output.go
diff options
context:
space:
mode:
authorKegsay <kegan@matrix.org>2020-06-11 19:50:40 +0100
committerGitHub <noreply@github.com>2020-06-11 19:50:40 +0100
commitec7718e7f842fa0fc5198489c904de21003db4c2 (patch)
treee267fe8dae227b274381213ef3e8a3f34fbf0f26 /roomserver/api/output.go
parent25cd2dd1c925fa0c1eeb27a3cd71e668344102ad (diff)
Roomserver API changes (#1118)
* s/QueryBackfill/PerformBackfill/g * OutputEvent now includes AddStateEvents which contain the full event of extra state events * Only include adds not the current event * Get adding state right
Diffstat (limited to 'roomserver/api/output.go')
-rw-r--r--roomserver/api/output.go27
1 files changed, 27 insertions, 0 deletions
diff --git a/roomserver/api/output.go b/roomserver/api/output.go
index 92a468a9..2bbd97af 100644
--- a/roomserver/api/output.go
+++ b/roomserver/api/output.go
@@ -63,6 +63,13 @@ type OutputNewRoomEvent struct {
// Together with RemovesStateEventIDs this allows the receiver to keep an up to date
// view of the current state of the room.
AddsStateEventIDs []string `json:"adds_state_event_ids"`
+ // All extra newly added state events. This is only set if there are *extra* events
+ // other than `Event`. This can happen when forks get merged because state resolution
+ // may decide a bunch of state events on one branch are now valid, so they will be
+ // present in this list. This is useful when trying to maintain the current state of a room
+ // as to do so you need to include both these events and `Event`.
+ AddStateEvents []gomatrixserverlib.HeaderedEvent `json:"adds_state_events"`
+
// The state event IDs that were removed from the state of the room by this event.
RemovesStateEventIDs []string `json:"removes_state_event_ids"`
// The ID of the event that was output before this event.
@@ -112,6 +119,26 @@ type OutputNewRoomEvent struct {
TransactionID *TransactionID `json:"transaction_id"`
}
+// AddsState returns all added state events from this event.
+//
+// This function is needed because `AddStateEvents` will not include a copy of
+// the original event to save space, so you cannot use that slice alone.
+// Instead, use this function which will add the original event if it is present
+// in `AddsStateEventIDs`.
+func (ore *OutputNewRoomEvent) AddsState() []gomatrixserverlib.HeaderedEvent {
+ includeOutputEvent := false
+ for _, id := range ore.AddsStateEventIDs {
+ if id == ore.Event.EventID() {
+ includeOutputEvent = true
+ break
+ }
+ }
+ if !includeOutputEvent {
+ return ore.AddStateEvents
+ }
+ return append(ore.AddStateEvents, ore.Event)
+}
+
// An OutputNewInviteEvent is written whenever an invite becomes active.
// Invite events can be received outside of an existing room so have to be
// tracked separately from the room events themselves.