diff options
author | RaindropsSys <contact@minteck.org> | 2023-05-06 12:44:50 +0200 |
---|---|---|
committer | RaindropsSys <contact@minteck.org> | 2023-05-06 12:44:50 +0200 |
commit | 2e5b62c056e5aafcb6460b1c6e5b7dba6e8e0582 (patch) | |
tree | da0e364ce1c51fdb7f619337159fa3593dfcc5db /matrix.js | |
download | butterscotch-2e5b62c056e5aafcb6460b1c6e5b7dba6e8e0582.tar.gz butterscotch-2e5b62c056e5aafcb6460b1c6e5b7dba6e8e0582.tar.bz2 butterscotch-2e5b62c056e5aafcb6460b1c6e5b7dba6e8e0582.zip |
Initial commit
Diffstat (limited to 'matrix.js')
-rw-r--r-- | matrix.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/matrix.js b/matrix.js new file mode 100644 index 0000000..d024641 --- /dev/null +++ b/matrix.js @@ -0,0 +1,94 @@ +const sdk = require("matrix-js-sdk"); +const showdown = require('showdown'); + +global.matrixSend = (room, message, data) => { + return new Promise((res, rej) => { + client.sendEvent(room, "m.room.message", { + msgtype: "m.text", + body: data ?? message, + format: "org.matrix.custom.html", + formatted_body: markdown(message), + }, "", (err, response) => { + if (err) rej(err); + res(response); + }); + }) +} + +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() !== ".") { + 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."); + } else { + if (!lastMessages[room.roomId]) lastMessages[room.roomId] = []; + lastMessages[room.roomId].unshift(event.event.content.body); + lastMessages[room.roomId] = lastMessages[room.roomId].splice(0, 5); + } + } + }); + + 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); + }); + } + }); +})();
\ No newline at end of file |