From 83c06c85919e5222fd07db468416f8e5a12969c4 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 17 Oct 2018 21:37:29 -0600 Subject: [PATCH] Warn the user when they try to bridge chats that are already bridged --- src/api/dimension/DimensionTelegramService.ts | 8 +++- src/bridges/TelegramBridge.ts | 10 +++-- web/app/app.module.ts | 6 +++ .../ask-unbridge/ask-unbridge.component.html | 17 +++++++++ .../ask-unbridge/ask-unbridge.component.scss | 0 .../ask-unbridge/ask-unbridge.component.ts | 24 ++++++++++++ .../cannot-unbridge.component.html | 14 +++++++ .../cannot-unbridge.component.scss | 0 .../cannot-unbridge.component.ts | 16 ++++++++ .../telegram/telegram.bridge.component.ts | 37 +++++++++++++++---- 10 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.html create mode 100644 web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.scss create mode 100644 web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.ts create mode 100644 web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.html create mode 100644 web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.scss create mode 100644 web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.ts diff --git a/src/api/dimension/DimensionTelegramService.ts b/src/api/dimension/DimensionTelegramService.ts index 02d2e50..3f82b5d 100644 --- a/src/api/dimension/DimensionTelegramService.ts +++ b/src/api/dimension/DimensionTelegramService.ts @@ -11,6 +11,10 @@ interface PortalInfoResponse { chatName: string; } +interface BridgeRoomRequest { + unbridgeOtherPortals: boolean; +} + /** * API for interacting with the Telegram bridge */ @@ -49,12 +53,12 @@ export class DimensionTelegramService { @POST @Path("chat/:chatId/room/:roomId") - public async bridgeRoom(@QueryParam("scalar_token") scalarToken: string, @PathParam("chatId") chatId: number, @PathParam("roomId") roomId: string): Promise { + public async bridgeRoom(@QueryParam("scalar_token") scalarToken: string, @PathParam("chatId") chatId: number, @PathParam("roomId") roomId: string, request: BridgeRoomRequest): Promise { const userId = await ScalarService.getTokenOwner(scalarToken); try { const telegram = new TelegramBridge(userId); - const portal = await telegram.bridgeRoom(chatId, roomId); + const portal = await telegram.bridgeRoom(chatId, roomId, request.unbridgeOtherPortals); return { bridged: true, canUnbridge: portal.canUnbridge, diff --git a/src/bridges/TelegramBridge.ts b/src/bridges/TelegramBridge.ts index e715034..29b2eed 100644 --- a/src/bridges/TelegramBridge.ts +++ b/src/bridges/TelegramBridge.ts @@ -97,9 +97,9 @@ export class TelegramBridge { try { const info = await this.doProvisionRequest(bridge, "GET", `/portal/${inRoomId}`); return { - bridged: !!info, + bridged: !!info && info.mxid === inRoomId, chatId: info ? info.chat_id : 0, - roomId: inRoomId, + roomId: info.mxid, chatName: info ? info.title || info.username : null, canUnbridge: info ? info.can_unbridge : false, }; @@ -150,11 +150,13 @@ export class TelegramBridge { } } - public async bridgeRoom(chatId: number, roomId: string): Promise { + public async bridgeRoom(chatId: number, roomId: string, unbridgeOtherPortals = false): Promise { const bridge = await this.getDefaultBridge(); try { - await this.doProvisionRequest(bridge, "POST", `/portal/${roomId}/connect/${chatId}`); + const qs = {}; + if (unbridgeOtherPortals) qs["force"] = "unbridge"; + await this.doProvisionRequest(bridge, "POST", `/portal/${roomId}/connect/${chatId}`, qs); return this.getChatConfiguration(chatId, roomId); } catch (e) { if (!e.errBody) throw e.error || e; diff --git a/web/app/app.module.ts b/web/app/app.module.ts index a09937a..e959d60 100644 --- a/web/app/app.module.ts +++ b/web/app/app.module.ts @@ -83,6 +83,8 @@ import { AdminTelegramBridgeComponent } from "./admin/bridges/telegram/telegram. import { AdminTelegramBridgeManageSelfhostedComponent } from "./admin/bridges/telegram/manage-selfhosted/manage-selfhosted.component"; import { TelegramApiService } from "./shared/services/integrations/telegram-api.service"; import { TelegramBridgeConfigComponent } from "./configs/bridge/telegram/telegram.bridge.component"; +import { TelegramAskUnbridgeComponent } from "./configs/bridge/telegram/ask-unbridge/ask-unbridge.component"; +import { TelegramCannotUnbridgeComponent } from "./configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component"; @NgModule({ imports: [ @@ -153,6 +155,8 @@ import { TelegramBridgeConfigComponent } from "./configs/bridge/telegram/telegra AdminTelegramBridgeComponent, AdminTelegramBridgeManageSelfhostedComponent, TelegramBridgeConfigComponent, + TelegramAskUnbridgeComponent, + TelegramCannotUnbridgeComponent, // Vendor ], @@ -192,6 +196,8 @@ import { TelegramBridgeConfigComponent } from "./configs/bridge/telegram/telegra AdminIrcBridgeAddSelfhostedComponent, AdminStickerPackPreviewComponent, AdminTelegramBridgeManageSelfhostedComponent, + TelegramAskUnbridgeComponent, + TelegramCannotUnbridgeComponent, ] }) export class AppModule { diff --git a/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.html b/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.html new file mode 100644 index 0000000..3336e5e --- /dev/null +++ b/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.html @@ -0,0 +1,17 @@ +
+
+

Telegram chat is already bridged

+
+
+ You have the appropriate permissions to be able to unbridge the chat, however. Would you like to unbridge + the other room and instead bridge it here? +
+ +
\ No newline at end of file diff --git a/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.scss b/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.ts b/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.ts new file mode 100644 index 0000000..fee4d9b --- /dev/null +++ b/web/app/configs/bridge/telegram/ask-unbridge/ask-unbridge.component.ts @@ -0,0 +1,24 @@ +import { Component } from "@angular/core"; +import { DialogRef, ModalComponent } from "ngx-modialog"; +import { BSModalContext } from "ngx-modialog/plugins/bootstrap"; + +export class AskUnbridgeDialogContext extends BSModalContext { +} + +@Component({ + templateUrl: "./ask-unbridge.component.html", + styleUrls: ["./ask-unbridge.component.scss"], +}) +export class TelegramAskUnbridgeComponent implements ModalComponent { + + constructor(public dialog: DialogRef) { + } + + public unbridgeAndContinue(): void { + this.dialog.close({unbridge: true}); + } + + public cancel(): void { + this.dialog.close({unbridge: false}); + } +} diff --git a/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.html b/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.html new file mode 100644 index 0000000..bcb45f2 --- /dev/null +++ b/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.html @@ -0,0 +1,14 @@ +
+
+

Telegram chat is already bridged

+
+
+ That Telegram chat is bridged to another Matrix room and cannot be bridged here. Unfortunately, you do not + have the required permissions to be able to unbridge the other room. +
+ +
\ No newline at end of file diff --git a/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.scss b/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.ts b/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.ts new file mode 100644 index 0000000..7496884 --- /dev/null +++ b/web/app/configs/bridge/telegram/cannot-unbridge/cannot-unbridge.component.ts @@ -0,0 +1,16 @@ +import { Component } from "@angular/core"; +import { DialogRef, ModalComponent } from "ngx-modialog"; +import { BSModalContext } from "ngx-modialog/plugins/bootstrap"; + +export class CannotUnbridgeDialogContext extends BSModalContext { +} + +@Component({ + templateUrl: "./cannot-unbridge.component.html", + styleUrls: ["./cannot-unbridge.component.scss"], +}) +export class TelegramCannotUnbridgeComponent implements ModalComponent { + + constructor(public dialog: DialogRef) { + } +} diff --git a/web/app/configs/bridge/telegram/telegram.bridge.component.ts b/web/app/configs/bridge/telegram/telegram.bridge.component.ts index d7192cb..07870d4 100644 --- a/web/app/configs/bridge/telegram/telegram.bridge.component.ts +++ b/web/app/configs/bridge/telegram/telegram.bridge.component.ts @@ -2,6 +2,12 @@ import { Component } from "@angular/core"; import { BridgeComponent } from "../bridge.component"; import { TelegramApiService } from "../../../shared/services/integrations/telegram-api.service"; import { FE_PortalInfo } from "../../../shared/models/telegram"; +import { Modal, overlayConfigFactory } from "ngx-modialog"; +import { AskUnbridgeDialogContext, TelegramAskUnbridgeComponent } from "./ask-unbridge/ask-unbridge.component"; +import { + CannotUnbridgeDialogContext, + TelegramCannotUnbridgeComponent +} from "./cannot-unbridge/cannot-unbridge.component"; interface TelegramConfig { puppet: { @@ -33,7 +39,7 @@ export class TelegramBridgeConfigComponent extends BridgeComponent { + this.telegram.getPortalInfo(this.bridge.config.portalInfo.chatId, this.roomId).then(async (chatInfo) => { + let forceUnbridge = false; if (chatInfo.bridged && chatInfo.canUnbridge) { - // TODO: Ask if the user would like to unbridge - console.log("Ask for unbridge"); + const response = await this.modal.open(TelegramAskUnbridgeComponent, overlayConfigFactory({ + isBlocking: true, + size: 'lg', + }, AskUnbridgeDialogContext)).result; + + if (response.unbridge) { + forceUnbridge = true; + } else { + return {aborted: true}; + } } else if (chatInfo.bridged) { - // TODO: Dialog saying 'sorry' - console.log("Cannot bridge"); + this.modal.open(TelegramCannotUnbridgeComponent, overlayConfigFactory({ + isBlocking: true, + size: 'lg', + }, CannotUnbridgeDialogContext)); + return {aborted: true}; } - return this.telegram.bridgeRoom(this.roomId, this.bridge.config.portalInfo.chatId); - }).then(portalInfo => { + + return this.telegram.bridgeRoom(this.roomId, this.bridge.config.portalInfo.chatId, forceUnbridge); + }).then((portalInfo: FE_PortalInfo) => { + if ((portalInfo).aborted) return; + this.bridge.config.portalInfo = portalInfo; this.bridge.config.linked = [portalInfo.chatId]; this.isUpdating = false;