diff --git a/modules/client/rooms/leave.cc b/modules/client/rooms/leave.cc index 9c5d9a216..b83ef156f 100644 --- a/modules/client/rooms/leave.cc +++ b/modules/client/rooms/leave.cc @@ -23,14 +23,40 @@ post__leave(client &client, }; if(!room.has("m.room.member", request.user_id)) - throw m::error + { + const m::user::room user_room { - http::NOT_MODIFIED, "M_TARGET_NOT_IN_ROOM", - "The user %s has no membership state in %s", - string_view{request.user_id}, - string_view{room_id}, + request.user_id }; + // In case the user's user room falls out of sync with the real room + // state; we directly set the user's user room state. + if(!user_room.has("ircd.member", room_id)) + throw m::error + { + http::NOT_MODIFIED, "M_TARGET_NOT_IN_ROOM", + "The user %s has no membership state in %s", + string_view{request.user_id}, + string_view{room_id}, + }; + + const auto event_id + { + send(user_room, request.user_id, "ircd.member", room_id, json::members + { + { "membership", "leave" } + }) + }; + + return resource::response + { + client, http::OK, json::members + { + { "event_id", event_id } + } + }; + } + const auto event_id { m::leave(room, request.user_id)