diff --git a/qml/components/InlineQuery.qml b/qml/components/InlineQuery.qml
index 1ad7cb3..5f97fb2 100644
--- a/qml/components/InlineQuery.qml
+++ b/qml/components/InlineQuery.qml
@@ -40,7 +40,7 @@ Loader {
property string chatId
property string userName
- property bool userNameIsValid: userName !== "" && inlineBotInformation && userName.toLowerCase() === inlineBotInformation.username.toLowerCase()
+ property bool userNameIsValid: userName !== "" && inlineBotInformation && userName.toLowerCase() === inlineBotInformation.usernames.editable_username.toLowerCase()
property string query
property int currentOffset: 0
property string responseExtra: chatId+"|"+userName+"|"+query+"|"+currentOffset
diff --git a/qml/components/MessageListViewItem.qml b/qml/components/MessageListViewItem.qml
index d62808e..d8a4944 100644
--- a/qml/components/MessageListViewItem.qml
+++ b/qml/components/MessageListViewItem.qml
@@ -687,7 +687,7 @@ ListItem {
Image {
id: emojiPicture
source: Emoji.getEmojiPath(modelData)
- width: Theme.fontSizeLarge
+ width: status === Image.Ready ? Theme.fontSizeLarge : 0
height: Theme.fontSizeLarge
}
diff --git a/qml/components/MessageViaLabel.qml b/qml/components/MessageViaLabel.qml
index b76619e..b0d34d3 100644
--- a/qml/components/MessageViaLabel.qml
+++ b/qml/components/MessageViaLabel.qml
@@ -31,12 +31,12 @@ Loader {
property var botUserInformation: tdLibWrapper.getUserInformation(message.via_bot_user_id)
color: Theme.secondaryColor
font.pixelSize: Theme.fontSizeExtraSmall
- text: qsTr("via %1", "message posted via bot user").arg("@" + Emoji.emojify(botUserInformation.username, font.pixelSize)+"")
+ text: qsTr("via %1", "message posted via bot user").arg("@" + Emoji.emojify(botUserInformation.usernames.editable_username, font.pixelSize)+"")
textFormat: Text.RichText
truncationMode: TruncationMode.Fade
onLinkActivated: {
if(link === "userId://" + message.via_bot_user_id && botUserInformation.type.is_inline) {
- newMessageTextField.text = "@"+botUserInformation.username+" "
+ newMessageTextField.text = "@"+botUserInformation.usernames.editable_username+" "
newMessageTextField.cursorPosition = newMessageTextField.text.length
lostFocusTimer.start();
}
diff --git a/qml/components/ReplyMarkupButtons.qml b/qml/components/ReplyMarkupButtons.qml
index de2cd2c..99efe97 100644
--- a/qml/components/ReplyMarkupButtons.qml
+++ b/qml/components/ReplyMarkupButtons.qml
@@ -60,12 +60,12 @@ Column {
},
inlineKeyboardButtonTypeSwitchInline: function() {
if(modelData.type.in_current_chat) {
- chatPage.setMessageText("@" + userInformation.username + " "+(modelData.type.query || ""))
+ chatPage.setMessageText("@" + userInformation.usernames.editable_username + " "+(modelData.type.query || ""))
} else {
pageStack.push(Qt.resolvedUrl("../pages/ChatSelectionPage.qml"), {
myUserId: chatPage.myUserId,
- payload: { neededPermissions: ["can_send_other_messages"], text:"@" + userInformation.username + " "+(modelData.type.query || "")},
+ payload: { neededPermissions: ["can_send_other_messages"], text:"@" + userInformation.usernames.editable_username + " "+(modelData.type.query || "")},
state: "fillTextArea"
})
}
diff --git a/qml/components/chatInformationPage/ChatInformationPageContent.qml b/qml/components/chatInformationPage/ChatInformationPageContent.qml
index 511bc38..bbd1992 100644
--- a/qml/components/chatInformationPage/ChatInformationPageContent.qml
+++ b/qml/components/chatInformationPage/ChatInformationPageContent.qml
@@ -300,8 +300,8 @@ SilicaFlickable {
}
leftMargin: imageContainer.getEased((imageContainer.minDimension + Theme.paddingMedium), 0, imageContainer.tweenFactor) + Theme.horizontalPageMargin
title: chatInformationPage.chatInformation.title !== "" ? Emoji.emojify(chatInformationPage.chatInformation.title, Theme.fontSizeLarge) : qsTr("Unknown")
- description: ((chatInformationPage.isPrivateChat || chatInformationPage.isSecretChat) && chatInformationPage.privateChatUserInformation.username)
- ? ("@"+chatInformationPage.privateChatUserInformation.username) : ""
+ description: ((chatInformationPage.isPrivateChat || chatInformationPage.isSecretChat) && chatInformationPage.privateChatUserInformation.usernames.editable_username)
+ ? ("@"+chatInformationPage.privateChatUserInformation.usernames.editable_username) : ""
}
SilicaFlickable {
diff --git a/qml/components/messageContent/MessageSticker.qml b/qml/components/messageContent/MessageSticker.qml
index ce499f8..fb9f02d 100644
--- a/qml/components/messageContent/MessageSticker.qml
+++ b/qml/components/messageContent/MessageSticker.qml
@@ -27,7 +27,7 @@ MessageContentBase {
property var stickerData: messageListItem ? messageListItem.myMessage.content.sticker : overlayFlickable.overlayMessage.content.sticker;
readonly property bool asEmoji: appSettings.showStickersAsEmojis
- readonly property bool animated: stickerData.type["@type"] === "stickerTypeAnimated" && appSettings.animateStickers
+ readonly property bool animated: stickerData.format["@type"] === "stickerFormatTgs" && appSettings.animateStickers
readonly property bool stickerVisible: staticStickerLoader.item ? staticStickerLoader.item.visible :
animatedStickerLoader.item ? animatedStickerLoader.item.visible : false
readonly property bool isOwnSticker : messageListItem ? messageListItem.isOwnMessage : overlayFlickable.isOwnMessage
diff --git a/qml/components/settingsPage/SettingsSession.qml b/qml/components/settingsPage/SettingsSession.qml
index 9f5a9b6..cb65cf8 100644
--- a/qml/components/settingsPage/SettingsSession.qml
+++ b/qml/components/settingsPage/SettingsSession.qml
@@ -30,141 +30,182 @@ AccordionItem {
Column {
id: activeSessionsItem
bottomPadding: Theme.paddingMedium
- property variant activeSessions;
- property bool loaded : false;
+ property variant activeSessions
+ property int inactiveSessionsTtlDays
Component.onCompleted: {
if (!activeSessions) {
tdLibWrapper.getActiveSessions();
- } else {
- activeSessionsItem.loaded = true;
}
}
Connections {
target: tdLibWrapper
onSessionsReceived: {
- activeSessionsItem.activeSessions = sessions;
- activeSessionsItem.loaded = true;
+ activeSessionsItem.activeSessions = sessions
+ activeSessionsItem.inactiveSessionsTtlDays = inactive_session_ttl_days
}
onOkReceived: {
if (request === "terminateSession") {
appNotification.show(qsTr("Session was terminated"));
- activeSessionsItem.loaded = false;
tdLibWrapper.getActiveSessions();
}
}
}
Loader {
- id: sessionInformationLoader
active: tdLibWrapper.authorizationState === TelegramAPI.AuthorizationReady
width: parent.width
sourceComponent: Component {
- SilicaListView {
- id: activeSessionsListView
- width: parent.width
- height: contentHeight
- model: activeSessionsItem.activeSessions
- headerPositioning: ListView.OverlayHeader
- header: Separator {
- width: parent.width
- color: Theme.primaryColor
- horizontalAlignment: Qt.AlignHCenter
+ Column {
+ BusyIndicator {
+ anchors.horizontalCenter: parent.horizontalCenter
+ running: !activeSessionsListView.count && !activeSessionsItem.inactiveSessionsTtlDays
+ size: BusyIndicatorSize.Medium
+ visible: opacity > 0
+ height: running ? implicitHeight : 0
}
- delegate: ListItem {
- id: activeSessionListItem
+
+ SilicaListView {
+ id: activeSessionsListView
width: parent.width
- contentHeight: activeSessionColumn.height + ( 2 * Theme.paddingMedium )
-
- menu: ContextMenu {
- hasContent: !modelData.is_current
- onHeightChanged: {
- if (parent && flickable) {
- // Make sure we are inside the screen area
- var bottom = parent.mapToItem(flickable, x, y).y + height
- if (bottom > flickable.height) {
- flickable.contentY += bottom - flickable.height
- }
- }
- }
- MenuItem {
- onClicked: {
- var sessionId = modelData.id;
- Remorse.itemAction(activeSessionListItem, qsTr("Terminating session"), function() { tdLibWrapper.terminateSession(sessionId); });
- }
- text: qsTr("Terminate Session")
- }
- }
-
- Column {
- id: activeSessionColumn
- width: parent.width - ( 2 * Theme.horizontalPageMargin )
- spacing: Theme.paddingSmall
- anchors.verticalCenter: parent.verticalCenter
- anchors.horizontalCenter: parent.horizontalCenter
-
- Label {
- width: parent.width
- text: qsTr("This app")
- font.pixelSize: Theme.fontSizeMedium
- font.bold: true
- visible: modelData.is_current
- color: Theme.highlightColor
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: modelData.application_name + " " + modelData.application_version
- font.pixelSize: Theme.fontSizeMedium
- font.bold: true
- color: Theme.primaryColor
- maximumLineCount: 1
- elide: Text.ElideRight
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: modelData.device_model + ", " + (modelData.platform + " " + modelData.system_version).trim()
- font.pixelSize: Theme.fontSizeSmall
- color: Theme.primaryColor
- maximumLineCount: 1
- truncationMode: TruncationMode.Fade
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
-
- Label {
- width: parent.width
- text: qsTr("Active since: %1, last online: %2").arg(Functions.getDateTimeTimepoint(modelData.log_in_date)).arg(Functions.getDateTimeElapsed(modelData.last_active_date))
- font.pixelSize: Theme.fontSizeExtraSmall
- color: Theme.primaryColor
- maximumLineCount: 1
- truncationMode: TruncationMode.Fade
- anchors {
- horizontalCenter: parent.horizontalCenter
- }
- }
- }
-
- Separator {
- id: separator
- anchors {
- bottom: parent.bottom
- }
-
+ height: contentHeight
+ model: activeSessionsItem.activeSessions
+ headerPositioning: ListView.OverlayHeader
+ header: Separator {
width: parent.width
color: Theme.primaryColor
horizontalAlignment: Qt.AlignHCenter
+ visible: activeSessionsListView.count > 0
+ }
+ delegate: ListItem {
+ id: activeSessionListItem
+ width: parent.width
+ contentHeight: activeSessionColumn.height + ( 2 * Theme.paddingMedium )
+
+ menu: ContextMenu {
+ hasContent: !modelData.is_current
+ onHeightChanged: {
+ if (parent && flickable) {
+ // Make sure we are inside the screen area
+ var bottom = parent.mapToItem(flickable, x, y).y + height
+ if (bottom > flickable.height) {
+ flickable.contentY += bottom - flickable.height
+ }
+ }
+ }
+ MenuItem {
+ onClicked: {
+ var sessionId = modelData.id;
+ Remorse.itemAction(activeSessionListItem, qsTr("Terminating session"), function() { tdLibWrapper.terminateSession(sessionId); });
+ }
+ text: qsTr("Terminate Session")
+ }
+ }
+
+ Column {
+ id: activeSessionColumn
+ width: parent.width - ( 2 * Theme.horizontalPageMargin )
+ spacing: Theme.paddingSmall
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ Label {
+ width: parent.width
+ text: qsTr("This app")
+ font.pixelSize: Theme.fontSizeMedium
+ font.bold: true
+ visible: modelData.is_current
+ color: Theme.highlightColor
+ }
+
+ Label {
+ width: parent.width
+ text: modelData.application_name + " " + modelData.application_version
+ font.pixelSize: Theme.fontSizeMedium
+ font.bold: true
+ maximumLineCount: 1
+ elide: Text.ElideRight
+ }
+
+ Label {
+ width: parent.width
+ text: modelData.device_model + ", " + (modelData.platform + " " + modelData.system_version).trim()
+ font.pixelSize: Theme.fontSizeSmall
+ maximumLineCount: 1
+ truncationMode: TruncationMode.Fade
+ }
+
+ Label {
+ width: parent.width
+ text: qsTr("Active since: %1, last online: %2").arg(Functions.getDateTimeTimepoint(modelData.log_in_date)).arg(Functions.getDateTimeElapsed(modelData.last_active_date))
+ font.pixelSize: Theme.fontSizeExtraSmall
+ maximumLineCount: 1
+ truncationMode: TruncationMode.Fade
+ }
+ }
+
+ Separator {
+ anchors {
+ bottom: parent.bottom
+ }
+
+ width: parent.width
+ color: Theme.primaryColor
+ horizontalAlignment: Qt.AlignHCenter
+ }
+ }
+ }
+
+ ComboBox {
+ readonly property int ttl: activeSessionsItem.inactiveSessionsTtlDays
+ label: qsTr("Terminate old sessions if inactive for")
+ value: (currentItem && currentItem.text) ? currentItem.text : qsTr("%1 day(s)", "", ttl).arg(ttl)
+ visible: ttl > 0
+ menu: ContextMenu {
+ id: ttlMenu
+ MenuItem {
+ readonly property int days: 7
+ text: qsTr("1 week")
+ onClicked: tdLibWrapper.setInactiveSessionTtl(days)
+ }
+ MenuItem {
+ readonly property int days: 30
+ text: qsTr("1 month")
+ onClicked: tdLibWrapper.setInactiveSessionTtl(days)
+ }
+ MenuItem {
+ readonly property int days: 90
+ text: qsTr("3 months")
+ onClicked: tdLibWrapper.setInactiveSessionTtl(days)
+ }
+ MenuItem {
+ readonly property int days: 180
+ text: qsTr("6 months")
+ onClicked: tdLibWrapper.setInactiveSessionTtl(days)
+ }
+ MenuItem {
+ readonly property int days: 365
+ text: qsTr("1 year")
+ onClicked: tdLibWrapper.setInactiveSessionTtl(days)
+ }
}
+ Component.onCompleted: updateSelection()
+
+ onTtlChanged: updateSelection()
+
+ function updateSelection() {
+ var menuItems = ttlMenu.children
+ var n = menuItems.length
+ for (var i = 0; i < n; i++) {
+ if (menuItems[i].days === ttl) {
+ currentIndex = i
+ return
+ }
+ }
+ currentIndex = -1
+ }
}
}
}
diff --git a/rpm/harbour-fernschreiber.spec b/rpm/harbour-fernschreiber.spec
index 4bb0e4f..5cdd4cf 100644
--- a/rpm/harbour-fernschreiber.spec
+++ b/rpm/harbour-fernschreiber.spec
@@ -12,7 +12,7 @@ Name: harbour-fernschreiber
Summary: Fernschreiber is a Telegram client for Aurora OS
Version: 0.17
-Release: 4
+Release: 5
Group: Qt/Qt
License: LICENSE
URL: http://werkwolf.eu/
diff --git a/src/knownusersmodel.cpp b/src/knownusersmodel.cpp
index 50fdbd2..243cfeb 100644
--- a/src/knownusersmodel.cpp
+++ b/src/knownusersmodel.cpp
@@ -56,10 +56,10 @@ QVariant KnownUsersModel::data(const QModelIndex &index, int role) const
case KnownUserRole::RoleDisplay: return requestedUser;
case KnownUserRole::RoleUserId: return requestedUser.value("id");
case KnownUserRole::RoleTitle: return QString(requestedUser.value("first_name").toString() + " " + requestedUser.value("last_name").toString()).trimmed();
- case KnownUserRole::RoleUsername: return requestedUser.value("username");
- case KnownUserRole::RoleUserHandle: return QString("@" + (requestedUser.value("username").toString().isEmpty() ? requestedUser.value("id").toString() : requestedUser.value("username").toString()));
+ case KnownUserRole::RoleUsername: return requestedUser.value("usernames").toMap().value("editable_username").toString();
+ case KnownUserRole::RoleUserHandle: return QString("@" + (requestedUser.value("usernames").toMap().value("editable_username").toString().isEmpty() ? requestedUser.value("id").toString() : requestedUser.value("usernames").toMap().value("editable_username").toString()));
case KnownUserRole::RolePhotoSmall: return requestedUser.value("profile_photo").toMap().value("small");
- case KnownUserRole::RoleFilter: return QString(requestedUser.value("first_name").toString() + " " + requestedUser.value("last_name").toString() + " " + requestedUser.value("username").toString()).trimmed();
+ case KnownUserRole::RoleFilter: return QString(requestedUser.value("first_name").toString() + " " + requestedUser.value("last_name").toString() + " " + requestedUser.value("usernames").toMap().value("editable_username").toString()).trimmed();
}
}
return QVariant();
diff --git a/src/tdlibreceiver.cpp b/src/tdlibreceiver.cpp
index 11a46dc..f14eeeb 100644
--- a/src/tdlibreceiver.cpp
+++ b/src/tdlibreceiver.cpp
@@ -712,8 +712,9 @@ void TDLibReceiver::processUpdateMessageInteractionInfo(const QVariantMap &recei
void TDLibReceiver::processSessions(const QVariantMap &receivedInformation)
{
+ int inactive_session_ttl_days = receivedInformation.value("inactive_session_ttl_days").toInt();
QVariantList sessions = receivedInformation.value("sessions").toList();
- emit sessionsReceived(sessions);
+ emit sessionsReceived(inactive_session_ttl_days, sessions);
}
void TDLibReceiver::processAvailableReactions(const QVariantMap &receivedInformation)
diff --git a/src/tdlibreceiver.h b/src/tdlibreceiver.h
index a13ae04..cf6558c 100644
--- a/src/tdlibreceiver.h
+++ b/src/tdlibreceiver.h
@@ -101,7 +101,7 @@ signals:
void userPrivacySettingRulesUpdated(const QVariantMap &updatedRules);
void messageInteractionInfoUpdated(qlonglong chatId, qlonglong messageId, const QVariantMap &updatedInfo);
void okReceived(const QString &request);
- void sessionsReceived(const QVariantList &sessions);
+ void sessionsReceived(int inactive_session_ttl_days, const QVariantList &sessions);
void availableReactionsReceived(qlonglong messageId, const QStringList &reactions);
void chatUnreadMentionCountUpdated(qlonglong chatId, int unreadMentionCount);
void chatUnreadReactionCountUpdated(qlonglong chatId, int unreadReactionCount);
diff --git a/src/tdlibwrapper.cpp b/src/tdlibwrapper.cpp
index 509e7cc..f815ccf 100644
--- a/src/tdlibwrapper.cpp
+++ b/src/tdlibwrapper.cpp
@@ -48,6 +48,8 @@ namespace {
const QString LAST_NAME("last_name");
const QString FIRST_NAME("first_name");
const QString USERNAME("username");
+ const QString USERNAMES("usernames");
+ const QString EDITABLE_USERNAME("editable_username");
const QString THREAD_ID("thread_id");
const QString VALUE("value");
const QString CHAT_LIST_TYPE("chat_list_type");
@@ -185,7 +187,7 @@ void TDLibWrapper::initializeTDLibReceiver() {
connect(this->tdLibReceiver, SIGNAL(userPrivacySettingRulesUpdated(QVariantMap)), this, SLOT(handleUpdatedUserPrivacySettingRules(QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(messageInteractionInfoUpdated(qlonglong, qlonglong, QVariantMap)), this, SIGNAL(messageInteractionInfoUpdated(qlonglong, qlonglong, QVariantMap)));
connect(this->tdLibReceiver, SIGNAL(okReceived(QString)), this, SIGNAL(okReceived(QString)));
- connect(this->tdLibReceiver, SIGNAL(sessionsReceived(QVariantList)), this, SIGNAL(sessionsReceived(QVariantList)));
+ connect(this->tdLibReceiver, SIGNAL(sessionsReceived(int, QVariantList)), this, SIGNAL(sessionsReceived(int, QVariantList)));
connect(this->tdLibReceiver, SIGNAL(availableReactionsReceived(qlonglong, QStringList)), this, SIGNAL(availableReactionsReceived(qlonglong, QStringList)));
connect(this->tdLibReceiver, SIGNAL(chatUnreadMentionCountUpdated(qlonglong, int)), this, SIGNAL(chatUnreadMentionCountUpdated(qlonglong, int)));
connect(this->tdLibReceiver, SIGNAL(chatUnreadReactionCountUpdated(qlonglong, int)), this, SIGNAL(chatUnreadReactionCountUpdated(qlonglong, int)));
@@ -411,19 +413,10 @@ QVariantMap TDLibWrapper::newSendMessageRequest(qlonglong chatId, qlonglong repl
request.insert(_TYPE, "sendMessage");
request.insert(CHAT_ID, chatId);
if (replyToMessageId) {
- if (versionNumber > VERSION_NUMBER(1,8,14)) {
- QVariantMap replyTo;
- if (versionNumber > VERSION_NUMBER(1,8,20)) {
- replyTo.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE);
- } else {
- replyTo.insert(_TYPE, TYPE_MESSAGE_REPLY_TO_MESSAGE);
- }
- replyTo.insert(CHAT_ID, chatId);
- replyTo.insert(MESSAGE_ID, replyToMessageId);
- request.insert(REPLY_TO, replyTo);
- } else {
- request.insert(REPLY_TO_MESSAGE_ID, replyToMessageId);
- }
+ QVariantMap replyTo;
+ replyTo.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE);
+ replyTo.insert(MESSAGE_ID, replyToMessageId);
+ request.insert(REPLY_TO, replyTo);
}
return request;
}
@@ -1527,6 +1520,14 @@ void TDLibWrapper::setNetworkType(NetworkType networkType)
this->sendRequest(requestObject);
}
+void TDLibWrapper::setInactiveSessionTtl(int days)
+{
+ QVariantMap requestObject;
+ requestObject.insert(_TYPE, "setInactiveSessionTtl");
+ requestObject.insert("inactive_session_ttl_days", days);
+ this->sendRequest(requestObject);
+}
+
void TDLibWrapper::searchEmoji(const QString &queryString)
{
LOG("Searching emoji" << queryString);
@@ -1838,9 +1839,9 @@ void TDLibWrapper::handleUserUpdated(const QVariantMap &userInformation)
this->userInformation = userInformation;
emit ownUserUpdated(userInformation);
}
- LOG("User information updated:" << userInformation.value(USERNAME).toString() << userInformation.value(FIRST_NAME).toString() << userInformation.value(LAST_NAME).toString());
+ LOG("User information updated:" << userInformation.value(USERNAMES).toMap().value(EDITABLE_USERNAME).toString() << userInformation.value(FIRST_NAME).toString() << userInformation.value(LAST_NAME).toString());
this->allUsers.insert(updatedUserId, userInformation);
- this->allUserNames.insert(userInformation.value(USERNAME).toString(), userInformation);
+ this->allUserNames.insert(userInformation.value(USERNAMES).toMap().value(EDITABLE_USERNAME).toString(), userInformation);
emit userUpdated(updatedUserId, userInformation);
}
@@ -1854,7 +1855,7 @@ void TDLibWrapper::handleUserStatusUpdated(const QString &userId, const QVariant
QVariantMap updatedUserInformation = this->allUsers.value(userId).toMap();
updatedUserInformation.insert(STATUS, userStatusInformation);
this->allUsers.insert(userId, updatedUserInformation);
- this->allUserNames.insert(userInformation.value(USERNAME).toString(), userInformation);
+ this->allUserNames.insert(userInformation.value(USERNAMES).toMap().value(EDITABLE_USERNAME).toString(), userInformation);
emit userUpdated(userId, updatedUserInformation);
}
diff --git a/src/tdlibwrapper.h b/src/tdlibwrapper.h
index 33e29b4..17a0896 100644
--- a/src/tdlibwrapper.h
+++ b/src/tdlibwrapper.h
@@ -251,6 +251,7 @@ public:
Q_INVOKABLE void getPageSource(const QString &address);
Q_INVOKABLE void setMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction);
Q_INVOKABLE void setNetworkType(NetworkType networkType);
+ Q_INVOKABLE void setInactiveSessionTtl(int days);
// Others (candidates for extraction ;))
Q_INVOKABLE void searchEmoji(const QString &queryString);
@@ -331,7 +332,7 @@ signals:
void userPrivacySettingUpdated(UserPrivacySetting setting, UserPrivacySettingRule rule);
void messageInteractionInfoUpdated(qlonglong chatId, qlonglong messageId, const QVariantMap &updatedInfo);
void okReceived(const QString &request);
- void sessionsReceived(const QVariantList &sessions);
+ void sessionsReceived(int inactive_session_ttl_days, const QVariantList &sessions);
void openFileExternally(const QString &filePath);
void availableReactionsReceived(qlonglong messageId, const QStringList &reactions);
void chatUnreadMentionCountUpdated(qlonglong chatId, int unreadMentionCount);
diff --git a/translations/harbour-fernschreiber-de.ts b/translations/harbour-fernschreiber-de.ts
index e701ecb..4359431 100644
--- a/translations/harbour-fernschreiber-de.ts
+++ b/translations/harbour-fernschreiber-de.ts
@@ -1704,6 +1704,37 @@
Sitzungen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-en.ts b/translations/harbour-fernschreiber-en.ts
index f746fae..fd4880b 100644
--- a/translations/harbour-fernschreiber-en.ts
+++ b/translations/harbour-fernschreiber-en.ts
@@ -1706,6 +1706,37 @@ messages
Active since: %1, last online: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-es.ts b/translations/harbour-fernschreiber-es.ts
index 13edb64..b342d05 100644
--- a/translations/harbour-fernschreiber-es.ts
+++ b/translations/harbour-fernschreiber-es.ts
@@ -1704,6 +1704,37 @@
Activo desde: %1, último en línea: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-fi.ts b/translations/harbour-fernschreiber-fi.ts
index 0a8fed4..86538d5 100644
--- a/translations/harbour-fernschreiber-fi.ts
+++ b/translations/harbour-fernschreiber-fi.ts
@@ -1705,6 +1705,37 @@
Aktiivinen %1 alkaen, viimeksi paikalla: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-fr.ts b/translations/harbour-fernschreiber-fr.ts
index 3c6b609..71bdeb8 100644
--- a/translations/harbour-fernschreiber-fr.ts
+++ b/translations/harbour-fernschreiber-fr.ts
@@ -1704,6 +1704,37 @@
Actif depuis : %1, en ligne : %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-hu.ts b/translations/harbour-fernschreiber-hu.ts
index 2f3e0e8..3cb6616 100644
--- a/translations/harbour-fernschreiber-hu.ts
+++ b/translations/harbour-fernschreiber-hu.ts
@@ -1677,6 +1677,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-it.ts b/translations/harbour-fernschreiber-it.ts
index 23ca0ec..b68a0d0 100644
--- a/translations/harbour-fernschreiber-it.ts
+++ b/translations/harbour-fernschreiber-it.ts
@@ -1704,6 +1704,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-pl.ts b/translations/harbour-fernschreiber-pl.ts
index 8dacef3..d4a1cf9 100644
--- a/translations/harbour-fernschreiber-pl.ts
+++ b/translations/harbour-fernschreiber-pl.ts
@@ -1731,6 +1731,38 @@
Aktywny od: %1, ostatnio aktywny: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-ru.ts b/translations/harbour-fernschreiber-ru.ts
index ecc4a97..125ba7c 100644
--- a/translations/harbour-fernschreiber-ru.ts
+++ b/translations/harbour-fernschreiber-ru.ts
@@ -1734,6 +1734,38 @@
Активен с: %1, был онлайн: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-sk.ts b/translations/harbour-fernschreiber-sk.ts
index 3c8b4ac..1a97fe2 100644
--- a/translations/harbour-fernschreiber-sk.ts
+++ b/translations/harbour-fernschreiber-sk.ts
@@ -1731,6 +1731,38 @@
Aktívna od: %1, naposledy pripojená: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-sv.ts b/translations/harbour-fernschreiber-sv.ts
index 10b0e60..705125b 100644
--- a/translations/harbour-fernschreiber-sv.ts
+++ b/translations/harbour-fernschreiber-sv.ts
@@ -1704,6 +1704,37 @@
Aktiv sedan: %1, senast online: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber-zh_CN.ts b/translations/harbour-fernschreiber-zh_CN.ts
index 8837c24..d5fa60d 100644
--- a/translations/harbour-fernschreiber-zh_CN.ts
+++ b/translations/harbour-fernschreiber-zh_CN.ts
@@ -1678,6 +1678,36 @@
活跃时间: %1, 上次在线: %2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage
diff --git a/translations/harbour-fernschreiber.ts b/translations/harbour-fernschreiber.ts
index 1423125..69001f7 100644
--- a/translations/harbour-fernschreiber.ts
+++ b/translations/harbour-fernschreiber.ts
@@ -1704,6 +1704,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
SettingsStorage