Add support for kicking Telegram users from Matrix

This commit is contained in:
Tulir Asokan
2017-12-03 22:50:57 +02:00
parent 8a082a4598
commit debcf0dc29
3 changed files with 38 additions and 7 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ does not do this automatically.
* [ ] Power level * [ ] Power level
* [ ] Membership actions * [ ] Membership actions
* [x] Inviting * [x] Inviting
* [ ] Kicking * [x] Kicking
* [ ] Joining/leaving * [ ] Joining/leaving
* [ ] Room metadata changes * [ ] Room metadata changes
* [x] Room invites * [x] Room invites
+28 -3
View File
@@ -494,6 +494,26 @@ class MautrixTelegram {
return undefined 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. * Handle an invite to a Matrix room.
* *
@@ -590,9 +610,14 @@ class MautrixTelegram {
} }
const asBotID = this.bridge.getBot().getUserId() const asBotID = this.bridge.getBot().getUserId()
if (evt.type === "m.room.member" && evt.content.membership === "invite") { if (evt.type === "m.room.member") {
await this.handleInvite(user, evt) if (evt.content.membership === "invite") {
return 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) { if (evt.sender === asBotID || evt.type !== "m.room.message" || !evt.content) {
+9 -3
View File
@@ -448,17 +448,23 @@ class Portal {
} }
async kickTelegram(telegramPOV, user) { async kickTelegram(telegramPOV, user) {
let updates
if (this.peer.type === "chat") { if (this.peer.type === "chat") {
const updates = await telegramPOV.client("messages.deleteChatUser", { updates = await telegramPOV.client("messages.deleteChatUser", {
chat_id: this.peer.id, chat_id: this.peer.id,
user_id: user.toPeer(telegramPOV).toInputObject(), user_id: user.toPeer(telegramPOV).toInputObject(),
}) })
console.log("Chat kick result:", updates)
} else if (this.peer.type === "channel") { } 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 { } else {
throw new Error(`Can't invite user to peer type ${this.peer.type}`) throw new Error(`Can't invite user to peer type ${this.peer.type}`)
} }
await telegramPOV.handleUpdate(updates)
} }
/** /**