73 lines
1.8 KiB
JavaScript
73 lines
1.8 KiB
JavaScript
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);
|
|
});
|