From eda12845dab482b85f3a0c35cfafb8cfc4d12093 Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Thu, 2 Oct 2025 16:35:13 +0100 Subject: [PATCH 01/10] federation/client: Add federated room membership functions --- federation/client.go | 163 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/federation/client.go b/federation/client.go index b20af4ab..a8feb038 100644 --- a/federation/client.go +++ b/federation/client.go @@ -20,6 +20,8 @@ import ( "go.mau.fi/util/exslices" "go.mau.fi/util/jsontime" + "maunium.net/go/mautrix/event" + "maunium.net/go/mautrix" "maunium.net/go/mautrix/federation/signutil" "maunium.net/go/mautrix/id" @@ -263,6 +265,167 @@ func (c *Client) GetOpenIDUserInfo(ctx context.Context, serverName, accessToken return } +type PartialMemberEvent struct { + Membership event.Membership `json:"membership"` + JoinAuthorisedViaUsersServer id.UserID `json:"join_authorised_via_users_server,omitempty"` +} + +type MakeJoinEventTemplate struct { + Content PartialMemberEvent `json:"content"` + Origin string `json:"origin"` + OriginServerTS jsontime.UnixMilli `json:"origin_server_ts"` + Sender id.UserID `json:"sender"` + StateKey string `json:"state_key"` + Type event.Type `json:"type"` +} + +type ReqMakeJoin struct { + RoomID id.RoomID + UserID id.UserID + Via string + SupportedVersions []id.RoomVersion +} + +type RespMakeJoin struct { + RoomVersion id.RoomVersion `json:"room_version"` + Event MakeJoinEventTemplate `json:"event"` +} + +type ReqSendJoin struct { + RoomID id.RoomID + EventID id.EventID + OmitMembers bool + Event MakeJoinEventTemplate +} + +type RespSendJoin struct { + AuthChain []PDU `json:"auth_chain"` + Event PDU `json:"event"` + MembersOmitted bool `json:"members_omitted"` + ServersInRoom []string `json:"servers_in_room"` + State []PDU `json:"state"` +} + +type RespSendKnock struct { + KnockRoomState []PDU `json:"knock_room_state"` +} + +type ReqSendInvite struct { + RoomID id.RoomID `json:"-"` + UserID id.UserID `json:"-"` + Event PartialMemberEvent `json:"event"` + InviteRoomState []PDU `json:"invite_room_state"` + RoomVersion id.RoomVersion `json:"room_version"` +} + +type RespSendInvite struct { + Event PDU `json:"event"` +} + +type ReqMakeLeave struct { + RoomID id.RoomID + UserID id.UserID +} + +type RespMakeLeave struct { + Event MakeJoinEventTemplate `json:"event"` + RoomVersion id.RoomVersion `json:"room_version"` +} + +func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) { + versions := make([]string, len(req.SupportedVersions)) + for i, v := range req.SupportedVersions { + versions[i] = string(v) + } + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: c.ServerName, + Method: http.MethodGet, + Path: URLPath{"v1", "make_join", req.RoomID, req.UserID}, + Query: url.Values{"v": versions}, + Authenticate: true, + ResponseJSON: &resp, + }) + return +} + +func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) { + versions := make([]string, len(req.SupportedVersions)) + for i, v := range req.SupportedVersions { + versions[i] = string(v) + } + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: req.UserID.Homeserver(), + Method: http.MethodGet, + Path: URLPath{"v1", "make_knock", req.RoomID, req.UserID}, + Query: url.Values{"v": versions}, + Authenticate: true, + ResponseJSON: &resp, + }) + return +} + +func (c *Client) SendJoin(ctx context.Context, req *ReqSendJoin) (resp *RespSendJoin, err error) { + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: c.ServerName, + Method: http.MethodPut, + Path: URLPath{"v1", "send_join", req.RoomID, req.EventID}, + Query: url.Values{ + "omit_members": {strconv.FormatBool(req.OmitMembers)}, + }, + Authenticate: true, + RequestJSON: req.Event, + ResponseJSON: &resp, + }) + return +} + +func (c *Client) SendKnock(ctx context.Context, req *ReqSendJoin) (resp *RespSendKnock, err error) { + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: c.ServerName, + Method: http.MethodPut, + Path: URLPath{"v1", "send_knock", req.RoomID, req.EventID}, + Authenticate: true, + RequestJSON: req.Event, + ResponseJSON: &resp, + }) + return +} + +func (c *Client) SendInvite(ctx context.Context, req *ReqSendInvite) (resp *RespSendInvite, err error) { + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: c.ServerName, + Method: http.MethodPut, + Path: URLPath{"v1", "invite", req.RoomID, req.UserID}, + Authenticate: true, + RequestJSON: req, + ResponseJSON: &resp, + }) + return +} + +func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMakeLeave, err error) { + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: c.ServerName, + Method: http.MethodPut, + Path: URLPath{"v1", "make_leave", req.RoomID, req.UserID}, + Authenticate: true, + ResponseJSON: &resp, + }) + return +} + +func (c *Client) SendLeave(ctx context.Context, roomID id.RoomID, eventID id.EventID, evt *PartialMemberEvent) (resp struct{}, err error) { + _, _, err = c.MakeFullRequest(ctx, RequestParams{ + ServerName: c.ServerName, + Method: http.MethodPut, + Path: URLPath{"v1", "send_leave", roomID, eventID}, + Authenticate: true, + RequestJSON: evt, + ResponseJSON: &resp, + }) + return +} + type URLPath []any func (fup URLPath) FullPath() []any { From b0c710ab5c4541db2d432f09245033e1b4b9137c Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Thu, 2 Oct 2025 17:05:24 +0100 Subject: [PATCH 02/10] federation/client: full PDUs are expected --- federation/client.go | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/federation/client.go b/federation/client.go index a8feb038..956d56b1 100644 --- a/federation/client.go +++ b/federation/client.go @@ -20,8 +20,6 @@ import ( "go.mau.fi/util/exslices" "go.mau.fi/util/jsontime" - "maunium.net/go/mautrix/event" - "maunium.net/go/mautrix" "maunium.net/go/mautrix/federation/signutil" "maunium.net/go/mautrix/id" @@ -265,20 +263,6 @@ func (c *Client) GetOpenIDUserInfo(ctx context.Context, serverName, accessToken return } -type PartialMemberEvent struct { - Membership event.Membership `json:"membership"` - JoinAuthorisedViaUsersServer id.UserID `json:"join_authorised_via_users_server,omitempty"` -} - -type MakeJoinEventTemplate struct { - Content PartialMemberEvent `json:"content"` - Origin string `json:"origin"` - OriginServerTS jsontime.UnixMilli `json:"origin_server_ts"` - Sender id.UserID `json:"sender"` - StateKey string `json:"state_key"` - Type event.Type `json:"type"` -} - type ReqMakeJoin struct { RoomID id.RoomID UserID id.UserID @@ -287,15 +271,15 @@ type ReqMakeJoin struct { } type RespMakeJoin struct { - RoomVersion id.RoomVersion `json:"room_version"` - Event MakeJoinEventTemplate `json:"event"` + RoomVersion id.RoomVersion `json:"room_version"` + Event PDU `json:"event"` } type ReqSendJoin struct { RoomID id.RoomID EventID id.EventID OmitMembers bool - Event MakeJoinEventTemplate + Event PDU } type RespSendJoin struct { @@ -311,11 +295,11 @@ type RespSendKnock struct { } type ReqSendInvite struct { - RoomID id.RoomID `json:"-"` - UserID id.UserID `json:"-"` - Event PartialMemberEvent `json:"event"` - InviteRoomState []PDU `json:"invite_room_state"` - RoomVersion id.RoomVersion `json:"room_version"` + RoomID id.RoomID `json:"-"` + UserID id.UserID `json:"-"` + Event PDU `json:"event"` + InviteRoomState []PDU `json:"invite_room_state"` + RoomVersion id.RoomVersion `json:"room_version"` } type RespSendInvite struct { @@ -328,8 +312,8 @@ type ReqMakeLeave struct { } type RespMakeLeave struct { - Event MakeJoinEventTemplate `json:"event"` - RoomVersion id.RoomVersion `json:"room_version"` + Event PDU `json:"event"` + RoomVersion id.RoomVersion `json:"room_version"` } func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) { @@ -414,7 +398,7 @@ func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMa return } -func (c *Client) SendLeave(ctx context.Context, roomID id.RoomID, eventID id.EventID, evt *PartialMemberEvent) (resp struct{}, err error) { +func (c *Client) SendLeave(ctx context.Context, roomID id.RoomID, eventID id.EventID, evt PDU) (resp struct{}, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: c.ServerName, Method: http.MethodPut, From 747e17de7a72ef10af74bca944fe508d72da52cb Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Mon, 6 Oct 2025 21:37:40 +0100 Subject: [PATCH 03/10] federation/client: actually route requests externally --- federation/client.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/federation/client.go b/federation/client.go index 956d56b1..21b256e5 100644 --- a/federation/client.go +++ b/federation/client.go @@ -280,6 +280,7 @@ type ReqSendJoin struct { EventID id.EventID OmitMembers bool Event PDU + Via string } type RespSendJoin struct { @@ -309,6 +310,7 @@ type RespSendInvite struct { type ReqMakeLeave struct { RoomID id.RoomID UserID id.UserID + Via string } type RespMakeLeave struct { @@ -316,13 +318,20 @@ type RespMakeLeave struct { RoomVersion id.RoomVersion `json:"room_version"` } +type ReqSendLeave struct { + RoomID id.RoomID + EventID id.EventID + Event PDU + Via string +} + func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) { versions := make([]string, len(req.SupportedVersions)) for i, v := range req.SupportedVersions { versions[i] = string(v) } _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: c.ServerName, + ServerName: req.Via, Method: http.MethodGet, Path: URLPath{"v1", "make_join", req.RoomID, req.UserID}, Query: url.Values{"v": versions}, @@ -338,7 +347,7 @@ func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeJoin) (resp *RespMak versions[i] = string(v) } _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: req.UserID.Homeserver(), + ServerName: req.Via, Method: http.MethodGet, Path: URLPath{"v1", "make_knock", req.RoomID, req.UserID}, Query: url.Values{"v": versions}, @@ -350,7 +359,7 @@ func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeJoin) (resp *RespMak func (c *Client) SendJoin(ctx context.Context, req *ReqSendJoin) (resp *RespSendJoin, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: c.ServerName, + ServerName: req.Via, Method: http.MethodPut, Path: URLPath{"v1", "send_join", req.RoomID, req.EventID}, Query: url.Values{ @@ -365,7 +374,7 @@ func (c *Client) SendJoin(ctx context.Context, req *ReqSendJoin) (resp *RespSend func (c *Client) SendKnock(ctx context.Context, req *ReqSendJoin) (resp *RespSendKnock, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: c.ServerName, + ServerName: req.Via, Method: http.MethodPut, Path: URLPath{"v1", "send_knock", req.RoomID, req.EventID}, Authenticate: true, @@ -377,7 +386,7 @@ func (c *Client) SendKnock(ctx context.Context, req *ReqSendJoin) (resp *RespSen func (c *Client) SendInvite(ctx context.Context, req *ReqSendInvite) (resp *RespSendInvite, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: c.ServerName, + ServerName: req.UserID.Homeserver(), Method: http.MethodPut, Path: URLPath{"v1", "invite", req.RoomID, req.UserID}, Authenticate: true, @@ -389,7 +398,7 @@ func (c *Client) SendInvite(ctx context.Context, req *ReqSendInvite) (resp *Resp func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMakeLeave, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: c.ServerName, + ServerName: req.Via, Method: http.MethodPut, Path: URLPath{"v1", "make_leave", req.RoomID, req.UserID}, Authenticate: true, @@ -398,14 +407,13 @@ func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMa return } -func (c *Client) SendLeave(ctx context.Context, roomID id.RoomID, eventID id.EventID, evt PDU) (resp struct{}, err error) { +func (c *Client) SendLeave(ctx context.Context, req *ReqSendLeave) (err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ - ServerName: c.ServerName, + ServerName: req.Via, Method: http.MethodPut, - Path: URLPath{"v1", "send_leave", roomID, eventID}, + Path: URLPath{"v1", "send_leave", req.RoomID, req.EventID}, Authenticate: true, - RequestJSON: evt, - ResponseJSON: &resp, + RequestJSON: req.Event, }) return } From df3a805b64eec66c266ad5f281de99bbf50e8ed9 Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Mon, 6 Oct 2025 21:53:22 +0100 Subject: [PATCH 04/10] federation/client: use correct query param for make join/knock --- federation/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/federation/client.go b/federation/client.go index 21b256e5..1ea530fe 100644 --- a/federation/client.go +++ b/federation/client.go @@ -334,7 +334,7 @@ func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMake ServerName: req.Via, Method: http.MethodGet, Path: URLPath{"v1", "make_join", req.RoomID, req.UserID}, - Query: url.Values{"v": versions}, + Query: url.Values{"ver": versions}, Authenticate: true, ResponseJSON: &resp, }) @@ -350,7 +350,7 @@ func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeJoin) (resp *RespMak ServerName: req.Via, Method: http.MethodGet, Path: URLPath{"v1", "make_knock", req.RoomID, req.UserID}, - Query: url.Values{"v": versions}, + Query: url.Values{"ver": versions}, Authenticate: true, ResponseJSON: &resp, }) From 3d498f35be3d0736a234ef44f317531f25493b89 Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Mon, 6 Oct 2025 22:44:48 +0100 Subject: [PATCH 05/10] federation/pdu: omit empty auth&prev events --- federation/pdu/pdu.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/federation/pdu/pdu.go b/federation/pdu/pdu.go index cecee5b9..b6d0c0db 100644 --- a/federation/pdu/pdu.go +++ b/federation/pdu/pdu.go @@ -11,8 +11,8 @@ package pdu import ( "bytes" "crypto/ed25519" + "encoding/json" "encoding/json/jsontext" - "encoding/json/v2" "errors" "fmt" "strings" @@ -60,12 +60,12 @@ type InternalMeta struct { } type PDU struct { - AuthEvents []id.EventID `json:"auth_events"` + AuthEvents []id.EventID `json:"auth_events,omitzero"` Content jsontext.Value `json:"content"` Depth int64 `json:"depth"` Hashes *Hashes `json:"hashes,omitzero"` OriginServerTS int64 `json:"origin_server_ts"` - PrevEvents []id.EventID `json:"prev_events"` + PrevEvents []id.EventID `json:"prev_events,omitzero"` Redacts *id.EventID `json:"redacts,omitzero"` RoomID id.RoomID `json:"room_id,omitzero"` // not present for room v12+ create events Sender id.UserID `json:"sender"` From daeeab16123073a50f48bed5fae11c749623626f Mon Sep 17 00:00:00 2001 From: nexy7574 Date: Mon, 6 Oct 2025 23:26:50 +0100 Subject: [PATCH 06/10] federation/client: fix send join+leave API versions --- federation/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/federation/client.go b/federation/client.go index 1ea530fe..4807cda0 100644 --- a/federation/client.go +++ b/federation/client.go @@ -361,7 +361,7 @@ func (c *Client) SendJoin(ctx context.Context, req *ReqSendJoin) (resp *RespSend _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: req.Via, Method: http.MethodPut, - Path: URLPath{"v1", "send_join", req.RoomID, req.EventID}, + Path: URLPath{"v2", "send_join", req.RoomID, req.EventID}, Query: url.Values{ "omit_members": {strconv.FormatBool(req.OmitMembers)}, }, @@ -411,7 +411,7 @@ func (c *Client) SendLeave(ctx context.Context, req *ReqSendLeave) (err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: req.Via, Method: http.MethodPut, - Path: URLPath{"v1", "send_leave", req.RoomID, req.EventID}, + Path: URLPath{"v2", "send_leave", req.RoomID, req.EventID}, Authenticate: true, RequestJSON: req.Event, }) From 0216c265302bf2a7b811dbd55fab840b77271d99 Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 31 Oct 2025 20:38:34 +0000 Subject: [PATCH 07/10] federation/client: Fix MakeLeave request & use correct invite API version --- federation/client.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/federation/client.go b/federation/client.go index 4807cda0..3cbe00e2 100644 --- a/federation/client.go +++ b/federation/client.go @@ -388,7 +388,7 @@ func (c *Client) SendInvite(ctx context.Context, req *ReqSendInvite) (resp *Resp _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: req.UserID.Homeserver(), Method: http.MethodPut, - Path: URLPath{"v1", "invite", req.RoomID, req.UserID}, + Path: URLPath{"v2", "invite", req.RoomID, req.UserID}, Authenticate: true, RequestJSON: req, ResponseJSON: &resp, @@ -399,8 +399,9 @@ func (c *Client) SendInvite(ctx context.Context, req *ReqSendInvite) (resp *Resp func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMakeLeave, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: req.Via, - Method: http.MethodPut, - Path: URLPath{"v1", "make_leave", req.RoomID, req.UserID}, + Method: http.MethodGet, + Path: URLPath{"v1", "make_leave"}, + Query: url.Values{"room_id": {string(req.RoomID)}, "user_id": {string(req.UserID)}}, Authenticate: true, ResponseJSON: &resp, }) From 0241c41eba5bd97896424edd6efab52e29f8c4b1 Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 31 Oct 2025 20:42:16 +0000 Subject: [PATCH 08/10] federation/client: Fix MakeLeave URI Read the docs wrong --- federation/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/federation/client.go b/federation/client.go index 3cbe00e2..3e884940 100644 --- a/federation/client.go +++ b/federation/client.go @@ -400,8 +400,7 @@ func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMa _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: req.Via, Method: http.MethodGet, - Path: URLPath{"v1", "make_leave"}, - Query: url.Values{"room_id": {string(req.RoomID)}, "user_id": {string(req.UserID)}}, + Path: URLPath{"v1", "make_leave", req.RoomID, req.UserID}, Authenticate: true, ResponseJSON: &resp, }) From 4b92ea12d206a1971a7dfeb122db1c0b564ac5b6 Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 31 Oct 2025 20:48:04 +0000 Subject: [PATCH 09/10] federation/client: Don't re-use join types for knock methods --- federation/client.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/federation/client.go b/federation/client.go index 3e884940..435b4386 100644 --- a/federation/client.go +++ b/federation/client.go @@ -275,6 +275,11 @@ type RespMakeJoin struct { Event PDU `json:"event"` } +type ( + ReqMakeKnock = ReqMakeJoin + RespMakeKnock = RespMakeJoin +) + type ReqSendJoin struct { RoomID id.RoomID EventID id.EventID @@ -283,6 +288,13 @@ type ReqSendJoin struct { Via string } +type ReqSendKnock struct { + RoomID id.RoomID + EventID id.EventID + Event PDU + Via string +} + type RespSendJoin struct { AuthChain []PDU `json:"auth_chain"` Event PDU `json:"event"` @@ -341,7 +353,7 @@ func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMake return } -func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) { +func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeKnock) (resp *RespMakeKnock, err error) { versions := make([]string, len(req.SupportedVersions)) for i, v := range req.SupportedVersions { versions[i] = string(v) @@ -372,7 +384,7 @@ func (c *Client) SendJoin(ctx context.Context, req *ReqSendJoin) (resp *RespSend return } -func (c *Client) SendKnock(ctx context.Context, req *ReqSendJoin) (resp *RespSendKnock, err error) { +func (c *Client) SendKnock(ctx context.Context, req *ReqSendKnock) (resp *RespSendKnock, err error) { _, _, err = c.MakeFullRequest(ctx, RequestParams{ ServerName: req.Via, Method: http.MethodPut, From 8a8949be462e7512d845aa1cd84b9416edc386c4 Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 31 Oct 2025 20:50:58 +0000 Subject: [PATCH 10/10] federation/client: Remove duplicate struct for RespMakeLeave --- federation/client.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/federation/client.go b/federation/client.go index 435b4386..50bdacd7 100644 --- a/federation/client.go +++ b/federation/client.go @@ -275,11 +275,6 @@ type RespMakeJoin struct { Event PDU `json:"event"` } -type ( - ReqMakeKnock = ReqMakeJoin - RespMakeKnock = RespMakeJoin -) - type ReqSendJoin struct { RoomID id.RoomID EventID id.EventID @@ -325,11 +320,6 @@ type ReqMakeLeave struct { Via string } -type RespMakeLeave struct { - Event PDU `json:"event"` - RoomVersion id.RoomVersion `json:"room_version"` -} - type ReqSendLeave struct { RoomID id.RoomID EventID id.EventID @@ -337,6 +327,12 @@ type ReqSendLeave struct { Via string } +type ( + ReqMakeKnock = ReqMakeJoin + RespMakeKnock = RespMakeJoin + RespMakeLeave = RespMakeJoin +) + func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) { versions := make([]string, len(req.SupportedVersions)) for i, v := range req.SupportedVersions {