From a82d33f7a815d1a1ba596c37a1465a27a20983ae Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 17 Jan 2021 10:18:20 +0800 Subject: [PATCH] forwarder: implement reply on IRC side --- forwarder.js | 29 ++++++++++++++++++++++++++--- index.js | 4 +++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/forwarder.js b/forwarder.js index 432c8df..92e75f7 100644 --- a/forwarder.js +++ b/forwarder.js @@ -102,7 +102,7 @@ module.exports = class Forwarder { } } - onMatrixMessage(event, room, toStartOfTimeline) { + async onMatrixMessage(event, room, toStartOfTimeline) { this.clientMatrix.sendReadReceipt(event); if (toStartOfTimeline) { return; // Ignore pagniation @@ -124,6 +124,28 @@ module.exports = class Forwarder { } } + let replyUsername = null; + if (content['m.relates_to'] && content['m.relates_to']['m.in_reply_to']) { + let replyEvId = content['m.relates_to']['m.in_reply_to']['event_id']; + try { + let tl = await this.clientMatrix.getEventTimeline(room.getUnfilteredTimelineSet(), replyEvId); + let replyEv = tl.getEvents().filter((v) => v.getId() == replyEvId); + if (replyEv.length > 0) { + replyUsername = replyEv[0].sender.name; + if (replyEv[0].getContent()['net.typeblog.i2m.irc_nick']) { + replyUsername = replyEv[0].getContent()['net.typeblog.i2m.irc_nick']; + } + } + } catch (err) { + console.log(err); + } + } + + let replyTxt = ""; + if (replyUsername) { + replyTxt = replyUsername + ": " + } + let msgTxt = null; switch (event.getType()) { case "m.sticker": @@ -138,7 +160,8 @@ module.exports = class Forwarder { msgTxt = `${content.body} ${this.clientMatrix.mxcUrlToHttp(content.url)}`; break; default: - msgTxt = content.body; + // Get rid of the reply quote generated by Element client + msgTxt = content.body.replace(/> <@(.*):(.*)> (.*)\n\n/, ""); break; } break; @@ -154,7 +177,7 @@ module.exports = class Forwarder { // Special format for emote this.clientIRC.say(this.mappingM2I[room.roomId], `* ${name} ${msgTxt}`); } else { - this.clientIRC.say(this.mappingM2I[room.roomId], `[${name}] ${msgTxt}`); + this.clientIRC.say(this.mappingM2I[room.roomId], `[${name}] ${replyTxt}${msgTxt}`); } } } diff --git a/index.js b/index.js index c3c1f22..26248d8 100644 --- a/index.js +++ b/index.js @@ -33,7 +33,9 @@ function connectIrc(config, callback) { } function connectMatrix(config, callback) { - let client = matrix.createClient(config.matrix); + let client = matrix.createClient(Object.assign(config.matrix, { + timelineSupport: true + })); let myCallback = (state) => { switch (state) { case "PREPARED":