From 56ab82cabd4ecc97f1b62cf2b51ba604b805d0bf Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 30 Nov 2017 21:38:55 +0200 Subject: [PATCH] Send channel messages as AS bot if sender is unknown --- src/app.js | 7 +++++++ src/portal.js | 1 + src/telegram-peer.js | 20 +++++++++++++------- src/telegram-puppet.js | 5 +++-- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/app.js b/src/app.js index 75ae7033..93ad905e 100644 --- a/src/app.js +++ b/src/app.js @@ -34,6 +34,7 @@ class MautrixTelegram { */ constructor(config) { this.config = config + this.channelTelegramSender = new TelegramUser(this, -1) /** * MXID -> {@link MatrixUser} cache. @@ -142,6 +143,9 @@ class MautrixTelegram { * @returns {Intent} The Matrix puppet intent for the given Telegram user. */ getIntentForTelegramUser(id) { + if (id === -1) { + return this.botIntent + } return this.bridge.getIntentFromLocalpart(this.getUsernameForTelegramUser(id)) } @@ -282,6 +286,9 @@ class MautrixTelegram { * @returns {TelegramUser} The TelegramUser object. */ async getTelegramUser(id, { createIfNotFound = true } = {}) { + if (id === -1) { + return this.channelTelegramSender + } // TODO remove this after bugs are fixed if (isNaN(parseInt(id, 10))) { const err = new Error("Fatal: non-int Telegram user ID") diff --git a/src/portal.js b/src/portal.js index ec37525d..ed93760e 100644 --- a/src/portal.js +++ b/src/portal.js @@ -210,6 +210,7 @@ class Portal { console.error(err.stack) } } + const sender = await this.app.getTelegramUser(evt.from) await sender.intent.sendTyping(this.roomID, false) diff --git a/src/telegram-peer.js b/src/telegram-peer.js index 0c1fa1d5..3314df0b 100644 --- a/src/telegram-peer.js +++ b/src/telegram-peer.js @@ -137,13 +137,19 @@ class TelegramPeer { channel: this.toInputObject(), }) info = info.chats[0] - const participants = await telegramPOV.client("channels.getParticipants", { - channel: this.toInputObject(), - filter: { _: "channelParticipantsRecent" }, - offset: 0, - limit: 1000, - }) - users = participants.users + try { + const participants = await telegramPOV.client("channels.getParticipants", { + channel: this.toInputObject(), + filter: { _: "channelParticipantsRecent" }, + offset: 0, + limit: 1000, + }) + users = participants.users + } catch (err) { + // Getting channel participants apparently requires admin. + // TODO figure out what to do about that ^ + users = [] + } break default: throw new Error(`Unknown peer type ${this.type}`) diff --git a/src/telegram-puppet.js b/src/telegram-puppet.js index daf96e1e..d333b65b 100644 --- a/src/telegram-puppet.js +++ b/src/telegram-puppet.js @@ -305,9 +305,11 @@ class TelegramPuppet { from = update.from_id break case "updateNewChannelMessage": + // TODO figure out how channel message signing works + from = -1 case "updateNewMessage": update = update.message // Message defined at message#90dddc11 in layer 71 - from = update.from_id + from = update.from_id || from to = TelegramPeer.fromTelegramData(update.to_id, update.from_id, this.userID) break @@ -317,7 +319,6 @@ class TelegramPuppet { return } - console.log(update) portal = await this.app.getPortalByPeer(to) if (update._ === "messageService") {