Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions continuwuityadmin/client.go
Original file line number Diff line number Diff line change
@@ -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))
}
62 changes: 62 additions & 0 deletions continuwuityadmin/rooms.go
Original file line number Diff line number Diff line change
@@ -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
}
6 changes: 6 additions & 0 deletions url.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down