diff --git a/src/formatter.js b/src/formatter.js index 50efa49b..11ee310b 100644 --- a/src/formatter.js +++ b/src/formatter.js @@ -68,9 +68,10 @@ function telegramToMatrix(message, entities, app) { addSimpleTag(tags, entity, "pre", pc) addTag(tags, entity, "code", `class="language-${entity.language}"`, pc + 1) break - case "messageEntityHashtag": case "messageEntityBotCommand": // TODO bridge bot commands differently? + message = `${message.substr(0, entity.offset)}!${message.substr(entity.offset + 1)}` + case "messageEntityHashtag": addTag(tags, entity, "font", "color=\"blue\"", --pc) break case "messageEntityMentionName": @@ -153,6 +154,7 @@ const inlineCode = /<(code)>()(.*?)<\/code>/g const emailAddresses = /([^]*?)<\/a>/g const mentions = /(.*?)<\/a>/g const hyperlinks = /<(a href)="(.*?)">([^]*?)<\/a>/g +const commands = /(\s|^)!([^\s]+)/g const REGEX_CAPTURE_GROUP_COUNT = 3 RegExp.any = function(...regexes) { @@ -263,9 +265,22 @@ function regexMonsterHandler(identifier, arg, text, index, app) { * @param {string} message The HTML-formatted message. * @returns {{message: string, entities: Array}} The Telegram entity-formatted message. */ -function matrixToTelegram(message, app) { +function matrixToTelegram(message, isHTML, app) { const entities = [] + message = message.replace(commands, (_, prefix, command, index) => { + entities.push({ + _: "messageEntityBotCommand", + offset: index + prefix.length, + length: command.length + 1, + }) + return `${prefix}/${command}` + }) + + if (!isHTML) { + return { message, entities } + } + // First replace all the things that don't get converted into Telegram entities message = message.replace(linebreaks, "\n") message = message.replace(paragraphs, "$1\n") diff --git a/src/portal.js b/src/portal.js index e705a15b..85797895 100644 --- a/src/portal.js +++ b/src/portal.js @@ -251,12 +251,11 @@ class Portal { await this.loadAccessHash(sender.telegramPuppet) switch (evt.content.msgtype) { case "m.text": - if (evt.content.format === "org.matrix.custom.html") { - const { message, entities } = formatter.matrixToTelegram(evt.content.formatted_body, this.app) - await sender.telegramPuppet.sendMessage(this.peer, message, entities) - } else { - await sender.telegramPuppet.sendMessage(this.peer, evt.content.body) - } + const { message, entities } = formatter.matrixToTelegram( + evt.content.formatted_body || evt.content.body, + evt.content.format === "org.matrix.custom.html", + this.app) + await sender.telegramPuppet.sendMessage(this.peer, message, entities) break case "m.video": case "m.audio":