Skip to content

Commit 14b85e9

Browse files
authored
federation: Implement federated membership functions (make/send join/knock/leave) (#422)
1 parent 36029b7 commit 14b85e9

File tree

1 file changed

+163
-0
lines changed

1 file changed

+163
-0
lines changed

federation/client.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,169 @@ func (c *Client) GetOpenIDUserInfo(ctx context.Context, serverName, accessToken
263263
return
264264
}
265265

266+
type ReqMakeJoin struct {
267+
RoomID id.RoomID
268+
UserID id.UserID
269+
Via string
270+
SupportedVersions []id.RoomVersion
271+
}
272+
273+
type RespMakeJoin struct {
274+
RoomVersion id.RoomVersion `json:"room_version"`
275+
Event PDU `json:"event"`
276+
}
277+
278+
type ReqSendJoin struct {
279+
RoomID id.RoomID
280+
EventID id.EventID
281+
OmitMembers bool
282+
Event PDU
283+
Via string
284+
}
285+
286+
type ReqSendKnock struct {
287+
RoomID id.RoomID
288+
EventID id.EventID
289+
Event PDU
290+
Via string
291+
}
292+
293+
type RespSendJoin struct {
294+
AuthChain []PDU `json:"auth_chain"`
295+
Event PDU `json:"event"`
296+
MembersOmitted bool `json:"members_omitted"`
297+
ServersInRoom []string `json:"servers_in_room"`
298+
State []PDU `json:"state"`
299+
}
300+
301+
type RespSendKnock struct {
302+
KnockRoomState []PDU `json:"knock_room_state"`
303+
}
304+
305+
type ReqSendInvite struct {
306+
RoomID id.RoomID `json:"-"`
307+
UserID id.UserID `json:"-"`
308+
Event PDU `json:"event"`
309+
InviteRoomState []PDU `json:"invite_room_state"`
310+
RoomVersion id.RoomVersion `json:"room_version"`
311+
}
312+
313+
type RespSendInvite struct {
314+
Event PDU `json:"event"`
315+
}
316+
317+
type ReqMakeLeave struct {
318+
RoomID id.RoomID
319+
UserID id.UserID
320+
Via string
321+
}
322+
323+
type ReqSendLeave struct {
324+
RoomID id.RoomID
325+
EventID id.EventID
326+
Event PDU
327+
Via string
328+
}
329+
330+
type (
331+
ReqMakeKnock = ReqMakeJoin
332+
RespMakeKnock = RespMakeJoin
333+
RespMakeLeave = RespMakeJoin
334+
)
335+
336+
func (c *Client) MakeJoin(ctx context.Context, req *ReqMakeJoin) (resp *RespMakeJoin, err error) {
337+
versions := make([]string, len(req.SupportedVersions))
338+
for i, v := range req.SupportedVersions {
339+
versions[i] = string(v)
340+
}
341+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
342+
ServerName: req.Via,
343+
Method: http.MethodGet,
344+
Path: URLPath{"v1", "make_join", req.RoomID, req.UserID},
345+
Query: url.Values{"ver": versions},
346+
Authenticate: true,
347+
ResponseJSON: &resp,
348+
})
349+
return
350+
}
351+
352+
func (c *Client) MakeKnock(ctx context.Context, req *ReqMakeKnock) (resp *RespMakeKnock, err error) {
353+
versions := make([]string, len(req.SupportedVersions))
354+
for i, v := range req.SupportedVersions {
355+
versions[i] = string(v)
356+
}
357+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
358+
ServerName: req.Via,
359+
Method: http.MethodGet,
360+
Path: URLPath{"v1", "make_knock", req.RoomID, req.UserID},
361+
Query: url.Values{"ver": versions},
362+
Authenticate: true,
363+
ResponseJSON: &resp,
364+
})
365+
return
366+
}
367+
368+
func (c *Client) SendJoin(ctx context.Context, req *ReqSendJoin) (resp *RespSendJoin, err error) {
369+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
370+
ServerName: req.Via,
371+
Method: http.MethodPut,
372+
Path: URLPath{"v2", "send_join", req.RoomID, req.EventID},
373+
Query: url.Values{
374+
"omit_members": {strconv.FormatBool(req.OmitMembers)},
375+
},
376+
Authenticate: true,
377+
RequestJSON: req.Event,
378+
ResponseJSON: &resp,
379+
})
380+
return
381+
}
382+
383+
func (c *Client) SendKnock(ctx context.Context, req *ReqSendKnock) (resp *RespSendKnock, err error) {
384+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
385+
ServerName: req.Via,
386+
Method: http.MethodPut,
387+
Path: URLPath{"v1", "send_knock", req.RoomID, req.EventID},
388+
Authenticate: true,
389+
RequestJSON: req.Event,
390+
ResponseJSON: &resp,
391+
})
392+
return
393+
}
394+
395+
func (c *Client) SendInvite(ctx context.Context, req *ReqSendInvite) (resp *RespSendInvite, err error) {
396+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
397+
ServerName: req.UserID.Homeserver(),
398+
Method: http.MethodPut,
399+
Path: URLPath{"v2", "invite", req.RoomID, req.UserID},
400+
Authenticate: true,
401+
RequestJSON: req,
402+
ResponseJSON: &resp,
403+
})
404+
return
405+
}
406+
407+
func (c *Client) MakeLeave(ctx context.Context, req *ReqMakeLeave) (resp *RespMakeLeave, err error) {
408+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
409+
ServerName: req.Via,
410+
Method: http.MethodGet,
411+
Path: URLPath{"v1", "make_leave", req.RoomID, req.UserID},
412+
Authenticate: true,
413+
ResponseJSON: &resp,
414+
})
415+
return
416+
}
417+
418+
func (c *Client) SendLeave(ctx context.Context, req *ReqSendLeave) (err error) {
419+
_, _, err = c.MakeFullRequest(ctx, RequestParams{
420+
ServerName: req.Via,
421+
Method: http.MethodPut,
422+
Path: URLPath{"v2", "send_leave", req.RoomID, req.EventID},
423+
Authenticate: true,
424+
RequestJSON: req.Event,
425+
})
426+
return
427+
}
428+
266429
type URLPath []any
267430

268431
func (fup URLPath) FullPath() []any {

0 commit comments

Comments
 (0)