matrix.ts (4317B)
1 // 2 // Events 3 // 4 5 interface PowerLevelsEventContent { 6 /** 7 * The power level required to ban. Default 50. 8 */ 9 ban?: number; 10 /** 11 * A map of event types to the power level required to send them. 12 */ 13 events?: { 14 [eventType: string]: number; 15 }; 16 /** 17 * The power level required to send events in the room. Default 50. 18 */ 19 events_default?: number; 20 /** 21 * The power level required to invite users to the room. Default 50. 22 */ 23 invite?: number; 24 /** 25 * The power level required to kick users from the room. Default 50. 26 */ 27 kick?: number; 28 /** 29 * The power level required to redact other people's events in the room. Default 50. 30 */ 31 redact?: number; 32 /** 33 * The power level required to send state events in the room. Default 50. 34 */ 35 state_default?: number; 36 /** 37 * A map of user IDs to power levels. 38 */ 39 users?: { 40 [userId: string]: number; 41 }; 42 /** 43 * The power level of users not listed in `users`. Default 0. 44 */ 45 users_default?: number; 46 /** 47 * Power levels required to send certain kinds of notifications. 48 */ 49 notifications?: { 50 /** 51 * The power level required to send "@room" notifications. Default 50. 52 */ 53 room?: number; 54 }; 55 } 56 57 interface IEvent<T extends string, C> { 58 type: T; 59 event_id: string; 60 content: C; 61 } 62 63 export interface IStateEvent<T extends string, C> extends IEvent<T, C> { 64 state_key: string; 65 } 66 67 export type Received<E extends Event> = E & { 68 content: E["content"] | Record<string, never> /* redacted */; 69 origin_server_ts: number; 70 room_id: string; 71 sender: string; 72 }; 73 74 export type MessageEvent<T = unknown> = ( 75 | IEvent< 76 "m.reaction", 77 { "m.relates_to": { rel_type: "m.annotation"; event_id: string; key: string } } 78 > 79 | IEvent< 80 "m.room.message", 81 { 82 body: string; 83 msgtype: "m.notice" | "m.text"; 84 "m.relates_to"?: { rel_type: "m.replace"; event_id: string }; 85 } & (Record<string, never> | { format: "org.matrix.custom.html"; formatted_body: string }) 86 > 87 | (IEvent<"m.room.redaction", { reason?: string }> & { redacts: string }) 88 ) & { type: T }; 89 90 type WidgetContent = { 91 creatorUserId: string; 92 name: string; 93 avatar_url?: string; 94 } & ( 95 | { type: "customwidget"; url: string } 96 | { 97 type: "jitsi"; 98 url: string; 99 data: { domain: string; conferenceId: string; roomName: string }; 100 } 101 ); 102 103 export type StateEvent<T = unknown> = ( 104 | IStateEvent<"im.vector.modular.widgets", Record<string, never> | WidgetContent> 105 | IStateEvent< 106 "io.element.widgets.layout", 107 { 108 widgets: Record< 109 string, 110 { index: number; container: "top"; height: number; width: number } 111 >; 112 } 113 > 114 | IStateEvent<"m.room.avatar", { url: string }> 115 | IStateEvent<"m.room.canonical_alias", { alias: string; alt_aliases?: string[] }> 116 | IStateEvent<"m.room.guest_access", { guest_access: "can_join" | "forbidden" }> 117 | IStateEvent< 118 "m.room.history_visibility", 119 { history_visibility: "invited" | "joined" | "shared" | "world_readable" } 120 > 121 | IStateEvent< 122 "m.room.join_rules", 123 | { join_rule: "invite" | "knock" | "private" | "public" } 124 | { 125 join_rule: "knock_restricted" | "restricted"; 126 allow: { type: "m.room_membership"; room_id: string }[]; 127 } 128 > 129 | IStateEvent< 130 "m.room.member", 131 { membership: "ban" | "invite" | "join" | "knock" | "leave" } 132 > 133 | IStateEvent<"m.room.name", { name: string }> 134 | IStateEvent<"m.room.power_levels", PowerLevelsEventContent> 135 | IStateEvent<"m.room.topic", { topic: string }> 136 ) & { type: T }; 137 138 export type Event = MessageEvent | StateEvent; 139 140 // 141 // Client API 142 // 143 144 export interface GetRoomMessagesRequest { 145 dir: "b" | "f"; 146 filter?: string; // RoomEventFilter 147 from?: string; 148 } 149 150 export interface GetRoomMessagesResponse { 151 chunk: Received<Event>[]; 152 end?: string; 153 } 154 155 export interface RoomEventFilter { 156 not_senders?: string[]; 157 not_types?: string[]; 158 senders?: string[]; 159 types?: string[]; 160 }