const { MxBridge } = require("./mxbridge"); const { store } = require("./store"); const { XSSBook } = require("./xssbook.js"); // create the matrix bridge const mxbridge = new MxBridge( "data/xss-registration.yaml", "xss-config-schema.yaml", {}, { localpart: "xssbook", regex: [ { type: "users", regex: "@xss_.*", exclusive: true }, { type: "aliases", regex: "#xss_.*", exclusive: true }, ] }, config => ({ homeserver: config.matrix?.homeserver, homeserver_url: config.matrix?.homeserver_url, }) ); // persist uploaded avatar urls const avatarStore = store("data/avatars.json"); mxbridge.avatars = avatarStore.store; // save on change mxbridge.on("avatarupload", () => { avatarStore.save().catch(err => { console.error("Error writing avatar store", err); }); }); mxbridge.on("config", config => { const xss = new XSSBook({ ...config.xssbook, }); // store associations for messages sent by the bridge so it can mirror edits and deletes const matrixToXss = {}; const xssToMatrix = {}; // xssbook -> matrix xss.on("post", async (post, user) => { if(post.post_id in xssToMatrix) { return; } xssToMatrix[post.post_id] = await mxbridge.sendMessage( xss.room, { localpart: "xss_" + post.user_id, username: user.firstname + " " + user.lastname, avatar: xss.url + "/image/avatar?user_id=" + post.user_id, }, post.content, post.content, ); }); // matrix -> xssbook mxbridge.on("message", async (content, evt, bridge) => { if(evt.room_id !== xss.room) { return; } matrixToXss[evt.event_id] = await xss.post(evt.sender, content.formatted_body || content.body); xssToMatrix[matrixToXss[evt.event_id]] = evt.event_id; }); }); process.on("unhandledRejection", reason => { console.log("Unhandled rejection:", reason); });