summaryrefslogtreecommitdiff
path: root/matrix.js
blob: a2fb4c522a836a9f11195db529ac1bfd6bca3bc7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
function startMatrix() {
    try {
        const sdk = require("matrix-js-sdk");
        const showdown = require('showdown');

        global.matrixSend = async (room, message, data) => {
            await client.sendEvent(room, "m.room.message", {
                msgtype: "m.text",
                body: data ?? message,
                format: "org.matrix.custom.html",
                formatted_body: markdown(message),
            });
        }

        global.markdown = (text) => {
            let converter = new showdown.Converter();
            return converter.makeHtml(text);
        }

        const client = sdk.createClient({
            baseUrl: "https://chat.equestria.dev",
            userId: require('./credentials.json').username,
            accessToken: require('./credentials.json').token
        });

        (async () => {
            await client.startClient({ initialSyncLimit: 0 });

            client.once("sync", async function (state, prevState, res) {
                if (state === "PREPARED") {
                    console.log("Ready!");

                    client.setPresence({
                        presence: "online"
                    });
                } else {
                    console.log(state);
                    process.exit(1);
                }
            });

            client.on("Room.timeline", function (event, room) {
                if (event.getType() !== "m.room.message") {
                    return;
                }

                if (new Date().getTime() - event.event.origin_server_ts < 1000 && event.sender.userId !== require('./credentials.json').username) {
                    let message = event.event.content.body;

                    if (event.event.content.formatted_body && event.event.content.formatted_body.startsWith("<mx-reply>")) {
                        message = event.event.content.formatted_body.split("</mx-reply>")[1];
                    }

                    if (message.startsWith(".") && !message.startsWith("..") && message.trim() !== "." && message.trim() !== ".c." && !message.trim().startsWith(".c.") && !message.trim().startsWith(".❤️")) {
                        let command;

                        try {
                            command = message.replaceAll(/ +/g, " ");
                            if (command.startsWith(". ")) command = "." + command.substring(2);
                            command = command.split(" ")[0].substring(1).replaceAll("/", "-");
                            let parameter = message.split(" ").splice(1).join(" ");

                            require('./handler')({
                                command,
                                parameter,
                                source: "matrix",
                                event,
                                room,
                                client
                            });
                        } catch (e) {
                            matrixSend(room.roomId, "❓ Hmm, something isn't quite right! I was trying to process your message and something wrong happened. I think you need to report this so it can be fixed!\n\n<details><summary>Show stack trace</summary>\n\n```plaintext\n" + e.stack + "\n```\n\n</details>");
                        }
                    } else if (message.includes(require('./credentials.json').username) || (event.event.content.formatted_body && event.event.content.formatted_body.includes(require('./credentials.json').username))) {
                        matrixSend(room.roomId, "👋 Hello! I think you forgot my prefix is `.`, use `.help` to get help.");
                    }
                }
            });

            client.on("RoomMember.membership", function (event, member) {
                if (member.membership === "invite" && member.userId === require('./credentials.json').username) {
                    client.joinRoom(member.roomId).then(function () {
                        console.log("Auto-joined %s", member.roomId);
                    });
                }
            });
        })();
    } catch (e) {
        setTimeout(() => {
            startMatrix();
        }, 300000);
    }
}

startMatrix();