From debcf0dc29563edfc05c7a3041708d3b2e9d163d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 3 Dec 2017 22:50:57 +0200 Subject: [PATCH] Add support for kicking Telegram users from Matrix --- README.md | 2 +- src/app.js | 31 ++++++++++++++++++++++++++++--- src/portal.js | 12 +++++++++--- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3a139d7e..a8159561 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ does not do this automatically. * [ ] Power level * [ ] Membership actions * [x] Inviting - * [ ] Kicking + * [x] Kicking * [ ] Joining/leaving * [ ] Room metadata changes * [x] Room invites diff --git a/src/app.js b/src/app.js index 6566d60f..303b66ef 100644 --- a/src/app.js +++ b/src/app.js @@ -494,6 +494,26 @@ class MautrixTelegram { return undefined } + async handlePart(sender, evt) { + const capture = this.usernameRegex.exec(evt.state_key) + if (!capture) { + return + } + + const telegramID = +capture[1] + if (!telegramID || isNaN(telegramID)) { + return + } + + const user = await this.getTelegramUser(telegramID) + + const portal = await this.getPortalByRoomID(evt.room_id) + if (!portal) { + return + } + await portal.kickTelegram(sender.telegramPuppet, user) + } + /** * Handle an invite to a Matrix room. * @@ -590,9 +610,14 @@ class MautrixTelegram { } const asBotID = this.bridge.getBot().getUserId() - if (evt.type === "m.room.member" && evt.content.membership === "invite") { - await this.handleInvite(user, evt) - return + if (evt.type === "m.room.member") { + if (evt.content.membership === "invite") { + await this.handleInvite(user, evt) + return + } else if (evt.content.membership === "leave") { + await this.handlePart(user, evt) + return + } } if (evt.sender === asBotID || evt.type !== "m.room.message" || !evt.content) { diff --git a/src/portal.js b/src/portal.js index fe66d4a9..803e80ba 100644 --- a/src/portal.js +++ b/src/portal.js @@ -448,17 +448,23 @@ class Portal { } async kickTelegram(telegramPOV, user) { + let updates if (this.peer.type === "chat") { - const updates = await telegramPOV.client("messages.deleteChatUser", { + updates = await telegramPOV.client("messages.deleteChatUser", { chat_id: this.peer.id, user_id: user.toPeer(telegramPOV).toInputObject(), }) - console.log("Chat kick result:", updates) } else if (this.peer.type === "channel") { - throw new Error("I don't know how to kick users from channels :(") + this.loadAccessHash(telegramPOV) + updates = await telegramPOV.client("channels.kickFromChannel", { + channel: this.peer.toInputObject(), + user_id: user.toPeer(telegramPOV).toInputObject(), + kicked: true, + }) } else { throw new Error(`Can't invite user to peer type ${this.peer.type}`) } + await telegramPOV.handleUpdate(updates) } /**