From e9475c7706010ae71459367f2e8a23305d788ff9 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 1 Nov 2021 12:25:58 +0200 Subject: [PATCH] Automatically move top-level prev_content inside unsigned --- event/events.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/event/events.go b/event/events.go index dc544f42..8f3f07b5 100644 --- a/event/events.go +++ b/event/events.go @@ -41,10 +41,42 @@ type eventForMarshaling struct { Redacts id.EventID `json:"redacts,omitempty"` Unsigned *Unsigned `json:"unsigned,omitempty"` + PrevContent *Content `json:"prev_content,omitempty"` + ReplacesState *id.EventID `json:"replaces_state,omitempty"` + ToUserID id.UserID `json:"to_user_id,omitempty"` ToDeviceID id.DeviceID `json:"to_device_id,omitempty"` } +// UnmarshalJSON unmarshals the event, including moving prev_content from the top level to inside unsigned. +func (evt *Event) UnmarshalJSON(data []byte) error { + var efm eventForMarshaling + err := json.Unmarshal(data, &efm) + if err != nil { + return err + } + evt.StateKey = efm.StateKey + evt.Sender = efm.Sender + evt.Type = efm.Type + evt.Timestamp = efm.Timestamp + evt.ID = efm.ID + evt.RoomID = efm.RoomID + evt.Content = efm.Content + evt.Redacts = efm.Redacts + if efm.Unsigned != nil { + evt.Unsigned = *efm.Unsigned + } + if efm.PrevContent != nil && evt.Unsigned.PrevContent == nil { + evt.Unsigned.PrevContent = efm.PrevContent + } + if efm.ReplacesState != nil && *efm.ReplacesState != "" && evt.Unsigned.ReplacesState == "" { + evt.Unsigned.ReplacesState = *efm.ReplacesState + } + evt.ToUserID = efm.ToUserID + evt.ToDeviceID = efm.ToDeviceID + return nil +} + // MarshalJSON marshals the event, including omitting the unsigned field if it's empty. // // This is necessary because Unsigned is not a pointer (for convenience reasons),