From 681111641850bc2e8fd6c6e04a7e73330aef86cf Mon Sep 17 00:00:00 2001 From: ghuet Date: Tue, 9 Jan 2024 14:57:59 +0100 Subject: [PATCH 1/8] add methods to api --- responses.go | 38 +++++++++++ synapseadmin/roomapi.go | 140 ++++++++++++++++++++++++++++++++++++++++ synapseadmin/userapi.go | 102 ++++++++++++++++++++++++++++- 3 files changed, 278 insertions(+), 2 deletions(-) create mode 100644 synapseadmin/roomapi.go diff --git a/responses.go b/responses.go index e182a722..3fa5f2c9 100644 --- a/responses.go +++ b/responses.go @@ -623,3 +623,41 @@ type RespRoomKeysUpdate struct { Count int `json:"count"` ETag string `json:"etag"` } + +// Room represents the structure of each room +type RoomInfos struct { + RoomID string `json:"room_id"` + Name string `json:"name"` + CanonicalAlias string `json:"canonical_alias"` + JoinedMembers int `json:"joined_members"` + JoinedLocalMembers int `json:"joined_local_members"` + Version string `json:"version"` + Creator string `json:"creator"` + Encryption string `json:"encryption"` + Federatable bool `json:"federatable"` + Public bool `json:"public"` + JoinRules string `json:"join_rules"` + GuestAccess string `json:"guest_access"` + HistoryVisibility string `json:"history_visibility"` + StateEvents int `json:"state_events"` + RoomType string `json:"room_type"` +} + +// RoomsResponse represents the response containing a list of rooms +type RoomsResponse struct { + Rooms []RoomInfos `json:"rooms"` + Offset int `json:"offset"` + TotalRooms int `json:"total_rooms"` +} + +// RoomsMembersResponse represents the response containing a list of members of a room +type RoomsMembersResponse struct { + Members []string `json:"members"` + Total int `json:"total"` +} + +// RoomsBlockResponse represents the response containing wether a room is blocked or not +type RoomsBlockResponse struct { + Block bool `json:"block"` + UserId string `json:"user_id"` +} diff --git a/synapseadmin/roomapi.go b/synapseadmin/roomapi.go new file mode 100644 index 00000000..29fd04a9 --- /dev/null +++ b/synapseadmin/roomapi.go @@ -0,0 +1,140 @@ +// Copyright (c) 2023 Tulir Asokan +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package synapseadmin + +import ( + "context" + "net/http" + "maunium.net/go/mautrix" + "maunium.net/go/mautrix/id" +) + +// Get room info based on alias +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html +func (cli *Client) ListRoom(ctx context.Context, alias string) (*mautrix.RoomsResponse ,error) { + reqURL := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, map[string]string{"search_term": alias}) + var resp mautrix.RoomsResponse + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodGet, + URL: reqURL, + ResponseJSON: &resp, + }) + return &resp, err +} + +// ReqDeleteRoom is the request content for Client.DeleteRoom. +type ReqDeleteRoom struct { + // Room Id to delete + RoomId string `json:"room_id"` + // Default to true: remove all traces from database + Purge bool `json:"purge"` +} + +// Delete Room based on Id +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version +func (cli *Client) DeleteRoom(ctx context.Context, req ReqDeleteRoom) error { + reqURL := cli.BuildAdminURL("v2", "rooms", req.RoomId) + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodDelete, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +// Get Room Members based on Room Id +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version +func (cli *Client) RoomMembers(ctx context.Context, RoomId string) (*mautrix.RoomsMembersResponse, error) { + reqURL := cli.BuildAdminURL("v1", "rooms", RoomId, "members") + var resp mautrix.RoomsMembersResponse + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodGet, + URL: reqURL, + ResponseJSON: &resp, + }) + return &resp, err +} + +// ReqRoomAdmin is the request content for Client.RoomAdmin. +type ReqRoomAdmin struct { + // User Id to make admin + UserId id.UserID `json:"user_id"` + // Room Id or alias + Room string `json:"room"` +} + +// Make admin a Room's user based on Id +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#make-room-admin-api +func (cli *Client) RoomAdmin(ctx context.Context, req ReqRoomAdmin) error { + reqURL := cli.BuildAdminURL("v1", "rooms", req.Room, "make_room_admin") + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodPost, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +// ReqAddUser is the request content for Client.AddUser. +type ReqAddUser struct { + // User Id to make admin + UserId string `json:"user_id"` + // Room Id or alias + Room string `json:"room"` +} + +// Add User to Room +// +// https://matrix-org.github.io/synapse/latest/admin_api/room_membership.html +func (cli *Client) AddUser(ctx context.Context, req ReqAddUser) error { + reqURL := cli.BuildAdminURL("v1", "join", req.Room) + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodPost, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +// ReqBlockRoom is the request content for Client.BlockRoom. +type ReqBlockRoom struct { + // Room Id to block + RoomId string `json:"room_id"` + // true to block + Block bool `json:"block"` +} + +// Block or UnBlock a Room +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#block-room-api +func (cli *Client) BlockRoom(ctx context.Context, req ReqBlockRoom) error { + reqURL := cli.BuildAdminURL("v1", "rooms", req.RoomId, "block") + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodPut, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +// Get block status of a Room +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#get-block-status +func (cli *Client) GetBlockRoom(ctx context.Context, RoomId string) (*mautrix.RoomsBlockResponse, error) { + var resp mautrix.RoomsBlockResponse + reqURL := cli.BuildAdminURL("v1", "rooms", RoomId, "block") + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodGet, + URL: reqURL, + ResponseJSON: &resp, + }) + return &resp, err +} diff --git a/synapseadmin/userapi.go b/synapseadmin/userapi.go index aa1ce2a7..ce0ffa01 100644 --- a/synapseadmin/userapi.go +++ b/synapseadmin/userapi.go @@ -21,13 +21,13 @@ import ( type ReqResetPassword struct { // The user whose password to reset. UserID id.UserID `json:"-"` - // The new password for the user. Required. NewPassword string `json:"new_password"` // Whether all the user's existing devices should be logged out after the password change. LogoutDevices bool `json:"logout_devices"` } + // ResetPassword changes the password of another user using // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#reset-password @@ -86,7 +86,7 @@ type RespUserInfo struct { UserID id.UserID `json:"name"` DisplayName string `json:"displayname"` AvatarURL id.ContentURIString `json:"avatar_url"` - Guest int `json:"is_guest"` + Guest bool `json:"is_guest"` Admin bool `json:"admin"` Deactivated bool `json:"deactivated"` Erased bool `json:"erased"` @@ -109,3 +109,101 @@ func (cli *Client) GetUserInfo(ctx context.Context, userID id.UserID) (resp *Res }) return } + +// ReqDeleteUser is the request content to deactivate account. +type ReqDeleteUser struct { + // The user to deactivate + UserID id.UserID `json:"-"` + // true if message hidden for new users in room after actual user is deactivated + Erase bool `json:"erase"` +} + +// DeactivateAccount deactivate a specific user account. +// +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#deactivate-account +func (cli *Client) DeactivateAccount(ctx context.Context, req ReqDeleteUser) error { + reqURL := cli.BuildAdminURL("v1", "deactivate", req.UserID) + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodPost, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +// ReqUpdateUser is the request content to reactivate an account +type ReqActivateUser struct { + // The user to deactivate + UserID id.UserID `json:"-"` + // new password for user + Password string `json:"password"` + // false if we want to re-activate the user + Deactivated bool `json:"deactivated"` +} + +// ActivateAccount re-activate a specific user account that has been deactivated. +// +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#create-or-modify-account +func (cli *Client) ActivateAccount(ctx context.Context, req ReqActivateUser) error { + reqURL := cli.BuildAdminURL("v2", "users", req.UserID) + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodPut, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +// ReqOverrideRatelimit is the request content to OverrideRatelimit an account +type ReqOverrideRatelimit struct { + // The user to override rate limit + UserID string `json:"-"` + // ratelimite message per second + MessagesPerSecond int `json:"messages_per_second"` + // How many actions that can be performed before being limited + BurstCount int `json:"burst_count"` +} + +// Override RateLimits for a specific user. +// +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#set-ratelimit +func (cli *Client) OverrideRatelimit(ctx context.Context, req ReqOverrideRatelimit) error { + reqURL := cli.BuildAdminURL("v1", "users", req.UserID, "override_ratelimit") + _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodPost, + URL: reqURL, + RequestJSON: &req, + }) + return err +} + +type RespRateLimit struct { + // ratelimite message per second + MessagePerSecond int `json:"messages_per_second"` + // How many actions that can be performed before being limited + BurstCount int `json:"burst_count"` +} + +// GetUserRateLimit gets RateLimit from a specific user. +// +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account +func (cli *Client) GetUserRateLimit(ctx context.Context, userID string) (resp *RespRateLimit, err error) { + _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodGet, + URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), + ResponseJSON: &resp, + }) + return +} + +// DelUserRateLimit delete RateLimit from a specific user. +// +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account +func (cli *Client) DelUserRateLimit(ctx context.Context, userID string) (err error) { + _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodDelete, + URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), + }) + return +} + From 858c79046161b50c3039fc26ab422b4b458641d6 Mon Sep 17 00:00:00 2001 From: ghuet Date: Tue, 9 Jan 2024 14:57:59 +0100 Subject: [PATCH 2/8] add methods to api --- synapseadmin/roomapi.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/synapseadmin/roomapi.go b/synapseadmin/roomapi.go index 29fd04a9..2dde7ba5 100644 --- a/synapseadmin/roomapi.go +++ b/synapseadmin/roomapi.go @@ -17,8 +17,13 @@ import ( // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html func (cli *Client) ListRoom(ctx context.Context, alias string) (*mautrix.RoomsResponse ,error) { - reqURL := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, map[string]string{"search_term": alias}) var resp mautrix.RoomsResponse + var reqURL string + if (alias == "") { + reqURL = cli.BuildAdminURL("v1", "rooms") + } else { + reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, map[string]string{"search_term": alias}) + } _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: reqURL, From bb65f85b05bf2ffa25fcc380b8d9317868a4a1eb Mon Sep 17 00:00:00 2001 From: ghuet Date: Thu, 1 Feb 2024 18:11:54 +0100 Subject: [PATCH 3/8] fix rooms api --- responses.go | 1 + synapseadmin/roomapi.go | 34 ++++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/responses.go b/responses.go index 3fa5f2c9..6bc7463c 100644 --- a/responses.go +++ b/responses.go @@ -648,6 +648,7 @@ type RoomsResponse struct { Rooms []RoomInfos `json:"rooms"` Offset int `json:"offset"` TotalRooms int `json:"total_rooms"` + NextBatch int `json:"next_batch"` } // RoomsMembersResponse represents the response containing a list of members of a room diff --git a/synapseadmin/roomapi.go b/synapseadmin/roomapi.go index 2dde7ba5..2884204b 100644 --- a/synapseadmin/roomapi.go +++ b/synapseadmin/roomapi.go @@ -11,19 +11,41 @@ import ( "net/http" "maunium.net/go/mautrix" "maunium.net/go/mautrix/id" + "strconv" ) +type ReqListRoom struct { + Alias string + From int + Limit int +} + +func (cli *Client) NewReqListRoom() ReqListRoom { + req := ReqListRoom{} + req.Alias = "" + req.From = 0 + req.Limit = 100 + return req +} + +func (req *ReqListRoom) BuildQuery() map[string]string { + query := map[string]string{ + "limit": strconv.Itoa(req.Limit), + } + if req.Alias != "" { + query["search_term"] = req.Alias + } + query["from"] = strconv.Itoa(req.From) + return query +} + // Get room info based on alias // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html -func (cli *Client) ListRoom(ctx context.Context, alias string) (*mautrix.RoomsResponse ,error) { +func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (*mautrix.RoomsResponse ,error) { var resp mautrix.RoomsResponse var reqURL string - if (alias == "") { - reqURL = cli.BuildAdminURL("v1", "rooms") - } else { - reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, map[string]string{"search_term": alias}) - } + reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, req.BuildQuery())//map[string]string{"search_term": alias}) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: reqURL, From acfbc6c11bdf5b7f2fb212b254c307954c4a1e74 Mon Sep 17 00:00:00 2001 From: ghuet Date: Thu, 1 Feb 2024 18:19:05 +0100 Subject: [PATCH 4/8] sync admin room messages --- responses.go | 8 ++++ synapseadmin/client.go | 87 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/responses.go b/responses.go index 6bc7463c..09498f64 100644 --- a/responses.go +++ b/responses.go @@ -662,3 +662,11 @@ type RoomsBlockResponse struct { Block bool `json:"block"` UserId string `json:"user_id"` } + +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-messages-api +type RespSyncRoomMessagesAdmin struct { + Chunk []*event.Event `json:"chunk"` + End string `json:"end"` + Start string `json:"start"` +} + diff --git a/synapseadmin/client.go b/synapseadmin/client.go index 775b4b13..3d99d626 100644 --- a/synapseadmin/client.go +++ b/synapseadmin/client.go @@ -8,6 +8,11 @@ package synapseadmin import ( "maunium.net/go/mautrix" + "maunium.net/go/mautrix/event" + "context" + "time" + "maunium.net/go/mautrix/id" + "net/http" ) // Client is a wrapper for the mautrix.Client struct that includes methods for accessing the Synapse admin API. @@ -20,3 +25,85 @@ type Client struct { func (cli *Client) BuildAdminURL(path ...any) string { return cli.BuildURL(mautrix.SynapseAdminURLPath(path)) } + +func (cli *Client) SyncRoomWithContextAdmin(ctx context.Context, nextBatch string, roomID string) error { + // Use Admin API to pseudo sync specific room messages + for { + resSyncAdmin, err := cli.FullSyncRequest(ctx, ReqSyncAdmin{ + from: nextBatch, + }, roomID) + if err != nil { + return err + } + /* + remplacer par stockage sur fichier bbolt + err = cli.Store.SaveNextBatch(ctx, cli.UserID, resSyncAdmin.End) + if err != nil { + return err + } + */ + + resSync := RespSyncAdminToRespSync(resSyncAdmin) + if err = cli.Syncer.ProcessResponse(ctx, resSync, nextBatch); err != nil { + return err + } + if (resSync.NextBatch != "") { + nextBatch = resSync.NextBatch + } + time.Sleep(2 * time.Second) + } +} + +type ReqSyncAdmin struct { + from string +} + +func (req *ReqSyncAdmin) BuildQuery() map[string]string { + query := map[string]string{} + if req.from != "" { + query["from"] = req.from + } + return query +} + +func RespSyncAdminToRespSync(respSyncAdmin *mautrix.RespSyncRoomMessagesAdmin) *mautrix.RespSync { + respSync := &mautrix.RespSync{} + respSync.NextBatch = respSyncAdmin.End + respSync.Presence.Events = append(respSync.Presence.Events, &event.Event{Type: event.Type{Type: "RoomMessagesAdmin"}}) + // Populate Rooms field + respSync.Rooms = mautrix.RespSyncRooms{ + Join: make(map[id.RoomID]*mautrix.SyncJoinedRoom), + } + + // Iterate over events in Chunk and populate Join field + for _, room_event := range respSyncAdmin.Chunk { + roomID := room_event.RoomID + joinedRoom, ok := respSync.Rooms.Join[roomID] + if !ok { + joinedRoom = &mautrix.SyncJoinedRoom{ + Timeline: mautrix.SyncTimeline{ + SyncEventsList: mautrix.SyncEventsList{Events: []*event.Event{}}, + Limited: true, + PrevBatch: "", + }, + } + respSync.Rooms.Join[roomID] = joinedRoom + } + joinedRoom.Timeline.Events = append(joinedRoom.Timeline.Events, room_event) + } + + return respSync +} + +func (cli *Client) FullSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID string) (resp *mautrix.RespSyncRoomMessagesAdmin, err error) { + urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, req.BuildQuery()) + fullReq := mautrix.FullRequest{ + Method: http.MethodGet, + URL: urlPath, + ResponseJSON: &resp, + MaxAttempts: 1, + } + _, err = cli.MakeFullRequest(ctx, fullReq) + return +} + From 4ca53b0e38b3fc69d399a9b300fe0d919da86423 Mon Sep 17 00:00:00 2001 From: ghuet Date: Fri, 16 Feb 2024 14:41:35 +0100 Subject: [PATCH 5/8] admin sync func --- synapseadmin/client.go | 74 ++++++++---------------------------------- 1 file changed, 14 insertions(+), 60 deletions(-) diff --git a/synapseadmin/client.go b/synapseadmin/client.go index 3d99d626..1d3ee79c 100644 --- a/synapseadmin/client.go +++ b/synapseadmin/client.go @@ -8,10 +8,7 @@ package synapseadmin import ( "maunium.net/go/mautrix" - "maunium.net/go/mautrix/event" "context" - "time" - "maunium.net/go/mautrix/id" "net/http" ) @@ -26,36 +23,20 @@ func (cli *Client) BuildAdminURL(path ...any) string { return cli.BuildURL(mautrix.SynapseAdminURLPath(path)) } -func (cli *Client) SyncRoomWithContextAdmin(ctx context.Context, nextBatch string, roomID string) error { - // Use Admin API to pseudo sync specific room messages - for { - resSyncAdmin, err := cli.FullSyncRequest(ctx, ReqSyncAdmin{ - from: nextBatch, - }, roomID) - if err != nil { - return err - } - /* - remplacer par stockage sur fichier bbolt - err = cli.Store.SaveNextBatch(ctx, cli.UserID, resSyncAdmin.End) - if err != nil { - return err - } - */ - - resSync := RespSyncAdminToRespSync(resSyncAdmin) - if err = cli.Syncer.ProcessResponse(ctx, resSync, nextBatch); err != nil { - return err - } - if (resSync.NextBatch != "") { - nextBatch = resSync.NextBatch - } - time.Sleep(2 * time.Second) +func (cli *Client) SyncRoomWithContextAdmin(ctx context.Context, nextBatch string, roomID string, prevBatch string) (*mautrix.RespSyncRoomMessagesAdmin, error) { + resSyncAdmin, err := cli.FullAdminSyncRequest(ctx, ReqSyncAdmin{ + from: nextBatch, + to: prevBatch, + }, roomID) + if err != nil { + return &mautrix.RespSyncRoomMessagesAdmin{}, err } + return resSyncAdmin, nil } type ReqSyncAdmin struct { from string + to string } func (req *ReqSyncAdmin) BuildQuery() map[string]string { @@ -63,39 +44,13 @@ func (req *ReqSyncAdmin) BuildQuery() map[string]string { if req.from != "" { query["from"] = req.from } + if req.to != "" { + query["to"] = req.to + } return query } -func RespSyncAdminToRespSync(respSyncAdmin *mautrix.RespSyncRoomMessagesAdmin) *mautrix.RespSync { - respSync := &mautrix.RespSync{} - respSync.NextBatch = respSyncAdmin.End - respSync.Presence.Events = append(respSync.Presence.Events, &event.Event{Type: event.Type{Type: "RoomMessagesAdmin"}}) - // Populate Rooms field - respSync.Rooms = mautrix.RespSyncRooms{ - Join: make(map[id.RoomID]*mautrix.SyncJoinedRoom), - } - - // Iterate over events in Chunk and populate Join field - for _, room_event := range respSyncAdmin.Chunk { - roomID := room_event.RoomID - joinedRoom, ok := respSync.Rooms.Join[roomID] - if !ok { - joinedRoom = &mautrix.SyncJoinedRoom{ - Timeline: mautrix.SyncTimeline{ - SyncEventsList: mautrix.SyncEventsList{Events: []*event.Event{}}, - Limited: true, - PrevBatch: "", - }, - } - respSync.Rooms.Join[roomID] = joinedRoom - } - joinedRoom.Timeline.Events = append(joinedRoom.Timeline.Events, room_event) - } - - return respSync -} - -func (cli *Client) FullSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID string) (resp *mautrix.RespSyncRoomMessagesAdmin, err error) { +func (cli *Client) FullAdminSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID string) (resp *mautrix.RespSyncRoomMessagesAdmin, err error) { urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, req.BuildQuery()) fullReq := mautrix.FullRequest{ Method: http.MethodGet, @@ -104,6 +59,5 @@ func (cli *Client) FullSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID MaxAttempts: 1, } _, err = cli.MakeFullRequest(ctx, fullReq) - return + return resp, err } - From 9d772e365a8cda0d2eec05cbf94d61ea557b4a17 Mon Sep 17 00:00:00 2001 From: ghuet Date: Mon, 19 Feb 2024 12:06:30 +0100 Subject: [PATCH 6/8] syntax correction --- responses.go | 47 ---------------------- synapseadmin/client.go | 12 +++--- synapseadmin/responses.go | 54 ++++++++++++++++++++++++++ synapseadmin/roomapi.go | 82 ++++++++++++++++----------------------- synapseadmin/userapi.go | 24 +++++------- 5 files changed, 104 insertions(+), 115 deletions(-) create mode 100644 synapseadmin/responses.go diff --git a/responses.go b/responses.go index 09498f64..e182a722 100644 --- a/responses.go +++ b/responses.go @@ -623,50 +623,3 @@ type RespRoomKeysUpdate struct { Count int `json:"count"` ETag string `json:"etag"` } - -// Room represents the structure of each room -type RoomInfos struct { - RoomID string `json:"room_id"` - Name string `json:"name"` - CanonicalAlias string `json:"canonical_alias"` - JoinedMembers int `json:"joined_members"` - JoinedLocalMembers int `json:"joined_local_members"` - Version string `json:"version"` - Creator string `json:"creator"` - Encryption string `json:"encryption"` - Federatable bool `json:"federatable"` - Public bool `json:"public"` - JoinRules string `json:"join_rules"` - GuestAccess string `json:"guest_access"` - HistoryVisibility string `json:"history_visibility"` - StateEvents int `json:"state_events"` - RoomType string `json:"room_type"` -} - -// RoomsResponse represents the response containing a list of rooms -type RoomsResponse struct { - Rooms []RoomInfos `json:"rooms"` - Offset int `json:"offset"` - TotalRooms int `json:"total_rooms"` - NextBatch int `json:"next_batch"` -} - -// RoomsMembersResponse represents the response containing a list of members of a room -type RoomsMembersResponse struct { - Members []string `json:"members"` - Total int `json:"total"` -} - -// RoomsBlockResponse represents the response containing wether a room is blocked or not -type RoomsBlockResponse struct { - Block bool `json:"block"` - UserId string `json:"user_id"` -} - -// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-messages-api -type RespSyncRoomMessagesAdmin struct { - Chunk []*event.Event `json:"chunk"` - End string `json:"end"` - Start string `json:"start"` -} - diff --git a/synapseadmin/client.go b/synapseadmin/client.go index 1d3ee79c..90bc321f 100644 --- a/synapseadmin/client.go +++ b/synapseadmin/client.go @@ -8,6 +8,7 @@ package synapseadmin import ( "maunium.net/go/mautrix" + "maunium.net/go/mautrix/id" "context" "net/http" ) @@ -23,13 +24,14 @@ func (cli *Client) BuildAdminURL(path ...any) string { return cli.BuildURL(mautrix.SynapseAdminURLPath(path)) } -func (cli *Client) SyncRoomWithContextAdmin(ctx context.Context, nextBatch string, roomID string, prevBatch string) (*mautrix.RespSyncRoomMessagesAdmin, error) { +//func (cli *Client) MessagesAdmin(ctx context.Context, roomID string, from, to string) (RespMessagesAdmin, error) { +func (cli *Client) MessagesAdmin(ctx context.Context, roomID id.RoomID, from, to string) (RespMessagesAdmin, error) { resSyncAdmin, err := cli.FullAdminSyncRequest(ctx, ReqSyncAdmin{ - from: nextBatch, - to: prevBatch, + from: from, + to: to, }, roomID) if err != nil { - return &mautrix.RespSyncRoomMessagesAdmin{}, err + return nil, err } return resSyncAdmin, nil } @@ -50,7 +52,7 @@ func (req *ReqSyncAdmin) BuildQuery() map[string]string { return query } -func (cli *Client) FullAdminSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID string) (resp *mautrix.RespSyncRoomMessagesAdmin, err error) { +func (cli *Client) FullAdminSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID id.RoomID) (resp RespMessagesAdmin, err error) { urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, req.BuildQuery()) fullReq := mautrix.FullRequest{ Method: http.MethodGet, diff --git a/synapseadmin/responses.go b/synapseadmin/responses.go new file mode 100644 index 00000000..0685462f --- /dev/null +++ b/synapseadmin/responses.go @@ -0,0 +1,54 @@ +// Copyright (c) 2023 Tulir Asokan +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package synapseadmin + +import ( + "maunium.net/go/mautrix" + "maunium.net/go/mautrix/id" +) + +// RoomInfos represents the structure of each room +type RoomInfos struct { + RoomID id.RoomID `json:"room_id"` + Name string `json:"name"` + CanonicalAlias string `json:"canonical_alias"` + JoinedMembers int `json:"joined_members"` + JoinedLocalMembers int `json:"joined_local_members"` + Version string `json:"version"` + Creator string `json:"creator"` + Encryption string `json:"encryption"` + Federatable bool `json:"federatable"` + Public bool `json:"public"` + JoinRules string `json:"join_rules"` + GuestAccess string `json:"guest_access"` + HistoryVisibility string `json:"history_visibility"` + StateEvents int `json:"state_events"` + RoomType string `json:"room_type"` +} + +// RoomsResponse represents the response containing a list of rooms +type RoomsResponse struct { + Rooms []RoomInfos `json:"rooms"` + Offset int `json:"offset"` + TotalRooms int `json:"total_rooms"` + NextBatch int `json:"next_batch"` +} + +// RoomsMembersResponse represents the response containing a list of members of a room +type RoomsMembersResponse struct { + Members []string `json:"members"` + Total int `json:"total"` +} + +// RoomsBlockResponse represents the response containing wether a room is blocked or not +type RoomsBlockResponse struct { + Block bool `json:"block"` + UserId id.UserID `json:"user_id"` +} + +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-messages-api +type RespMessagesAdmin *mautrix.RespMessages diff --git a/synapseadmin/roomapi.go b/synapseadmin/roomapi.go index 2884204b..23ed50da 100644 --- a/synapseadmin/roomapi.go +++ b/synapseadmin/roomapi.go @@ -15,49 +15,41 @@ import ( ) type ReqListRoom struct { - Alias string - From int - Limit int -} - -func (cli *Client) NewReqListRoom() ReqListRoom { - req := ReqListRoom{} - req.Alias = "" - req.From = 0 - req.Limit = 100 - return req + SearchTerm string + From int + Limit int } func (req *ReqListRoom) BuildQuery() map[string]string { query := map[string]string{ - "limit": strconv.Itoa(req.Limit), + "from": strconv.Itoa(req.From), + } + if req.SearchTerm != "" { + query["search_term"] = req.SearchTerm } - if req.Alias != "" { - query["search_term"] = req.Alias + if req.Limit != 0 { + query["limit"] = strconv.Itoa(req.Limit) } - query["from"] = strconv.Itoa(req.From) return query } -// Get room info based on alias +// Get room info based on room alias name // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html -func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (*mautrix.RoomsResponse ,error) { - var resp mautrix.RoomsResponse +func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (RoomsResponse ,error) { + var resp RoomsResponse var reqURL string - reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, req.BuildQuery())//map[string]string{"search_term": alias}) + reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, req.BuildQuery()) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: reqURL, ResponseJSON: &resp, }) - return &resp, err + return resp, err } // ReqDeleteRoom is the request content for Client.DeleteRoom. type ReqDeleteRoom struct { - // Room Id to delete - RoomId string `json:"room_id"` // Default to true: remove all traces from database Purge bool `json:"purge"` } @@ -65,8 +57,8 @@ type ReqDeleteRoom struct { // Delete Room based on Id // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version -func (cli *Client) DeleteRoom(ctx context.Context, req ReqDeleteRoom) error { - reqURL := cli.BuildAdminURL("v2", "rooms", req.RoomId) +func (cli *Client) DeleteRoom(ctx context.Context, roomID id.RoomID, req ReqDeleteRoom) error { + reqURL := cli.BuildAdminURL("v2", "rooms", roomID) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodDelete, URL: reqURL, @@ -78,30 +70,28 @@ func (cli *Client) DeleteRoom(ctx context.Context, req ReqDeleteRoom) error { // Get Room Members based on Room Id // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version -func (cli *Client) RoomMembers(ctx context.Context, RoomId string) (*mautrix.RoomsMembersResponse, error) { - reqURL := cli.BuildAdminURL("v1", "rooms", RoomId, "members") - var resp mautrix.RoomsMembersResponse +func (cli *Client) RoomMembers(ctx context.Context, roomId id.RoomID) (RoomsMembersResponse, error) { + reqURL := cli.BuildAdminURL("v1", "rooms", roomId, "members") + var resp RoomsMembersResponse _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: reqURL, ResponseJSON: &resp, }) - return &resp, err + return resp, err } // ReqRoomAdmin is the request content for Client.RoomAdmin. type ReqRoomAdmin struct { // User Id to make admin - UserId id.UserID `json:"user_id"` - // Room Id or alias - Room string `json:"room"` + userID id.UserID `json:"user_id"` } -// Make admin a Room's user based on Id +// Make admin a Room's user based on room Id or room alias // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#make-room-admin-api -func (cli *Client) RoomAdmin(ctx context.Context, req ReqRoomAdmin) error { - reqURL := cli.BuildAdminURL("v1", "rooms", req.Room, "make_room_admin") +func (cli *Client) RoomAdmin(ctx context.Context, room string, req ReqRoomAdmin) error { + reqURL := cli.BuildAdminURL("v1", "rooms", room, "make_room_admin") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, URL: reqURL, @@ -113,16 +103,14 @@ func (cli *Client) RoomAdmin(ctx context.Context, req ReqRoomAdmin) error { // ReqAddUser is the request content for Client.AddUser. type ReqAddUser struct { // User Id to make admin - UserId string `json:"user_id"` - // Room Id or alias - Room string `json:"room"` + UserID id.UserID `json:"user_id"` } -// Add User to Room +// Add User to Room via room ID or room Alias // // https://matrix-org.github.io/synapse/latest/admin_api/room_membership.html -func (cli *Client) AddUser(ctx context.Context, req ReqAddUser) error { - reqURL := cli.BuildAdminURL("v1", "join", req.Room) +func (cli *Client) AddUser(ctx context.Context, room id.RoomID, req ReqAddUser) error { + reqURL := cli.BuildAdminURL("v1", "join", room) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, URL: reqURL, @@ -133,8 +121,6 @@ func (cli *Client) AddUser(ctx context.Context, req ReqAddUser) error { // ReqBlockRoom is the request content for Client.BlockRoom. type ReqBlockRoom struct { - // Room Id to block - RoomId string `json:"room_id"` // true to block Block bool `json:"block"` } @@ -142,8 +128,8 @@ type ReqBlockRoom struct { // Block or UnBlock a Room // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#block-room-api -func (cli *Client) BlockRoom(ctx context.Context, req ReqBlockRoom) error { - reqURL := cli.BuildAdminURL("v1", "rooms", req.RoomId, "block") +func (cli *Client) BlockRoom(ctx context.Context, roomID id.RoomID, req ReqBlockRoom) error { + reqURL := cli.BuildAdminURL("v1", "rooms", roomID, "block") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPut, URL: reqURL, @@ -155,13 +141,13 @@ func (cli *Client) BlockRoom(ctx context.Context, req ReqBlockRoom) error { // Get block status of a Room // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#get-block-status -func (cli *Client) GetBlockRoom(ctx context.Context, RoomId string) (*mautrix.RoomsBlockResponse, error) { - var resp mautrix.RoomsBlockResponse - reqURL := cli.BuildAdminURL("v1", "rooms", RoomId, "block") +func (cli *Client) GetBlockRoom(ctx context.Context, roomID id.RoomID) (RoomsBlockResponse, error) { + var resp RoomsBlockResponse + reqURL := cli.BuildAdminURL("v1", "rooms", roomID, "block") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: reqURL, ResponseJSON: &resp, }) - return &resp, err + return resp, err } diff --git a/synapseadmin/userapi.go b/synapseadmin/userapi.go index ce0ffa01..7f0a119a 100644 --- a/synapseadmin/userapi.go +++ b/synapseadmin/userapi.go @@ -112,8 +112,6 @@ func (cli *Client) GetUserInfo(ctx context.Context, userID id.UserID) (resp *Res // ReqDeleteUser is the request content to deactivate account. type ReqDeleteUser struct { - // The user to deactivate - UserID id.UserID `json:"-"` // true if message hidden for new users in room after actual user is deactivated Erase bool `json:"erase"` } @@ -121,8 +119,8 @@ type ReqDeleteUser struct { // DeactivateAccount deactivate a specific user account. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#deactivate-account -func (cli *Client) DeactivateAccount(ctx context.Context, req ReqDeleteUser) error { - reqURL := cli.BuildAdminURL("v1", "deactivate", req.UserID) +func (cli *Client) DeactivateAccount(ctx context.Context, userID id.UserID, req ReqDeleteUser) error { + reqURL := cli.BuildAdminURL("v1", "deactivate", userID) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, URL: reqURL, @@ -133,8 +131,6 @@ func (cli *Client) DeactivateAccount(ctx context.Context, req ReqDeleteUser) err // ReqUpdateUser is the request content to reactivate an account type ReqActivateUser struct { - // The user to deactivate - UserID id.UserID `json:"-"` // new password for user Password string `json:"password"` // false if we want to re-activate the user @@ -144,8 +140,8 @@ type ReqActivateUser struct { // ActivateAccount re-activate a specific user account that has been deactivated. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#create-or-modify-account -func (cli *Client) ActivateAccount(ctx context.Context, req ReqActivateUser) error { - reqURL := cli.BuildAdminURL("v2", "users", req.UserID) +func (cli *Client) ActivateAccount(ctx context.Context, userID id.UserID, req ReqActivateUser) error { + reqURL := cli.BuildAdminURL("v2", "users", userID) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPut, URL: reqURL, @@ -156,8 +152,6 @@ func (cli *Client) ActivateAccount(ctx context.Context, req ReqActivateUser) err // ReqOverrideRatelimit is the request content to OverrideRatelimit an account type ReqOverrideRatelimit struct { - // The user to override rate limit - UserID string `json:"-"` // ratelimite message per second MessagesPerSecond int `json:"messages_per_second"` // How many actions that can be performed before being limited @@ -167,8 +161,8 @@ type ReqOverrideRatelimit struct { // Override RateLimits for a specific user. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#set-ratelimit -func (cli *Client) OverrideRatelimit(ctx context.Context, req ReqOverrideRatelimit) error { - reqURL := cli.BuildAdminURL("v1", "users", req.UserID, "override_ratelimit") +func (cli *Client) OverrideRatelimit(ctx context.Context, userID id.UserID, req ReqOverrideRatelimit) error { + reqURL := cli.BuildAdminURL("v1", "users", userID, "override_ratelimit") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, URL: reqURL, @@ -187,7 +181,7 @@ type RespRateLimit struct { // GetUserRateLimit gets RateLimit from a specific user. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account -func (cli *Client) GetUserRateLimit(ctx context.Context, userID string) (resp *RespRateLimit, err error) { +func (cli *Client) GetUserRateLimit(ctx context.Context, userID id.UserID) (resp *RespRateLimit, err error) { _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), @@ -196,10 +190,10 @@ func (cli *Client) GetUserRateLimit(ctx context.Context, userID string) (resp *R return } -// DelUserRateLimit delete RateLimit from a specific user. +// DeleteUserRateLimit delete RateLimit from a specific user. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account -func (cli *Client) DelUserRateLimit(ctx context.Context, userID string) (err error) { +func (cli *Client) DeleteUserRateLimit(ctx context.Context, userID id.UserID) (err error) { _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodDelete, URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), From 245c3574dcfe188bdb1783d597c89e17fb48a429 Mon Sep 17 00:00:00 2001 From: ghuet Date: Tue, 20 Feb 2024 16:40:43 +0100 Subject: [PATCH 7/8] reviews changes --- synapseadmin/client.go | 40 +++++++++++----------------- synapseadmin/responses.go | 48 +++++++++++++++++---------------- synapseadmin/roomapi.go | 56 +++++++++++++++++++++------------------ synapseadmin/userapi.go | 6 ++--- 4 files changed, 72 insertions(+), 78 deletions(-) diff --git a/synapseadmin/client.go b/synapseadmin/client.go index 90bc321f..2188e8e0 100644 --- a/synapseadmin/client.go +++ b/synapseadmin/client.go @@ -7,10 +7,11 @@ package synapseadmin import ( - "maunium.net/go/mautrix" - "maunium.net/go/mautrix/id" "context" "net/http" + + "maunium.net/go/mautrix" + "maunium.net/go/mautrix/id" ) // Client is a wrapper for the mautrix.Client struct that includes methods for accessing the Synapse admin API. @@ -24,21 +25,22 @@ func (cli *Client) BuildAdminURL(path ...any) string { return cli.BuildURL(mautrix.SynapseAdminURLPath(path)) } -//func (cli *Client) MessagesAdmin(ctx context.Context, roomID string, from, to string) (RespMessagesAdmin, error) { -func (cli *Client) MessagesAdmin(ctx context.Context, roomID id.RoomID, from, to string) (RespMessagesAdmin, error) { - resSyncAdmin, err := cli.FullAdminSyncRequest(ctx, ReqSyncAdmin{ - from: from, - to: to, - }, roomID) - if err != nil { - return nil, err +func (cli *Client) MessagesAdmin(ctx context.Context, roomID id.RoomID, from, to string) (resp RespMessagesAdmin, err error) { + req := ReqSyncAdmin{from: from, to: to} + urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, req.BuildQuery()) + fullReq := mautrix.FullRequest{ + Method: http.MethodGet, + URL: urlPath, + ResponseJSON: &resp, + MaxAttempts: 1, } - return resSyncAdmin, nil + _, err = cli.MakeFullRequest(ctx, fullReq) + return resp, err } type ReqSyncAdmin struct { - from string - to string + from string + to string } func (req *ReqSyncAdmin) BuildQuery() map[string]string { @@ -51,15 +53,3 @@ func (req *ReqSyncAdmin) BuildQuery() map[string]string { } return query } - -func (cli *Client) FullAdminSyncRequest(ctx context.Context, req ReqSyncAdmin, roomID id.RoomID) (resp RespMessagesAdmin, err error) { - urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, req.BuildQuery()) - fullReq := mautrix.FullRequest{ - Method: http.MethodGet, - URL: urlPath, - ResponseJSON: &resp, - MaxAttempts: 1, - } - _, err = cli.MakeFullRequest(ctx, fullReq) - return resp, err -} diff --git a/synapseadmin/responses.go b/synapseadmin/responses.go index 0685462f..9d86b129 100644 --- a/synapseadmin/responses.go +++ b/synapseadmin/responses.go @@ -8,46 +8,48 @@ package synapseadmin import ( "maunium.net/go/mautrix" + "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" ) // RoomInfos represents the structure of each room type RoomInfos struct { - RoomID id.RoomID `json:"room_id"` - Name string `json:"name"` - CanonicalAlias string `json:"canonical_alias"` - JoinedMembers int `json:"joined_members"` - JoinedLocalMembers int `json:"joined_local_members"` - Version string `json:"version"` - Creator string `json:"creator"` - Encryption string `json:"encryption"` - Federatable bool `json:"federatable"` - Public bool `json:"public"` - JoinRules string `json:"join_rules"` - GuestAccess string `json:"guest_access"` - HistoryVisibility string `json:"history_visibility"` - StateEvents int `json:"state_events"` - RoomType string `json:"room_type"` + RoomID id.RoomID `json:"room_id"` + Name string `json:"name"` + CanonicalAlias id.RoomAlias `json:"canonical_alias"` + JoinedMembers int `json:"joined_members"` + JoinedLocalMembers int `json:"joined_local_members"` + Version string `json:"version"` + Creator id.UserID `json:"creator"` + Encryption id.Algorithm `json:"encryption"` + Federatable bool `json:"federatable"` + Public bool `json:"public"` + JoinRules event.JoinRule `json:"join_rules"` + GuestAccess event.GuestAccess `json:"guest_access"` + HistoryVisibility event.HistoryVisibility `json:"history_visibility"` + StateEvents int `json:"state_events"` + RoomType event.RoomType `json:"room_type"` } // RoomsResponse represents the response containing a list of rooms type RoomsResponse struct { - Rooms []RoomInfos `json:"rooms"` - Offset int `json:"offset"` - TotalRooms int `json:"total_rooms"` - NextBatch int `json:"next_batch"` + Rooms []RoomInfos `json:"rooms"` + Offset int `json:"offset"` + TotalRooms int `json:"total_rooms"` + NextBatch int `json:"next_batch"` + PrevBatch int `json:"prev_batch"` } // RoomsMembersResponse represents the response containing a list of members of a room type RoomsMembersResponse struct { - Members []string `json:"members"` - Total int `json:"total"` + Members []string `json:"members"` + Total int `json:"total"` } // RoomsBlockResponse represents the response containing wether a room is blocked or not type RoomsBlockResponse struct { - Block bool `json:"block"` - UserId id.UserID `json:"user_id"` + Block bool `json:"block"` + UserID id.UserID `json:"user_id"` } // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-messages-api diff --git a/synapseadmin/roomapi.go b/synapseadmin/roomapi.go index 23ed50da..63e50be1 100644 --- a/synapseadmin/roomapi.go +++ b/synapseadmin/roomapi.go @@ -9,15 +9,16 @@ package synapseadmin import ( "context" "net/http" + "strconv" + "maunium.net/go/mautrix" "maunium.net/go/mautrix/id" - "strconv" ) type ReqListRoom struct { - SearchTerm string - From int - Limit int + SearchTerm string + From int + Limit int } func (req *ReqListRoom) BuildQuery() map[string]string { @@ -33,10 +34,10 @@ func (req *ReqListRoom) BuildQuery() map[string]string { return query } -// Get room info based on room alias name +// Get room info based on room alias name // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html -func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (RoomsResponse ,error) { +func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (RoomsResponse, error) { var resp RoomsResponse var reqURL string reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, req.BuildQuery()) @@ -50,18 +51,21 @@ func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (RoomsResponse // ReqDeleteRoom is the request content for Client.DeleteRoom. type ReqDeleteRoom struct { - // Default to true: remove all traces from database - Purge bool `json:"purge"` + Purge bool `json:"purge"` + Block bool `json:"block"` + Message string `json:"message"` + RoomName string `json:"room_name"` + NewRoomUserID id.UserID `json:"new_room_user_id"` } -// Delete Room based on Id +// Delete Room based on Id // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version func (cli *Client) DeleteRoom(ctx context.Context, roomID id.RoomID, req ReqDeleteRoom) error { reqURL := cli.BuildAdminURL("v2", "rooms", roomID) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ - Method: http.MethodDelete, - URL: reqURL, + Method: http.MethodDelete, + URL: reqURL, RequestJSON: &req, }) return err @@ -70,8 +74,8 @@ func (cli *Client) DeleteRoom(ctx context.Context, roomID id.RoomID, req ReqDele // Get Room Members based on Room Id // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version -func (cli *Client) RoomMembers(ctx context.Context, roomId id.RoomID) (RoomsMembersResponse, error) { - reqURL := cli.BuildAdminURL("v1", "rooms", roomId, "members") +func (cli *Client) RoomMembers(ctx context.Context, roomID id.RoomID) (RoomsMembersResponse, error) { + reqURL := cli.BuildAdminURL("v1", "rooms", roomID, "members") var resp RoomsMembersResponse _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, @@ -84,17 +88,17 @@ func (cli *Client) RoomMembers(ctx context.Context, roomId id.RoomID) (RoomsMemb // ReqRoomAdmin is the request content for Client.RoomAdmin. type ReqRoomAdmin struct { // User Id to make admin - userID id.UserID `json:"user_id"` + UserID id.UserID `json:"user_id"` } -// Make admin a Room's user based on room Id or room alias +// Make admin a Room's user based on room Id or room alias // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#make-room-admin-api -func (cli *Client) RoomAdmin(ctx context.Context, room string, req ReqRoomAdmin) error { - reqURL := cli.BuildAdminURL("v1", "rooms", room, "make_room_admin") +func (cli *Client) RoomAdmin(ctx context.Context, roomIDOrAlias string, req ReqRoomAdmin) error { + reqURL := cli.BuildAdminURL("v1", "rooms", roomIDOrAlias, "make_room_admin") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ - Method: http.MethodPost, - URL: reqURL, + Method: http.MethodPost, + URL: reqURL, RequestJSON: &req, }) return err @@ -106,14 +110,14 @@ type ReqAddUser struct { UserID id.UserID `json:"user_id"` } -// Add User to Room via room ID or room Alias +// Add User to Room via room ID or room Alias // // https://matrix-org.github.io/synapse/latest/admin_api/room_membership.html func (cli *Client) AddUser(ctx context.Context, room id.RoomID, req ReqAddUser) error { reqURL := cli.BuildAdminURL("v1", "join", room) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ - Method: http.MethodPost, - URL: reqURL, + Method: http.MethodPost, + URL: reqURL, RequestJSON: &req, }) return err @@ -125,20 +129,20 @@ type ReqBlockRoom struct { Block bool `json:"block"` } -// Block or UnBlock a Room +// Block or UnBlock a Room // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#block-room-api func (cli *Client) BlockRoom(ctx context.Context, roomID id.RoomID, req ReqBlockRoom) error { reqURL := cli.BuildAdminURL("v1", "rooms", roomID, "block") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ - Method: http.MethodPut, - URL: reqURL, + Method: http.MethodPut, + URL: reqURL, RequestJSON: &req, }) return err } -// Get block status of a Room +// Get block status of a Room // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#get-block-status func (cli *Client) GetBlockRoom(ctx context.Context, roomID id.RoomID) (RoomsBlockResponse, error) { diff --git a/synapseadmin/userapi.go b/synapseadmin/userapi.go index 7f0a119a..5e01ff51 100644 --- a/synapseadmin/userapi.go +++ b/synapseadmin/userapi.go @@ -27,7 +27,6 @@ type ReqResetPassword struct { LogoutDevices bool `json:"logout_devices"` } - // ResetPassword changes the password of another user using // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#reset-password @@ -195,9 +194,8 @@ func (cli *Client) GetUserRateLimit(ctx context.Context, userID id.UserID) (resp // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account func (cli *Client) DeleteUserRateLimit(ctx context.Context, userID id.UserID) (err error) { _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ - Method: http.MethodDelete, - URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), + Method: http.MethodDelete, + URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), }) return } - From 7667ef1406fe8262ae18c0548b5beb9f559f4047 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 24 Feb 2024 15:01:28 +0200 Subject: [PATCH 8/8] Clean up everything --- synapseadmin/client.go | 33 --------- synapseadmin/responses.go | 56 -------------- synapseadmin/roomapi.go | 152 +++++++++++++++++++++++++++++--------- synapseadmin/userapi.go | 57 +++++++------- 4 files changed, 143 insertions(+), 155 deletions(-) delete mode 100644 synapseadmin/responses.go diff --git a/synapseadmin/client.go b/synapseadmin/client.go index 2188e8e0..775b4b13 100644 --- a/synapseadmin/client.go +++ b/synapseadmin/client.go @@ -7,11 +7,7 @@ package synapseadmin import ( - "context" - "net/http" - "maunium.net/go/mautrix" - "maunium.net/go/mautrix/id" ) // Client is a wrapper for the mautrix.Client struct that includes methods for accessing the Synapse admin API. @@ -24,32 +20,3 @@ type Client struct { func (cli *Client) BuildAdminURL(path ...any) string { return cli.BuildURL(mautrix.SynapseAdminURLPath(path)) } - -func (cli *Client) MessagesAdmin(ctx context.Context, roomID id.RoomID, from, to string) (resp RespMessagesAdmin, err error) { - req := ReqSyncAdmin{from: from, to: to} - urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, req.BuildQuery()) - fullReq := mautrix.FullRequest{ - Method: http.MethodGet, - URL: urlPath, - ResponseJSON: &resp, - MaxAttempts: 1, - } - _, err = cli.MakeFullRequest(ctx, fullReq) - return resp, err -} - -type ReqSyncAdmin struct { - from string - to string -} - -func (req *ReqSyncAdmin) BuildQuery() map[string]string { - query := map[string]string{} - if req.from != "" { - query["from"] = req.from - } - if req.to != "" { - query["to"] = req.to - } - return query -} diff --git a/synapseadmin/responses.go b/synapseadmin/responses.go deleted file mode 100644 index 9d86b129..00000000 --- a/synapseadmin/responses.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2023 Tulir Asokan -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -package synapseadmin - -import ( - "maunium.net/go/mautrix" - "maunium.net/go/mautrix/event" - "maunium.net/go/mautrix/id" -) - -// RoomInfos represents the structure of each room -type RoomInfos struct { - RoomID id.RoomID `json:"room_id"` - Name string `json:"name"` - CanonicalAlias id.RoomAlias `json:"canonical_alias"` - JoinedMembers int `json:"joined_members"` - JoinedLocalMembers int `json:"joined_local_members"` - Version string `json:"version"` - Creator id.UserID `json:"creator"` - Encryption id.Algorithm `json:"encryption"` - Federatable bool `json:"federatable"` - Public bool `json:"public"` - JoinRules event.JoinRule `json:"join_rules"` - GuestAccess event.GuestAccess `json:"guest_access"` - HistoryVisibility event.HistoryVisibility `json:"history_visibility"` - StateEvents int `json:"state_events"` - RoomType event.RoomType `json:"room_type"` -} - -// RoomsResponse represents the response containing a list of rooms -type RoomsResponse struct { - Rooms []RoomInfos `json:"rooms"` - Offset int `json:"offset"` - TotalRooms int `json:"total_rooms"` - NextBatch int `json:"next_batch"` - PrevBatch int `json:"prev_batch"` -} - -// RoomsMembersResponse represents the response containing a list of members of a room -type RoomsMembersResponse struct { - Members []string `json:"members"` - Total int `json:"total"` -} - -// RoomsBlockResponse represents the response containing wether a room is blocked or not -type RoomsBlockResponse struct { - Block bool `json:"block"` - UserID id.UserID `json:"user_id"` -} - -// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-messages-api -type RespMessagesAdmin *mautrix.RespMessages diff --git a/synapseadmin/roomapi.go b/synapseadmin/roomapi.go index 63e50be1..0953377e 100644 --- a/synapseadmin/roomapi.go +++ b/synapseadmin/roomapi.go @@ -8,15 +8,19 @@ package synapseadmin import ( "context" + "encoding/json" "net/http" "strconv" "maunium.net/go/mautrix" + "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" ) type ReqListRoom struct { SearchTerm string + OrderBy string + Direction mautrix.Direction From int Limit int } @@ -28,17 +32,49 @@ func (req *ReqListRoom) BuildQuery() map[string]string { if req.SearchTerm != "" { query["search_term"] = req.SearchTerm } + if req.OrderBy != "" { + query["order_by"] = req.OrderBy + } + if req.Direction != 0 { + query["dir"] = string(req.Direction) + } if req.Limit != 0 { query["limit"] = strconv.Itoa(req.Limit) } return query } -// Get room info based on room alias name +type RoomInfo struct { + RoomID id.RoomID `json:"room_id"` + Name string `json:"name"` + CanonicalAlias id.RoomAlias `json:"canonical_alias"` + JoinedMembers int `json:"joined_members"` + JoinedLocalMembers int `json:"joined_local_members"` + Version string `json:"version"` + Creator id.UserID `json:"creator"` + Encryption id.Algorithm `json:"encryption"` + Federatable bool `json:"federatable"` + Public bool `json:"public"` + JoinRules event.JoinRule `json:"join_rules"` + GuestAccess event.GuestAccess `json:"guest_access"` + HistoryVisibility event.HistoryVisibility `json:"history_visibility"` + StateEvents int `json:"state_events"` + RoomType event.RoomType `json:"room_type"` +} + +type RespListRooms struct { + Rooms []RoomInfo `json:"rooms"` + Offset int `json:"offset"` + TotalRooms int `json:"total_rooms"` + NextBatch int `json:"next_batch"` + PrevBatch int `json:"prev_batch"` +} + +// ListRooms returns a list of rooms on the server. // -// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html -func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (RoomsResponse, error) { - var resp RoomsResponse +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#list-room-api +func (cli *Client) ListRooms(ctx context.Context, req ReqListRoom) (RespListRooms, error) { + var resp RespListRooms var reqURL string reqURL = cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms"}, req.BuildQuery()) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ @@ -49,34 +85,78 @@ func (cli *Client) ListRoom(ctx context.Context, req ReqListRoom) (RoomsResponse return resp, err } -// ReqDeleteRoom is the request content for Client.DeleteRoom. +type RespRoomMessages = mautrix.RespMessages + +// RoomMessages returns a list of messages in a room. +// +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-messages-api +func (cli *Client) RoomMessages(ctx context.Context, roomID id.RoomID, from, to string, dir mautrix.Direction, filter *mautrix.FilterPart, limit int) (resp *RespRoomMessages, err error) { + query := map[string]string{ + "from": from, + "dir": string(dir), + } + if filter != nil { + filterJSON, err := json.Marshal(filter) + if err != nil { + return nil, err + } + query["filter"] = string(filterJSON) + } + if to != "" { + query["to"] = to + } + if limit != 0 { + query["limit"] = strconv.Itoa(limit) + } + urlPath := cli.BuildURLWithQuery(mautrix.SynapseAdminURLPath{"v1", "rooms", roomID, "messages"}, query) + _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ + Method: http.MethodGet, + URL: urlPath, + ResponseJSON: &resp, + }) + return resp, err +} + type ReqDeleteRoom struct { - Purge bool `json:"purge"` - Block bool `json:"block"` - Message string `json:"message"` - RoomName string `json:"room_name"` - NewRoomUserID id.UserID `json:"new_room_user_id"` + Purge bool `json:"purge,omitempty"` + Block bool `json:"block,omitempty"` + Message string `json:"message,omitempty"` + RoomName string `json:"room_name,omitempty"` + NewRoomUserID id.UserID `json:"new_room_user_id,omitempty"` } -// Delete Room based on Id +type RespDeleteRoom struct { + DeleteID string `json:"delete_id"` +} + +// DeleteRoom deletes a room from the server, optionally blocking it and/or purging all data from the database. +// +// This calls the async version of the endpoint, which will return immediately and delete the room in the background. // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version -func (cli *Client) DeleteRoom(ctx context.Context, roomID id.RoomID, req ReqDeleteRoom) error { +func (cli *Client) DeleteRoom(ctx context.Context, roomID id.RoomID, req ReqDeleteRoom) (RespDeleteRoom, error) { reqURL := cli.BuildAdminURL("v2", "rooms", roomID) + var resp RespDeleteRoom _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ - Method: http.MethodDelete, - URL: reqURL, - RequestJSON: &req, + Method: http.MethodDelete, + URL: reqURL, + ResponseJSON: &resp, + RequestJSON: &req, }) - return err + return resp, err +} + +type RespRoomsMembers struct { + Members []id.UserID `json:"members"` + Total int `json:"total"` } -// Get Room Members based on Room Id +// RoomMembers gets the full list of members in a room. // -// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#version-2-new-version -func (cli *Client) RoomMembers(ctx context.Context, roomID id.RoomID) (RoomsMembersResponse, error) { +// https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#room-members-api +func (cli *Client) RoomMembers(ctx context.Context, roomID id.RoomID) (RespRoomsMembers, error) { reqURL := cli.BuildAdminURL("v1", "rooms", roomID, "members") - var resp RoomsMembersResponse + var resp RespRoomsMembers _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: reqURL, @@ -85,16 +165,14 @@ func (cli *Client) RoomMembers(ctx context.Context, roomID id.RoomID) (RoomsMemb return resp, err } -// ReqRoomAdmin is the request content for Client.RoomAdmin. -type ReqRoomAdmin struct { - // User Id to make admin +type ReqMakeRoomAdmin struct { UserID id.UserID `json:"user_id"` } -// Make admin a Room's user based on room Id or room alias +// MakeRoomAdmin promotes a user to admin in a room. This requires that a local user has permission to promote users in the room. // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#make-room-admin-api -func (cli *Client) RoomAdmin(ctx context.Context, roomIDOrAlias string, req ReqRoomAdmin) error { +func (cli *Client) MakeRoomAdmin(ctx context.Context, roomIDOrAlias string, req ReqMakeRoomAdmin) error { reqURL := cli.BuildAdminURL("v1", "rooms", roomIDOrAlias, "make_room_admin") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, @@ -104,17 +182,15 @@ func (cli *Client) RoomAdmin(ctx context.Context, roomIDOrAlias string, req ReqR return err } -// ReqAddUser is the request content for Client.AddUser. -type ReqAddUser struct { - // User Id to make admin +type ReqJoinUserToRoom struct { UserID id.UserID `json:"user_id"` } -// Add User to Room via room ID or room Alias +// JoinUserToRoom makes a local user join the given room. // // https://matrix-org.github.io/synapse/latest/admin_api/room_membership.html -func (cli *Client) AddUser(ctx context.Context, room id.RoomID, req ReqAddUser) error { - reqURL := cli.BuildAdminURL("v1", "join", room) +func (cli *Client) JoinUserToRoom(ctx context.Context, roomID id.RoomID, req ReqJoinUserToRoom) error { + reqURL := cli.BuildAdminURL("v1", "join", roomID) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, URL: reqURL, @@ -123,13 +199,11 @@ func (cli *Client) AddUser(ctx context.Context, room id.RoomID, req ReqAddUser) return err } -// ReqBlockRoom is the request content for Client.BlockRoom. type ReqBlockRoom struct { - // true to block Block bool `json:"block"` } -// Block or UnBlock a Room +// BlockRoom blocks or unblocks a room. // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#block-room-api func (cli *Client) BlockRoom(ctx context.Context, roomID id.RoomID, req ReqBlockRoom) error { @@ -142,10 +216,16 @@ func (cli *Client) BlockRoom(ctx context.Context, roomID id.RoomID, req ReqBlock return err } -// Get block status of a Room +// RoomsBlockResponse represents the response containing wether a room is blocked or not +type RoomsBlockResponse struct { + Block bool `json:"block"` + UserID id.UserID `json:"user_id"` +} + +// GetRoomBlockStatus gets whether a room is currently blocked. // // https://matrix-org.github.io/synapse/latest/admin_api/rooms.html#get-block-status -func (cli *Client) GetBlockRoom(ctx context.Context, roomID id.RoomID) (RoomsBlockResponse, error) { +func (cli *Client) GetRoomBlockStatus(ctx context.Context, roomID id.RoomID) (RoomsBlockResponse, error) { var resp RoomsBlockResponse reqURL := cli.BuildAdminURL("v1", "rooms", roomID, "block") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ diff --git a/synapseadmin/userapi.go b/synapseadmin/userapi.go index 5e01ff51..31d0a6dc 100644 --- a/synapseadmin/userapi.go +++ b/synapseadmin/userapi.go @@ -109,13 +109,11 @@ func (cli *Client) GetUserInfo(ctx context.Context, userID id.UserID) (resp *Res return } -// ReqDeleteUser is the request content to deactivate account. type ReqDeleteUser struct { - // true if message hidden for new users in room after actual user is deactivated Erase bool `json:"erase"` } -// DeactivateAccount deactivate a specific user account. +// DeactivateAccount deactivates a specific local user account. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#deactivate-account func (cli *Client) DeactivateAccount(ctx context.Context, userID id.UserID, req ReqDeleteUser) error { @@ -128,18 +126,23 @@ func (cli *Client) DeactivateAccount(ctx context.Context, userID id.UserID, req return err } -// ReqUpdateUser is the request content to reactivate an account -type ReqActivateUser struct { - // new password for user - Password string `json:"password"` - // false if we want to re-activate the user - Deactivated bool `json:"deactivated"` +type ReqCreateOrModifyAccount struct { + Password string `json:"password,omitempty"` + LogoutDevices *bool `json:"logout_devices,omitempty"` + + Deactivated *bool `json:"deactivated,omitempty"` + Admin *bool `json:"admin,omitempty"` + Locked *bool `json:"locked,omitempty"` + + Displayname string `json:"displayname,omitempty"` + AvatarURL id.ContentURIString `json:"avatar_url,omitempty"` + UserType string `json:"user_type,omitempty"` } -// ActivateAccount re-activate a specific user account that has been deactivated. +// CreateOrModifyAccount creates or modifies an account on the server. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#create-or-modify-account -func (cli *Client) ActivateAccount(ctx context.Context, userID id.UserID, req ReqActivateUser) error { +func (cli *Client) CreateOrModifyAccount(ctx context.Context, userID id.UserID, req ReqCreateOrModifyAccount) error { reqURL := cli.BuildAdminURL("v2", "users", userID) _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPut, @@ -149,18 +152,17 @@ func (cli *Client) ActivateAccount(ctx context.Context, userID id.UserID, req Re return err } -// ReqOverrideRatelimit is the request content to OverrideRatelimit an account -type ReqOverrideRatelimit struct { - // ratelimite message per second +type RatelimitOverride struct { MessagesPerSecond int `json:"messages_per_second"` - // How many actions that can be performed before being limited - BurstCount int `json:"burst_count"` + BurstCount int `json:"burst_count"` } -// Override RateLimits for a specific user. +type ReqSetRatelimit = RatelimitOverride + +// SetUserRatelimit overrides the message sending ratelimit for a specific user. // // https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#set-ratelimit -func (cli *Client) OverrideRatelimit(ctx context.Context, userID id.UserID, req ReqOverrideRatelimit) error { +func (cli *Client) SetUserRatelimit(ctx context.Context, userID id.UserID, req ReqSetRatelimit) error { reqURL := cli.BuildAdminURL("v1", "users", userID, "override_ratelimit") _, err := cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodPost, @@ -170,17 +172,12 @@ func (cli *Client) OverrideRatelimit(ctx context.Context, userID id.UserID, req return err } -type RespRateLimit struct { - // ratelimite message per second - MessagePerSecond int `json:"messages_per_second"` - // How many actions that can be performed before being limited - BurstCount int `json:"burst_count"` -} +type RespUserRatelimit = RatelimitOverride -// GetUserRateLimit gets RateLimit from a specific user. +// GetUserRatelimit gets the ratelimit override for the given user. // -// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account -func (cli *Client) GetUserRateLimit(ctx context.Context, userID id.UserID) (resp *RespRateLimit, err error) { +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#get-status-of-ratelimit +func (cli *Client) GetUserRatelimit(ctx context.Context, userID id.UserID) (resp RespUserRatelimit, err error) { _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodGet, URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"), @@ -189,10 +186,10 @@ func (cli *Client) GetUserRateLimit(ctx context.Context, userID id.UserID) (resp return } -// DeleteUserRateLimit delete RateLimit from a specific user. +// DeleteUserRatelimit deletes the ratelimit override for the given user, returning them to the default ratelimits. // -// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#query-user-account -func (cli *Client) DeleteUserRateLimit(ctx context.Context, userID id.UserID) (err error) { +// https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#delete-ratelimit +func (cli *Client) DeleteUserRatelimit(ctx context.Context, userID id.UserID) (err error) { _, err = cli.MakeFullRequest(ctx, mautrix.FullRequest{ Method: http.MethodDelete, URL: cli.BuildAdminURL("v1", "users", userID, "override_ratelimit"),