diff --git a/qml/components/messageContent/SponsoredMessage.qml b/qml/components/messageContent/SponsoredMessage.qml index 4350c15..55e0e8d 100644 --- a/qml/components/messageContent/SponsoredMessage.qml +++ b/qml/components/messageContent/SponsoredMessage.qml @@ -70,7 +70,6 @@ Column { } if (advertisesBot) { tdLibWrapper.createPrivateChat(tdLibWrapper.getUserInformationByName(sponsoredMessageData.link.bot_username).id, "openAndSendStartToBot:" + sponsoredMessageData.link.start_parameter); - //tdLibWrapper.sendBotStartMessage(tdLibWrapper.getUserInformationByName(sponsoredMessageData.link.bot_username).id, sponsoredMessageData.sponsor_chat_id, sponsoredMessageData.link.start_parameter, ""); } } } diff --git a/qml/js/functions.js b/qml/js/functions.js index 166bd1e..b3a7d53 100644 --- a/qml/js/functions.js +++ b/qml/js/functions.js @@ -393,6 +393,19 @@ function handleTMeLink(link, usedPrefix) { function handleLink(link) { var tMePrefix = tdLibWrapper.getOptionString("t_me_url"); var tMePrefixHttp = tMePrefix.replace('https', 'http'); + + // Checking if we have a direct message link... + Debug.log("URL open requested: " + link); + if ( (link.indexOf(tMePrefix) === 0 && link.substring(tMePrefix.length).indexOf("/") > 0) || + (link.indexOf(tMePrefixHttp) === 0 && link.substring(tMePrefixHttp.length).indexOf("/") > 0) || + link.indexOf("tg://privatepost") === 0 || + link.indexOf("tg://resolve") === 0 ) { + Debug.log("Using message link info for: " + link); + tdLibWrapper.getMessageLinkInfo(link, "openDirectly"); + return; + } + + Debug.log("Trying to parse link ourselves: " + link); if (link.indexOf("user://") === 0) { var userName = link.substring(8); var userInformation = tdLibWrapper.getUserInformationByName(userName); diff --git a/qml/pages/ChatPage.qml b/qml/pages/ChatPage.qml index 9d83561..25d5f1a 100644 --- a/qml/pages/ChatPage.qml +++ b/qml/pages/ChatPage.qml @@ -52,6 +52,8 @@ Page { property int chatOnlineMemberCount: 0; property var emojiProposals; property bool iterativeInitialization: false; + property var messageToShow; + property string messageIdToShow; readonly property bool userIsMember: ((isPrivateChat || isSecretChat) && chatInformation["@type"]) || // should be optimized (isBasicGroup || isSuperGroup) && ( (chatGroupInformation.status["@type"] === "chatMemberStatusMember") @@ -530,6 +532,11 @@ Page { if (chatInformation.draft_message && messageId === chatInformation.draft_message.reply_to_message_id) { newMessageInReplyToRow.inReplyToMessage = message; } + Debug.log("Received message ID: " + messageId + ", message ID to show: " + chatPage.messageIdToShow) + if (chatPage.messageIdToShow && chatPage.messageIdToShow === String(messageId)) { + messageOverlayLoader.overlayMessage = message; + messageOverlayLoader.active = true; + } } onSecretChatReceived: { if (secretChatId === chatInformation.type.secret_chat_id) { @@ -1115,6 +1122,13 @@ Page { if (chatPage.isChannel) { tdLibWrapper.getChatSponsoredMessages(chatInformation.id); } + if (typeof chatPage.messageToShow !== "undefined" && chatPage.messageToShow !== {}) { + messageOverlayLoader.overlayMessage = chatPage.messageToShow; + messageOverlayLoader.active = true; + } + if (typeof chatPage.messageIdToShow !== "undefined") { + tdLibWrapper.getMessage(chatPage.chatInformation.id, chatPage.messageIdToShow); + } } } } diff --git a/qml/pages/OverviewPage.qml b/qml/pages/OverviewPage.qml index 1fd3104..4f828b6 100644 --- a/qml/pages/OverviewPage.qml +++ b/qml/pages/OverviewPage.qml @@ -49,8 +49,10 @@ Page { Connections { target: dBusAdaptor onPleaseOpenMessage: { - Debug.log("[OverviewPage] Opening chat from external requested: ", chatId); - openMessage(chatId, messageId); + Debug.log("[OverviewPage] Opening chat from external requested: ", chatId, messageId); + // We open the chat only for now - as it's automatically positioned at the last read message + // it's probably better as if the message itself is displayed in the overlay + openChat(chatId); } onPleaseOpenUrl: { Debug.log("[OverviewPage] Opening URL requested: ", url); @@ -74,8 +76,6 @@ Page { titleInteractionHint.opacity = 1.0; appSettings.remainingInteractionHints = remainingInteractionHints - 1; } - openUrl(); - openMessage(); } } @@ -110,14 +110,35 @@ Page { filterText: chatSearchField.text } - function openMessage(chatId, messageId) { + function openChat(chatId) { + if(chatListCreated && chatId) { + Debug.log("[OverviewPage] Opening Chat: ", chatId); + pageStack.pop(overviewPage, PageStackAction.Immediate); + pageStack.push(Qt.resolvedUrl("../pages/ChatPage.qml"), { "chatInformation" : tdLibWrapper.getChat(chatId) }, PageStackAction.Immediate); + chatToOpen = null; + } + } + + function openChatWithMessageId(chatId, messageId) { if(chatId && messageId) { chatToOpen = [chatId, messageId]; } - if(chatListCreated && chatToOpen && chatToOpen.length === 2) { // messageId not handled (yet) - Debug.log("[OverviewPage] Opening Chat: ", chatToOpen[0]); + if(chatListCreated && chatToOpen && chatToOpen.length === 2) { + Debug.log("[OverviewPage] Opening Chat: ", chatToOpen[0], "message ID: " + chatToOpen[1]); pageStack.pop(overviewPage, PageStackAction.Immediate); - pageStack.push(Qt.resolvedUrl("../pages/ChatPage.qml"), { "chatInformation" : chatListModel.getById(chatToOpen[0]) }, PageStackAction.Immediate); + pageStack.push(Qt.resolvedUrl("../pages/ChatPage.qml"), { "chatInformation" : tdLibWrapper.getChat(chatToOpen[0]), "messageIdToShow" : chatToOpen[1] }, PageStackAction.Immediate); + chatToOpen = null; + } + } + + function openChatWithMessage(chatId, message) { + if(chatId && message) { + chatToOpen = [chatId, message]; + } + if(chatListCreated && chatToOpen && chatToOpen.length === 2) { + Debug.log("[OverviewPage] Opening Chat (with provided message): ", chatToOpen[0]); + pageStack.pop(overviewPage, PageStackAction.Immediate); + pageStack.push(Qt.resolvedUrl("../pages/ChatPage.qml"), { "chatInformation" : tdLibWrapper.getChat(chatToOpen[0]), "messageToShow" : chatToOpen[1] }, PageStackAction.Immediate); chatToOpen = null; } } @@ -272,6 +293,15 @@ Page { onCopyToDownloadsError: { appNotification.show(qsTr("Download failed.")); } + onMessageLinkInfoReceived: { + if (extra === "openDirectly") { + if (messageLinkInfo.chat_id === 0) { + appNotification.show(qsTr("Unable to open link.")); + } else { + openChatWithMessage(messageLinkInfo.chat_id, messageLinkInfo.message); + } + } + } } Component.onCompleted: { diff --git a/src/tdlibreceiver.cpp b/src/tdlibreceiver.cpp index f6d5c23..f42d3b6 100644 --- a/src/tdlibreceiver.cpp +++ b/src/tdlibreceiver.cpp @@ -383,9 +383,18 @@ void TDLibReceiver::processMessage(const QVariantMap &receivedInformation) void TDLibReceiver::processMessageLinkInfo(const QVariantMap &receivedInformation) { - const QString url = receivedInformation.value(EXTRA).toString(); - LOG("Received message link info " << url); - emit messageLinkInfoReceived(url, receivedInformation); + const QString oldExtra = receivedInformation.value(EXTRA).toString(); + QString url = ""; + QString extra = ""; + LOG("Received message link info " << oldExtra); + if (oldExtra.contains("|")) { + const int midIndex = oldExtra.indexOf("|"); + url = oldExtra.left(midIndex); + extra = oldExtra.mid(midIndex + 1); + } else { + url = oldExtra; + } + emit messageLinkInfoReceived(url, receivedInformation, extra); } void TDLibReceiver::processMessageSendSucceeded(const QVariantMap &receivedInformation) diff --git a/src/tdlibreceiver.h b/src/tdlibreceiver.h index 910ed3f..53f4c70 100644 --- a/src/tdlibreceiver.h +++ b/src/tdlibreceiver.h @@ -56,7 +56,7 @@ signals: void superGroupUpdated(qlonglong groupId, const QVariantMap &groupInformation); void chatOnlineMemberCountUpdated(const QString &chatId, int onlineMemberCount); void messagesReceived(const QVariantList &messages, int totalCount); - void messageLinkInfoReceived(const QString &url, const QVariantMap &messageLinkInfo); + void messageLinkInfoReceived(const QString &url, const QVariantMap &messageLinkInfo, const QString &extra); void sponsoredMessagesReceived(qlonglong chatId, const QVariantList &messages); void newMessageReceived(qlonglong chatId, const QVariantMap &message); void messageInformation(qlonglong chatId, qlonglong messageId, const QVariantMap &message); diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp index e54d8e5..cf2be5b 100644 --- a/src/tdlibwrapper.cpp +++ b/src/tdlibwrapper.cpp @@ -119,7 +119,7 @@ void TDLibWrapper::initializeTDLibReciever() { connect(this->tdLibReceiver, SIGNAL(chatOnlineMemberCountUpdated(QString, int)), this, SIGNAL(chatOnlineMemberCountUpdated(QString, int))); connect(this->tdLibReceiver, SIGNAL(messagesReceived(QVariantList, int)), this, SIGNAL(messagesReceived(QVariantList, int))); connect(this->tdLibReceiver, SIGNAL(sponsoredMessagesReceived(qlonglong, QVariantList)), this, SLOT(handleSponsoredMess(qlonglong, QVariantList))); - connect(this->tdLibReceiver, SIGNAL(messageLinkInfoReceived(QString, QVariantMap)), this, SIGNAL(messageLinkInfoReceived(QString, QVariantMap))); + connect(this->tdLibReceiver, SIGNAL(messageLinkInfoReceived(QString, QVariantMap, QString)), this, SIGNAL(messageLinkInfoReceived(QString, QVariantMap, QString))); connect(this->tdLibReceiver, SIGNAL(newMessageReceived(qlonglong, QVariantMap)), this, SIGNAL(newMessageReceived(qlonglong, QVariantMap))); connect(this->tdLibReceiver, SIGNAL(messageInformation(qlonglong, qlonglong, QVariantMap)), this, SLOT(handleMessageInformation(qlonglong, qlonglong, QVariantMap))); connect(this->tdLibReceiver, SIGNAL(messageSendSucceeded(qlonglong, qlonglong, QVariantMap)), this, SIGNAL(messageSendSucceeded(qlonglong, qlonglong, QVariantMap))); @@ -656,13 +656,18 @@ void TDLibWrapper::getMessage(qlonglong chatId, qlonglong messageId) this->sendRequest(requestObject); } -void TDLibWrapper::getMessageLinkInfo(const QString &url) +void TDLibWrapper::getMessageLinkInfo(const QString &url, const QString &extra) { - LOG("Retrieving message link info" << url); + LOG("Retrieving message link info" << url << extra); QVariantMap requestObject; requestObject.insert(_TYPE, "getMessageLinkInfo"); requestObject.insert("url", url); - requestObject.insert(_EXTRA, url); + if (extra == "") { + requestObject.insert(_EXTRA, url); + } else { + requestObject.insert(_EXTRA, url + "|" + extra); + } + this->sendRequest(requestObject); } diff --git a/src/tdlibwrapper.h b/src/tdlibwrapper.h index eadfd0c..f16b90b 100644 --- a/src/tdlibwrapper.h +++ b/src/tdlibwrapper.h @@ -172,7 +172,7 @@ public: Q_INVOKABLE void sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &explanation, const QString &replyToMessageId = "0"); Q_INVOKABLE void forwardMessages(const QString &chatId, const QString &fromChatId, const QVariantList &messageIds, bool sendCopy, bool removeCaption); Q_INVOKABLE void getMessage(qlonglong chatId, qlonglong messageId); - Q_INVOKABLE void getMessageLinkInfo(const QString &url); + Q_INVOKABLE void getMessageLinkInfo(const QString &url, const QString &extra = ""); Q_INVOKABLE void getCallbackQueryAnswer(const QString &chatId, const QString &messageId, const QVariantMap &payload); Q_INVOKABLE void getChatPinnedMessage(qlonglong chatId); Q_INVOKABLE void getChatSponsoredMessages(qlonglong chatId); @@ -265,7 +265,7 @@ signals: void chatOnlineMemberCountUpdated(const QString &chatId, int onlineMemberCount); void messagesReceived(const QVariantList &messages, int totalCount); void sponsoredMessagesReceived(qlonglong chatId, const QVariantList &messages); - void messageLinkInfoReceived(const QString &url, const QVariantMap &messageLinkInfo); + void messageLinkInfoReceived(const QString &url, const QVariantMap &messageLinkInfo, const QString &extra); void newMessageReceived(qlonglong chatId, const QVariantMap &message); void copyToDownloadsSuccessful(const QString &fileName, const QString &filePath); void copyToDownloadsError(const QString &fileName, const QString &filePath); diff --git a/translations/harbour-fernschreiber-de.ts b/translations/harbour-fernschreiber-de.ts index e0441a0..6c640d1 100644 --- a/translations/harbour-fernschreiber-de.ts +++ b/translations/harbour-fernschreiber-de.ts @@ -1304,6 +1304,10 @@ Logging out Abmelden + + Unable to open link. + Kann Link nicht öffnen. + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-en.ts b/translations/harbour-fernschreiber-en.ts index 3574c2b..785f109 100644 --- a/translations/harbour-fernschreiber-en.ts +++ b/translations/harbour-fernschreiber-en.ts @@ -1306,6 +1306,10 @@ messages Logging out Logging out + + Unable to open link. + Unable to open link. + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts index 178d9e1..75153bd 100644 --- a/translations/harbour-fernschreiber-es.ts +++ b/translations/harbour-fernschreiber-es.ts @@ -1304,6 +1304,10 @@ Logging out Saliendo de la cuenta + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-fi.ts b/translations/harbour-fernschreiber-fi.ts index 4dc3038..ec5ec04 100644 --- a/translations/harbour-fernschreiber-fi.ts +++ b/translations/harbour-fernschreiber-fi.ts @@ -1305,6 +1305,10 @@ Logging out Kirjaudutaan ulos + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-fr.ts b/translations/harbour-fernschreiber-fr.ts index fd5111f..00b4d8e 100644 --- a/translations/harbour-fernschreiber-fr.ts +++ b/translations/harbour-fernschreiber-fr.ts @@ -1304,6 +1304,10 @@ Logging out Se déconnecte + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-hu.ts b/translations/harbour-fernschreiber-hu.ts index 6a2ec41..5254d34 100644 --- a/translations/harbour-fernschreiber-hu.ts +++ b/translations/harbour-fernschreiber-hu.ts @@ -1285,6 +1285,10 @@ Logging out + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-it.ts b/translations/harbour-fernschreiber-it.ts index aa727c1..1a54a7a 100644 --- a/translations/harbour-fernschreiber-it.ts +++ b/translations/harbour-fernschreiber-it.ts @@ -1304,6 +1304,10 @@ Logging out Disconnetto + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-pl.ts b/translations/harbour-fernschreiber-pl.ts index 3d4c95b..635d73c 100644 --- a/translations/harbour-fernschreiber-pl.ts +++ b/translations/harbour-fernschreiber-pl.ts @@ -1323,6 +1323,10 @@ Logging out Wylogowywanie + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts index fc0d823..c194131 100644 --- a/translations/harbour-fernschreiber-ru.ts +++ b/translations/harbour-fernschreiber-ru.ts @@ -1326,6 +1326,10 @@ Logging out Завершение сеанса + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-sk.ts b/translations/harbour-fernschreiber-sk.ts index b6d53cb..504d2b4 100644 --- a/translations/harbour-fernschreiber-sk.ts +++ b/translations/harbour-fernschreiber-sk.ts @@ -1323,6 +1323,10 @@ Logging out Odhlasovanie + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-sv.ts b/translations/harbour-fernschreiber-sv.ts index cb46eb9..17c5be0 100644 --- a/translations/harbour-fernschreiber-sv.ts +++ b/translations/harbour-fernschreiber-sv.ts @@ -1304,6 +1304,10 @@ Logging out Loggar ut + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber-zh_CN.ts b/translations/harbour-fernschreiber-zh_CN.ts index bf2cfd5..3c984a7 100644 --- a/translations/harbour-fernschreiber-zh_CN.ts +++ b/translations/harbour-fernschreiber-zh_CN.ts @@ -1286,6 +1286,10 @@ Logging out 正在登出 + + Unable to open link. + + PinnedMessageItem diff --git a/translations/harbour-fernschreiber.ts b/translations/harbour-fernschreiber.ts index 539083f..9e0c5e1 100644 --- a/translations/harbour-fernschreiber.ts +++ b/translations/harbour-fernschreiber.ts @@ -1304,6 +1304,10 @@ Logging out + + Unable to open link. + + PinnedMessageItem