matrixssbook/index.js

73 lines
1.8 KiB
JavaScript
Raw Permalink Normal View History

2023-05-25 02:04:06 +00:00
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);
});