mautrix-go/responses.go

622 lines
20 KiB
Go
Raw Permalink Normal View History

2018-10-02 04:31:42 -07:00
package mautrix
import (
2022-08-04 04:59:22 -07:00
"bytes"
"encoding/json"
2023-08-11 04:20:40 -07:00
"fmt"
2022-08-04 04:59:22 -07:00
"reflect"
"strconv"
"strings"
"github.com/tidwall/gjson"
2023-08-11 04:20:40 -07:00
"github.com/tidwall/sjson"
2023-08-05 09:24:45 -07:00
"go.mau.fi/util/jsontime"
2022-08-04 04:59:22 -07:00
2020-04-16 07:29:47 -07:00
"maunium.net/go/mautrix/event"
2020-04-16 06:51:32 -07:00
"maunium.net/go/mautrix/id"
)
2022-04-17 02:59:34 -07:00
// RespWhoami is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3accountwhoami
type RespWhoami struct {
2022-04-17 02:59:34 -07:00
UserID id.UserID `json:"user_id"`
DeviceID id.DeviceID `json:"device_id"`
}
2022-04-17 02:59:34 -07:00
// RespCreateFilter is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3useruseridfilter
type RespCreateFilter struct {
FilterID string `json:"filter_id"`
}
2022-04-17 02:59:34 -07:00
// RespJoinRoom is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidjoin
type RespJoinRoom struct {
2020-04-16 09:10:51 -07:00
RoomID id.RoomID `json:"room_id"`
}
2022-04-17 02:59:34 -07:00
// RespLeaveRoom is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidleave
2016-12-01 09:32:16 -08:00
type RespLeaveRoom struct{}
2022-04-17 02:59:34 -07:00
// RespForgetRoom is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidforget
2017-01-05 07:23:37 -08:00
type RespForgetRoom struct{}
2022-04-17 02:59:34 -07:00
// RespInviteUser is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidinvite
2017-01-05 07:23:37 -08:00
type RespInviteUser struct{}
2022-04-17 02:59:34 -07:00
// RespKickUser is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidkick
2017-01-05 07:23:37 -08:00
type RespKickUser struct{}
2022-04-17 02:59:34 -07:00
// RespBanUser is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidban
2017-01-05 07:23:37 -08:00
type RespBanUser struct{}
2022-04-17 02:59:34 -07:00
// RespUnbanUser is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3roomsroomidunban
2017-01-05 07:23:37 -08:00
type RespUnbanUser struct{}
2022-04-17 02:59:34 -07:00
// RespTyping is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#put_matrixclientv3roomsroomidtypinguserid
2017-04-25 02:11:59 -07:00
type RespTyping struct{}
2022-04-17 02:59:34 -07:00
// RespPresence is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3presenceuseridstatus
type RespPresence struct {
Presence event.Presence `json:"presence"`
LastActiveAgo int `json:"last_active_ago"`
StatusMsg string `json:"status_msg"`
CurrentlyActive bool `json:"currently_active"`
}
2022-04-17 02:59:34 -07:00
// RespJoinedRooms is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3joined_rooms
2017-01-06 06:39:25 -08:00
type RespJoinedRooms struct {
2020-04-16 06:51:32 -07:00
JoinedRooms []id.RoomID `json:"joined_rooms"`
2017-01-06 06:39:25 -08:00
}
2022-04-17 02:59:34 -07:00
// RespJoinedMembers is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3roomsroomidjoined_members
2017-01-06 06:39:25 -08:00
type RespJoinedMembers struct {
Joined map[id.UserID]JoinedMember `json:"joined"`
}
type JoinedMember struct {
2022-08-04 08:47:09 -07:00
DisplayName string `json:"display_name,omitempty"`
AvatarURL string `json:"avatar_url,omitempty"`
2017-01-06 06:39:25 -08:00
}
2022-04-17 02:59:34 -07:00
// RespMessages is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3roomsroomidmessages
2017-05-06 21:21:07 -07:00
type RespMessages struct {
2020-04-16 07:29:47 -07:00
Start string `json:"start"`
Chunk []*event.Event `json:"chunk"`
State []*event.Event `json:"state"`
End string `json:"end,omitempty"`
2017-05-06 21:21:07 -07:00
}
2022-04-17 02:59:34 -07:00
// RespContext is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3roomsroomidcontexteventid
2022-01-01 09:08:27 -08:00
type RespContext struct {
End string `json:"end"`
Event *event.Event `json:"event"`
EventsAfter []*event.Event `json:"events_after"`
EventsBefore []*event.Event `json:"events_before"`
Start string `json:"start"`
State []*event.Event `json:"state"`
}
2022-04-17 02:59:34 -07:00
// RespSendEvent is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#put_matrixclientv3roomsroomidsendeventtypetxnid
type RespSendEvent struct {
2020-04-16 06:51:32 -07:00
EventID id.EventID `json:"event_id"`
}
2022-10-03 00:04:10 -07:00
// RespMediaConfig is the JSON response for https://spec.matrix.org/v1.4/client-server-api/#get_matrixmediav3config
type RespMediaConfig struct {
UploadSize int64 `json:"m.upload.size,omitempty"`
}
2022-04-17 02:59:34 -07:00
// RespMediaUpload is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixmediav3upload
2016-12-01 04:19:25 -08:00
type RespMediaUpload struct {
2020-04-16 06:51:32 -07:00
ContentURI id.ContentURI `json:"content_uri"`
2016-12-01 04:19:25 -08:00
}
2023-06-10 06:25:31 -07:00
// RespCreateMXC is the JSON response for https://spec.matrix.org/v1.7/client-server-api/#post_matrixmediav1create
type RespCreateMXC struct {
ContentURI id.ContentURI `json:"content_uri"`
UnusedExpiresAt int `json:"unused_expires_at,omitempty"`
2023-06-10 06:25:31 -07:00
UnstableUploadURL string `json:"com.beeper.msc3870.upload_url,omitempty"`
}
2022-02-15 06:27:12 -08:00
// RespPreviewURL is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixmediav3preview_url
2024-02-17 04:45:20 -08:00
type RespPreviewURL = event.LinkPreview
2022-02-15 06:27:12 -08:00
2022-04-17 02:59:34 -07:00
// RespUserInteractive is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#user-interactive-authentication-api
2016-12-02 08:51:20 -08:00
type RespUserInteractive struct {
2022-08-04 06:16:58 -07:00
Flows []UIAFlow `json:"flows,omitempty"`
2022-08-04 06:15:27 -07:00
Params map[AuthType]interface{} `json:"params,omitempty"`
Session string `json:"session,omitempty"`
Completed []string `json:"completed,omitempty"`
2020-08-06 09:02:25 -07:00
2022-08-04 06:15:27 -07:00
ErrCode string `json:"errcode,omitempty"`
Error string `json:"error,omitempty"`
2016-12-02 08:51:20 -08:00
}
2022-08-04 06:16:58 -07:00
type UIAFlow struct {
Stages []AuthType `json:"stages,omitempty"`
}
// HasSingleStageFlow returns true if there exists at least 1 Flow with a single stage of stageName.
2020-08-06 09:02:25 -07:00
func (r RespUserInteractive) HasSingleStageFlow(stageName AuthType) bool {
for _, f := range r.Flows {
if len(f.Stages) == 1 && f.Stages[0] == stageName {
return true
}
}
return false
}
2022-04-17 02:59:34 -07:00
// RespUserDisplayName is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3profileuseriddisplayname
type RespUserDisplayName struct {
DisplayName string `json:"displayname"`
}
type RespUserProfile struct {
DisplayName string `json:"displayname"`
AvatarURL id.ContentURI `json:"avatar_url"`
}
// RespRegisterAvailable is the JSON response for https://spec.matrix.org/v1.4/client-server-api/#get_matrixclientv3registeravailable
type RespRegisterAvailable struct {
Available bool `json:"available"`
}
2022-04-17 02:59:34 -07:00
// RespRegister is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3register
2016-12-02 08:51:20 -08:00
type RespRegister struct {
AccessToken string `json:"access_token,omitempty"`
DeviceID id.DeviceID `json:"device_id,omitempty"`
2022-08-04 08:47:09 -07:00
UserID id.UserID `json:"user_id"`
RefreshToken string `json:"refresh_token,omitempty"`
ExpiresInMS int64 `json:"expires_in_ms,omitempty"`
// Deprecated: homeserver should be parsed from the user ID
HomeServer string `json:"home_server,omitempty"`
2016-12-02 08:51:20 -08:00
}
type LoginFlow struct {
Type AuthType `json:"type"`
}
2022-04-17 02:59:34 -07:00
// RespLoginFlows is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3login
2020-02-18 11:15:14 -08:00
type RespLoginFlows struct {
Flows []LoginFlow `json:"flows"`
2020-02-18 11:15:14 -08:00
}
func (rlf *RespLoginFlows) FirstFlowOfType(flowTypes ...AuthType) *LoginFlow {
2020-10-16 06:51:13 -07:00
for _, flow := range rlf.Flows {
for _, flowType := range flowTypes {
if flow.Type == flowType {
return &flow
}
2020-10-16 06:51:13 -07:00
}
}
return nil
}
func (rlf *RespLoginFlows) HasFlow(flowType ...AuthType) bool {
return rlf.FirstFlowOfType(flowType...) != nil
2020-10-16 06:51:13 -07:00
}
2022-04-17 02:59:34 -07:00
// RespLogin is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3login
2016-12-09 07:03:19 -08:00
type RespLogin struct {
AccessToken string `json:"access_token"`
DeviceID id.DeviceID `json:"device_id"`
UserID id.UserID `json:"user_id"`
2022-08-04 06:15:27 -07:00
WellKnown *ClientWellKnown `json:"well_known,omitempty"`
2016-12-09 07:03:19 -08:00
}
2022-04-17 02:59:34 -07:00
// RespLogout is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3logout
2017-01-05 06:16:47 -08:00
type RespLogout struct{}
2022-04-17 02:59:34 -07:00
// RespCreateRoom is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#post_matrixclientv3createroom
2016-12-09 07:42:32 -08:00
type RespCreateRoom struct {
2020-04-16 06:51:32 -07:00
RoomID id.RoomID `json:"room_id"`
2016-12-09 07:42:32 -08:00
}
type RespMembers struct {
2020-04-16 07:29:47 -07:00
Chunk []*event.Event `json:"chunk"`
}
type LazyLoadSummary struct {
2020-04-16 06:51:32 -07:00
Heroes []id.UserID `json:"m.heroes,omitempty"`
JoinedMemberCount *int `json:"m.joined_member_count,omitempty"`
InvitedMemberCount *int `json:"m.invited_member_count,omitempty"`
}
type SyncEventsList struct {
Events []*event.Event `json:"events,omitempty"`
}
type SyncTimeline struct {
SyncEventsList
Limited bool `json:"limited,omitempty"`
PrevBatch string `json:"prev_batch,omitempty"`
}
2022-04-17 02:59:34 -07:00
// RespSync is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3sync
type RespSync struct {
2020-04-16 06:51:32 -07:00
NextBatch string `json:"next_batch"`
AccountData SyncEventsList `json:"account_data"`
Presence SyncEventsList `json:"presence"`
ToDevice SyncEventsList `json:"to_device"`
2020-04-16 06:51:32 -07:00
DeviceLists DeviceLists `json:"device_lists"`
DeviceOTKCount OTKCount `json:"device_one_time_keys_count"`
FallbackKeys []id.KeyAlgorithm `json:"device_unused_fallback_key_types"`
2020-04-16 06:51:32 -07:00
Rooms RespSyncRooms `json:"rooms"`
}
type RespSyncRooms struct {
2022-10-03 14:23:33 -07:00
Leave map[id.RoomID]*SyncLeftRoom `json:"leave,omitempty"`
Join map[id.RoomID]*SyncJoinedRoom `json:"join,omitempty"`
Invite map[id.RoomID]*SyncInvitedRoom `json:"invite,omitempty"`
Knock map[id.RoomID]*SyncKnockedRoom `json:"knock,omitempty"`
}
type marshalableRespSync RespSync
2022-08-10 04:41:22 -07:00
var syncPathsToDelete = []string{"account_data", "presence", "to_device", "device_lists", "device_one_time_keys_count", "rooms"}
2023-08-11 04:20:40 -07:00
// marshalAndDeleteEmpty marshals a JSON object, then uses gjson to delete empty objects at the given gjson paths.
func marshalAndDeleteEmpty(marshalable interface{}, paths []string) ([]byte, error) {
data, err := json.Marshal(marshalable)
if err != nil {
return nil, err
}
for _, path := range paths {
res := gjson.GetBytes(data, path)
if res.IsObject() && len(res.Raw) == 2 {
data, err = sjson.DeleteBytes(data, path)
if err != nil {
return nil, fmt.Errorf("failed to delete empty %s: %w", path, err)
}
}
}
return data, nil
}
func (rs *RespSync) MarshalJSON() ([]byte, error) {
2023-08-11 04:20:40 -07:00
return marshalAndDeleteEmpty((*marshalableRespSync)(rs), syncPathsToDelete)
}
type DeviceLists struct {
2022-08-10 01:27:15 -07:00
Changed []id.UserID `json:"changed,omitempty"`
Left []id.UserID `json:"left,omitempty"`
}
type OTKCount struct {
2022-08-10 04:41:22 -07:00
Curve25519 int `json:"curve25519,omitempty"`
SignedCurve25519 int `json:"signed_curve25519,omitempty"`
// For appservice OTK counts only: the user ID in question
UserID id.UserID `json:"-"`
DeviceID id.DeviceID `json:"-"`
2020-04-20 16:56:58 -07:00
}
2020-04-19 05:56:45 -07:00
type SyncLeftRoom struct {
Summary LazyLoadSummary `json:"summary"`
State SyncEventsList `json:"state"`
Timeline SyncTimeline `json:"timeline"`
}
type marshalableSyncLeftRoom SyncLeftRoom
var syncLeftRoomPathsToDelete = []string{"summary", "state", "timeline"}
func (slr SyncLeftRoom) MarshalJSON() ([]byte, error) {
2023-08-11 04:20:40 -07:00
return marshalAndDeleteEmpty((marshalableSyncLeftRoom)(slr), syncLeftRoomPathsToDelete)
2020-04-19 05:56:45 -07:00
}
type BeeperInboxPreviewEvent struct {
EventID id.EventID `json:"event_id"`
Timestamp jsontime.UnixMilli `json:"origin_server_ts"`
Event *event.Event `json:"event,omitempty"`
}
2020-04-19 05:56:45 -07:00
type SyncJoinedRoom struct {
Summary LazyLoadSummary `json:"summary"`
State SyncEventsList `json:"state"`
Timeline SyncTimeline `json:"timeline"`
Ephemeral SyncEventsList `json:"ephemeral"`
AccountData SyncEventsList `json:"account_data"`
UnreadNotifications *UnreadNotificationCounts `json:"unread_notifications,omitempty"`
// https://github.com/matrix-org/matrix-spec-proposals/pull/2654
MSC2654UnreadCount *int `json:"org.matrix.msc2654.unread_count,omitempty"`
// Beeper extension
BeeperInboxPreview *BeeperInboxPreviewEvent `json:"com.beeper.inbox.preview,omitempty"`
}
type UnreadNotificationCounts struct {
HighlightCount int `json:"highlight_count"`
NotificationCount int `json:"notification_count"`
}
type marshalableSyncJoinedRoom SyncJoinedRoom
var syncJoinedRoomPathsToDelete = []string{"summary", "state", "timeline", "ephemeral", "account_data"}
func (sjr SyncJoinedRoom) MarshalJSON() ([]byte, error) {
2023-08-11 04:20:40 -07:00
return marshalAndDeleteEmpty((marshalableSyncJoinedRoom)(sjr), syncJoinedRoomPathsToDelete)
2020-04-19 05:56:45 -07:00
}
type SyncInvitedRoom struct {
Summary LazyLoadSummary `json:"summary"`
State SyncEventsList `json:"invite_state"`
}
type marshalableSyncInvitedRoom SyncInvitedRoom
var syncInvitedRoomPathsToDelete = []string{"summary"}
func (sir SyncInvitedRoom) MarshalJSON() ([]byte, error) {
2023-08-11 04:20:40 -07:00
return marshalAndDeleteEmpty((marshalableSyncInvitedRoom)(sir), syncInvitedRoomPathsToDelete)
2020-04-19 05:56:45 -07:00
}
type SyncKnockedRoom struct {
State SyncEventsList `json:"knock_state"`
}
type RespTurnServer struct {
Username string `json:"username"`
Password string `json:"password"`
TTL int `json:"ttl"`
URIs []string `json:"uris"`
}
2019-12-30 10:18:20 -08:00
type RespAliasCreate struct{}
type RespAliasDelete struct{}
type RespAliasResolve struct {
2020-04-16 06:51:32 -07:00
RoomID id.RoomID `json:"room_id"`
Servers []string `json:"servers"`
}
2022-03-31 22:41:49 -07:00
type RespAliasList struct {
Aliases []id.RoomAlias `json:"aliases"`
}
2020-04-16 06:51:32 -07:00
type RespUploadKeys struct {
OneTimeKeyCounts OTKCount `json:"one_time_key_counts"`
2019-12-30 10:18:20 -08:00
}
type RespQueryKeys struct {
2022-08-10 01:27:15 -07:00
Failures map[string]interface{} `json:"failures,omitempty"`
DeviceKeys map[id.UserID]map[id.DeviceID]DeviceKeys `json:"device_keys"`
MasterKeys map[id.UserID]CrossSigningKeys `json:"master_keys"`
SelfSigningKeys map[id.UserID]CrossSigningKeys `json:"self_signing_keys"`
UserSigningKeys map[id.UserID]CrossSigningKeys `json:"user_signing_keys"`
}
type RespClaimKeys struct {
2022-08-10 01:27:15 -07:00
Failures map[string]interface{} `json:"failures,omitempty"`
OneTimeKeys map[id.UserID]map[id.DeviceID]map[id.KeyID]OneTimeKey `json:"one_time_keys"`
}
type RespUploadSignatures struct {
2022-08-10 01:27:15 -07:00
Failures map[string]interface{} `json:"failures,omitempty"`
}
type RespKeyChanges struct {
Changed []id.UserID `json:"changed"`
Left []id.UserID `json:"left"`
}
2020-04-27 14:57:04 -07:00
type RespSendToDevice struct{}
2022-04-17 02:59:34 -07:00
// RespDevicesInfo is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3devices
type RespDevicesInfo struct {
Devices []RespDeviceInfo `json:"devices"`
}
2022-04-17 02:59:34 -07:00
// RespDeviceInfo is the JSON response for https://spec.matrix.org/v1.2/client-server-api/#get_matrixclientv3devicesdeviceid
type RespDeviceInfo struct {
DeviceID id.DeviceID `json:"device_id"`
DisplayName string `json:"display_name"`
LastSeenIP string `json:"last_seen_ip"`
LastSeenTS int64 `json:"last_seen_ts"`
}
2021-10-26 07:00:30 -07:00
// Deprecated: MSC2716 was abandoned
2021-10-26 07:00:30 -07:00
type RespBatchSend struct {
StateEventIDs []id.EventID `json:"state_event_ids"`
EventIDs []id.EventID `json:"event_ids"`
InsertionEventID id.EventID `json:"insertion_event_id"`
BatchEventID id.EventID `json:"batch_event_id"`
BaseInsertionEventID id.EventID `json:"base_insertion_event_id"`
NextBatchID id.BatchID `json:"next_batch_id"`
}
2022-08-04 04:59:22 -07:00
type RespBeeperBatchSend struct {
EventIDs []id.EventID `json:"event_ids"`
}
2022-08-04 04:59:22 -07:00
// RespCapabilities is the JSON response for https://spec.matrix.org/v1.3/client-server-api/#get_matrixclientv3capabilities
type RespCapabilities struct {
RoomVersions *CapRoomVersions `json:"m.room_versions,omitempty"`
ChangePassword *CapBooleanTrue `json:"m.change_password,omitempty"`
SetDisplayname *CapBooleanTrue `json:"m.set_displayname,omitempty"`
SetAvatarURL *CapBooleanTrue `json:"m.set_avatar_url,omitempty"`
ThreePIDChanges *CapBooleanTrue `json:"m.3pid_changes,omitempty"`
Custom map[string]interface{} `json:"-"`
}
type serializableRespCapabilities RespCapabilities
func (rc *RespCapabilities) UnmarshalJSON(data []byte) error {
res := gjson.GetBytes(data, "capabilities")
if !res.Exists() || !res.IsObject() {
return nil
}
if res.Index > 0 {
data = data[res.Index : res.Index+len(res.Raw)]
} else {
data = []byte(res.Raw)
}
err := json.Unmarshal(data, (*serializableRespCapabilities)(rc))
if err != nil {
return err
}
err = json.Unmarshal(data, &rc.Custom)
if err != nil {
return err
}
// Remove non-custom capabilities from the custom map so that they don't get overridden when serializing back
for _, field := range reflect.VisibleFields(reflect.TypeOf(rc).Elem()) {
jsonTag := strings.Split(field.Tag.Get("json"), ",")[0]
if jsonTag != "-" && jsonTag != "" {
delete(rc.Custom, jsonTag)
}
}
return nil
}
func (rc *RespCapabilities) MarshalJSON() ([]byte, error) {
2022-08-04 05:03:04 -07:00
marshalableCopy := make(map[string]interface{}, len(rc.Custom))
2022-08-04 04:59:22 -07:00
val := reflect.ValueOf(rc).Elem()
for _, field := range reflect.VisibleFields(val.Type()) {
jsonTag := strings.Split(field.Tag.Get("json"), ",")[0]
if jsonTag != "-" && jsonTag != "" {
fieldVal := val.FieldByIndex(field.Index)
if !fieldVal.IsNil() {
2022-08-04 05:03:04 -07:00
marshalableCopy[jsonTag] = fieldVal.Interface()
2022-08-04 04:59:22 -07:00
}
}
}
2022-08-04 05:03:04 -07:00
if rc.Custom != nil {
for key, value := range rc.Custom {
marshalableCopy[key] = value
}
2022-08-04 04:59:22 -07:00
}
var buf bytes.Buffer
buf.WriteString(`{"capabilities":`)
err := json.NewEncoder(&buf).Encode(marshalableCopy)
if err != nil {
return nil, err
}
buf.WriteByte('}')
return buf.Bytes(), nil
}
type CapBoolean struct {
Enabled bool `json:"enabled"`
}
type CapBooleanTrue CapBoolean
// IsEnabled returns true if the capability is either enabled explicitly or not specified (nil)
func (cb *CapBooleanTrue) IsEnabled() bool {
// Default to true when
return cb == nil || cb.Enabled
}
type CapBooleanFalse CapBoolean
// IsEnabled returns true if the capability is enabled explicitly. If it's not specified, this returns false.
func (cb *CapBooleanFalse) IsEnabled() bool {
return cb != nil && cb.Enabled
}
type CapRoomVersionStability string
const (
CapRoomVersionStable CapRoomVersionStability = "stable"
CapRoomVersionUnstable CapRoomVersionStability = "unstable"
)
type CapRoomVersions struct {
Default string `json:"default"`
Available map[string]CapRoomVersionStability `json:"available"`
}
func (vers *CapRoomVersions) IsStable(version string) bool {
if vers == nil || vers.Available == nil {
val, err := strconv.Atoi(version)
return err == nil && val > 0
}
return vers.Available[version] == CapRoomVersionStable
}
func (vers *CapRoomVersions) IsAvailable(version string) bool {
if vers == nil || vers.Available == nil {
return false
}
_, available := vers.Available[version]
return available
}
// RespHierarchy is the JSON response for https://spec.matrix.org/v1.4/client-server-api/#get_matrixclientv1roomsroomidhierarchy
type RespHierarchy struct {
2022-11-05 10:42:13 -07:00
NextBatch string `json:"next_batch,omitempty"`
Rooms []ChildRoomsChunk `json:"rooms"`
}
type ChildRoomsChunk struct {
2022-11-05 10:42:13 -07:00
AvatarURL id.ContentURI `json:"avatar_url,omitempty"`
CanonicalAlias id.RoomAlias `json:"canonical_alias,omitempty"`
ChildrenState []StrippedStateWithTime `json:"children_state"`
GuestCanJoin bool `json:"guest_can_join"`
JoinRule event.JoinRule `json:"join_rule,omitempty"`
Name string `json:"name,omitempty"`
NumJoinedMembers int `json:"num_joined_members"`
RoomID id.RoomID `json:"room_id"`
RoomType event.RoomType `json:"room_type"`
Topic string `json:"topic,omitempty"`
WorldReadble bool `json:"world_readable"`
}
type StrippedStateWithTime struct {
event.StrippedState
Timestamp jsontime.UnixMilli `json:"origin_server_ts"`
}
2023-03-11 06:24:18 -08:00
type RespAppservicePing struct {
2023-05-01 00:54:54 -07:00
DurationMS int64 `json:"duration_ms"`
2023-03-11 06:24:18 -08:00
}
type RespBeeperMergeRoom RespCreateRoom
type RespBeeperSplitRoom struct {
RoomIDs map[string]id.RoomID `json:"room_ids"`
}
type RespTimestampToEvent struct {
EventID id.EventID `json:"event_id"`
Timestamp jsontime.UnixMilli `json:"origin_server_ts"`
}
type RespRoomKeysVersionCreate struct {
Version id.KeyBackupVersion `json:"version"`
}
type RespRoomKeysVersion[A any] struct {
Algorithm id.KeyBackupAlgorithm `json:"algorithm"`
AuthData A `json:"auth_data"`
Count int `json:"count"`
ETag string `json:"etag"`
Version id.KeyBackupVersion `json:"version"`
}
type RespRoomKeys[S any] struct {
Rooms map[id.RoomID]RespRoomKeyBackup[S] `json:"rooms"`
}
type RespRoomKeyBackup[S any] struct {
Sessions map[id.SessionID]RespKeyBackupData[S] `json:"sessions"`
}
type RespKeyBackupData[S any] struct {
FirstMessageIndex int `json:"first_message_index"`
ForwardedCount int `json:"forwarded_count"`
IsVerified bool `json:"is_verified"`
SessionData S `json:"session_data"`
}
type RespRoomKeysUpdate struct {
Count int `json:"count"`
ETag string `json:"etag"`
}