diff --git a/d2m/event-dispatcher.js b/d2m/event-dispatcher.js
index 6c872fb..3544064 100644
--- a/d2m/event-dispatcher.js
+++ b/d2m/event-dispatcher.js
@@ -26,9 +26,11 @@ const updatePins = sync.require("./actions/update-pins")
/** @type {import("../matrix/api")}) */
const api = sync.require("../matrix/api")
/** @type {import("../discord/utils")} */
-const utils = sync.require("../discord/utils")
+const dUtils = sync.require("../discord/utils")
/** @type {import("../discord/discord-command-handler")}) */
const discordCommandHandler = sync.require("../discord/discord-command-handler")
+/** @type {import("../m2d/converters/utils")} */
+const mxUtils = require("../m2d/converters/utils")
/** @type {any} */ // @ts-ignore bad types from semaphore
const Semaphore = require("@chriscdn/promise-semaphore")
@@ -68,20 +70,17 @@ module.exports = {
stackLines = stackLines.slice(0, cloudstormLine - 2)
}
}
- let formattedBody = "\u26a0 Bridged event from Discord not delivered"
- + `
Gateway event: ${gatewayMessage.t}`
- + `
${e.toString()}`
+
+ const builder = new mxUtils.MatrixStringBuilder()
+ builder.addLine("\u26a0 Bridged event from Discord not delivered", "\u26a0 Bridged event from Discord not delivered")
+ builder.addLine(`Gateway event: ${gatewayMessage.t}`)
+ builder.addLine(e.toString())
if (stackLines) {
- formattedBody += `
Error trace
`
- + `${stackLines.join("\n")}
`
+ builder.addLine(`Error trace:\n${stackLines.join("\n")}`, `Error trace
${stackLines.join("\n")}
`)
}
- formattedBody += `Original payload
`
- + `${util.inspect(gatewayMessage.d, false, 4, false)}
`,
+ builder.addLine("", `Original payload
${util.inspect(gatewayMessage.d, false, 4, false)}
`)
api.sendEvent(roomID, "m.room.message", {
- msgtype: "m.text",
- body: "\u26a0 Bridged event from Discord not delivered. See formatted content for full details.",
- format: "org.matrix.custom.html",
- formatted_body: formattedBody,
+ ...builder.get(),
"moe.cadence.ooye.error": {
source: "discord",
payload: gatewayMessage
@@ -113,7 +112,7 @@ module.exports = {
const member = guild.members.find(m => m.user?.id === client.user.id)
if (!member) return
if (!("permission_overwrites" in channel)) continue
- const permissions = utils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites)
+ const permissions = dUtils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites)
const wants = BigInt(1 << 10) | BigInt(1 << 16) // VIEW_CHANNEL + READ_MESSAGE_HISTORY
if ((permissions & wants) !== wants) continue // We don't have permission to look back in this channel
@@ -162,7 +161,7 @@ module.exports = {
const lastPin = updatePins.convertTimestamp(channel.last_pin_timestamp)
// Permissions check
- const permissions = utils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites)
+ const permissions = dUtils.getPermissions(member.roles, guild.roles, client.user.id, channel.permission_overwrites)
const wants = BigInt(1 << 10) | BigInt(1 << 16) // VIEW_CHANNEL + READ_MESSAGE_HISTORY
if ((permissions & wants) !== wants) continue // We don't have permission to look up the pins in this channel
diff --git a/m2d/converters/utils.js b/m2d/converters/utils.js
index b820864..8a83a07 100644
--- a/m2d/converters/utils.js
+++ b/m2d/converters/utils.js
@@ -72,7 +72,7 @@ class MatrixStringBuilder {
/**
* @param {string} body
- * @param {string} formattedBody
+ * @param {string} [formattedBody]
* @param {any} [condition]
*/
add(body, formattedBody, condition = true) {
diff --git a/m2d/converters/utils.test.js b/m2d/converters/utils.test.js
index 9d039fe..76fd824 100644
--- a/m2d/converters/utils.test.js
+++ b/m2d/converters/utils.test.js
@@ -1,7 +1,10 @@
// @ts-check
+const e = new Error("Custom error")
+
const {test} = require("supertape")
-const {eventSenderIsFromDiscord, getEventIDHash} = require("./utils")
+const {eventSenderIsFromDiscord, getEventIDHash, MatrixStringBuilder} = require("./utils")
+const util = require("util")
test("sender type: matrix user", t => {
t.notOk(eventSenderIsFromDiscord("@cadence:cadence.moe"))
@@ -23,3 +26,51 @@ test("event hash: hash is the same each time", t => {
test("event hash: hash is different for different inputs", t => {
t.notEqual(getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe1"), getEventIDHash("$Ij3qo7NxMA4VPexlAiIx2CB9JbsiGhJeyt-2OvkAUe2"))
})
+
+test("MatrixStringBuilder: add, addLine, add same text", t => {
+ const gatewayMessage = {t: "MY_MESSAGE", d: {display: "Custom message data"}}
+ let stackLines = e.stack?.split("\n")
+
+ const builder = new MatrixStringBuilder()
+ builder.addLine("\u26a0 Bridged event from Discord not delivered", "\u26a0 Bridged event from Discord not delivered")
+ builder.addLine(`Gateway event: ${gatewayMessage.t}`)
+ builder.addLine(e.toString())
+ if (stackLines) {
+ stackLines = stackLines.slice(0, 2)
+ stackLines[1] = stackLines[1].replace(/\\/g, "/").replace(/(\s*at ).*(\/m2d\/)/, "$1.$2")
+ builder.addLine(`Error trace:`, `Error trace
`)
+ builder.add(`\n${stackLines.join("\n")}`, `${stackLines.join("\n")}
`)
+ }
+ builder.addLine("", `Original payload
${util.inspect(gatewayMessage.d, false, 4, false)}
`)
+
+ t.deepEqual(builder.get(), {
+ msgtype: "m.text",
+ body: "\u26a0 Bridged event from Discord not delivered"
+ + "\nGateway event: MY_MESSAGE"
+ + "\nError: Custom error"
+ + "\nError trace:"
+ + "\nError: Custom error"
+ + "\n at ./m2d/converters/utils.test.js:3:11)\n",
+ format: "org.matrix.custom.html",
+ formatted_body: "\u26a0 Bridged event from Discord not delivered"
+ + "
Gateway event: MY_MESSAGE"
+ + "
Error: Custom error"
+ + "
Error trace
Error: Custom error\n at ./m2d/converters/utils.test.js:3:11)
"
+ + `Original payload
{ display: 'Custom message data' }
`
+ })
+})
+
+test("MatrixStringBuilder: complete code coverage", t => {
+ const builder = new MatrixStringBuilder()
+ builder.add("Line 1")
+ builder.addParagraph("Line 2")
+ builder.add("Line 3")
+ builder.addParagraph("Line 4")
+
+ t.deepEqual(builder.get(), {
+ msgtype: "m.text",
+ body: "Line 1\n\nLine 2Line 3\n\nLine 4",
+ format: "org.matrix.custom.html",
+ formatted_body: "Line 1
Line 2
Line 3Line 4
"
+ })
+})