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":