matrix-search

A small nodejs script which indexes a whole matrix account into meilisearch and has a pdf rendering UI
git clone git://archive.git.mtrnord.blog/MTRNord/matrix-search.git
Log | Files | Refs | README | LICENSE

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 }