diff --git a/continuwuityadmin/client.go b/continuwuityadmin/client.go new file mode 100644 index 000000000..d2de003eb --- /dev/null +++ b/continuwuityadmin/client.go @@ -0,0 +1,14 @@ +package continuwuityadmin + +import ( + "maunium.net/go/mautrix" +) + +// Client is a wrapper for the mautrix.Client struct that includes methods for accessing the Continuwuity admin API. +type Client struct { + Client *mautrix.Client +} + +func (cli *Client) BuildAdminURL(path ...any) string { + return cli.Client.BuildURL(mautrix.ContinuwuityAdminURLPath(path)) +} diff --git a/continuwuityadmin/rooms.go b/continuwuityadmin/rooms.go new file mode 100644 index 000000000..2b91b9016 --- /dev/null +++ b/continuwuityadmin/rooms.go @@ -0,0 +1,62 @@ +package continuwuityadmin + +import ( + "context" + "net/http" + + "maunium.net/go/mautrix" + "maunium.net/go/mautrix/id" +) + +// RespGetRooms represents the response for `GET /_continuwuity/admin/rooms/list`. +type RespGetRooms struct { + Rooms []id.RoomID `json:"rooms"` +} + +// ReqBanRoom represents the request body for `PUT /_continuwuity/admin/rooms/{room_id}/ban`. +type ReqBanRoom struct { + RoomID id.RoomID `json:"room_id"` + Banned bool `json:"banned"` +} + +// RespBanRoom represents the response for `PUT /_continuwuity/admin/rooms/{room_id}/ban`. +type RespBanRoom struct { + KickedUsers []id.UserID `json:"kicked_users"` + FailedKickedUsers []id.UserID `json:"failed_kicked_users"` + LocalAliases []id.RoomAlias `json:"local_aliases"` +} + +// ListRooms retrieves a list of all room IDs known to the server (excluding banned rooms). +func (cli *Client) ListRooms(ctx context.Context) (resp *RespGetRooms, err error) { + reqURL := cli.Client.BuildURL(mautrix.ContinuwuityAdminURLPath{"rooms", "list"}) + _, err = cli.Client.MakeRequest(ctx, http.MethodGet, reqURL, nil, &resp) + return resp, err +} + +// BanRoom bans a room. +// +// This will first remove all local users, and then remove all local aliases, +// returning a list of users that were removed, failed to be removed, and aliases +// that were removed. +// +// This operation may take a long time. +func (cli *Client) BanRoom(ctx context.Context, roomID id.RoomID) (resp *RespBanRoom, err error) { + body := ReqBanRoom{ + RoomID: roomID, + Banned: true, + } + reqURL := cli.Client.BuildURL(mautrix.ContinuwuityAdminURLPath{"rooms", roomID, "ban"}) + _, err = cli.Client.MakeRequest(ctx, http.MethodPut, reqURL, &body, &resp) + return resp, err +} + +// UnbanRoom unbans a room. +func (cli *Client) UnbanRoom(ctx context.Context, roomID id.RoomID) (resp *RespBanRoom, err error) { + body := ReqBanRoom{ + RoomID: roomID, + Banned: false, + } + reqURL := cli.Client.BuildURL(mautrix.ContinuwuityAdminURLPath{"rooms", roomID, "ban"}) + _, err = cli.Client.MakeRequest(ctx, http.MethodPut, reqURL, &body, &resp) + return resp, err +} diff --git a/url.go b/url.go index 91b3d49d6..2c6ddd275 100644 --- a/url.go +++ b/url.go @@ -94,6 +94,12 @@ func (saup SynapseAdminURLPath) FullPath() []any { return append([]any{"_synapse", "admin"}, []any(saup)...) } +type ContinuwuityAdminURLPath []any + +func (caup ContinuwuityAdminURLPath) FullPath() []any { + return append([]any{"_continuwuity", "admin"}, []any(caup)...) +} + // BuildURLWithQuery builds a URL with query parameters in addition to the Client's homeserver // and appservice user ID set already. func (cli *Client) BuildURLWithQuery(urlPath PrefixableURLPath, urlQuery map[string]string) string {