MCPcopy Create free account
hub / github.com/daodst/chat / PerformLeave

Method PerformLeave

federationapi/internal/perform.go:485–572  ·  view source on GitHub ↗

PerformLeaveRequest implements api.FederationInternalAPI

(
	ctx context.Context,
	request *api.PerformLeaveRequest,
	response *api.PerformLeaveResponse,
)

Source from the content-addressed store, hash-verified

483
484// PerformLeaveRequest implements api.FederationInternalAPI
485func (r *FederationInternalAPI) PerformLeave(
486 ctx context.Context,
487 request *api.PerformLeaveRequest,
488 response *api.PerformLeaveResponse,
489) (err error) {
490 // Deduplicate the server names we were provided.
491 util.SortAndUnique(request.ServerNames)
492
493 // Try each server that we were provided until we land on one that
494 // successfully completes the make-leave send-leave dance.
495 for _, serverName := range request.ServerNames {
496 // Try to perform a make_leave using the information supplied in the
497 // request.
498 respMakeLeave, err := r.federation.MakeLeave(
499 ctx,
500 serverName,
501 request.RoomID,
502 request.UserID,
503 )
504 if err != nil {
505 // TODO: Check if the user was not allowed to leave the room.
506 logrus.WithError(err).Warnf("r.federation.MakeLeave failed")
507 r.statistics.ForServer(serverName).Failure()
508 continue
509 }
510
511 // Set all the fields to be what they should be, this should be a no-op
512 // but it's possible that the remote server returned us something "odd"
513 respMakeLeave.LeaveEvent.Type = gomatrixserverlib.MRoomMember
514 respMakeLeave.LeaveEvent.Sender = request.UserID
515 respMakeLeave.LeaveEvent.StateKey = &request.UserID
516 respMakeLeave.LeaveEvent.RoomID = request.RoomID
517 respMakeLeave.LeaveEvent.Redacts = ""
518 if respMakeLeave.LeaveEvent.Content == nil {
519 content := map[string]interface{}{
520 "membership": "leave",
521 }
522 if err = respMakeLeave.LeaveEvent.SetContent(content); err != nil {
523 logrus.WithError(err).Warnf("respMakeLeave.LeaveEvent.SetContent failed")
524 continue
525 }
526 }
527 if err = respMakeLeave.LeaveEvent.SetUnsigned(struct{}{}); err != nil {
528 logrus.WithError(err).Warnf("respMakeLeave.LeaveEvent.SetUnsigned failed")
529 continue
530 }
531
532 // Work out if we support the room version that has been supplied in
533 // the make_leave response.
534 if _, err = respMakeLeave.RoomVersion.EventFormat(); err != nil {
535 return gomatrixserverlib.UnsupportedRoomVersionError{}
536 }
537
538 // Build the leave event.
539 event, err := respMakeLeave.LeaveEvent.Build(
540 time.Now(),
541 r.cfg.Matrix.ServerName,
542 r.cfg.Matrix.KeyID,

Callers

nothing calls this directly

Calls 5

MakeLeaveMethod · 0.80
SendLeaveMethod · 0.80
FailureMethod · 0.45
ForServerMethod · 0.45
SuccessMethod · 0.45

Tested by

no test coverage detected