client: Add AdminWhoIs func (#411)

This commit is contained in:
timedout 2025-10-18 20:30:43 +01:00 committed by GitHub
commit e61c7b3f1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 0 deletions

View file

@ -2689,6 +2689,15 @@ func (cli *Client) ReportRoom(ctx context.Context, roomID id.RoomID, reason stri
return err
}
// AdminWhoIs fetches session information belonging to a specific user. Typically requires being a server admin.
//
// https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3adminwhoisuserid
func (cli *Client) AdminWhoIs(ctx context.Context, userID id.UserID) (resp RespWhoIs, err error) {
urlPath := cli.BuildClientURL("v3", "admin", "whois", userID)
_, err = cli.MakeRequest(ctx, http.MethodGet, urlPath, nil, &resp)
return
}
// UnstableGetSuspendedStatus uses MSC4323 to check if a user is suspended.
func (cli *Client) UnstableGetSuspendedStatus(ctx context.Context, userID id.UserID) (res *RespSuspended, err error) {
urlPath := cli.BuildClientURL("unstable", "uk.timedout.msc4323", "admin", "suspend", userID)

View file

@ -755,3 +755,23 @@ type RespSuspended struct {
type RespLocked struct {
Locked bool `json:"locked"`
}
type ConnectionInfo struct {
IP string `json:"ip,omitempty"`
LastSeen jsontime.UnixMilli `json:"last_seen,omitempty"`
UserAgent string `json:"user_agent,omitempty"`
}
type SessionInfo struct {
Connections []ConnectionInfo `json:"connections,omitempty"`
}
type DeviceInfo struct {
Sessions []SessionInfo `json:"sessions,omitempty"`
}
// RespWhoIs is the response body for https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3adminwhoisuserid
type RespWhoIs struct {
UserID id.UserID `json:"user_id,omitempty"`
Devices map[id.Device]DeviceInfo `json:"devices,omitempty"`
}