diff --git a/clientapi/routing/sendevent.go b/clientapi/routing/sendevent.go index 9744a5640..71cba0f15 100644 --- a/clientapi/routing/sendevent.go +++ b/clientapi/routing/sendevent.go @@ -15,6 +15,7 @@ package routing import ( + "bytes" "net/http" "sync" @@ -80,6 +81,29 @@ func SendEvent( return *resErr } + stateRes := api.QueryLatestEventsAndStateResponse{} + if err := rsAPI.QueryLatestEventsAndState(req.Context(), &api.QueryLatestEventsAndStateRequest{ + RoomID: roomID, + StateToFetch: []gomatrixserverlib.StateKeyTuple{}, + }, &stateRes); err != nil { + util.GetLogger(req.Context()).WithError(err).Error("queryAPI.QueryLatestEventsAndState failed") + return jsonerror.InternalServerError() + } + + // Check that currnet event doesn't match previous events + // If so return previous event + for _, ev := range stateRes.StateEvents { + if ev.Event.Type() == e.Type() && + ev.Event.StateKeyEquals(*stateKey) && + bytes.Equal(ev.Event.Content(), e.Content()) { + res := util.JSONResponse{ + Code: http.StatusOK, + JSON: sendEventResponse{ev.EventID()}, + } + return res + } + } + var txnAndSessionID *api.TransactionID if txnID != nil { txnAndSessionID = &api.TransactionID{