Compare commits
53 commits
master
...
upstream_m
Author | SHA1 | Date | |
---|---|---|---|
|
fafa2ba355 | ||
|
e0019d33d6 | ||
|
2fad48e359 | ||
|
047ea51d0e | ||
|
a1277fe79a | ||
|
ab647e6e4d | ||
|
4af73184b2 | ||
|
c1ab982cb1 | ||
|
b2363af36f | ||
|
47ee85915d | ||
|
4ed9495376 | ||
|
2dd1d2c380 | ||
|
bba4a6468c | ||
|
64479f0dd3 | ||
|
8eda82da18 | ||
|
07fdabc178 | ||
|
80ecf50e74 | ||
|
8258867407 | ||
|
61faf0f407 | ||
|
24edb17347 | ||
|
98f067cda8 | ||
|
57017e8bff | ||
|
84594e4c2c | ||
|
2ae4e2eb05 | ||
|
bada6fb3e2 | ||
|
16bcef3c78 | ||
|
02b6dd2e6d | ||
|
256514e55d | ||
|
4b9732b64f | ||
|
75bf146154 | ||
|
58382ac1b6 | ||
|
5b2fa38f7e | ||
|
8d59ee4c00 | ||
|
acfcfd3ca4 | ||
|
195e255f08 | ||
|
8531a46015 | ||
|
f133586aa2 | ||
|
ea89ef4fcd | ||
|
00deaa79fd | ||
|
61e3e366e6 | ||
|
0224d2f338 | ||
|
3ac8cebc06 | ||
|
f771a9a81b | ||
|
b11f7dd8b1 | ||
|
3620b8ed03 | ||
|
e44c69281c | ||
|
3ab0b94831 | ||
|
1ffcfb48ca | ||
|
6b0e54ec65 | ||
|
de7b119941 | ||
|
527b2c3c9a | ||
|
2b51405743 | ||
|
1ee8d134bc |
4
.github/workflows/main.yml
vendored
|
@ -84,7 +84,7 @@ jobs:
|
|||
assets+=("-a" "$asset")
|
||||
done
|
||||
tag_name="${GITHUB_REF##*/}"
|
||||
hub release create "${assets[@]}" -m "$tag_name" "$tag_name"
|
||||
gh release create "$tag_name" "${assets[@]}"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
@ -97,6 +97,6 @@ jobs:
|
|||
assets+=("-a" "$asset")
|
||||
done
|
||||
tag_name="${GITHUB_REF##*/}"
|
||||
hub release create -p "${assets[@]}" -m "$tag_name" -m "This is a pre-release for testing purposes only. It may or may not be unstable." -m "Join the Telegram group to help out: https://github.com/Wunderfitz/harbour-fernschreiber/issues/162" "$tag_name"
|
||||
gh release create "$tag_name" -p -n "This is a pre-release for testing purposes only. It may or may not be unstable." "${assets[@]}"
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
|
@ -14,7 +14,11 @@ Fernschreiber wouldn't be the same without all the people helping in making it b
|
|||
- Chat info page, performance improvements to chat page, location support, app initialization/registration with Telegram, project dependencies, emoji handling, qml/js optimizations, multi-message actions, i18n fixes, chat permission handling, code reviews, logging categories, bot support, github build: [jgibbon](https://github.com/jgibbon)
|
||||
- Copy message to clipboard: [Christian Stemmle](https://github.com/chstem)
|
||||
- Hide send message button if send-by-enter is switched on, focus text input on entering a chat: [santhoshmanikandan](https://github.com/santhoshmanikandan)
|
||||
- Integration of logout and sesison options to settings page: [Peter G.](https://github.com/nephros)
|
||||
- Integration of logout and sesison options to settings page, search results optimization, highlight unread conversations: [Peter G.](https://github.com/nephros)
|
||||
- Option to always append last message in notifications: [Johannes Bachmann](https://github.com/dscheinah)
|
||||
- Option to jump to quoted message, widescreen UI adjustments: [Mikhail Barashkov](https://github.com/mbarashkov)
|
||||
|
||||
This list might not be complete. In case I forgot something/somebody, please let me know or create a PR, thanks! :)
|
||||
|
||||
### Logo/Icon
|
||||
- Designed by [Matteo](https://github.com/iamnomeutente), adjustments by [Slava Monich](https://github.com/monich)
|
||||
|
@ -48,7 +52,7 @@ const char TDLIB_API_HASH[] = "1234567890abcdef1234567890abcdef";
|
|||
|
||||
You get the Telegram API ID and hash as soon as you've registered your own application on [https://my.telegram.org](https://my.telegram.org).
|
||||
|
||||
Moreover, you need to have a compiled version of [TDLib 1.8.3](https://github.com/tdlib/td) or higher in the sub-directory `tdlib`. This sub-directory must contain another sub-directory that fits to the target device architecture (e.g. armv7hl, i486). Within this directory, there needs to be a folder called `lib` that contains at least `libtdjson.so`. For armv7hl the relative path would consequently be `tdlib/armv7hl/lib`.
|
||||
Moreover, you need to have a compiled version of [TDLib 1.8.21](https://github.com/tdlib/td) or higher in the sub-directory `tdlib`. This sub-directory must contain another sub-directory that fits to the target device architecture (e.g. armv7hl, i486). Within this directory, there needs to be a folder called `lib` that contains at least `libtdjson.so`. For armv7hl the relative path would consequently be `tdlib/armv7hl/lib`.
|
||||
|
||||
You may just want to download the [tdlib.zip from our fork](https://github.com/Wunderfitz/td/releases) to just use the exact version of the latest official Fernschreiber release. To use it, you need to extract it into your local `tdlib/` folder as described above. If so, you're done and can compile Fernschreiber using the Sailfish SDK. If you want to build TDLib for yourself, please keep on reading.
|
||||
|
||||
|
|
BIN
db/emojis.db
|
@ -6,6 +6,6 @@ Exec=harbour-fernschreiber
|
|||
Name=Fernschreiber
|
||||
|
||||
[X-Sailjail]
|
||||
Permissions=Audio;Contacts;Documents;Downloads;Internet;Location;MediaIndexing;Microphone;Music;Pictures;PublicDir;RemovableMedia;UserDirs;Videos
|
||||
Permissions=Audio;Contacts;Documents;Downloads;Internet;Location;MediaIndexing;Microphone;Music;Pictures;Privileged;PublicDir;RemovableMedia;UserDirs;Videos
|
||||
OrganizationName=de.ygriega
|
||||
ApplicationName=fernschreiber
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -47,6 +47,7 @@ ListItem {
|
|||
readonly property bool canDeleteMessage: myMessage.can_be_deleted_for_all_users || (myMessage.can_be_deleted_only_for_self && myMessage.chat_id === page.myUserId)
|
||||
property bool hasContentComponent
|
||||
property bool additionalOptionsOpened
|
||||
property bool wasNavigatedTo: false
|
||||
|
||||
readonly property var additionalItemsModel: (extraContentLoader.item && ("extraContextMenuItems" in extraContentLoader.item)) ?
|
||||
extraContentLoader.item.extraContextMenuItems : 0
|
||||
|
@ -64,9 +65,10 @@ ListItem {
|
|||
readonly property bool showForwardMessageMenuItem: (baseContextMenuItemCount + 2) <= maxContextMenuItemCount
|
||||
// And don't count "More Options..." for "Delete Message" if "Delete Message" is the only extra option
|
||||
readonly property bool haveSpaceForDeleteMessageMenuItem: (baseContextMenuItemCount + 3 - (deleteMessageIsOnlyExtraOption ? 1 : 0)) <= maxContextMenuItemCount
|
||||
property var chatReactions
|
||||
property var messageReactions
|
||||
|
||||
highlighted: (down || isSelected || additionalOptionsOpened) && !menuOpen
|
||||
highlighted: (down || isSelected || additionalOptionsOpened || wasNavigatedTo) && !menuOpen
|
||||
openMenuOnPressAndHold: !messageListItem.precalculatedValues.pageIsSelecting
|
||||
|
||||
signal replyToMessage()
|
||||
|
@ -94,20 +96,43 @@ ListItem {
|
|||
}
|
||||
}
|
||||
|
||||
function getInteractionText(viewCount, reactions) {
|
||||
function getInteractionText(viewCount, reactions, size, highlightColor) {
|
||||
var interactionText = "";
|
||||
if (viewCount > 0) {
|
||||
interactionText = Emoji.emojify("👁️", Theme.fontSizeTiny) + Functions.getShortenedCount(viewCount);
|
||||
interactionText = Emoji.emojify("👁️ ", size) + Functions.getShortenedCount(viewCount);
|
||||
}
|
||||
for (var i = 0; i < reactions.length; i++) {
|
||||
interactionText += ( " " + Emoji.emojify(reactions[i].reaction, Theme.fontSizeTiny) );
|
||||
var reaction = reactions[i]
|
||||
var reactionText = reaction.reaction ? reaction.reaction : (reaction.type && reaction.type.emoji) ? reaction.type.emoji : ""
|
||||
if (reactionText) {
|
||||
interactionText += ( " " + Emoji.emojify(reactionText, size) );
|
||||
if (!chatPage.isPrivateChat) {
|
||||
interactionText += ( " " + Functions.getShortenedCount(reactions[i].total_count) );
|
||||
var count = Functions.getShortenedCount(reaction.total_count)
|
||||
interactionText += " "
|
||||
interactionText += (reaction.is_chosen ? ( "<font color='" + highlightColor + "'><b>" + count + "</b></font>" ) : count)
|
||||
}
|
||||
}
|
||||
}
|
||||
return interactionText;
|
||||
}
|
||||
|
||||
function openReactions() {
|
||||
if (messageListItem.chatReactions) {
|
||||
Debug.log("Using chat reactions")
|
||||
messageListItem.messageReactions = chatReactions
|
||||
showItemCompletelyTimer.requestedIndex = index;
|
||||
showItemCompletelyTimer.start();
|
||||
} else {
|
||||
Debug.log("Obtaining message reactions")
|
||||
tdLibWrapper.getMessageAvailableReactions(messageListItem.chatId, messageListItem.messageId);
|
||||
}
|
||||
selectReactionBubble.visible = false;
|
||||
}
|
||||
|
||||
function getContentWidthMultiplier() {
|
||||
return Functions.isWidescreen(appWindow) ? 0.4 : 1.0
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
if (messageListItem.precalculatedValues.pageIsSelecting) {
|
||||
page.toggleMessageSelection(myMessage);
|
||||
|
@ -125,12 +150,18 @@ ListItem {
|
|||
|
||||
if (messageListItem.messageReactions) {
|
||||
messageListItem.messageReactions = null;
|
||||
selectReactionBubble.visible = false;
|
||||
} else {
|
||||
tdLibWrapper.getMessageAvailableReactions(messageListItem.chatId, messageListItem.messageId);
|
||||
selectReactionBubble.visible = !selectReactionBubble.visible;
|
||||
elementSelected(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onDoubleClicked: {
|
||||
openReactions();
|
||||
}
|
||||
|
||||
onPressAndHold: {
|
||||
if (openMenuOnPressAndHold) {
|
||||
openContextMenu()
|
||||
|
@ -154,6 +185,25 @@ ListItem {
|
|||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: chatPage
|
||||
onResetElements: {
|
||||
messageListItem.messageReactions = null;
|
||||
selectReactionBubble.visible = false;
|
||||
}
|
||||
onElementSelected: {
|
||||
if (elementIndex !== index) {
|
||||
selectReactionBubble.visible = false;
|
||||
}
|
||||
}
|
||||
onNavigatedTo: {
|
||||
if (targetIndex === index) {
|
||||
messageListItem.wasNavigatedTo = true;
|
||||
restoreNormalityTimer.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: contextMenuLoader
|
||||
active: false
|
||||
|
@ -258,6 +308,9 @@ ListItem {
|
|||
messageListItem.messageReactions = null;
|
||||
}
|
||||
}
|
||||
onReactionsUpdated: {
|
||||
chatReactions = tdLibWrapper.getChatReactions(page.chatInformation.id);
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
|
@ -270,15 +323,33 @@ ListItem {
|
|||
interval: 200
|
||||
triggeredOnStart: false
|
||||
onTriggered: {
|
||||
Debug.log("Show item completely timer triggered, requested index: " + requestedIndex + ", current index: " + index)
|
||||
if (requestedIndex === index) {
|
||||
chatView.highlightMoveDuration = -1;
|
||||
chatView.highlightResizeDuration = -1;
|
||||
chatView.scrollToIndex(requestedIndex);
|
||||
chatView.highlightMoveDuration = 0;
|
||||
chatView.highlightResizeDuration = 0;
|
||||
var p = chatView.contentItem.mapFromItem(reactionsColumn, 0, 0)
|
||||
if (chatView.contentY > p.y || p.y + reactionsColumn.height > chatView.contentY + chatView.height) {
|
||||
Debug.log("Moving reactions for item at", requestedIndex, "info the view")
|
||||
chatView.highlightMoveDuration = -1
|
||||
chatView.highlightResizeDuration = -1
|
||||
chatView.scrollToIndex(requestedIndex, height <= chatView.height ? ListView.Contain : ListView.End)
|
||||
chatView.highlightMoveDuration = 0
|
||||
chatView.highlightResizeDuration = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: restoreNormalityTimer
|
||||
|
||||
repeat: false
|
||||
running: false
|
||||
interval: 1000
|
||||
triggeredOnStart: false
|
||||
onTriggered: {
|
||||
Debug.log("Restore normality for index " + index);
|
||||
messageListItem.wasNavigatedTo = false;
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
delegateComponentLoadingTimer.start();
|
||||
|
@ -322,8 +393,10 @@ ListItem {
|
|||
id: messageTextRow
|
||||
spacing: Theme.paddingSmall
|
||||
width: precalculatedValues.entryWidth
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.horizontalCenter: Functions.isWidescreen(appWindow) ? undefined : parent.horizontalCenter
|
||||
anchors.left: Functions.isWidescreen(appWindow) ? parent.left : undefined
|
||||
y: Theme.paddingSmall
|
||||
anchors.leftMargin: Functions.isWidescreen(appWindow) ? Theme.paddingMedium : undefined
|
||||
|
||||
Loader {
|
||||
id: profileThumbnailLoader
|
||||
|
@ -440,8 +513,12 @@ ListItem {
|
|||
page.toggleMessageSelection(myMessage)
|
||||
} else {
|
||||
messageOptionsDrawer.open = false
|
||||
messageOverlayLoader.overlayMessage = messageInReplyToRow.inReplyToMessage
|
||||
if(appSettings.goToQuotedMessage) {
|
||||
chatPage.showMessage(messageInReplyToRow.inReplyToMessage.id, true)
|
||||
} else {
|
||||
messageOverlayLoader.active = true
|
||||
messageOverlayLoader.overlayMessage = messageInReplyToRow.inReplyToMessage
|
||||
}
|
||||
}
|
||||
}
|
||||
onPressAndHold: {
|
||||
|
@ -467,11 +544,12 @@ ListItem {
|
|||
width: parent.width
|
||||
|
||||
Component.onCompleted: {
|
||||
if (myMessage.forward_info.origin["@type"] === "messageForwardOriginChannel") {
|
||||
var originType = myMessage.forward_info.origin["@type"]
|
||||
if (originType === "messageOriginChannel" || originType === "messageForwardOriginChannel") {
|
||||
var otherChatInformation = tdLibWrapper.getChat(myMessage.forward_info.origin.chat_id);
|
||||
forwardedThumbnail.photoData = (typeof otherChatInformation.photo !== "undefined") ? otherChatInformation.photo.small : {};
|
||||
forwardedChannelText.text = Emoji.emojify(otherChatInformation.title, Theme.fontSizeExtraSmall);
|
||||
} else if (myMessage.forward_info.origin["@type"] === "messageForwardOriginUser") {
|
||||
} else if (originType === "messageOriginUser" || originType === "messageForwardOriginUser") {
|
||||
var otherUserInformation = tdLibWrapper.getUserInformation(myMessage.forward_info.origin.sender_user_id);
|
||||
forwardedThumbnail.photoData = (typeof otherUserInformation.profile_photo !== "undefined") ? otherUserInformation.profile_photo.small : {};
|
||||
forwardedChannelText.text = Emoji.emojify(Functions.getUserName(otherUserInformation), Theme.fontSizeExtraSmall);
|
||||
|
@ -552,7 +630,7 @@ ListItem {
|
|||
id: webPagePreviewLoader
|
||||
active: false
|
||||
asynchronous: true
|
||||
width: parent.width
|
||||
width: parent.width * getContentWidthMultiplier()
|
||||
height: (status === Loader.Ready) ? item.implicitHeight : myMessage.content.web_page ? precalculatedValues.webPagePreviewHeight : 0
|
||||
|
||||
sourceComponent: Component {
|
||||
|
@ -566,7 +644,7 @@ ListItem {
|
|||
|
||||
Loader {
|
||||
id: extraContentLoader
|
||||
width: parent.width
|
||||
width: parent.width * getContentWidthMultiplier()
|
||||
asynchronous: true
|
||||
height: item ? item.height : (messageListItem.hasContentComponent ? chatView.getContentComponentHeight(model.content_type, myMessage.content, width) : 0)
|
||||
}
|
||||
|
@ -625,7 +703,7 @@ ListItem {
|
|||
height: ( ( chatPage.isChannel && messageViewCount > 0 ) || reactions.length > 0 ) ? ( Theme.fontSizeExtraSmall + Theme.paddingSmall ) : 0
|
||||
sourceComponent: Component {
|
||||
Label {
|
||||
text: getInteractionText(messageViewCount, reactions)
|
||||
text: getInteractionText(messageViewCount, reactions, font.pixelSize, Theme.highlightColor)
|
||||
width: parent.width
|
||||
font.pixelSize: Theme.fontSizeTiny
|
||||
color: messageListItem.isOwnMessage ? Theme.secondaryHighlightColor : Theme.secondaryColor
|
||||
|
@ -633,12 +711,50 @@ ListItem {
|
|||
textFormat: Text.StyledText
|
||||
maximumLineCount: 1
|
||||
elide: Text.ElideRight
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
if (messageListItem.messageReactions) {
|
||||
messageListItem.messageReactions = null;
|
||||
selectReactionBubble.visible = false;
|
||||
} else {
|
||||
openReactions();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: selectReactionBubble
|
||||
visible: false
|
||||
opacity: visible ? 0.5 : 0.0
|
||||
Behavior on opacity { NumberAnimation {} }
|
||||
anchors {
|
||||
horizontalCenter: messageListItem.isOwnMessage ? messageBackground.left : messageBackground.right
|
||||
verticalCenter: messageBackground.verticalCenter
|
||||
}
|
||||
height: Theme.itemSizeExtraSmall
|
||||
width: Theme.itemSizeExtraSmall
|
||||
color: Theme.primaryColor
|
||||
radius: parent.width / 2
|
||||
}
|
||||
|
||||
IconButton {
|
||||
id: selectReactionButton
|
||||
visible: selectReactionBubble.visible
|
||||
opacity: visible ? 1.0 : 0.0
|
||||
Behavior on opacity { NumberAnimation {} }
|
||||
icon.source: "image://theme/icon-s-favorite"
|
||||
anchors.centerIn: selectReactionBubble
|
||||
onClicked: {
|
||||
openReactions();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -647,7 +763,7 @@ ListItem {
|
|||
id: reactionsColumn
|
||||
width: parent.width - ( 2 * Theme.horizontalPageMargin )
|
||||
anchors.top: messageTextRow.bottom
|
||||
anchors.topMargin: Theme.paddingSmall
|
||||
anchors.topMargin: Theme.paddingMedium
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: messageListItem.messageReactions ? ( messageListItem.messageReactions.length > 0 ? true : false ) : false
|
||||
opacity: messageListItem.messageReactions ? ( messageListItem.messageReactions.length > 0 ? 1 : 0 ) : 0
|
||||
|
@ -656,7 +772,7 @@ ListItem {
|
|||
|
||||
Flickable {
|
||||
width: parent.width
|
||||
height: reactionsResultRow.height + Theme.paddingSmall
|
||||
height: reactionsResultRow.height + 2 * Theme.paddingMedium
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
contentWidth: reactionsResultRow.width
|
||||
clip: true
|
||||
|
@ -672,13 +788,13 @@ ListItem {
|
|||
|
||||
Row {
|
||||
id: singleReactionRow
|
||||
spacing: Theme.paddingSmall
|
||||
spacing: Theme.paddingMedium
|
||||
|
||||
Image {
|
||||
id: emojiPicture
|
||||
source: Emoji.getEmojiPath(modelData)
|
||||
width: Theme.fontSizeLarge
|
||||
height: Theme.fontSizeLarge
|
||||
width: status === Image.Ready ? Theme.fontSizeExtraLarge : 0
|
||||
height: Theme.fontSizeExtraLarge
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -686,12 +802,26 @@ ListItem {
|
|||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
tdLibWrapper.setMessageReaction(messageListItem.chatId, messageListItem.messageId, modelData);
|
||||
messageListItem.messageReactions = null;
|
||||
for (var i = 0; i < reactions.length; i++) {
|
||||
var reaction = reactions[i]
|
||||
var reactionText = reaction.reaction ? reaction.reaction : (reaction.type && reaction.type.emoji) ? reaction.type.emoji : ""
|
||||
if (reactionText === modelData) {
|
||||
if (reaction.is_chosen) {
|
||||
// Reaction is already selected
|
||||
tdLibWrapper.removeMessageReaction(chatId, messageId, reactionText)
|
||||
messageReactions = null
|
||||
return
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
// Reaction is not yet selected
|
||||
tdLibWrapper.addMessageReaction(chatId, messageId, modelData)
|
||||
messageReactions = null
|
||||
selectReactionBubble.visible = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,9 +40,11 @@ Flickable {
|
|||
|
||||
function getOriginalAuthor(forwardInformation, fontSize) {
|
||||
switch (forwardInformation.origin["@type"]) {
|
||||
case "messageOriginChannel":
|
||||
case "messageForwardOriginChannel":
|
||||
var otherChatInformation = tdLibWrapper.getChat(forwardInformation.origin.chat_id);
|
||||
return Emoji.emojify(otherChatInformation.title, fontSize);
|
||||
case "messageOriginUser":
|
||||
case "messageForwardOriginUser":
|
||||
var otherUserInformation = tdLibWrapper.getUserInformation(forwardInformation.origin.sender_id.user_id);
|
||||
return Emoji.emojify(Functions.getUserName(otherUserInformation), fontSize);
|
||||
|
|
|
@ -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("<a style=\"text-decoration: none; font-weight: bold; color:"+Theme.primaryColor+"\" href=\"userId://" + message.via_bot_user_id + "\">@" + Emoji.emojify(botUserInformation.username, font.pixelSize)+"</a>")
|
||||
text: qsTr("via %1", "message posted via bot user").arg("<a style=\"text-decoration: none; font-weight: bold; color:"+Theme.primaryColor+"\" href=\"userId://" + message.via_bot_user_id + "\">@" + Emoji.emojify(botUserInformation.usernames.editable_username, font.pixelSize)+"</a>")
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import QtQuick 2.6
|
||||
import Sailfish.Silica 1.0
|
||||
import WerkWolf.Fernschreiber 1.0
|
||||
import "../js/functions.js" as Functions
|
||||
|
||||
ListItem {
|
||||
id: chatListViewItem
|
||||
|
@ -103,31 +104,42 @@ ListItem {
|
|||
anchors.centerIn: chatUnreadMessagesCountBackground
|
||||
visible: chatListViewItem.unreadCount > 0
|
||||
opacity: isMuted ? Theme.opacityHigh : 1.0
|
||||
text: chatListViewItem.unreadCount > 99 ? "99+" : chatListViewItem.unreadCount
|
||||
text: Functions.formatUnreadCount(chatListViewItem.unreadCount)
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
id: chatUnreadReactionCountBackground
|
||||
color: isMuted ? ((Theme.colorScheme === Theme.DarkOnLight) ? "lightgray" : "dimgray") : Theme.highlightBackgroundColor
|
||||
width: Theme.fontSizeLarge
|
||||
height: Theme.fontSizeLarge
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
radius: parent.width / 2
|
||||
visible: chatListViewItem.unreadReactionCount > 0
|
||||
}
|
||||
visible: chatListViewItem.unreadReactionCount > 0 || chatListViewItem.unreadMentionCount > 0
|
||||
|
||||
Icon {
|
||||
source: "image://theme/icon-s-favorite"
|
||||
height: Theme.iconSizeExtraSmall
|
||||
width: Theme.iconSizeExtraSmall
|
||||
highlighted: chatListViewItem.highlighted
|
||||
anchors.centerIn: chatUnreadReactionCountBackground
|
||||
visible: chatListViewItem.unreadReactionCount > 0
|
||||
anchors.centerIn: parent
|
||||
visible: chatListViewItem.unreadReactionCount > 0 && !chatListViewItem.unreadMentionCount
|
||||
}
|
||||
|
||||
Text {
|
||||
font {
|
||||
pixelSize: Theme.iconSizeExtraSmall
|
||||
bold: true
|
||||
}
|
||||
color: Theme.primaryColor
|
||||
anchors.centerIn: parent
|
||||
visible: chatListViewItem.unreadMentionCount > 0
|
||||
opacity: isMuted ? Theme.opacityHigh : 1.0
|
||||
text: "@"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
id: contentColumn
|
||||
anchors {
|
||||
|
@ -150,6 +162,9 @@ ListItem {
|
|||
truncationMode: TruncationMode.Fade
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
width: Math.min(contentColumn.width - (verifiedImage.visible ? (verifiedImage.width + primaryTextRow.spacing) : 0) - (mutedImage.visible ? (mutedImage.width + primaryTextRow.spacing) : 0), implicitWidth)
|
||||
font.bold: appSettings.highlightUnreadConversations && ( !chatListViewItem.isMuted && (chatListViewItem.unreadCount > 0 || chatListViewItem.isMarkedAsUnread) )
|
||||
font.italic: appSettings.highlightUnreadConversations && (chatListViewItem.unreadReactionCount > 0)
|
||||
color: (appSettings.highlightUnreadConversations && (chatListViewItem.unreadCount > 0)) ? Theme.highlightColor : Theme.primaryColor
|
||||
}
|
||||
|
||||
Image {
|
||||
|
|
|
@ -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"
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -79,7 +79,7 @@ ChatInformationTabItemBase {
|
|||
// chat title
|
||||
primaryText.text: Emoji.emojify(Functions.getUserName(user), primaryText.font.pixelSize)
|
||||
// last user
|
||||
prologSecondaryText.text: "@"+(user.username !== "" ? user.username : member_id.user_id) + (member_id.user_id === chatInformationPage.myUserId ? " " + qsTr("You") : "")
|
||||
prologSecondaryText.text: "@"+(user.username ? user.username : member_id.user_id) + (member_id.user_id === chatInformationPage.myUserId ? " " + qsTr("You") : "")
|
||||
secondaryText {
|
||||
horizontalAlignment: Text.AlignRight
|
||||
property string statusText: Functions.getChatMemberStatusText(model.status["@type"])
|
||||
|
@ -180,6 +180,9 @@ ChatInformationTabItemBase {
|
|||
for(var memberIndex in members) {
|
||||
var memberData = members[memberIndex];
|
||||
var userInfo = tdLibWrapper.getUserInformation(memberData.member_id.user_id) || {user:{}, bot_info:{}};
|
||||
if (!userInfo.username && userInfo.usernames && userInfo.usernames.active_usernames) {
|
||||
userInfo.username = userInfo.usernames.active_usernames[0]
|
||||
}
|
||||
memberData.user = userInfo;
|
||||
memberData.bot_info = memberData.bot_info || {};
|
||||
pageContent.membersList.append(memberData);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -19,9 +19,10 @@
|
|||
|
||||
import QtQuick 2.6
|
||||
import Sailfish.Silica 1.0
|
||||
import "../../js/functions.js" as Functions
|
||||
|
||||
Grid {
|
||||
width: parent.width - ( 2 * x )
|
||||
columns: (appWindow.deviceOrientation & Orientation.LandscapeMask) || Screen.sizeCategory === Screen.Large || Screen.sizeCategory === Screen.ExtraLarge ? 2 : 1
|
||||
columns: Functions.isWidescreen(appWindow) ? 2 : 1
|
||||
readonly property real columnWidth: width/columns
|
||||
}
|
||||
|
|
|
@ -70,6 +70,17 @@ AccordionItem {
|
|||
}
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
width: parent.columnWidth
|
||||
checked: appSettings.highlightUnreadConversations
|
||||
text: qsTr("Highlight unread messages")
|
||||
description: qsTr("Highlight Conversations with unread messages")
|
||||
automaticCheck: false
|
||||
onClicked: {
|
||||
appSettings.highlightUnreadConversations = !checked
|
||||
}
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
width: parent.columnWidth
|
||||
checked: appSettings.useOpenWith
|
||||
|
@ -81,6 +92,28 @@ AccordionItem {
|
|||
}
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
width: parent.columnWidth
|
||||
checked: appSettings.notificationAlwaysShowPreview
|
||||
text: qsTr("Always append message preview to notifications")
|
||||
description: qsTr("In addition to showing the number of unread messages, the latest message will also be appended to notifications.")
|
||||
automaticCheck: false
|
||||
onClicked: {
|
||||
appSettings.notificationAlwaysShowPreview = !checked
|
||||
}
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
width: parent.columnWidth
|
||||
checked: appSettings.goToQuotedMessage
|
||||
text: qsTr("Go to quoted message")
|
||||
description: qsTr("When tapping a quoted message, open it in chat instead of showing it in an overlay.")
|
||||
automaticCheck: false
|
||||
onClicked: {
|
||||
appSettings.goToQuotedMessage = !checked
|
||||
}
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
id: feedbackComboBox
|
||||
width: parent.columnWidth
|
||||
|
@ -135,35 +168,53 @@ AccordionItem {
|
|||
}
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
width: parent.columnWidth
|
||||
checked: appSettings.notificationTurnsDisplayOn && enabled
|
||||
text: qsTr("Notification turns on the display")
|
||||
Item {
|
||||
// Occupies one grid cell so that the column ends up under the combo box
|
||||
// in the landscape layout
|
||||
visible: parent.columns === 2
|
||||
width: 1
|
||||
height: 1
|
||||
}
|
||||
|
||||
Column {
|
||||
enabled: appSettings.notificationFeedback !== AppSettings.NotificationFeedbackNone
|
||||
width: parent.columnWidth
|
||||
height: enabled ? implicitHeight: 0
|
||||
clip: height < implicitHeight
|
||||
visible: height > 0
|
||||
|
||||
Behavior on height { SmoothedAnimation { duration: 200 } }
|
||||
|
||||
TextSwitch {
|
||||
checked: appSettings.notificationSuppressContent && enabled
|
||||
text: qsTr("Hide content in notifications")
|
||||
enabled: parent.enabled
|
||||
automaticCheck: false
|
||||
onClicked: {
|
||||
appSettings.notificationSuppressContent = !checked
|
||||
}
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
checked: appSettings.notificationTurnsDisplayOn && enabled
|
||||
text: qsTr("Notification turns on the display")
|
||||
enabled: parent.enabled
|
||||
automaticCheck: false
|
||||
onClicked: {
|
||||
appSettings.notificationTurnsDisplayOn = !checked
|
||||
}
|
||||
Behavior on height { SmoothedAnimation { duration: 200 } }
|
||||
}
|
||||
|
||||
TextSwitch {
|
||||
width: parent.columnWidth
|
||||
checked: appSettings.notificationSoundsEnabled && enabled
|
||||
text: qsTr("Enable notification sounds")
|
||||
description: qsTr("When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.")
|
||||
enabled: appSettings.notificationFeedback !== AppSettings.NotificationFeedbackNone
|
||||
height: enabled ? implicitHeight: 0
|
||||
clip: height < implicitHeight
|
||||
visible: height > 0
|
||||
enabled: parent.enabled
|
||||
automaticCheck: false
|
||||
onClicked: {
|
||||
appSettings.notificationSoundsEnabled = !checked
|
||||
}
|
||||
Behavior on height { SmoothedAnimation { duration: 200 } }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,37 +30,42 @@ 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 {
|
||||
Column {
|
||||
BusyIndicator {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
running: !activeSessionsListView.count && !activeSessionsItem.inactiveSessionsTtlDays
|
||||
size: BusyIndicatorSize.Medium
|
||||
visible: opacity > 0
|
||||
height: running ? implicitHeight : 0
|
||||
}
|
||||
|
||||
SilicaListView {
|
||||
id: activeSessionsListView
|
||||
width: parent.width
|
||||
|
@ -71,6 +76,7 @@ AccordionItem {
|
|||
width: parent.width
|
||||
color: Theme.primaryColor
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
visible: activeSessionsListView.count > 0
|
||||
}
|
||||
delegate: ListItem {
|
||||
id: activeSessionListItem
|
||||
|
@ -111,9 +117,6 @@ AccordionItem {
|
|||
font.bold: true
|
||||
visible: modelData.is_current
|
||||
color: Theme.highlightColor
|
||||
anchors {
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
|
@ -121,53 +124,28 @@ AccordionItem {
|
|||
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("IP address: %1, origin: %2").arg(modelData.ip).arg(modelData.country)
|
||||
font.pixelSize: Theme.fontSizeExtraSmall
|
||||
color: Theme.secondaryColor
|
||||
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
|
||||
}
|
||||
|
@ -176,7 +154,59 @@ AccordionItem {
|
|||
color: Theme.primaryColor
|
||||
horizontalAlignment: Qt.AlignHCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
readonly property int ttl: activeSessionsItem.inactiveSessionsTtlDays
|
||||
label: qsTr("Session Timeout")
|
||||
description: qsTr("Inactive sessions will be terminated after this timeframe")
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -143,7 +143,7 @@ AccordionItem {
|
|||
visible: true
|
||||
canEdit: true
|
||||
headerText: qsTr("Username", "user name of the logged-in profile - header")
|
||||
text: userInformation.username
|
||||
text: userInformation.usernames.editable_username
|
||||
width: parent.columnWidth
|
||||
headerLeftAligned: true
|
||||
|
||||
|
|
1
qml/js/emoji/1f426-200d-2b1b.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFAC33" d="M8.916 12.88c-.111 1.652 1.768 3.126-.712 2.959-2.48-.167-7.836-2.533-7.768-3.53s3.708-2.757 6.188-2.59c2.48.166 2.404 1.508 2.292 3.161m20.122 16.049a.966.966 0 0 0-.564.095c-2.325.232-3.225-1.885-3.225-1.885-.439-.336-.981-2.009-1.589-1.215l.187 1.402c.187 1.402 2.57 3.224 2.57 3.224l-1.215 1.589a1 1 0 1 0 1.589 1.215l.673-.88-.039.249a1 1 0 1 0 1.976.314l.47-2.963a1.003 1.003 0 0 0-.833-1.145zm-6.278.623a.984.984 0 0 0-.572.018c-2.335-.082-2.944-2.3-2.944-2.3-.39-.392-.703-2.123-1.412-1.417l-.003 1.414c-.003 1.414 2.115 3.539 2.115 3.539l-1.417 1.412a.999.999 0 1 0 1.411 1.417l.785-.782-.073.242a1 1 0 0 0 1.916.576l.862-2.873a.996.996 0 0 0-.668-1.246z"/><path fill="#31373D" d="M35.009 6.729c-.383-.17-.758-.057-1.05.244-.054.056-4.225 6.306-14.532 4.944-.34-.045 3.139 11.968 3.199 11.962.124-.014 3.07-.368 6.14-2.553 2.818-2.005 6.284-5.991 6.797-13.598.028-.418-.171-.828-.554-.999z"/><path fill="#31373D" d="M34.477 21.108c-.204-.336-.59-.56-.979-.471-1.293.295-3.197.543-4.53.453-6.357-.428-9.361-4.129-9.392-4.16-.275-.282.466 11.552.816 11.576 9.194.62 13.862-6.027 14.057-6.31.222-.326.233-.751.028-1.088"/><path fill="#31373D" d="M24.586 19.016c-.371 5.51 1.316 9.861-4.194 9.489-5.51-.371-10.145-4.92-9.774-10.431s14.34-4.568 13.968.942"/><path fill="#31373D" d="M23.257 12.412c-.353 5.235-3.922 9.257-9.156 8.904-5.235-.353-9.193-4.882-8.84-10.117.353-5.235 4.832-8.444 10.067-8.091 4.001.269 8.24 4.683 7.929 9.304z"/><circle cx="10.67" cy="8.989" r="2"/><path d="M18.179 16.645s7.63 5.648 12.387-4.459c.396-.842 1.685.793.099 4.162s-8.175 6.44-12.04 1.536c-.815-1.035-.446-1.239-.446-1.239"/><path fill="#31373D" d="M15.327 3.107s6.246.254 7.798-.477.136 2.932-3.262 3.789-4.536-3.312-4.536-3.312z"/><path fill="#31373D" d="M17.428 5.788s4.501.136 6.054-.594.136 2.932-3.262 3.789c-3.399.857-2.792-3.195-2.792-3.195z"/></svg>
|
After Width: | Height: | Size: 1.9 KiB |
1
qml/js/emoji/1f6dc.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><clipPath id="a"><path fill="none" d="M0 0h36v36H0z"/></clipPath></defs><g clip-path="url(#a)"><path fill="#2b87c7" d="M36 32c0 4-4 4-4 4H4c-4 0-4-4-4-4V4c0-4 4-4 4-4h28s4 0 4 4z"/></g><path fill="#fff" d="m5.1 13.01 1.46 1.65c.15.16.39.19.57.07 3.01-1.98 6.77-3.17 10.83-3.17s7.88 1.2 10.9 3.21c.18.12.42.09.57-.07l1.47-1.64c.17-.2.14-.5-.07-.65-3.56-2.45-8.02-3.91-12.87-3.91S8.72 9.94 5.17 12.36c-.22.15-.25.45-.08.65Z"/><path fill="#fff" d="m9.43 17.9 1.45 1.64c.15.16.39.2.58.08 1.8-1.2 4.06-1.92 6.51-1.92s4.74.73 6.54 1.95c.18.12.42.1.57-.07l1.47-1.64c.18-.2.14-.5-.08-.65-2.34-1.66-5.29-2.65-8.5-2.65s-6.12.98-8.45 2.61a.43.43 0 0 0-.08.65Zm4.22 4.77 1.46 1.64c.14.16.39.19.57.07.63-.41 1.42-.65 2.28-.65s1.67.25 2.3.66c.18.12.42.09.57-.07l1.46-1.64a.44.44 0 0 0-.06-.64c-1.17-.86-2.65-1.37-4.27-1.37s-3.08.51-4.24 1.35c-.21.15-.24.45-.07.64Z"/><circle cx="17.91" cy="27.64" r="1.86" fill="#fff"/></svg>
|
After Width: | Height: | Size: 977 B |
1
qml/js/emoji/1fa75.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#88C9F9" d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z"/></svg>
|
After Width: | Height: | Size: 368 B |
1
qml/js/emoji/1fa76.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#99AAB5" d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z"/></svg>
|
After Width: | Height: | Size: 368 B |
1
qml/js/emoji/1fa77.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F4ABBA" d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z"/></svg>
|
After Width: | Height: | Size: 368 B |
1
qml/js/emoji/1fa87.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><clipPath id="a" clipPathUnits="userSpaceOnUse"><path d="M-35.367 13.848h36v-36h-36Z"/></clipPath><clipPath id="b" clipPathUnits="userSpaceOnUse"><path d="M-24.343 34.246h36v-36h-36Z"/></clipPath><clipPath id="c" clipPathUnits="userSpaceOnUse"><path d="M-36 10.269H0v-36h-36Z"/></clipPath><clipPath id="d" clipPathUnits="userSpaceOnUse"><path d="M-34.38 15.907h36v-36h-36Z"/></clipPath><clipPath id="e" clipPathUnits="userSpaceOnUse"><path d="M-31.406 19.303h36v-36h-36Z"/></clipPath><clipPath id="f" clipPathUnits="userSpaceOnUse"><path d="M-28.11 21.53h36v-36h-36Z"/></clipPath><clipPath id="g" clipPathUnits="userSpaceOnUse"><path d="M-12.71 6.294h36v-36h-36Z"/></clipPath><clipPath id="h" clipPathUnits="userSpaceOnUse"><path d="M-16.316 29.198h36v-36h-36Z"/></clipPath><clipPath id="i" clipPathUnits="userSpaceOnUse"><path d="M-11.042 3.065h36v-36h-36Z"/></clipPath><clipPath id="j" clipPathUnits="userSpaceOnUse"><path d="M-13.173 8.53h36v-36h-36Z"/></clipPath><clipPath id="k" clipPathUnits="userSpaceOnUse"><path d="M-12.869 13.034h36v-36h-36Z"/></clipPath><clipPath id="l" clipPathUnits="userSpaceOnUse"><path d="M-11.599 16.805h36v-36h-36Z"/></clipPath></defs><path fill="#fcd646" d="M0 0a10.926 10.926 0 0 0-.987-2.058l-.001-.001c-1.379-1.093-5.157-1.888-7.379-1.093-2.222.794-4 3-4.227 5.246.098.732.276 1.477.54 2.217a10.562 10.562 0 0 0 1.783 3.168c1.904-.631 3.847.105 5.904-.631 2.058-.736 3-2 5-3.269A10.622 10.622 0 0 0 0 0" clip-path="url(#a)" transform="matrix(1 0 0 -1 35.367 13.848)"/><path fill="#d4a086" d="M0 0c-.55-1.538-2.122-2.092-3.626-1.554-1.502.537-2.368 1.963-1.818 3.501.348.972.898 1.811 1.275 2.334 1.491 2.067 2.65 4.354 3.508 6.755l.036.101c.045.125.086.251.123.378 1.159.731 1.691.898 2.159.731.468-.168 0 0 .592-1.715a6.6 6.6 0 0 1-.145-.37l-.036-.101C1.209 7.659.654 5.156.496 2.612.456 1.969.394 1.102 0 0" clip-path="url(#b)" transform="matrix(1 0 0 -1 24.343 34.246)"/><path fill="#d24248" d="M0 0c-1.778-.237-3.836-.021-5.895.715-2.056.736-3.785 1.875-5.009 3.185 1.922 2.334 4.664 3.444 7.073 2.583C-1.422 5.621-.007 3.024 0 0" clip-path="url(#c)" transform="matrix(1 0 0 -1 36 10.269)"/><path fill="#82ae63" d="M0 0a10.36 10.36 0 0 0-.431-.64 12.303 12.303 0 0 0-2.543-2.757c-1.406-.696-3.867-.247-5.406.304-1.538.55-2 1-3.082 2.732a12.312 12.312 0 0 0-.217 3.745c.015.255.039.511.073.769C-10.373 2.709-8.535 1.445-6.314.65-4.091-.145-1.869-.333 0 0" clip-path="url(#d)" transform="matrix(1 0 0 -1 34.38 15.907)"/><path fill="#d24248" d="M0 0a10.735 10.735 0 0 0-1.724-1.11 6.727 6.727 0 0 1-1.573-1.117c-2.109 0-1.41-.72-2.109-.47-.697.25-1.013.987-1.946 1.92a6.698 6.698 0 0 1-.507 1.861 10.78 10.78 0 0 0-.629 1.952c1.096-.904 2.45-1.679 3.989-2.229C-2.961.256-1.422-.003 0 0" clip-path="url(#e)" transform="matrix(1 0 0 -1 31.406 19.303)"/><path fill="#ba6e54" d="M0 0a6.63 6.63 0 0 1-1.517-2.184 14.314 14.314 0 0 0-2.751.984c.252.865.32 1.766.213 2.651.614-.334 1.274-.63 1.971-.88C-1.385.321-.688.132 0 0" clip-path="url(#f)" transform="matrix(1 0 0 -1 28.11 21.53)"/><path fill="#fcd646" d="M0 0c.239-.75.391-1.499.463-2.235v-.001C.029-3.942-2.492-6.865-4.741-7.581c-2.248-.716-5-.041-6.542 1.608a10.935 10.935 0 0 0-.916 2.091 10.586 10.586 0 0 0-.504 3.599c1.897.653 2.996 2.416 5.077 3.079 2.083.663 3.599.229 5.958.433A10.592 10.592 0 0 0 0 0" clip-path="url(#g)" transform="matrix(1 0 0 -1 12.71 6.294)"/><path fill="#d4a086" d="M0 0c.496-1.557-.419-2.95-1.94-3.434s-3.074.124-3.569 1.681C-5.822-.77-5.893.23-5.911.875c-.068 2.548-.534 5.069-1.307 7.499l-.033.102c-.04.127-.084.252-.132.375.478 1.284.8 1.739 1.273 1.89.474.151 0 0 1.511-1.003.033-.129.069-.256.109-.383l.033-.103c.773-2.429 1.85-4.756 3.267-6.875C-.832 1.841-.355 1.115 0 0" clip-path="url(#h)" transform="matrix(1 0 0 -1 16.316 29.198)"/><path fill="#d24248" d="M0 0c-1.27-1.267-3.037-2.343-5.12-3.006-2.082-.663-4.147-.806-5.915-.506.113 3.022 1.62 5.567 4.057 6.343C-4.54 3.607-1.84 2.4 0 0" clip-path="url(#i)" transform="matrix(1 0 0 -1 11.042 3.065)"/><path fill="#ec9435" d="M0 0c.024-.258.04-.516.046-.77.059-1.085 0-2.378-.35-3.734C-1-5.911-3.229-7.046-4.786-7.542c-1.557-.495-2.197-.417-4.109.304a12.287 12.287 0 0 0-2.443 2.845c-.143.212-.279.43-.409.656 1.857-.4 4.084-.291 6.332.425C-3.165-2.596-1.284-1.398 0 0" clip-path="url(#j)" transform="matrix(1 0 0 -1 13.173 8.53)"/><path fill="#d24248" d="M0 0a10.72 10.72 0 0 0-.698-1.928A6.694 6.694 0 0 1-1.27-3.77c-1.677-1.279-.686-1.428-1.393-1.653-.705-.224-1.404.171-2.712.347a6.693 6.693 0 0 1-1.531 1.172c-.624.35-1.184.747-1.684 1.17 1.42-.054 2.966.151 4.523.647C-2.51-1.592-1.129-.865 0 0" clip-path="url(#k)" transform="matrix(1 0 0 -1 12.869 13.035)"/><path fill="#ba6e54" d="M0 0a6.594 6.594 0 0 1 .119-2.656 13.854 13.854 0 0 0-1.371-.514 14.2 14.2 0 0 0-1.414-.373 6.617 6.617 0 0 1-1.438 2.237c.691.107 1.395.272 2.101.497C-1.296-.584-.627-.312 0 0" clip-path="url(#l)" transform="matrix(1 0 0 -1 11.599 16.805)"/></svg>
|
After Width: | Height: | Size: 4.9 KiB |
1
qml/js/emoji/1fa88.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFCC4D" d="m29.346.937 4.95 4.95L6.012 34.17l-4.95-4.95z"/><circle cx="4.5" cy="30.75" r="3.5" fill="#C1694F"/><circle cx="3.5" cy="31.75" r="3.5" fill="#FFCC4D"/><circle cx="3.5" cy="31.75" r="2" fill="#292F33"/><circle cx="31.75" cy="3.5" r="3.5" fill="#FFCC4D"/><circle cx="25.75" cy="9.5" r="3.5" fill="#C1694F"/><circle cx="24.75" cy="10.5" r="3.5" fill="#FFCC4D"/><circle cx="7.95" cy="26.15" r="1.25" fill="#C1694F"/><circle cx="8.2" cy="26.4" r="1" fill="#292F33"/><circle cx="10.95" cy="23.15" r="1.25" fill="#C1694F"/><circle cx="11.2" cy="23.4" r="1" fill="#292F33"/><circle cx="13.95" cy="20.15" r="1.25" fill="#C1694F"/><circle cx="14.2" cy="20.4" r="1" fill="#292F33"/><circle cx="16.95" cy="17.15" r="1.25" fill="#C1694F"/><circle cx="17.2" cy="17.4" r="1" fill="#292F33"/><circle cx="19.95" cy="14.15" r="1.25" fill="#C1694F"/><circle cx="20.2" cy="14.4" r="1" fill="#292F33"/><circle cx="22.95" cy="11.15" r="1.25" fill="#C1694F"/><circle cx="23.2" cy="11.4" r="1" fill="#292F33"/><circle cx="29.95" cy="4.15" r="1.25" fill="#C1694F"/><circle cx="30.2" cy="4.4" r="1" fill="#292F33"/></svg>
|
After Width: | Height: | Size: 1.2 KiB |
1
qml/js/emoji/1faad.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#e80040" d="m18 28 17.08-10.2c.42-.25.52-.84.19-1.2C30.98 11.94 24.84 9.01 18 9.01S5.02 11.93.73 16.59c-.33.36-.24.95.19 1.2L18 27.99Z"/><path fill="#a80018" d="m18 25.79.03-.05.47-1.71V9.01c-.17 0-.33-.01-.5-.01s-.33 0-.5.01v15.02l.47 1.71zm-.81 1.26-.06.1.23.15-.03-.1zm2.99-2.79 8.25-12.81c-.3-.15-.6-.3-.91-.43l-7.68 11.93-.58 2.12.92-.81Z"/><path fill="#a80018" d="m18.01 25.81.02-.07-.03.05zm.76 1.01 14.15-12.45c-.26-.22-.53-.43-.8-.63L20.17 24.25l-.92.81-.48 1.75Zm-1.54.03-.12.11.08.09.14.15zm1.21.62.06.23.04-.02.1-.38-.13.08z"/><path fill="#a80018" d="m19.25 25.07.58-2.12 3.63-13.3c-.32-.08-.65-.15-.98-.21L18.5 24.03l-.47 1.71-.02.07.55.86.2.18v-.03zm-3.08-2.12L8.49 11.02c-.31.14-.61.28-.91.43l8.25 12.81.92.81-.58-2.12Z"/><path fill="#a80018" d="m17.97 25.74.14.53.46.4-.56-.86-.01-.02zm.54 1.64.13-.08.23-.15-.06-.1z"/><path fill="#a80018" d="m18.57 26.67-.46-.4.33 1.2.07-.09.3-.33.08-.09-.12-.11zm-1.82-1.6-.92-.81L3.87 13.75c-.27.2-.54.41-.8.63l14.15 12.45-.48-1.75Z"/><path fill="#a80018" d="m18.44 27.47-.33-1.19-.14-.53-.47-1.71-3.98-14.59c-.33.06-.66.13-.98.21l3.63 13.3.58 2.12.48 1.75v.03l.1.35.03.09.1.38.54.32.5-.3-.06-.23Z"/><path fill="#de9a7e" d="m18 28 6.59-3.94a8.628 8.628 0 0 0-13.18 0z"/><path fill="#fff" d="M12.19 23.95c1.53-1.56 3.62-2.45 5.81-2.45s4.28.88 5.81 2.45L18 27.42l-5.81-3.47Z"/><path fill="#de9a7e" d="m19.52 27.09 5.07-3.03a8.628 8.628 0 0 0-13.18 0l5.07 3.03-2.08 1.49a.38.38 0 0 0-.08.55c.93 1.15 2.24 1.87 3.69 1.87s2.75-.72 3.69-1.87c.14-.17.09-.42-.08-.55l-2.08-1.49Zm3.47-3.23-3.4 2.03c-.1-.15-.22-.28-.35-.4l1.83-2.84c.69.3 1.34.71 1.92 1.21Zm-4.61-1.84c.68.03 1.34.16 1.97.36l-1.76 2.73c-.07-.02-.14-.04-.22-.06v-3.03Zm-.75 0v3.03c-.07.02-.15.03-.22.06l-1.76-2.73c.63-.21 1.3-.33 1.97-.36Zm-4.61 1.84c.58-.5 1.23-.9 1.92-1.21l1.83 2.84c-.13.12-.25.25-.35.4l-3.4-2.03Z"/><circle cx="18" cy="27" r="1" fill="#a80018"/></svg>
|
After Width: | Height: | Size: 1.9 KiB |
1
qml/js/emoji/1faae.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#31373d" d="M35.9 12.22c-.13-.13-.37-.13-.51 0-.24.23-11.05 10.8-11.92 11.52-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 11.29-11.67 11.52-11.92.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.49 11.24-12.35 11.95-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 11.72-12.11 11.95-12.35.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.77 11.52-12.64 12.24-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 12.01-12.39 12.24-12.64.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.92 11.67-12.78 12.38-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 12.15-12.54 12.38-12.78.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.92 11.67-12.78 12.38-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 12.15-12.54 12.38-12.78.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.77 11.52-12.64 12.24-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 12.01-12.39 12.24-12.64.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.49 11.24-12.35 11.95-.19.16-.45.16-.61 0s-.16-.42 0-.61c.72-.86 11.72-12.11 11.95-12.35.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.05 10.8-11.92 11.52-.19.16-.45.16-.61 0s-.16-.42 0-.61C12.94 11.63 23.51.82 23.74.57c.13-.14.13-.38 0-.51s-.37-.13-.51 0c-.24.23-11.31 10.98-12.15 11.73-4.62 4.17-2.53 6.17-2.3 8.58.37 3.97-2.44 6.21-4.38 6.41-2.52.26-4.45 2.06-4.45 4.59 0 1.27.51 2.42 1.35 3.25.83.83 1.98 1.35 3.25 1.35 2.54 0 4.33-1.93 4.59-4.45.2-1.94 2.44-4.75 6.41-4.38 2.41.22 4.41 2.32 8.58-2.3.75-.83 11.5-11.9 11.73-12.15.13-.14.13-.38 0-.51zM4.56 32.69c-.35 0-.66-.14-.88-.37a1.24 1.24 0 0 1-.37-.88c0-.69.56-1.25 1.25-1.25.35 0 .66.14.88.37s.37.54.37.88c0 .69-.56 1.25-1.25 1.25"/><path fill="none" stroke="#7a8891" stroke-linecap="round" stroke-miterlimit="10" d="M3.88 28.12c-1.46.3-2.58 1.55-2.67 3.08m9.28-17.1c-1.61 2.13-1.3 2.91-.65 5.23.55 1.97.06 3.81-.65 5.23"/></svg>
|
After Width: | Height: | Size: 1.8 KiB |
1
qml/js/emoji/1faaf.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 36 36"><path fill="#9266cc" d="M36 32c0 2.2-1.8 4-4 4H4c-2.2 0-4-1.8-4-4V4c0-2.2 1.8-4 4-4h28c2.2 0 4 1.8 4 4z"/><path fill="#fff" d="M23.5 6.9s4 2.3 3.6 7.5c-.4 5.1-8.3 10.1-8.3 10.1v-1.6l2.1-1.5c-.1-.5-.2-.9-.3-1.4 2.8-1.1 4.9-3.8 4.9-7s-2-5.9-4.8-7c.1-.7.2-1 .2-1L18 2l-2.9 3s.1.3.2.9c-2.8 1.1-4.8 3.8-4.8 7s2 5.9 4.8 7c-.1.5-.2.9-.3 1.4l2.1 1.5v1.6s-7.9-4.9-8.3-10.1c-.4-5.1 3.6-7.5 3.6-7.5s-6.1 1-6.5 7.5c-.4 6.3 5.8 11 5.8 11s1.1.9 1.2 1.9l2.7-2 1 .7-3.4 2.6c-.3.2-.5.6-.5 1 0 .8.6 1.4 1.4 1.4s1.4-.6 1.4-1.4c0-.3-.1-.6-.3-.8l1.9-1.3v3c-.6.3-1 .9-1 1.6 0 1 .8 1.9 1.9 1.9s1.9-.8 1.9-1.9c0-.7-.4-1.3-1-1.6v-3l1.9 1.3c-.2.2-.3.5-.3.8 0 .8.6 1.4 1.4 1.4s1.4-.6 1.4-1.4c0-.4-.2-.8-.5-1l-3.4-2.6 1-.7 2.7 2c.1-1 1.2-1.9 1.2-1.9s6.2-4.7 5.8-11c-.5-6.4-6.6-7.4-6.6-7.4m.5 6c0 2.5-1.5 4.6-3.6 5.5-.7-4.6-.3-8.6.1-11 2 1 3.5 3.1 3.5 5.5m-12 0c0-2.4 1.5-4.5 3.6-5.5.4 2.4.7 6.4.1 11-2.2-.9-3.7-3-3.7-5.5"/></svg>
|
After Width: | Height: | Size: 982 B |
1
qml/js/emoji/1fabb.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#69b546" d="M31.71 28.26c-1.78-.49-4.33.36-6.77 1.57 1.9-2.33 3.91-4.76 6.1-6.08 1.82-1.09 2.07-2.09 1.86-2.82-.24-.86-1.17-1.32-2.05-1.18-4.49.7-9.71 8.85-11.86 12.52v-5.53h-2v5.53c-2.14-3.68-7.36-11.82-11.86-12.52-.88-.14-1.81.32-2.05 1.18-.2.73.05 1.73 1.86 2.82 2.19 1.32 4.2 3.75 6.1 6.08-2.44-1.21-5-2.07-6.77-1.57-.68.19-1.2.83-1.09 1.53.09.59.6 1.24 2.28 1.43 4.21.49 9.43 4.74 12.53 4.52 3.1.23 8.32-4.03 12.53-4.52 1.68-.19 2.18-.84 2.28-1.43.11-.7-.41-1.34-1.09-1.53Z"/><path fill="#894fc4" d="M23.68 6.26c1.93-4-1.93-3-1.93-3C21-.24 18 2.32 18 2.32s-3-2.56-3.75.94c0 0-3.86-1-1.93 3 0 0-3.07 1-2.07 4l.82 3.68S8.75 21.85 13 19.56c0 0-1.75 3.7 2.25 2.7 0 0-.46 3.38 1.02 5.32a2.145 2.145 0 0 0 3.45 0c1.48-1.94 1.02-5.32 1.02-5.32 4 1 2.25-2.7 2.25-2.7 4.25 2.3 1.93-5.62 1.93-5.62l.82-3.68c1-3-2.07-4-2.07-4Z"/><path fill="#ae6dee" d="M19.17 2.98c0 1.93-.52 4.28-1.17 4.28s-1.17-2.34-1.17-4.28S17.35.26 18 .26s1.17.79 1.17 2.72"/><path fill="#ae6dee" d="M19.17 10.54c0-1.93-.52-4.28-1.17-4.28s-1.17 2.34-1.17 4.28.52 2.72 1.17 2.72 1.17-.79 1.17-2.72"/><path fill="#ae6dee" d="M21.62 5.05c-1.17 1.17-2.9 2.27-3.29 1.88s.71-2.12 1.88-3.29 1.96-1.33 2.35-.94.23 1.18-.94 2.35"/><path fill="#ae6dee" d="M21.62 8.47c-1.17-1.17-2.9-2.27-3.29-1.88s.71 2.12 1.88 3.29 1.96 1.33 2.35.94.23-1.18-.94-2.35m-7.24-3.42c1.17 1.17 2.9 2.27 3.29 1.88s-.71-2.12-1.88-3.29-1.96-1.33-2.35-.94-.23 1.18.94 2.35Z"/><path fill="#ae6dee" d="M14.38 8.47c1.17-1.17 2.9-2.27 3.29-1.88s-.71 2.12-1.88 3.29-1.96 1.33-2.35.94-.23-1.18.94-2.35Z"/><circle cx="18" cy="6.76" r=".8" fill="#cd95ff"/><path fill="#ae6dee" d="M19.17 16.98c0 1.93-.52 4.28-1.17 4.28s-1.17-2.34-1.17-4.28.52-2.72 1.17-2.72 1.17.79 1.17 2.72"/><path fill="#ae6dee" d="M19.17 24.54c0-1.93-.52-4.28-1.17-4.28s-1.17 2.34-1.17 4.28.52 2.72 1.17 2.72 1.17-.79 1.17-2.72"/><path fill="#ae6dee" d="M21.62 19.05c-1.17 1.17-2.9 2.27-3.29 1.88s.71-2.12 1.88-3.29 1.96-1.33 2.35-.94.23 1.18-.94 2.35"/><path fill="#ae6dee" d="M21.62 22.47c-1.17-1.17-2.9-2.27-3.29-1.88s.71 2.12 1.88 3.29 1.96 1.33 2.35.94.23-1.18-.94-2.35m-7.24-3.42c1.17 1.17 2.9 2.27 3.29 1.88s-.71-2.12-1.88-3.29-1.96-1.33-2.35-.94-.23 1.18.94 2.35Z"/><path fill="#ae6dee" d="M14.38 22.47c1.17-1.17 2.9-2.27 3.29-1.88s-.71 2.12-1.88 3.29-1.96 1.33-2.35.94-.23-1.18.94-2.35Z"/><circle cx="18" cy="20.76" r=".8" fill="#cd95ff"/><path fill="#ae6dee" d="M22.17 13.3c1.19.62 2.8 1.04 3.01.65s-1.07-1.47-2.26-2.08-1.84-.55-2.05-.15.11.97 1.31 1.59Z"/><path fill="#ae6dee" d="M22.17 14.21c1.19-.62 2.8-1.04 3.01-.65s-1.07 1.47-2.26 2.08-1.84.55-2.05.15.11-.97 1.31-1.59Z"/><path fill="#ae6dee" d="M27.83 13.3c-1.19.62-2.8 1.04-3.01.65s1.07-1.47 2.26-2.08 1.84-.55 2.05-.15-.11.97-1.31 1.59Z"/><path fill="#ae6dee" d="M27.83 14.21c-1.19-.62-2.8-1.04-3.01-.65s1.07 1.47 2.26 2.08 1.84.55 2.05.15-.11-.97-1.31-1.59Z"/><path fill="#ae6dee" d="M26.84 11.03c-.58 1.47-1.67 3.1-2.16 2.91s-.19-2.13.39-3.61 1.21-1.92 1.7-1.73.65.95.08 2.42Z"/><path fill="#ae6dee" d="M26.84 16.49c-.58-1.47-1.67-3.1-2.16-2.91s-.19 2.13.39 3.61 1.21 1.92 1.7 1.73.65-.95.08-2.42Z"/><ellipse cx="25.35" cy="13.76" fill="#cd95ff" rx=".4" ry=".8"/><path fill="#ae6dee" d="M13.83 13.3c-1.19.62-2.8 1.04-3.01.65s1.07-1.47 2.26-2.08 1.84-.55 2.05-.15-.11.97-1.31 1.59Z"/><path fill="#ae6dee" d="M13.83 14.21c-1.19-.62-2.8-1.04-3.01-.65s1.07 1.47 2.26 2.08 1.84.55 2.05.15-.11-.97-1.31-1.59Z"/><path fill="#ae6dee" d="M8.17 13.3c1.19.62 2.8 1.04 3.01.65s-1.07-1.47-2.26-2.08-1.84-.55-2.05-.15.11.97 1.31 1.59Z"/><path fill="#ae6dee" d="M8.17 14.21c1.19-.62 2.8-1.04 3.01-.65s-1.07 1.47-2.26 2.08-1.84.55-2.05.15.11-.97 1.31-1.59Z"/><path fill="#ae6dee" d="M9.16 11.03c.58 1.47 1.67 3.1 2.16 2.91s.19-2.13-.39-3.61-1.21-1.92-1.7-1.73-.65.95-.08 2.42Z"/><path fill="#ae6dee" d="M9.16 16.49c.58-1.47 1.67-3.1 2.16-2.91s.19 2.13-.39 3.61-1.21 1.92-1.7 1.73-.65-.95-.08-2.42Z"/><ellipse cx="10.65" cy="13.76" fill="#cd95ff" rx=".4" ry=".8"/></svg>
|
After Width: | Height: | Size: 3.9 KiB |
1
qml/js/emoji/1fabc.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#44abf3" d="M13.5 35c-.26 0-.53-.07-.77-.21-.71-.43-.94-1.35-.51-2.06l1.59-2.65c.45-.75.3-1.71-.34-2.29a4.804 4.804 0 0 1-.84-6.19l2.2-3.44c.45-.7 1.37-.9 2.07-.45.7.45.9 1.37.45 2.07l-2.2 3.44c-.48.75-.35 1.73.32 2.33 1.72 1.54 2.1 4.09.92 6.06l-1.59 2.65a1.5 1.5 0 0 1-1.29.73Zm-6-2c-.26 0-.53-.07-.77-.21-.71-.43-.94-1.35-.51-2.06l1.59-2.65c.45-.75.3-1.71-.34-2.29a4.804 4.804 0 0 1-.84-6.19l2.2-3.44c.45-.7 1.37-.9 2.07-.45.7.45.9 1.38.45 2.07l-2.2 3.44c-.48.75-.35 1.73.32 2.33 1.72 1.54 2.1 4.09.92 6.06L8.8 32.26a1.5 1.5 0 0 1-1.29.73Zm14.44 2a1.5 1.5 0 0 1-1.29-.73l-1.59-2.65c-1.19-1.98-.8-4.53.92-6.06.67-.6.8-1.58.32-2.33l-2.2-3.44a1.499 1.499 0 0 1 2.52-1.62l2.2 3.44c1.28 2 .93 4.6-.84 6.19-.65.58-.79 1.54-.34 2.29l1.59 2.65c.43.71.2 1.63-.51 2.06-.24.15-.51.21-.77.21Zm6-2a1.5 1.5 0 0 1-1.29-.73l-1.59-2.65c-1.19-1.98-.8-4.53.92-6.06.67-.6.8-1.58.32-2.33l-2.2-3.44a1.499 1.499 0 0 1 2.52-1.62l2.2 3.44c1.28 2 .93 4.6-.84 6.19-.65.58-.79 1.54-.34 2.29l1.59 2.65c.43.71.2 1.63-.51 2.06-.24.15-.51.21-.77.21Z"/><path fill="#44abf3" d="M18 22.27c-1.17 0-2.3-.29-3.36-.85-.71-.38-1.28-.82-1.68-1.31-.61-.75-1.5-1.17-2.42-1.17-.11 0-.21 0-.32.02-.33.04-.72.06-1.15.06-3.21 0-5.26-1.36-6.1-4.04C1.6 10.6 4.73 7.51 7.59 5.7c1.13-.72 5.7-2.68 10.42-2.68S27.3 4.99 28.43 5.7c2.87 1.82 6 4.9 4.62 9.28-.84 2.68-2.89 4.04-6.1 4.04-.43 0-.82-.03-1.15-.06-.11-.01-.21-.02-.32-.02-.92 0-1.81.43-2.42 1.17-.41.5-.97.94-1.68 1.32-1.06.57-2.2.85-3.36.85Z"/><path fill="#2b87c7" d="M18 4c4.44 0 8.86 1.88 9.89 2.53 2.57 1.63 5.39 4.36 4.21 8.14-.26.83-1.05 3.34-5.15 3.34-.34 0-.7-.02-1.05-.06-.14-.02-.28-.02-.43-.02-1.23 0-2.39.56-3.19 1.54-.32.39-.79.75-1.38 1.07-.92.49-1.89.74-2.9.74s-1.98-.25-2.9-.74c-.59-.32-1.06-.67-1.38-1.07-.8-.98-1.97-1.54-3.19-1.54-.14 0-.28 0-.43.02-.35.04-.7.06-1.05.06-4.1 0-4.89-2.51-5.15-3.34-1.18-3.78 1.63-6.51 4.21-8.14C9.13 5.88 13.55 4 18 4m0-2C13 2 8.24 4.08 7.04 4.84 4.44 6.48.36 10.02 2 15.26 3.25 19.25 6.67 20 9.06 20c.47 0 .89-.03 1.26-.07.07 0 .14-.01.22-.01.61 0 1.21.27 1.65.81.54.66 1.25 1.17 1.99 1.56 1.22.65 2.53.97 3.83.97s2.62-.32 3.83-.97c.73-.39 1.44-.9 1.99-1.56.44-.54 1.04-.81 1.65-.81.07 0 .14 0 .22.01.36.04.79.07 1.26.07 2.39 0 5.81-.75 7.06-4.74 1.64-5.25-2.44-8.78-5.04-10.43-1.19-.76-5.96-2.84-10.96-2.84Z"/><path fill="#fff" d="M8.12 12.67c-.57 1.67-.98 2.83-1.99 2.49s-1.36-1.97-.79-3.64 1.84-2.75 2.84-2.41.5 1.89-.06 3.57Z"/><path fill="#2b87c7" d="M23.12 6.98c-.61-.48-1.76-1.72-5.12-1.72s-4.51 1.25-5.12 1.72c-.78.61-.86 1.53-.19 2.06.67.53 1.85.46 2.62-.15.11-.08.24-.21.39-.35-.11.37-.18.7-.18.9 0 .86 1.11 1.56 2.48 1.56s2.48-.7 2.48-1.56c0-.21-.06-.53-.18-.9.15.15.28.27.39.35.78.61 1.95.68 2.62.15.67-.53.59-1.45-.19-2.06"/><ellipse cx="10" cy="7.5" fill="#fff" rx="1.5" ry="1" transform="rotate(-42.63 9.993 7.502)"/><path fill="#fff" d="M30.24 15.68c-.77 1.03-1.9 1.49-2.52 1.03s-.5-1.68.28-2.71 1.9-1.49 2.52-1.03.5 1.67-.27 2.71Z"/></svg>
|
After Width: | Height: | Size: 2.9 KiB |
1
qml/js/emoji/1fabd.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CAD4DB" d="M33.86 3.06c.03-.8-.92-1.26-1.53-.75-6.2 5.13-13.64 8.46-18.68 9.1-4.06.52-5.34 2.11-6.26 5.18-.29.97-.69 1.9-1.22 2.75l-3.19 5.12-.117.252c-.428.923-.873 1.881-.873 2.898 0 2.47 3.16 3.67 4.89 4.14.39.11.74-.15.82-.51l-.044-.063.078.022-1.515-4.012.563.241.026.072c.038.107.075.213.122.32v.01c.2.48.44.96.71 1.44 2.03 3.27 5.56 3.85 7.66 3.88.73.01 1.14-.83.69-1.41l-.68-.88-.036.073-2.524-2.495.763.108.067.054-.04-.05.052.007c4.516 2.8 8.073 3.373 10.298 3.333.97-.01 1.34-1.27.54-1.82l-.17-.12a23.27 23.27 0 0 1-.243-.065l-3.11-1.666.62-.19c6.053 1.66 9.432-.137 10.953-1.439.49-.42.27-1.21-.37-1.3l-1.17-.18-.137.024-5.49-.743.189-.099.208.018-.19-.027.007-.004c3.684-.136 5.926-1.552 7.103-2.609.35-.31.26-.82-.06-1.06l-.18.045-6.015-.093.102-.106.113-.006c3.99-1.03 5.97-2.54 6.95-3.79.65-.82-.07-2.01-1.11-1.87l-.73.1.008.02-4.599 1.012.32-.353c.117-.035.234-.072.351-.109l-.28.04c4.44-1.27 6.06-3.74 6.66-5.38a.795.795 0 0 0-.81-1.07l-.029.021.023-.024-4.512 2.012c-.562.18-.857.3-1.16.392a4.781 4.781 0 0 1-.234.066l.015-.025c5.22-2.61 6.277-6.232 6.377-8.442z"/><path fill="#97A8B3" d="M24.8 21.53c3.37 0 6.05-.49 7.77-.92a.69.69 0 0 0-.41-.13h-5.68l.11-.03c-3.13.17-7.02-.05-11.37-1.25.31-.41.61-.86.9-1.33.58.03 1.19.04 1.82.04 4.11 0 9.13-.64 13.78-2.96l-.02-.05-3.92.56c-3.9 1.24-7.86 1.5-11.09 1.4.27-.52.52-1.08.75-1.66h.24c2.98 0 8.64-.88 15.67-6.16a.76.76 0 0 0-.25.06l-5.29 2.27c-4.39 2.28-7.9 2.77-10 2.8.06-.18.13-.35.19-.53a.5.5 0 0 0-.33-.62c-.04-.01-.08 0-.12-.01-.22 0-.43.12-.5.35-2.41 8.04-8.32 10.1-12 10.58-.19.03-.39.05-.57.07-.28.03-.48.27-.45.54.02.26.24.45.5.45h.05c.2-.02.41-.04.64-.07.19 2.07 1.04 4.19 2.52 6.32.02-.1.03-.21 0-.32L6.69 27.1c-.27-.79-.43-1.57-.49-2.34.78-.16 1.66-.39 2.59-.75 1.92 4.58 6.46 6.91 6.52 6.94l.04-.08-1.74-2.26c-1.33-1.07-2.96-2.73-3.9-4.98.36-.16.72-.35 1.08-.55 4.17 4.34 12.35 6.58 13.49 6.88l-2.8-1.93c-2.93-1.03-7.2-2.87-9.82-5.49.4-.26.79-.55 1.19-.87 4.01 1.96 9.68 3.72 14.83 3.72 1.13 0 2.24-.09 3.3-.28l-5.25-.8c-4.31-.35-8.75-1.81-12.05-3.37.3-.28.59-.58.87-.91 3.83 1.11 7.32 1.5 10.27 1.5z"/></svg>
|
After Width: | Height: | Size: 2.1 KiB |
1
qml/js/emoji/1fabf.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#ffa800" d="M20.43 33.26a.736.736 0 0 0-.32-.31s-.36-.08-.42-.17c-.67-1.12 1.29-5.33 1.29-5.33h-2l-1.21 4.9-1.11-.03a.773.773 0 0 0-.79.76c-.01.43.33.78.76.79l.86.02-.17.09c-.38.19-.53.66-.34 1.04s.66.53 1.04.34l2.07-1.06c.38-.19.53-.66.34-1.04Z"/><path fill="#ffa800" d="M25.12 31.7a.743.743 0 0 0-.44-.06s-.33.15-.44.11c-1.21-.49-2.15-5.05-2.15-5.05l-1.6 1.19 1.96 4.65-.91.64c-.35.25-.43.73-.19 1.08.25.35.73.43 1.08.19l.7-.5-.09.18c-.19.38-.03.85.35 1.04s.85.03 1.04-.35l1.03-2.08a.78.78 0 0 0-.35-1.04Z"/><path fill="#dfe7ed" d="M9.23 11.39c-1.03 1.43-1.74 3.08-1.77 4.84-.08 5.16 4.11 7.45 6.01 8.71 1.33.88 2.85 2.35 4.13 3.72 1.47 1.56 3.98 1.41 5.24-.32 1.5-2.07 3.54-4.48 5.57-5.62 2.41-1.37 3.27-3.3 3.57-4.59.16-.66-.4-1.26-1.08-1.23-3.54.17-5.43-1.96-5.43-1.96-5.02-5.02-10.04-2.38-11.55-1.38-.25.17-.6.04-.68-.25-.38-1.35-.12-3.35.77-5.42.57-1.32.76-2.79.47-4.19-.12-.61-.34-1.22-.69-1.76-1.31-2-5.31-2-6.32 1.17-1.21 3.77 1.02 2.83 1.02 2.83s3.12 2.16.75 5.45Z"/><path fill="#fc8a00" d="M4.47 4.8c.91-.22 2.04-.55 2.94-.97.31-.14.66-.02.85.27.23.35.63.73 1.34.81.42.04.52.63.17.86-1.16.74-3.06 1.42-5.44.24-.53-.26-.43-1.07.14-1.21Z"/><circle cx="10.98" cy="3.44" r="1" fill="#282f33"/><path fill="#cad4db" d="M21.43 23.72c-1.02 0-1.99-.18-2.91-.55-4.06-1.62-5.47-6.22-5.52-6.41-.08-.26.07-.54.34-.62.27-.08.54.07.62.34.01.04 1.33 4.34 4.94 5.77 2.38.95 5.25.46 8.54-1.43a.35.35 0 0 0 .17-.3c0-.06-.02-.22-.19-.3l-2.65-1.33a.488.488 0 0 1-.22-.67c.12-.25.42-.34.67-.22l2.65 1.33c.44.22.73.67.74 1.16.01.49-.24.95-.67 1.2-2.35 1.36-4.53 2.04-6.51 2.04Z"/></svg>
|
After Width: | Height: | Size: 1.6 KiB |
1
qml/js/emoji/1face.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#6c1a0d" d="M.75 8.93s.24-3.25 3.01-5.01c.67-.43 1.46.33 1.08 1.03-.82 1.47-1.64 3.51-1.12 5.2.1.32.54.34.65.03.25-.73.67-1.83 1.28-2.75.37-.56 1.26-.23 1.18.44-.12.96-.21 2.12-.11 2.99.07.64.84.93 1.31.49.3-.28.62-.66.83-1.13.23-.5.96-.44 1.13.08.12.37.19.84.15 1.41-.05.85.36 1.66 1.08 2.1l2.05 1.26-1.15.94-1.92-1.28c-.63-.42-1.42-.52-2.12-.23-2.31.93-7.59 2.22-7.31-5.56Zm34.5 0s-.24-3.25-3.01-5.01c-.67-.43-1.46.33-1.08 1.03.82 1.47 1.64 3.51 1.12 5.2-.1.32-.54.34-.65.03-.25-.73-.67-1.83-1.28-2.75-.37-.56-1.26-.23-1.18.44.12.96.21 2.12.11 2.99-.07.64-.84.93-1.31.49-.3-.28-.62-.66-.83-1.13-.23-.5-.96-.44-1.13.08-.12.37-.19.84-.15 1.41.05.85-.36 1.66-1.08 2.1l-2.05 1.26 1.15.94 1.92-1.28c.63-.42 1.42-.52 2.12-.23 2.31.93 7.59 2.22 7.31-5.56Zm-15.73.53-.7.63-.49-.87c-.16-.29-.49-.29-.65 0l-.49.87-.7-.63c-.22-.2-.52-.07-.61.27L15.01 13h6l-.87-3.27c-.09-.34-.39-.47-.61-.27Z"/><path fill="#282f33" d="M13.15 15.06s-2.37-3.81-.72-4.76 3.73 3.06 3.73 3.06z"/><path fill="#c86349" d="m12.97 15.73-.25-.41c-.18-.28-1.71-2.82-1.31-4.42.11-.46.38-.81.76-1.04.39-.22.83-.27 1.27-.14 1.58.46 3 3.1 3.15 3.4l.22.43-3.85 2.18Zm-.01-5.08c-.1 0-.2.03-.29.08-.15.09-.25.22-.3.42-.21.84.49 2.38.95 3.23l2.15-1.21c-.58-.98-1.54-2.26-2.31-2.48a.761.761 0 0 0-.21-.03Z"/><path fill="#282f33" d="M22.85 15.06s2.37-3.81.72-4.76-3.73 3.06-3.73 3.06z"/><path fill="#c86349" d="m23.03 15.73-3.85-2.18.22-.43c.16-.3 1.57-2.94 3.15-3.4.45-.13.89-.08 1.28.14s.65.58.76 1.04c.4 1.6-1.14 4.14-1.31 4.42l-.25.41Zm-2.5-2.56 2.15 1.21c.47-.86 1.16-2.39.95-3.23-.05-.19-.14-.33-.29-.41-.15-.09-.31-.1-.5-.05-.83.24-1.81 1.64-2.31 2.48Z"/><circle cx="18" cy="30" r="2.5" fill="#282f33"/><path fill="#c86349" d="M18 33c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3m0-5c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2"/><path fill="#c86349" d="M25 17.5c0-3.31-3.13-6-7-6s-7 2.69-7 6c0 1.2.41 2.32 1.13 3.26.78 1.02 1 2.37.76 3.64-.25 1.33-.39 2.46-.39 3.11 0 2.76 2.46 3 5.5 3s5.5-.24 5.5-3c0-.65-.14-1.77-.39-3.11-.24-1.26-.02-2.61.76-3.64.71-.94 1.13-2.05 1.13-3.26"/><path fill="#262b2b" d="M14.4 20.01s0-1.03 1.03-1.03 1.03 1.03 1.03 1.03v1.03s0 1.03-1.03 1.03-1.03-1.03-1.03-1.03v-1.03Zm5.15 0s0-1.03 1.03-1.03 1.03 1.03 1.03 1.03v1.03s0 1.03-1.03 1.03-1.03-1.03-1.03-1.03z"/><path fill="#6c1a0d" d="M16.06 28.03c.36-.09.51-.76.33-1.49s-.63-1.25-1-1.15-.51.76-.33 1.49.63 1.25 1 1.15Zm4.86-1.16c.19-.73.04-1.4-.33-1.49s-.81.42-1 1.15-.04 1.4.33 1.49.81-.42 1-1.15"/></svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
qml/js/emoji/1facf.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#738695" d="m16.07 26.09 3.23 6.04c.1.18.35.22.49.07l1.49-1.49c.12-.12.12-.31 0-.43l-2.24-2.43a1.03 1.03 0 0 1-.27-.69v-3.72l-3.28-1.94-1 3 1.57 1.59Zm5.7-2.88S23 26 25 27l-1.33 4.07c-.08.2.07.43.29.43h1.52c.14 0 .26-.09.3-.22l1.72-5.78-3-5.38-3 2z"/><path fill="#bfccd5" d="M6.97 5s-1.86 3.92-.18 5.5h1.14S9.02 8.48 6.97 5"/><path fill="#738695" d="M7.02 8.82s.38-1.7 3.48-2.32c1.36-.27 2.42.05 3.11.39.48.24.57.89.16 1.25l-.76.67s1.72-.24 1.99.18c.22.33-.5 1.5-.5 1.5s1.08.02 1.5.5c.11.13.52.54.94.96.69.68 1.54 1.16 2.48 1.4l2.57.64-6.5-.5-4.04-2.91-4.44-1.77Z"/><path fill="#bfccd5" d="M31.4 12.92c-1.91-2.01-5.4-2.75-8.9-.42-4.85 3.23-10-2-10-2-3.36-2.69-5.37-2.21-6.32-1.61-.38.24-.67.59-.87.99l-2.2 4.36c-.84 1.66.82 3.47 2.55 2.79L9.01 16c.71 2.83 2.17 4.41 2.96 5.09.35.3.58.72.64 1.18l.9 7.23-.75 4.05c-.05.27.15.51.42.51h1.89c.24 0 .43-.19.43-.43V29.5s.63-3.81.89-5.36c.06-.34.4-.53.72-.42 3.39 1.12 5.78-.06 6.81-.77.28-.19.67-.08.78.25 1.15 3.42 3.79 4.3 3.79 4.3l-1.34 6.04c-.06.27.15.53.42.53h1.58c.2 0 .37-.13.42-.32l1.81-6.86c.06-.24.03-.51-.1-.73l-.78-1.36a.788.788 0 0 1-.06-.67l2.03-5.63c.06-.16.1-.32.15-.48.22 1.19.35 2.66.35 4.48 0 .28.22.5.5.5s.5-.22.5-.5c0-5.84-1.37-8.43-2.6-9.58Z"/><path fill="#dfe7ed" d="M5.82 15.37S6.5 11.5 2.5 13.5c-2 1-1.06 2.92.36 3.98 1.04.77 2.53.6 3.33-.41.5-.63.67-1.31-.38-1.7Z"/><path fill="#bfccd5" d="M10.38 4.3s-2.86 3.97-1.32 6.06l1.26.23s1.62-2.02.06-6.3Z"/><path fill="#738695" d="M9.76 8.82c.25.1.52.23.79.38.11-.74.08-1.78-.43-3.18 0 0-.88 1.26-1.08 2.59.24.04.48.11.71.2Zm-6 6.12c.13-.52.06-.98-.15-1.04s-.5.32-.63.84-.06.98.15 1.04.5-.32.63-.84"/><path d="M7.2 12.82c.44 0 .8-.36.8-.8s-.36-.8-.8-.8-.8.36-.8.8.36.8.8.8"/><path fill="#738695" d="M13.18 34.06h1.89c.24 0 .43-.19.43-.43V33h-2.65l-.1.55c-.05.27.15.51.42.51ZM27.28 33l-.12.54c-.06.27.15.53.42.53h1.58c.2 0 .37-.13.42-.32l.2-.74h-2.5Zm6.21-11.18c-.98 0-1.93 1.45 0 3.91 0 0 2.44-3.92 0-3.91"/></svg>
|
After Width: | Height: | Size: 2 KiB |
1
qml/js/emoji/1fada.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#f1b777" d="M16.4 26.75c.52.82 1.17 2 1.81 3.58.69 1.71 2.05 3.05 3.8 3.64.05.02.09.03.14.05 3.88 1.31 8.02-1.13 8.75-5.15.22-1.19-.05-2.42-.74-3.42l-1.32-1.9c-.3-.43-.25-1.01.13-1.37 1.35-1.29 4.18-4.55 3.34-8.56-.08-.4-2.81-4.11-6.72-1.05a1.77 1.77 0 0 0-.4 1.96c.36.84.71 2.15.48 3.73-.04.27-.41.32-.51.07-.42-.99-1.31-2.54-2.93-3.14-.42-.16-.71-.55-.71-1v-.98c0-.41.25-.78.63-.91 1.17-.42 3.61-1.55 4.37-3.8 0 0 .49-1.47-.59-2.35-.9-.74-2.29-.51-3.01.4-.38.48-.96.95-1.75.95 0 0 .08-.78.06-1.73a3.497 3.497 0 0 0-2.92-3.37h-.08c-2.49-.42-5.71.1-7.88 2.44-.51.55-1.01 1.1-1.2 1.83-.6 2.35-1.33 8.02 2.85 14.83 0 0-3.43-.77-4.95-4.31a2.197 2.197 0 0 0-2.46-1.3c-1.4.28-2.51 1.36-2.81 2.76-.41 1.87.14 3.82 1.47 5.2 1.9 1.96 5.27 3.9 10.54 2.02.98-.35 2.07 0 2.63.88Z"/><path fill="#ffd875" d="M29.06 27.58c-.69-1.6-3.11-2.09-5.41-1.1-2.3.99-3.6 3.09-2.91 4.69.69 1.6 3.11 2.09 5.41 1.1s3.6-3.09 2.91-4.69Z"/><path fill="#ea9e48" d="M20.21 24.17c-1.56 1.01-2.54 2.4-3.17 3.69.19.35.39.74.59 1.17.52-1.35 1.46-2.96 3.12-4.03 2.16-1.39 5.07-1.59 8.66-.63l-.58-.84c-.08-.11-.13-.24-.16-.36-3.43-.74-6.27-.42-8.46 1m-16.99-.32c.14.14.29.29.45.43-.14-1.9.23-3.4 1.09-4.48.83-1.04 1.96-1.47 2.77-1.65-.17-.28-.34-.59-.48-.92-.93.25-2.13.79-3.06 1.94-.83 1.03-1.27 2.37-1.33 3.98.17.25.36.48.57.7Zm6.8-3.21c-.51-.32-1.07-.74-1.59-1.3-.78.65-1.84 1.79-2.25 3.48-.24 1-.23 2.04.04 3.11.7.3 1.47.52 2.34.63-.53-1.17-.68-2.26-.44-3.24.34-1.42 1.4-2.32 1.9-2.68m6.88-1.34c1.98-2.42 5.18-3.07 6.72-3.24a4.27 4.27 0 0 0-1.27-.82c-1.83.36-4.42 1.23-6.21 3.42-1.49 1.82-2.12 4.2-1.92 7.1.34-.05.69-.02 1.01.08-.22-2.7.33-4.9 1.68-6.54Zm4.6-5.24v-.85c0-.41.25-.78.63-.91.06-.02.13-.05.2-.08-2.73-1.63-5.39-2.16-7.93-1.55-2.46.59-4.27 2.13-5.4 3.39.15.78.35 1.59.63 2.44.64-.94 2.46-3.22 5.25-3.89 2.06-.49 4.29 0 6.62 1.45ZM8.94 7.5c-.08.43-.16.91-.21 1.46 2.43-2.11 7.03-5.05 12.46-3.32-.02-.39-.1-.77-.25-1.12-5.04-1.36-9.34.91-12 2.98Zm14.98-1.67c-.36.13-.69.35-.95.65.76.34 1.62.87 2.09 1.71.35.62.43 1.34.27 2.16a5.2 5.2 0 0 0 1.02-1.48c-.08-.41-.21-.8-.42-1.17-.48-.86-1.25-1.45-2.01-1.86Zm8.51 8.7c-1.28-1.21-2.63-1.88-4.03-1.98-1.4-.09-2.54.41-3.3.87-.09.36-.07.74.08 1.09 0 .01.01.03.02.05.54-.41 1.7-1.12 3.14-1.01 1.39.1 2.76.91 4.06 2.39.05-.45.07-.92.03-1.41m-3.98.82c-.97-.3-1.96-.25-2.96.12.08.31.14.65.18 1.02.85-.36 1.68-.43 2.48-.18 1.46.44 2.56 1.77 3.21 2.75.18-.33.34-.68.49-1.05-.76-1.03-1.91-2.21-3.41-2.66Z"/></svg>
|
After Width: | Height: | Size: 2.4 KiB |
1
qml/js/emoji/1fadb.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4e932b" d="M28 5C12 5 2.03 33.73 2.03 33.73c.01.24.21.42.45.4l8.78-5.46s.36-.61.83-1.4c.75.3 1.57.45 2.43.4a5.789 5.789 0 0 0 5.44-5.08 6.373 6.373 0 0 0 4.31-6.19c3.64-.44 6.18-4.23 4.61-8.08-.62-1.52.75-3.33-.89-3.33Z"/><circle cx="7.7" cy="30.6" r="3.3" fill="#9bd57f"/><path fill="#4e932b" d="M7 25s-2 4 1.7 6c.26.14 2.46-1.81 2.38-1.4S7.4 25.11 7.4 25.11z"/><circle cx="12.16" cy="26.74" r="5.16" fill="#9bd57f"/><path fill="#4e932b" d="M11 20s-4 2 1 8l4 1z"/><circle cx="15.5" cy="21.5" r="5.5" fill="#9bd57f"/><path fill="#4e932b" d="M13.8 15.12S12.48 21.99 19 24l1.42-1.14-6.63-7.74Z"/><circle cx="19.75" cy="16.33" r="5.58" fill="#9bd57f"/><path fill="#4e932b" d="M19.27 9.73s-1.49 5.78 2.9 8.38l5.69-2.55-8.6-5.83Z"/><circle cx="24.44" cy="11.46" r="4.96" fill="#9bd57f"/><path fill="#69b546" d="M2.35 34.03C4.2 33.16 19 22 29.25 8.47l1.71 1S21 38 2.39 34.23c-.1-.02-.13-.15-.04-.2Z"/><path fill="#4e932b" d="M32.64 3.18c2.46.88 2.24-1.04 1.69-1.62-.81-.84-2.22-.94-3.3-.07-.35.28-.83.89-1.32 1.59-.2.29-.57.38-.89.25-2.85-1.16-5.8-1.23-9.4.4 0 0 2.41 3.35 7.37 3.46 0 0-3.37 3.24-.99 8.24 0 0 3.35-2.41 3.42-5.71 0 0 1.6 2.51 4.91 2.58 0 0-.61-5.8-3.37-7.95-.18-.14-.16-.43.04-.56.74-.47 1.43-.77 1.87-.61Z"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
qml/js/emoji/1fae8.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><clipPath id="a"><path fill="none" d="M.997 18 17.996 1.001l16.999 17-17 16.998z"/></clipPath></defs><g clip-path="url(#a)"><path fill="#ffcb26" d="M26.5 26.5c-4.69 4.69-12.31 4.69-17 0-4.69-4.69-4.69-12.31 0-17s12.31-4.69 17 0c4.69 4.69 4.69 12.31 0 17"/><path fill="#b68600" d="M14.93 13.99c.65.65 1.92.44 2.83-.47.91-.91 1.12-2.18.47-2.83s-1.92-.44-2.83.47-1.12 2.18-.47 2.83Z"/><path fill="#b68600" d="M16.35 15.4c.65.65 1.92.44 2.83-.47.91-.91 1.12-2.18.47-2.83s-1.92-.44-2.83.47-1.12 2.18-.47 2.83m5.66 5.67c.65.65 1.92.44 2.83-.47s1.12-2.18.47-2.83-1.92-.44-2.83.47-1.12 2.18-.47 2.83Z"/><path fill="#b68600" d="M20.6 19.65c.65.65 1.92.44 2.83-.47s1.12-2.18.47-2.83-1.92-.44-2.83.47-1.12 2.18-.47 2.83"/><path fill="#694400" d="M12.33 23.67c1.04 1.04 2.95.83 4.25-.47s1.52-3.21.47-4.25-2.95-.83-4.25.47-1.52 3.21-.47 4.25Z"/></g><path fill="#4facf0" d="M21.89 33.66c-.46 0-.88-.32-.98-.79-.11-.54.23-1.07.77-1.19 8.4-1.78 9.92-9.63 9.99-9.96.1-.54.62-.9 1.16-.81s.9.62.81 1.16c-.02.09-1.79 9.5-11.54 11.57-.07.01-.14.02-.21.02Zm5.31 2.33c-.46 0-.88-.32-.98-.79-.11-.54.23-1.07.77-1.19 5.89-1.25 6.97-6.75 7.01-6.99.1-.54.62-.9 1.16-.8.54.1.9.61.81 1.16-.05.29-1.33 7.06-8.57 8.59-.07.01-.14.02-.21.02ZM3.34 15.1c-.07 0-.14 0-.21-.02a.998.998 0 0 1-.77-1.19C4.43 4.15 13.83 2.37 13.93 2.36a1 1 0 1 1 .35 1.97c-.35.06-8.18 1.6-9.96 9.99-.1.47-.52.79-.98.79ZM1.01 9.8c-.07 0-.14 0-.21-.02a.998.998 0 0 1-.77-1.19C1.56 1.36 8.34.08 8.62.03A1 1 0 1 1 8.97 2c-.26.05-5.74 1.14-6.99 7.01-.1.47-.51.79-.98.79Z"/><path fill="#694400" d="M15.64 14.69c.65.65 1.92.44 2.83-.47.91-.91 1.12-2.18.47-2.83s-1.92-.44-2.83.47-1.12 2.18-.47 2.83Zm5.67 5.67c.65.65 1.92.44 2.83-.47s1.12-2.18.47-2.83-1.92-.44-2.83.47-1.12 2.18-.47 2.83"/></svg>
|
After Width: | Height: | Size: 1.8 KiB |
1
qml/js/emoji/1faf7-1f3fb.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E0AA94" d="M16.5 31c-.64 0-1.28-.24-1.77-.73C9.28 24.82 6.79 5.49 6.52 3.3 6.35 1.93 7.33.68 8.7.52c1.38-.17 2.62.81 2.78 2.18.93 7.6 3.59 20.84 6.79 24.04a2.499 2.499 0 0 1-1.77 4.27Z"/><path fill="#F7DECE" d="m28.9 25.33-8.75 1.15c-2.15.51-3.94-1.06-5.01-2.8l-.17-.38c-1.3-2.86-2.22-5.87-2.73-8.97L10.32 2.64a2.392 2.392 0 0 0-4.77.31l.22 12.21c0 .07-.02.14-.05.21-.78 1.3-1.35 3.72.04 7.88-.15.77-.44 1.48-.92 2.69-1.28 4.82 2.35 9.55 7.34 9.55h16.51a2.76 2.76 0 0 0 2.76-2.76v-5.16c0-1.35-1.19-2.4-2.54-2.22Z"/><path fill="#E0AA94" d="M12.21 26.47c-.77-1.68-1.11-3.93-1.47-5.82-.22-1.26-.42-2.55-.6-3.81-.05-1.6-1.43-2.97-3.04-2.74-.47.01-.92.11-1.35.26l.02.86c1.24-.57 2.76-.43 3.19 1.06.44 3.71.43 7.3 1.67 10.9.47 1.09 2.09.36 1.59-.71ZM26.55 34H13.33c-1.55 0-3.09-.15-4.61-.46l-2.04-.41a7.564 7.564 0 0 0 5.49 2.35h16.51c1.25 0 2.3-.84 2.64-1.98-1.57.32-3.16.5-4.76.5Z"/></svg>
|
After Width: | Height: | Size: 958 B |
1
qml/js/emoji/1faf7-1f3fc.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D2A077" d="M16.5 31c-.64 0-1.28-.24-1.77-.73C9.28 24.82 6.79 5.49 6.52 3.3 6.35 1.93 7.33.68 8.7.52c1.38-.17 2.62.81 2.78 2.18.93 7.6 3.59 20.84 6.79 24.04a2.499 2.499 0 0 1-1.77 4.27Z"/><path fill="#F3D2A2" d="m28.9 25.33-8.75 1.15c-2.15.51-3.94-1.06-5.01-2.8l-.17-.38c-1.3-2.86-2.22-5.87-2.73-8.97L10.32 2.64a2.392 2.392 0 0 0-4.77.31l.22 12.21c0 .07-.02.14-.05.21-.78 1.3-1.35 3.72.04 7.88-.15.77-.44 1.48-.92 2.69-1.28 4.82 2.35 9.55 7.34 9.55h16.51a2.76 2.76 0 0 0 2.76-2.76v-5.16c0-1.35-1.19-2.4-2.54-2.22Z"/><path fill="#D2A077" d="M12.21 26.47c-.77-1.68-1.11-3.93-1.47-5.82-.22-1.26-.42-2.55-.6-3.81-.05-1.6-1.43-2.97-3.04-2.74-.47.01-.92.11-1.35.26l.02.86c1.24-.57 2.76-.43 3.19 1.06.44 3.71.43 7.3 1.67 10.9.47 1.09 2.09.36 1.59-.71ZM26.55 34H13.33c-1.55 0-3.09-.15-4.61-.46l-2.04-.41a7.564 7.564 0 0 0 5.49 2.35h16.51c1.25 0 2.3-.84 2.64-1.98-1.57.32-3.16.5-4.76.5Z"/></svg>
|
After Width: | Height: | Size: 958 B |
1
qml/js/emoji/1faf7-1f3fd.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#B78B60" d="M16.5 31c-.64 0-1.28-.24-1.77-.73C9.28 24.82 6.79 5.49 6.52 3.3 6.35 1.93 7.33.68 8.7.52c1.38-.17 2.62.81 2.78 2.18.93 7.6 3.59 20.84 6.79 24.04a2.499 2.499 0 0 1-1.77 4.27Z"/><path fill="#D5AB88" d="m28.9 25.33-8.75 1.15c-2.15.51-3.94-1.06-5.01-2.8l-.17-.38c-1.3-2.86-2.22-5.87-2.73-8.97L10.32 2.64a2.392 2.392 0 0 0-4.77.31l.22 12.21c0 .07-.02.14-.05.21-.78 1.3-1.35 3.72.04 7.88-.15.77-.44 1.48-.92 2.69-1.28 4.82 2.35 9.55 7.34 9.55h16.51a2.76 2.76 0 0 0 2.76-2.76v-5.16c0-1.35-1.19-2.4-2.54-2.22Z"/><path fill="#B78B60" d="M12.21 26.47c-.77-1.68-1.11-3.93-1.47-5.82-.22-1.26-.42-2.55-.6-3.81-.05-1.6-1.43-2.97-3.04-2.74-.47.01-.92.11-1.35.26l.02.86c1.24-.57 2.76-.43 3.19 1.06.44 3.71.43 7.3 1.67 10.9.47 1.09 2.09.36 1.59-.71ZM26.55 34H13.33c-1.55 0-3.09-.15-4.61-.46l-2.04-.41a7.564 7.564 0 0 0 5.49 2.35h16.51c1.25 0 2.3-.84 2.64-1.98-1.57.32-3.16.5-4.76.5Z"/></svg>
|
After Width: | Height: | Size: 958 B |
1
qml/js/emoji/1faf7-1f3fe.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path xmlns="http://www.w3.org/2000/svg" fill="#90603E" d="M16.5 31c-.64 0-1.28-.24-1.77-.73C9.28 24.82 6.79 5.49 6.52 3.3 6.35 1.93 7.33.68 8.7.52c1.38-.17 2.62.81 2.78 2.18.93 7.6 3.59 20.84 6.79 24.04a2.499 2.499 0 0 1-1.77 4.27Z"/><path fill="#AF7E57" d="m28.9 25.33-8.75 1.15c-2.15.51-3.94-1.06-5.01-2.8l-.17-.38c-1.3-2.86-2.22-5.87-2.73-8.97L10.32 2.64a2.392 2.392 0 0 0-4.77.31l.22 12.21c0 .07-.02.14-.05.21-.78 1.3-1.35 3.72.04 7.88-.15.77-.44 1.48-.92 2.69-1.28 4.82 2.35 9.55 7.34 9.55h16.51a2.76 2.76 0 0 0 2.76-2.76v-5.16c0-1.35-1.19-2.4-2.54-2.22Z"/><path xmlns="http://www.w3.org/2000/svg" fill="#90603E" d="M12.21 26.47c-.77-1.68-1.11-3.93-1.47-5.82-.22-1.26-.42-2.55-.6-3.81-.05-1.6-1.43-2.97-3.04-2.74-.47.01-.92.11-1.35.26l.02.86c1.24-.57 2.76-.43 3.19 1.06.44 3.71.43 7.3 1.67 10.9.47 1.09 2.09.36 1.59-.71ZM26.55 34H13.33c-1.55 0-3.09-.15-4.61-.46l-2.04-.41a7.564 7.564 0 0 0 5.49 2.35h16.51c1.25 0 2.3-.84 2.64-1.98-1.57.32-3.16.5-4.76.5Z"/></svg>
|
After Width: | Height: | Size: 1 KiB |
1
qml/js/emoji/1faf7-1f3ff.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#583529" d="M16.5 31c-.64 0-1.28-.24-1.77-.73C9.28 24.82 6.79 5.49 6.52 3.3 6.35 1.93 7.33.68 8.7.52c1.38-.17 2.62.81 2.78 2.18.93 7.6 3.59 20.84 6.79 24.04a2.499 2.499 0 0 1-1.77 4.27Z"/><path fill="#7C533E" d="m28.9 25.33-8.75 1.15c-2.15.51-3.94-1.06-5.01-2.8l-.17-.38c-1.3-2.86-2.22-5.87-2.73-8.97L10.32 2.64a2.392 2.392 0 0 0-4.77.31l.22 12.21c0 .07-.02.14-.05.21-.78 1.3-1.35 3.72.04 7.88-.15.77-.44 1.48-.92 2.69-1.28 4.82 2.35 9.55 7.34 9.55h16.51a2.76 2.76 0 0 0 2.76-2.76v-5.16c0-1.35-1.19-2.4-2.54-2.22Z"/><path fill="#583529" d="M12.21 26.47c-.77-1.68-1.11-3.93-1.47-5.82-.22-1.26-.42-2.55-.6-3.81-.05-1.6-1.43-2.97-3.04-2.74-.47.01-.92.11-1.35.26l.02.86c1.24-.57 2.76-.43 3.19 1.06.44 3.71.43 7.3 1.67 10.9.47 1.09 2.09.36 1.59-.71ZM26.55 34H13.33c-1.55 0-3.09-.15-4.61-.46l-2.04-.41a7.564 7.564 0 0 0 5.49 2.35h16.51c1.25 0 2.3-.84 2.64-1.98-1.57.32-3.16.5-4.76.5Z"/></svg>
|
After Width: | Height: | Size: 958 B |
1
qml/js/emoji/1faf7.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EF9645" d="M16.5 31c-.64 0-1.28-.24-1.77-.73C9.28 24.82 6.79 5.49 6.52 3.3 6.35 1.93 7.33.68 8.7.52c1.38-.17 2.62.81 2.78 2.18.93 7.6 3.59 20.84 6.79 24.04a2.499 2.499 0 0 1-1.77 4.27Z"/><path fill="#FFDC5D" d="m28.9 25.33-8.75 1.15c-2.15.51-3.94-1.06-5.01-2.8l-.17-.38c-1.3-2.86-2.22-5.87-2.73-8.97L10.32 2.64a2.392 2.392 0 0 0-4.77.31l.22 12.21c0 .07-.02.14-.05.21-.78 1.3-1.35 3.72.04 7.88-.15.77-.44 1.48-.92 2.69-1.28 4.82 2.35 9.55 7.34 9.55h16.51a2.76 2.76 0 0 0 2.76-2.76v-5.16c0-1.35-1.19-2.4-2.54-2.22Z"/><path fill="#EF9645" d="M12.21 26.47c-.77-1.68-1.11-3.93-1.47-5.82-.22-1.26-.42-2.55-.6-3.81-.05-1.6-1.43-2.97-3.04-2.74-.47.01-.92.11-1.35.26l.02.86c1.24-.57 2.76-.43 3.19 1.06.44 3.71.43 7.3 1.67 10.9.47 1.09 2.09.36 1.59-.71ZM26.55 34H13.33c-1.55 0-3.09-.15-4.61-.46l-2.04-.41a7.564 7.564 0 0 0 5.49 2.35h16.51c1.25 0 2.3-.84 2.64-1.98-1.57.32-3.16.5-4.76.5Z"/></svg>
|
After Width: | Height: | Size: 958 B |
1
qml/js/emoji/1faf8-1f3fb.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E0AA94" d="M19.5 31c.64 0 1.28-.24 1.77-.73 5.45-5.45 7.95-24.78 8.21-26.96.17-1.37-.81-2.62-2.18-2.78-1.38-.17-2.62.81-2.78 2.18-.93 7.6-3.59 20.84-6.79 24.04a2.499 2.499 0 0 0 1.77 4.27Z"/><path fill="#F7DECE" d="m7.1 25.33 8.75 1.15c2.15.51 3.94-1.06 5.01-2.8l.17-.38c1.3-2.86 2.22-5.87 2.73-8.97l1.92-11.69a2.392 2.392 0 0 1 4.77.31l-.22 12.21c0 .07.02.14.05.21.78 1.3 1.35 3.72-.04 7.88.15.77.44 1.48.92 2.69 1.28 4.82-2.35 9.55-7.34 9.55H7.33a2.76 2.76 0 0 1-2.76-2.76v-5.16c0-1.35 1.19-2.4 2.54-2.22Z"/><path fill="#E0AA94" d="M23.79 26.47c.77-1.68 1.11-3.93 1.47-5.82.22-1.26.42-2.55.6-3.81.05-1.6 1.43-2.97 3.04-2.74.47.01.92.11 1.35.26l-.02.86c-1.24-.57-2.76-.43-3.19 1.06-.44 3.71-.43 7.3-1.67 10.9-.47 1.09-2.09.36-1.59-.71ZM9.45 34h13.22c1.55 0 3.09-.15 4.61-.46l2.04-.41a7.564 7.564 0 0 1-5.49 2.35H7.33c-1.25 0-2.3-.84-2.64-1.98 1.57.32 3.16.5 4.76.5"/></svg>
|
After Width: | Height: | Size: 947 B |
1
qml/js/emoji/1faf8-1f3fc.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D2A077" d="M19.5 31c.64 0 1.28-.24 1.77-.73 5.45-5.45 7.95-24.78 8.21-26.96.17-1.37-.81-2.62-2.18-2.78-1.38-.17-2.62.81-2.78 2.18-.93 7.6-3.59 20.84-6.79 24.04a2.499 2.499 0 0 0 1.77 4.27Z"/><path fill="#F3D2A2" d="m7.1 25.33 8.75 1.15c2.15.51 3.94-1.06 5.01-2.8l.17-.38c1.3-2.86 2.22-5.87 2.73-8.97l1.92-11.69a2.392 2.392 0 0 1 4.77.31l-.22 12.21c0 .07.02.14.05.21.78 1.3 1.35 3.72-.04 7.88.15.77.44 1.48.92 2.69 1.28 4.82-2.35 9.55-7.34 9.55H7.33a2.76 2.76 0 0 1-2.76-2.76v-5.16c0-1.35 1.19-2.4 2.54-2.22Z"/><path fill="#D2A077" d="M23.79 26.47c.77-1.68 1.11-3.93 1.47-5.82.22-1.26.42-2.55.6-3.81.05-1.6 1.43-2.97 3.04-2.74.47.01.92.11 1.35.26l-.02.86c-1.24-.57-2.76-.43-3.19 1.06-.44 3.71-.43 7.3-1.67 10.9-.47 1.09-2.09.36-1.59-.71ZM9.45 34h13.22c1.55 0 3.09-.15 4.61-.46l2.04-.41a7.564 7.564 0 0 1-5.49 2.35H7.33c-1.25 0-2.3-.84-2.64-1.98 1.57.32 3.16.5 4.76.5Z"/></svg>
|
After Width: | Height: | Size: 948 B |
1
qml/js/emoji/1faf8-1f3fd.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#B78B60" d="M19.5 31c.64 0 1.28-.24 1.77-.73 5.45-5.45 7.95-24.78 8.21-26.96.17-1.37-.81-2.62-2.18-2.78-1.38-.17-2.62.81-2.78 2.18-.93 7.6-3.59 20.84-6.79 24.04a2.499 2.499 0 0 0 1.77 4.27Z"/><path fill="#D5AB88" d="m7.1 25.33 8.75 1.15c2.15.51 3.94-1.06 5.01-2.8l.17-.38c1.3-2.86 2.22-5.87 2.73-8.97l1.92-11.69a2.392 2.392 0 0 1 4.77.31l-.22 12.21c0 .07.02.14.05.21.78 1.3 1.35 3.72-.04 7.88.15.77.44 1.48.92 2.69 1.28 4.82-2.35 9.55-7.34 9.55H7.33a2.76 2.76 0 0 1-2.76-2.76v-5.16c0-1.35 1.19-2.4 2.54-2.22Z"/><path fill="#B78B60" d="M23.79 26.47c.77-1.68 1.11-3.93 1.47-5.82.22-1.26.42-2.55.6-3.81.05-1.6 1.43-2.97 3.04-2.74.47.01.92.11 1.35.26l-.02.86c-1.24-.57-2.76-.43-3.19 1.06-.44 3.71-.43 7.3-1.67 10.9-.47 1.09-2.09.36-1.59-.71ZM9.45 34h13.22c1.55 0 3.09-.15 4.61-.46l2.04-.41a7.564 7.564 0 0 1-5.49 2.35H7.33c-1.25 0-2.3-.84-2.64-1.98 1.57.32 3.16.5 4.76.5"/></svg>
|
After Width: | Height: | Size: 947 B |
1
qml/js/emoji/1faf8-1f3fe.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#90603E" d="M19.5 31c.64 0 1.28-.24 1.77-.73 5.45-5.45 7.95-24.78 8.21-26.96.17-1.37-.81-2.62-2.18-2.78-1.38-.17-2.62.81-2.78 2.18-.93 7.6-3.59 20.84-6.79 24.04a2.499 2.499 0 0 0 1.77 4.27Z"/><path fill="#AF7E57" d="m7.1 25.33 8.75 1.15c2.15.51 3.94-1.06 5.01-2.8l.17-.38c1.3-2.86 2.22-5.87 2.73-8.97l1.92-11.69a2.392 2.392 0 0 1 4.77.31l-.22 12.21c0 .07.02.14.05.21.78 1.3 1.35 3.72-.04 7.88.15.77.44 1.48.92 2.69 1.28 4.82-2.35 9.55-7.34 9.55H7.33a2.76 2.76 0 0 1-2.76-2.76v-5.16c0-1.35 1.19-2.4 2.54-2.22Z"/><path fill="#90603E" d="M23.79 26.47c.77-1.68 1.11-3.93 1.47-5.82.22-1.26.42-2.55.6-3.81.05-1.6 1.43-2.97 3.04-2.74.47.01.92.11 1.35.26l-.02.86c-1.24-.57-2.76-.43-3.19 1.06-.44 3.71-.43 7.3-1.67 10.9-.47 1.09-2.09.36-1.59-.71ZM9.45 34h13.22c1.55 0 3.09-.15 4.61-.46l2.04-.41a7.564 7.564 0 0 1-5.49 2.35H7.33c-1.25 0-2.3-.84-2.64-1.98 1.57.32 3.16.5 4.76.5"/></svg>
|
After Width: | Height: | Size: 947 B |
1
qml/js/emoji/1faf8-1f3ff.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#583529" d="M19.5 31c.64 0 1.28-.24 1.77-.73 5.45-5.45 7.95-24.78 8.21-26.96.17-1.37-.81-2.62-2.18-2.78-1.38-.17-2.62.81-2.78 2.18-.93 7.6-3.59 20.84-6.79 24.04a2.499 2.499 0 0 0 1.77 4.27Z"/><path fill="#7C533E" d="m7.1 25.33 8.75 1.15c2.15.51 3.94-1.06 5.01-2.8l.17-.38c1.3-2.86 2.22-5.87 2.73-8.97l1.92-11.69a2.392 2.392 0 0 1 4.77.31l-.22 12.21c0 .07.02.14.05.21.78 1.3 1.35 3.72-.04 7.88.15.77.44 1.48.92 2.69 1.28 4.82-2.35 9.55-7.34 9.55H7.33a2.76 2.76 0 0 1-2.76-2.76v-5.16c0-1.35 1.19-2.4 2.54-2.22Z"/><path fill="#583529" d="M23.79 26.47c.77-1.68 1.11-3.93 1.47-5.82.22-1.26.42-2.55.6-3.81.05-1.6 1.43-2.97 3.04-2.74.47.01.92.11 1.35.26l-.02.86c-1.24-.57-2.76-.43-3.19 1.06-.44 3.71-.43 7.3-1.67 10.9-.47 1.09-2.09.36-1.59-.71ZM9.45 34h13.22c1.55 0 3.09-.15 4.61-.46l2.04-.41a7.564 7.564 0 0 1-5.49 2.35H7.33c-1.25 0-2.3-.84-2.64-1.98 1.57.32 3.16.5 4.76.5"/></svg>
|
After Width: | Height: | Size: 947 B |
1
qml/js/emoji/1faf8.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EF9645" d="M19.5 31c.64 0 1.28-.24 1.77-.73 5.45-5.45 7.95-24.78 8.21-26.96.17-1.37-.81-2.62-2.18-2.78-1.38-.17-2.62.81-2.78 2.18-.93 7.6-3.59 20.84-6.79 24.04a2.499 2.499 0 0 0 1.77 4.27Z"/><path fill="#FFDC5D" d="m7.1 25.33 8.75 1.15c2.15.51 3.94-1.06 5.01-2.8l.17-.38c1.3-2.86 2.22-5.87 2.73-8.97l1.92-11.69a2.392 2.392 0 0 1 4.77.31l-.22 12.21c0 .07.02.14.05.21.78 1.3 1.35 3.72-.04 7.88.15.77.44 1.48.92 2.69 1.28 4.82-2.35 9.55-7.34 9.55H7.33a2.76 2.76 0 0 1-2.76-2.76v-5.16c0-1.35 1.19-2.4 2.54-2.22Z"/><path fill="#EF9645" d="M23.79 26.47c.77-1.68 1.11-3.93 1.47-5.82.22-1.26.42-2.55.6-3.81.05-1.6 1.43-2.97 3.04-2.74.47.01.92.11 1.35.26l-.02.86c-1.24-.57-2.76-.43-3.19 1.06-.44 3.71-.43 7.3-1.67 10.9-.47 1.09-2.09.36-1.59-.71ZM9.45 34h13.22c1.55 0 3.09-.15 4.61-.46l2.04-.41a7.564 7.564 0 0 1-5.49 2.35H7.33c-1.25 0-2.3-.84-2.64-1.98 1.57.32 3.16.5 4.76.5"/></svg>
|
After Width: | Height: | Size: 947 B |
|
@ -27,6 +27,14 @@ function setGlobals(globals) {
|
|||
tdLibWrapper = globals.tdLibWrapper;
|
||||
appNotification = globals.appNotification;
|
||||
}
|
||||
function formatUnreadCount(value) {
|
||||
if(value < 1000) {
|
||||
return value;
|
||||
} else if(value > 9000) {
|
||||
return '9k+';
|
||||
}
|
||||
return ''+Math.floor(value / 1000)+'k'+((value % 1000)>0 ? '+' : '');
|
||||
}
|
||||
|
||||
function getUserName(userInformation) {
|
||||
return ((userInformation.first_name || "") + " " + (userInformation.last_name || "")).trim();
|
||||
|
@ -439,10 +447,15 @@ function handleLink(link) {
|
|||
handleTMeLink(link, tMePrefix);
|
||||
} else if (link.indexOf(tMePrefixHttp) === 0) {
|
||||
handleTMeLink(link, tMePrefixHttp);
|
||||
} else {
|
||||
Debug.log("Trying to open URL externally: " + link)
|
||||
if (link.indexOf("://") === -1) {
|
||||
Qt.openUrlExternally("https://" + link)
|
||||
} else {
|
||||
Qt.openUrlExternally(link);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getVideoHeight(videoWidth, videoData) {
|
||||
|
@ -504,7 +517,7 @@ function handleErrorMessage(code, message) {
|
|||
}
|
||||
|
||||
function getMessagesNeededForwardPermissions(messages) {
|
||||
var neededPermissions = ["can_send_messages"]
|
||||
var neededPermissions = ["can_send_basic_messages"]
|
||||
|
||||
var mediaMessageTypes = ["messageAudio", "messageDocument", "messagePhoto", "messageVideo", "messageVideoNote", "messageVoiceNote"]
|
||||
var otherMessageTypes = ["messageAnimation", "messageGame", "messageSticker"]
|
||||
|
@ -527,3 +540,7 @@ function getMessagesNeededForwardPermissions(messages) {
|
|||
}
|
||||
return neededPermissions
|
||||
}
|
||||
|
||||
function isWidescreen(appWindow) {
|
||||
return (appWindow.deviceOrientation & Silica.Orientation.LandscapeMask) || Silica.Screen.sizeCategory === Silica.Screen.Large || Silica.Screen.sizeCategory === Silica.Screen.ExtraLarge
|
||||
}
|
||||
|
|
|
@ -54,6 +54,7 @@ Page {
|
|||
property bool iterativeInitialization: false;
|
||||
property var messageToShow;
|
||||
property string messageIdToShow;
|
||||
property string messageIdToScrollTo;
|
||||
readonly property bool userIsMember: ((isPrivateChat || isSecretChat) && chatInformation["@type"]) || // should be optimized
|
||||
(isBasicGroup || isSuperGroup) && (
|
||||
(chatGroupInformation.status["@type"] === "chatMemberStatusMember")
|
||||
|
@ -63,9 +64,13 @@ Page {
|
|||
)
|
||||
property var selectedMessages: []
|
||||
readonly property bool isSelecting: selectedMessages.length > 0
|
||||
readonly property bool canSendMessages: hasSendPrivilege("can_send_messages")
|
||||
readonly property bool canSendMessages: hasSendPrivilege("can_send_basic_messages")
|
||||
property bool doSendBotStartMessage
|
||||
property string sendBotStartMessageParameter
|
||||
property var availableReactions
|
||||
signal resetElements()
|
||||
signal elementSelected(int elementIndex)
|
||||
signal navigatedTo(int targetIndex)
|
||||
|
||||
states: [
|
||||
State {
|
||||
|
@ -184,7 +189,7 @@ Page {
|
|||
}
|
||||
tdLibWrapper.getChatPinnedMessage(chatInformation.id);
|
||||
tdLibWrapper.toggleChatIsMarkedAsUnread(chatInformation.id, false);
|
||||
|
||||
availableReactions = tdLibWrapper.getChatReactions(chatInformation.id);
|
||||
}
|
||||
|
||||
function getMessageStatusText(message, listItemIndex, lastReadSentIndex, useElapsed) {
|
||||
|
@ -406,6 +411,24 @@ Page {
|
|||
chatPage.focus = true;
|
||||
}
|
||||
|
||||
function showMessage(messageId, initialRun) {
|
||||
// Means we tapped a quoted message and had to load it.
|
||||
if(initialRun) {
|
||||
chatPage.messageIdToScrollTo = messageId
|
||||
}
|
||||
if (chatPage.messageIdToScrollTo && chatPage.messageIdToScrollTo != "") {
|
||||
var index = chatModel.getMessageIndex(chatPage.messageIdToScrollTo);
|
||||
if(index !== -1) {
|
||||
chatPage.messageIdToScrollTo = "";
|
||||
chatView.scrollToIndex(index);
|
||||
navigatedTo(index);
|
||||
} else if(initialRun) {
|
||||
// we only want to do this once.
|
||||
chatModel.triggerLoadHistoryForMessage(chatPage.messageIdToScrollTo)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: forwardMessagesTimer
|
||||
interval: 200
|
||||
|
@ -439,7 +462,8 @@ Page {
|
|||
|
||||
Component.onDestruction: {
|
||||
if (chatPage.canSendMessages && !chatPage.isDeletedUser) {
|
||||
tdLibWrapper.setChatDraftMessage(chatInformation.id, 0, newMessageColumn.replyToMessageId, newMessageTextField.text);
|
||||
tdLibWrapper.setChatDraftMessage(chatInformation.id, 0, newMessageColumn.replyToMessageId, newMessageTextField.text,
|
||||
newMessageInReplyToRow.inReplyToMessage ? newMessageInReplyToRow.inReplyToMessage.id : 0);
|
||||
}
|
||||
fernschreiberUtils.stopGeoLocationUpdates();
|
||||
tdLibWrapper.closeChat(chatInformation.id);
|
||||
|
@ -478,7 +502,10 @@ Page {
|
|||
if (pageStack.depth === 1) {
|
||||
// Only clear chat model if navigated back to overview page. In other cases we keep the information...
|
||||
chatModel.clear();
|
||||
} else {
|
||||
resetElements();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -562,18 +589,21 @@ Page {
|
|||
}
|
||||
}
|
||||
onUserFullInfoReceived: {
|
||||
if(userFullInfo["@extra"] === chatPartnerInformation.id.toString()) {
|
||||
if ((isPrivateChat || isSecretChat) && userFullInfo["@extra"] === chatPartnerInformation.id.toString()) {
|
||||
chatPage.botInformation = userFullInfo;
|
||||
}
|
||||
}
|
||||
onUserFullInfoUpdated: {
|
||||
if(userId === chatPartnerInformation.id) {
|
||||
if ((isPrivateChat || isSecretChat) && userId === chatPartnerInformation.id) {
|
||||
chatPage.botInformation = userFullInfo;
|
||||
}
|
||||
}
|
||||
onSponsoredMessageReceived: {
|
||||
chatPage.containsSponsoredMessages = true;
|
||||
}
|
||||
onReactionsUpdated: {
|
||||
availableReactions = tdLibWrapper.getChatReactions(chatInformation.id);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
|
@ -607,6 +637,19 @@ Page {
|
|||
|
||||
chatViewCooldownTimer.restart();
|
||||
chatViewStartupReadTimer.restart();
|
||||
|
||||
/*
|
||||
// Double-tap for reactions is currently disabled, let's see if we'll ever need it again
|
||||
var remainingDoubleTapHints = appSettings.remainingDoubleTapHints;
|
||||
Debug.log("Remaining double tap hints: " + remainingDoubleTapHints);
|
||||
if (remainingDoubleTapHints > 0) {
|
||||
doubleTapHintTimer.start();
|
||||
tapHint.visible = true;
|
||||
tapHintLabel.visible = true;
|
||||
appSettings.remainingDoubleTapHints = remainingDoubleTapHints - 1;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
onNewMessageReceived: {
|
||||
if (( chatView.manuallyScrolledToBottom && Qt.application.state === Qt.ApplicationActive ) || message.sender_id.user_id === chatPage.myUserId) {
|
||||
|
@ -618,8 +661,8 @@ Page {
|
|||
onUnreadCountUpdated: {
|
||||
Debug.log("[ChatPage] Unread count updated, new count: ", unreadCount);
|
||||
chatInformation.unread_count = unreadCount;
|
||||
chatUnreadMessagesItem.visible = ( !chatPage.loading && chatInformation.unread_count > 0 && chatOverviewItem.visible );
|
||||
chatUnreadMessagesCount.text = unreadCount > 99 ? "99+" : unreadCount;
|
||||
chatUnreadMessagesItem.visible = ( !chatPage.loading && unreadCount > 0 && chatOverviewItem.visible );
|
||||
chatUnreadMessagesCount.text = Functions.formatUnreadCount(unreadCount)
|
||||
}
|
||||
onLastReadSentMessageUpdated: {
|
||||
Debug.log("[ChatPage] Updating last read sent index, new index: ", lastReadSentIndex);
|
||||
|
@ -634,6 +677,8 @@ Page {
|
|||
if (chatView.height > chatView.contentHeight) {
|
||||
Debug.log("[ChatPage] Chat content quite small...");
|
||||
viewMessageTimer.queueViewMessage(chatView.count - 1);
|
||||
} else if (chatPage.messageIdToScrollTo && chatPage.messageIdToScrollTo != "") {
|
||||
showMessage(chatPage.messageIdToScrollTo, false)
|
||||
}
|
||||
chatViewCooldownTimer.restart();
|
||||
chatViewStartupReadTimer.restart();
|
||||
|
@ -1196,10 +1241,9 @@ Page {
|
|||
manuallyScrolledToBottom = chatView.atYEnd
|
||||
}
|
||||
|
||||
function scrollToIndex(index) {
|
||||
function scrollToIndex(index, mode) {
|
||||
if(index > 0 && index < chatView.count) {
|
||||
positionViewAtIndex(index, ListView.Contain)
|
||||
// currentIndex = index;
|
||||
positionViewAtIndex(index, (mode === undefined) ? ListView.Contain : mode)
|
||||
if(index === chatView.count - 1) {
|
||||
manuallyScrolledToBottom = true;
|
||||
}
|
||||
|
@ -1348,6 +1392,7 @@ Page {
|
|||
messageId: model.message_id
|
||||
messageViewCount: model.view_count
|
||||
reactions: model.reactions
|
||||
chatReactions: availableReactions
|
||||
messageIndex: model.index
|
||||
hasContentComponent: !!myMessage.content && chatView.delegateMessagesContent.indexOf(model.content_type) > -1
|
||||
canReplyToMessage: chatPage.canSendMessages
|
||||
|
@ -1427,7 +1472,7 @@ Page {
|
|||
color: Theme.primaryColor
|
||||
anchors.centerIn: chatUnreadMessagesCountBackground
|
||||
visible: chatUnreadMessagesItem.visible
|
||||
text: chatInformation.unread_count > 99 ? "99+" : chatInformation.unread_count
|
||||
text: Functions.formatUnreadCount(chatInformation.unread_count)
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
|
@ -1596,7 +1641,7 @@ Page {
|
|||
|
||||
IconButton {
|
||||
id: attachImageIconButton
|
||||
visible: chatPage.hasSendPrivilege("can_send_media_messages")
|
||||
visible: chatPage.hasSendPrivilege("can_send_photos")
|
||||
icon.source: "image://theme/icon-m-image"
|
||||
onClicked: {
|
||||
var picker = pageStack.push("Sailfish.Pickers.ImagePickerPage", {
|
||||
|
@ -1612,7 +1657,7 @@ Page {
|
|||
}
|
||||
}
|
||||
IconButton {
|
||||
visible: chatPage.hasSendPrivilege("can_send_media_messages")
|
||||
visible: chatPage.hasSendPrivilege("can_send_videos")
|
||||
icon.source: "image://theme/icon-m-video"
|
||||
onClicked: {
|
||||
var picker = pageStack.push("Sailfish.Pickers.VideoPickerPage", {
|
||||
|
@ -1628,7 +1673,7 @@ Page {
|
|||
}
|
||||
}
|
||||
IconButton {
|
||||
visible: chatPage.hasSendPrivilege("can_send_media_messages")
|
||||
visible: chatPage.hasSendPrivilege("can_send_voice_notes")
|
||||
icon.source: "image://theme/icon-m-mic"
|
||||
icon.sourceSize {
|
||||
width: Theme.iconSizeMedium
|
||||
|
@ -1641,7 +1686,7 @@ Page {
|
|||
}
|
||||
}
|
||||
IconButton {
|
||||
visible: chatPage.hasSendPrivilege("can_send_media_messages")
|
||||
visible: chatPage.hasSendPrivilege("can_send_documents")
|
||||
icon.source: "image://theme/icon-m-document"
|
||||
onClicked: {
|
||||
var picker = pageStack.push("Sailfish.Pickers.FilePickerPage", {
|
||||
|
@ -1832,7 +1877,7 @@ Page {
|
|||
|
||||
Image {
|
||||
id: emojiPicture
|
||||
source: "../js/emoji/" + modelData.file_name
|
||||
source: "../js/emoji/" + modelData.file_name +".svg"
|
||||
width: Theme.fontSizeLarge
|
||||
height: Theme.fontSizeLarge
|
||||
}
|
||||
|
@ -2154,4 +2199,31 @@ Page {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: doubleTapHintTimer
|
||||
running: true
|
||||
triggeredOnStart: false
|
||||
repeat: false
|
||||
interval: 6000
|
||||
onTriggered: {
|
||||
tapHint.visible = false;
|
||||
tapHintLabel.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
TapInteractionHint {
|
||||
id: tapHint
|
||||
loops: Animation.Infinite
|
||||
taps: 2
|
||||
anchors.centerIn: parent
|
||||
visible: false
|
||||
}
|
||||
|
||||
InteractionHintLabel {
|
||||
id: tapHintLabel
|
||||
anchors.bottom: parent.bottom
|
||||
text: qsTr("Double-tap on a message to choose a reaction")
|
||||
visible: false
|
||||
}
|
||||
}
|
||||
|
|
|
@ -143,10 +143,11 @@ Page {
|
|||
|
||||
Connections {
|
||||
target: tdLibWrapper
|
||||
onUsersReceived: {
|
||||
onMessageSendersReceived: {
|
||||
Debug.log("Received poll users...")
|
||||
if(extra === optionDelegate.usersResponseIdentifierString) {
|
||||
for(var i = 0; i < userIds.length; i += 1) {
|
||||
optionDelegate.users.append({id: userIds[i], user:tdLibWrapper.getUserInformation(userIds[i])});
|
||||
for(var i = 0; i < senders.length; i += 1) {
|
||||
optionDelegate.users.append({id: senders[i].user_id, user:tdLibWrapper.getUserInformation(senders[i].user_id)});
|
||||
}
|
||||
loadUsersTimer.start();
|
||||
}
|
||||
|
|
|
@ -12,6 +12,26 @@
|
|||
# * date Author's Name <author's email> version-release
|
||||
# - Summary of changes
|
||||
|
||||
* Sun Dec 03 2023 Sebastian J. Wolf <sebastian@ygriega.de> 0.17
|
||||
- Update to TDLib 1.8.21, expect some hiccups ;)
|
||||
- Added contacts sync (OpenRepos builds only)
|
||||
- Tweaks to reaction handling (opens now on double click or click + star)
|
||||
- Option to jump to quoted message
|
||||
- Option to highlight unread conversations
|
||||
- Option to suppress notification previews
|
||||
- Option to append last message content to notifications
|
||||
- Added "unread mention" indicator to chat list
|
||||
- Improve message when search yields no results
|
||||
- New unread info for chats with high amount of unread messages
|
||||
- Setting for session inactivity timeout
|
||||
- UI improvements in landscape mode
|
||||
- Fix: Restore video functionality on SFOS 4.5
|
||||
- Fix: Chat list timestamp now updated more reliably
|
||||
- Fix: Faster reconnect after network changes
|
||||
- Fix: Some URLs couldn't be opened
|
||||
- Updated translations for several languages
|
||||
- Thanks to monich, nephros, arustg, jgibbon, carlosgonz0, okruhliak, dscheinah, pherjung and mbarashkov for your contributions
|
||||
|
||||
* Sun Jun 12 2022 Sebastian J. Wolf <sebastian@ygriega.de> 0.16
|
||||
- Support message reactions
|
||||
- Support t.me/+... links
|
||||
|
|
|
@ -6,13 +6,13 @@
|
|||
Name: harbour-fernschreiber
|
||||
|
||||
# >> macros
|
||||
# << macros
|
||||
%define __provides_exclude_from ^%{_datadir}/.*$
|
||||
%define __requires_exclude ^libtdjson.*$
|
||||
# << macros
|
||||
|
||||
Summary: Fernschreiber is a Telegram client for Sailfish OS
|
||||
Version: 0.17
|
||||
Release: 1
|
||||
Release: 12
|
||||
Group: Qt/Qt
|
||||
License: LICENSE
|
||||
URL: http://werkwolf.eu/
|
||||
|
@ -69,7 +69,7 @@ desktop-file-install --delete-original \
|
|||
|
||||
%files
|
||||
%defattr(-,root,root,-)
|
||||
%{_bindir}
|
||||
%{_bindir}/%{name}
|
||||
%{_datadir}/%{name}
|
||||
%{_datadir}/applications/%{name}.desktop
|
||||
%{_datadir}/icons/hicolor/*/apps/%{name}.png
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Name: harbour-fernschreiber
|
||||
Summary: Fernschreiber is a Telegram client for Sailfish OS
|
||||
Version: 0.17
|
||||
Release: 1
|
||||
Release: 12
|
||||
# The contents of the Group field should be one of the groups listed here:
|
||||
# https://github.com/mer-tools/spectacle/blob/master/data/GROUPS
|
||||
Group: Qt/Qt
|
||||
|
@ -30,6 +30,11 @@ PkgConfigBR:
|
|||
- nemonotifications-qt5
|
||||
- openssl
|
||||
|
||||
# NB: spectacle has a bug where it will remove custom "#<< macros" lines, so define them here:
|
||||
Macros:
|
||||
- '__provides_exclude_from;^%{_datadir}/.*$'
|
||||
- '__requires_exclude;^libtdjson.*$'
|
||||
|
||||
# Build dependencies without a pkgconfig setup can be listed here
|
||||
PkgBR:
|
||||
- gperf
|
||||
|
@ -41,7 +46,7 @@ Requires:
|
|||
|
||||
# All installed files
|
||||
Files:
|
||||
- '%{_bindir}'
|
||||
- '%{_bindir}/%{name}'
|
||||
- '%{_datadir}/%{name}'
|
||||
- '%{_datadir}/applications/%{name}.desktop'
|
||||
- '%{_datadir}/icons/hicolor/*/apps/%{name}.png'
|
||||
|
|
|
@ -29,14 +29,19 @@ namespace {
|
|||
const QString KEY_ANIMATE_STICKERS("animateStickers");
|
||||
const QString KEY_NOTIFICATION_TURNS_DISPLAY_ON("notificationTurnsDisplayOn");
|
||||
const QString KEY_NOTIFICATION_SOUNDS_ENABLED("notificationSoundsEnabled");
|
||||
const QString KEY_NOTIFICATION_SUPPRESS_ENABLED("notificationSuppressContent");
|
||||
const QString KEY_NOTIFICATION_FEEDBACK("notificationFeedback");
|
||||
const QString KEY_NOTIFICATION_ALWAYS_SHOW_PREVIEW("notificationAlwaysShowPreview");
|
||||
const QString KEY_GO_TO_QUOTED_MESSAGE("goToQuotedMessage");
|
||||
const QString KEY_STORAGE_OPTIMIZER("useStorageOptimizer");
|
||||
const QString KEY_INLINEBOT_LOCATION_ACCESS("allowInlineBotLocationAccess");
|
||||
const QString KEY_REMAINING_INTERACTION_HINTS("remainingInteractionHints");
|
||||
const QString KEY_REMAINING_DOUBLE_TAP_HINTS("remainingDoubleTapHints");
|
||||
const QString KEY_ONLINE_ONLY_MODE("onlineOnlyMode");
|
||||
const QString KEY_DELAY_MESSAGE_READ("delayMessageRead");
|
||||
const QString KEY_FOCUS_TEXTAREA_ON_CHAT_OPEN("focusTextAreaOnChatOpen");
|
||||
const QString KEY_SPONSORED_MESS("sponsoredMess");
|
||||
const QString KEY_HIGHLIGHT_UNREADCONVS("highlightUnreadConversations");
|
||||
}
|
||||
|
||||
AppSettings::AppSettings(QObject *parent) : QObject(parent), settings(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/de.ygriega/fernschreiber/settings.conf", QSettings::NativeFormat)
|
||||
|
@ -155,6 +160,20 @@ void AppSettings::setNotificationSoundsEnabled(bool enable)
|
|||
}
|
||||
}
|
||||
|
||||
bool AppSettings::notificationSuppressContent() const
|
||||
{
|
||||
return settings.value(KEY_NOTIFICATION_SUPPRESS_ENABLED, false).toBool();
|
||||
}
|
||||
|
||||
void AppSettings::setNotificationSuppressContent(bool enable)
|
||||
{
|
||||
if (notificationSuppressContent() != enable) {
|
||||
LOG(KEY_NOTIFICATION_SUPPRESS_ENABLED << enable);
|
||||
settings.setValue(KEY_NOTIFICATION_SUPPRESS_ENABLED, enable);
|
||||
emit notificationSuppressContentChanged();
|
||||
}
|
||||
}
|
||||
|
||||
AppSettings::NotificationFeedback AppSettings::notificationFeedback() const
|
||||
{
|
||||
return (NotificationFeedback) settings.value(KEY_NOTIFICATION_FEEDBACK, (int) NotificationFeedbackAll).toInt();
|
||||
|
@ -169,6 +188,34 @@ void AppSettings::setNotificationFeedback(NotificationFeedback feedback)
|
|||
}
|
||||
}
|
||||
|
||||
bool AppSettings::notificationAlwaysShowPreview() const
|
||||
{
|
||||
return settings.value(KEY_NOTIFICATION_ALWAYS_SHOW_PREVIEW, false).toBool();
|
||||
}
|
||||
|
||||
void AppSettings::setNotificationAlwaysShowPreview(bool enable)
|
||||
{
|
||||
if (notificationAlwaysShowPreview() != enable) {
|
||||
LOG(KEY_NOTIFICATION_ALWAYS_SHOW_PREVIEW << enable);
|
||||
settings.setValue(KEY_NOTIFICATION_ALWAYS_SHOW_PREVIEW, enable);
|
||||
emit notificationAlwaysShowPreviewChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool AppSettings::goToQuotedMessage() const
|
||||
{
|
||||
return settings.value(KEY_GO_TO_QUOTED_MESSAGE, false).toBool();
|
||||
}
|
||||
|
||||
void AppSettings::setGoToQuotedMessage(bool enable)
|
||||
{
|
||||
if (goToQuotedMessage() != enable) {
|
||||
LOG(KEY_GO_TO_QUOTED_MESSAGE << enable);
|
||||
settings.setValue(KEY_GO_TO_QUOTED_MESSAGE, enable);
|
||||
emit goToQuotedMessageChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool AppSettings::storageOptimizer() const
|
||||
{
|
||||
return settings.value(KEY_STORAGE_OPTIMIZER, true).toBool();
|
||||
|
@ -212,6 +259,20 @@ void AppSettings::setRemainingInteractionHints(int remainingHints)
|
|||
}
|
||||
}
|
||||
|
||||
int AppSettings::remainingDoubleTapHints() const
|
||||
{
|
||||
return settings.value(KEY_REMAINING_DOUBLE_TAP_HINTS, 3).toInt();
|
||||
}
|
||||
|
||||
void AppSettings::setRemainingDoubleTapHints(int remainingHints)
|
||||
{
|
||||
if (remainingDoubleTapHints() != remainingHints) {
|
||||
LOG(KEY_REMAINING_DOUBLE_TAP_HINTS << remainingHints);
|
||||
settings.setValue(KEY_REMAINING_DOUBLE_TAP_HINTS, remainingHints);
|
||||
emit remainingDoubleTapHintsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool AppSettings::onlineOnlyMode() const
|
||||
{
|
||||
return settings.value(KEY_ONLINE_ONLY_MODE, false).toBool();
|
||||
|
@ -240,6 +301,20 @@ void AppSettings::setDelayMessageRead(bool enable)
|
|||
}
|
||||
}
|
||||
|
||||
bool AppSettings::highlightUnreadConversations() const
|
||||
{
|
||||
return settings.value(KEY_HIGHLIGHT_UNREADCONVS, false).toBool();
|
||||
}
|
||||
|
||||
void AppSettings::setHighlightUnreadConversations(bool enable)
|
||||
{
|
||||
if (highlightUnreadConversations() != enable) {
|
||||
LOG(KEY_HIGHLIGHT_UNREADCONVS << enable);
|
||||
settings.setValue(KEY_HIGHLIGHT_UNREADCONVS, enable);
|
||||
emit highlightUnreadConversationsChanged();
|
||||
}
|
||||
}
|
||||
|
||||
bool AppSettings::getFocusTextAreaOnChatOpen() const
|
||||
{
|
||||
return settings.value(KEY_FOCUS_TEXTAREA_ON_CHAT_OPEN, false).toBool();
|
||||
|
|
|
@ -32,14 +32,19 @@ class AppSettings : public QObject {
|
|||
Q_PROPERTY(bool animateStickers READ animateStickers WRITE setAnimateStickers NOTIFY animateStickersChanged)
|
||||
Q_PROPERTY(bool notificationTurnsDisplayOn READ notificationTurnsDisplayOn WRITE setNotificationTurnsDisplayOn NOTIFY notificationTurnsDisplayOnChanged)
|
||||
Q_PROPERTY(bool notificationSoundsEnabled READ notificationSoundsEnabled WRITE setNotificationSoundsEnabled NOTIFY notificationSoundsEnabledChanged)
|
||||
Q_PROPERTY(bool notificationSuppressContent READ notificationSuppressContent WRITE setNotificationSuppressContent NOTIFY notificationSuppressContentChanged)
|
||||
Q_PROPERTY(NotificationFeedback notificationFeedback READ notificationFeedback WRITE setNotificationFeedback NOTIFY notificationFeedbackChanged)
|
||||
Q_PROPERTY(bool notificationAlwaysShowPreview READ notificationAlwaysShowPreview WRITE setNotificationAlwaysShowPreview NOTIFY notificationAlwaysShowPreviewChanged)
|
||||
Q_PROPERTY(bool goToQuotedMessage READ goToQuotedMessage WRITE setGoToQuotedMessage NOTIFY goToQuotedMessageChanged)
|
||||
Q_PROPERTY(bool storageOptimizer READ storageOptimizer WRITE setStorageOptimizer NOTIFY storageOptimizerChanged)
|
||||
Q_PROPERTY(bool allowInlineBotLocationAccess READ allowInlineBotLocationAccess WRITE setAllowInlineBotLocationAccess NOTIFY allowInlineBotLocationAccessChanged)
|
||||
Q_PROPERTY(int remainingInteractionHints READ remainingInteractionHints WRITE setRemainingInteractionHints NOTIFY remainingInteractionHintsChanged)
|
||||
Q_PROPERTY(int remainingDoubleTapHints READ remainingDoubleTapHints WRITE setRemainingDoubleTapHints NOTIFY remainingDoubleTapHintsChanged)
|
||||
Q_PROPERTY(bool onlineOnlyMode READ onlineOnlyMode WRITE setOnlineOnlyMode NOTIFY onlineOnlyModeChanged)
|
||||
Q_PROPERTY(bool delayMessageRead READ delayMessageRead WRITE setDelayMessageRead NOTIFY delayMessageReadChanged)
|
||||
Q_PROPERTY(bool focusTextAreaOnChatOpen READ getFocusTextAreaOnChatOpen WRITE setFocusTextAreaOnChatOpen NOTIFY focusTextAreaOnChatOpenChanged)
|
||||
Q_PROPERTY(SponsoredMess sponsoredMess READ getSponsoredMess WRITE setSponsoredMess NOTIFY sponsoredMessChanged)
|
||||
Q_PROPERTY(bool highlightUnreadConversations READ highlightUnreadConversations WRITE setHighlightUnreadConversations NOTIFY highlightUnreadConversationsChanged)
|
||||
|
||||
public:
|
||||
enum SponsoredMess {
|
||||
|
@ -83,9 +88,18 @@ public:
|
|||
bool notificationSoundsEnabled() const;
|
||||
void setNotificationSoundsEnabled(bool enable);
|
||||
|
||||
bool notificationSuppressContent() const;
|
||||
void setNotificationSuppressContent(bool enable);
|
||||
|
||||
NotificationFeedback notificationFeedback() const;
|
||||
void setNotificationFeedback(NotificationFeedback feedback);
|
||||
|
||||
bool notificationAlwaysShowPreview() const;
|
||||
void setNotificationAlwaysShowPreview(bool enable);
|
||||
|
||||
bool goToQuotedMessage() const;
|
||||
void setGoToQuotedMessage(bool enable);
|
||||
|
||||
bool storageOptimizer() const;
|
||||
void setStorageOptimizer(bool enable);
|
||||
|
||||
|
@ -95,6 +109,9 @@ public:
|
|||
int remainingInteractionHints() const;
|
||||
void setRemainingInteractionHints(int remainingHints);
|
||||
|
||||
int remainingDoubleTapHints() const;
|
||||
void setRemainingDoubleTapHints(int remainingHints);
|
||||
|
||||
bool onlineOnlyMode() const;
|
||||
void setOnlineOnlyMode(bool enable);
|
||||
|
||||
|
@ -107,6 +124,9 @@ public:
|
|||
SponsoredMess getSponsoredMess() const;
|
||||
void setSponsoredMess(SponsoredMess sponsoredMess);
|
||||
|
||||
bool highlightUnreadConversations() const;
|
||||
void setHighlightUnreadConversations(bool enable);
|
||||
|
||||
signals:
|
||||
void sendByEnterChanged();
|
||||
void focusTextAreaAfterSendChanged();
|
||||
|
@ -116,14 +136,19 @@ signals:
|
|||
void animateStickersChanged();
|
||||
void notificationTurnsDisplayOnChanged();
|
||||
void notificationSoundsEnabledChanged();
|
||||
void notificationSuppressContentChanged();
|
||||
void notificationFeedbackChanged();
|
||||
void notificationAlwaysShowPreviewChanged();
|
||||
void goToQuotedMessageChanged();
|
||||
void storageOptimizerChanged();
|
||||
void allowInlineBotLocationAccessChanged();
|
||||
void remainingInteractionHintsChanged();
|
||||
void remainingDoubleTapHintsChanged();
|
||||
void onlineOnlyModeChanged();
|
||||
void delayMessageReadChanged();
|
||||
void focusTextAreaOnChatOpenChanged();
|
||||
void sponsoredMessChanged();
|
||||
void highlightUnreadConversationsChanged();
|
||||
|
||||
private:
|
||||
QSettings settings;
|
||||
|
|
|
@ -44,6 +44,7 @@ namespace {
|
|||
const QString UNREAD_COUNT("unread_count");
|
||||
const QString UNREAD_MENTION_COUNT("unread_mention_count");
|
||||
const QString UNREAD_REACTION_COUNT("unread_reaction_count");
|
||||
const QString AVAILABLE_REACTIONS("available_reactions");
|
||||
const QString NOTIFICATION_SETTINGS("notification_settings");
|
||||
const QString LAST_READ_INBOX_MESSAGE_ID("last_read_inbox_message_id");
|
||||
const QString LAST_READ_OUTBOX_MESSAGE_ID("last_read_outbox_message_id");
|
||||
|
@ -70,6 +71,7 @@ public:
|
|||
int unreadCount() const;
|
||||
int unreadMentionCount() const;
|
||||
int unreadReactionCount() const;
|
||||
QVariant availableReactions() const;
|
||||
QVariant photoSmall() const;
|
||||
qlonglong lastReadInboxMessageId() const;
|
||||
qlonglong senderUserId() const;
|
||||
|
@ -168,6 +170,11 @@ int ChatListModel::ChatData::unreadMentionCount() const
|
|||
return chatData.value(UNREAD_MENTION_COUNT).toInt();
|
||||
}
|
||||
|
||||
QVariant ChatListModel::ChatData::availableReactions() const
|
||||
{
|
||||
return chatData.value(AVAILABLE_REACTIONS);
|
||||
}
|
||||
|
||||
int ChatListModel::ChatData::unreadReactionCount() const
|
||||
{
|
||||
return chatData.value(UNREAD_REACTION_COUNT).toInt();
|
||||
|
@ -400,6 +407,7 @@ ChatListModel::ChatListModel(TDLibWrapper *tdLibWrapper, AppSettings *appSetting
|
|||
connect(tdLibWrapper, SIGNAL(chatDraftMessageUpdated(qlonglong, QVariantMap, QString)), this, SLOT(handleChatDraftMessageUpdated(qlonglong, QVariantMap, QString)));
|
||||
connect(tdLibWrapper, SIGNAL(chatUnreadMentionCountUpdated(qlonglong, int)), this, SLOT(handleChatUnreadMentionCountUpdated(qlonglong, int)));
|
||||
connect(tdLibWrapper, SIGNAL(chatUnreadReactionCountUpdated(qlonglong, int)), this, SLOT(handleChatUnreadReactionCountUpdated(qlonglong, int)));
|
||||
connect(tdLibWrapper, SIGNAL(chatAvailableReactionsUpdated(qlonglong,QVariantMap)), this, SLOT(handleChatAvailableReactionsUpdated(qlonglong,QVariantMap)));
|
||||
|
||||
// Don't start the timer until we have at least one chat
|
||||
relativeTimeRefreshTimer = new QTimer(this);
|
||||
|
@ -436,6 +444,7 @@ QHash<int,QByteArray> ChatListModel::roleNames() const
|
|||
roles.insert(ChatListModel::RoleUnreadCount, "unread_count");
|
||||
roles.insert(ChatListModel::RoleUnreadMentionCount, "unread_mention_count");
|
||||
roles.insert(ChatListModel::RoleUnreadReactionCount, "unread_reaction_count");
|
||||
roles.insert(ChatListModel::RoleAvailableReactions, "available_reactions");
|
||||
roles.insert(ChatListModel::RoleLastReadInboxMessageId, "last_read_inbox_message_id");
|
||||
roles.insert(ChatListModel::RoleLastMessageSenderId, "last_message_sender_id");
|
||||
roles.insert(ChatListModel::RoleLastMessageDate, "last_message_date");
|
||||
|
@ -472,6 +481,7 @@ QVariant ChatListModel::data(const QModelIndex &index, int role) const
|
|||
case ChatListModel::RolePhotoSmall: return data->photoSmall();
|
||||
case ChatListModel::RoleUnreadCount: return data->unreadCount();
|
||||
case ChatListModel::RoleUnreadMentionCount: return data->unreadMentionCount();
|
||||
case ChatListModel::RoleAvailableReactions: return data->availableReactions();
|
||||
case ChatListModel::RoleUnreadReactionCount: return data->unreadReactionCount();
|
||||
case ChatListModel::RoleLastReadInboxMessageId: return data->lastReadInboxMessageId();
|
||||
case ChatListModel::RoleLastMessageSenderId: return data->senderUserId();
|
||||
|
@ -1036,6 +1046,26 @@ void ChatListModel::handleChatUnreadReactionCountUpdated(qlonglong chatId, int u
|
|||
}
|
||||
}
|
||||
|
||||
void ChatListModel::handleChatAvailableReactionsUpdated(qlonglong chatId, const QVariantMap availableReactions)
|
||||
{
|
||||
if (chatIndexMap.contains(chatId)) {
|
||||
LOG("Updating available reaction type for" << chatId << availableReactions);
|
||||
const int chatIndex = chatIndexMap.value(chatId);
|
||||
ChatData *chat = chatList.at(chatIndex);
|
||||
chat->chatData.insert(AVAILABLE_REACTIONS, availableReactions);
|
||||
QVector<int> changedRoles;
|
||||
changedRoles.append(ChatListModel::RoleAvailableReactions);
|
||||
const QModelIndex modelIndex(index(chatIndex));
|
||||
emit dataChanged(modelIndex, modelIndex, changedRoles);
|
||||
} else {
|
||||
ChatData *chat = hiddenChats.value(chatId);
|
||||
if (chat) {
|
||||
LOG("Updating available reaction type for hidden chat" << chatId << availableReactions);
|
||||
chat->chatData.insert(AVAILABLE_REACTIONS, availableReactions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ChatListModel::handleRelativeTimeRefreshTimer()
|
||||
{
|
||||
LOG("Refreshing timestamps");
|
||||
|
|
|
@ -42,6 +42,7 @@ public:
|
|||
RoleUnreadCount,
|
||||
RoleUnreadMentionCount,
|
||||
RoleUnreadReactionCount,
|
||||
RoleAvailableReactions,
|
||||
RoleLastReadInboxMessageId,
|
||||
RoleLastMessageSenderId,
|
||||
RoleLastMessageDate,
|
||||
|
@ -93,6 +94,7 @@ private slots:
|
|||
void handleChatDraftMessageUpdated(qlonglong chatId, const QVariantMap &draftMessage, const QString &order);
|
||||
void handleChatUnreadMentionCountUpdated(qlonglong chatId, int unreadMentionCount);
|
||||
void handleChatUnreadReactionCountUpdated(qlonglong chatId, int unreadReactionCount);
|
||||
void handleChatAvailableReactionsUpdated(qlonglong chatId, const QVariantMap availableReactions);
|
||||
void handleRelativeTimeRefreshTimer();
|
||||
|
||||
signals:
|
||||
|
|
|
@ -363,6 +363,15 @@ void ChatModel::initialize(const QVariantMap &chatInformation)
|
|||
tdLibWrapper->getChatHistory(chatId, this->chatInformation.value(LAST_READ_INBOX_MESSAGE_ID).toLongLong());
|
||||
}
|
||||
|
||||
void ChatModel::triggerLoadHistoryForMessage(qlonglong messageId)
|
||||
{
|
||||
if (!this->inIncrementalUpdate && !messages.isEmpty()) {
|
||||
LOG("Trigger loading message with id..." << messageId);
|
||||
this->inIncrementalUpdate = true;
|
||||
this->tdLibWrapper->getChatHistory(chatId, messageId);
|
||||
}
|
||||
}
|
||||
|
||||
void ChatModel::triggerLoadMoreHistory()
|
||||
{
|
||||
if (!this->inIncrementalUpdate && !messages.isEmpty()) {
|
||||
|
@ -400,6 +409,17 @@ QVariantMap ChatModel::getMessage(int index)
|
|||
return QVariantMap();
|
||||
}
|
||||
|
||||
int ChatModel::getMessageIndex(qlonglong messageId)
|
||||
{
|
||||
if (messages.size() == 0) {
|
||||
return -1;
|
||||
}
|
||||
if (messageIndexMap.contains(messageId)) {
|
||||
return messageIndexMap.value(messageId);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ChatModel::getLastReadMessageIndex()
|
||||
{
|
||||
LOG("Obtaining last read message index");
|
||||
|
|
|
@ -40,12 +40,14 @@ public:
|
|||
Q_INVOKABLE void clear(bool contentOnly = false);
|
||||
Q_INVOKABLE void initialize(const QVariantMap &chatInformation);
|
||||
Q_INVOKABLE void triggerLoadMoreHistory();
|
||||
Q_INVOKABLE void triggerLoadHistoryForMessage(qlonglong messageId);
|
||||
Q_INVOKABLE void triggerLoadMoreFuture();
|
||||
Q_INVOKABLE QVariantMap getChatInformation();
|
||||
Q_INVOKABLE QVariantMap getMessage(int index);
|
||||
Q_INVOKABLE int getLastReadMessageIndex();
|
||||
Q_INVOKABLE void setSearchQuery(const QString newSearchQuery);
|
||||
|
||||
Q_INVOKABLE int getMessageIndex(qlonglong messageId);
|
||||
QVariantMap smallPhoto() const;
|
||||
qlonglong getChatId() const;
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ QVariant ContactsModel::data(const QModelIndex &index, int role) const
|
|||
case ContactRole::RoleDisplay: return requestedContact;
|
||||
case ContactRole::RoleTitle: return QString(requestedContact.value("first_name").toString() + " " + requestedContact.value("last_name").toString()).trimmed();
|
||||
case ContactRole::RoleUserId: return requestedContact.value("id");
|
||||
case ContactRole::RoleUsername: return requestedContact.value("username");
|
||||
case ContactRole::RoleUsername: return requestedContact.value("usernames").toMap().value("editable_username").toString();
|
||||
case ContactRole::RolePhotoSmall: return requestedContact.value("profile_photo").toMap().value("small");
|
||||
case ContactRole::RoleUserStatus: return requestedContact.value("status").toMap().value("@type");
|
||||
case ContactRole::RoleUserLastOnline: return requestedContact.value("status").toMap().value("was_online");
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -341,8 +341,18 @@ void NotificationManager::publishNotification(const NotificationGroup *notificat
|
|||
|
||||
QString notificationBody;
|
||||
const QVariantMap senderInformation = messageMap.value(SENDER_ID).toMap();
|
||||
if (notificationGroup->totalCount == 1 && !messageMap.isEmpty()) {
|
||||
bool outputMessageCount = notificationGroup->totalCount > 1;
|
||||
bool messageIsEmpty = messageMap.isEmpty();
|
||||
if (outputMessageCount || messageIsEmpty) {
|
||||
// Either we have more than one notification or we have no content to display
|
||||
LOG("Group" << notificationGroup->notificationGroupId << "has" << notificationGroup->totalCount << "notifications");
|
||||
notificationBody = tr("%Ln unread messages", "", notificationGroup->totalCount);
|
||||
}
|
||||
if ((!outputMessageCount || appSettings->notificationAlwaysShowPreview()) && !messageIsEmpty) {
|
||||
LOG("Group" << notificationGroup->notificationGroupId << "has 1 notification");
|
||||
if (outputMessageCount) {
|
||||
notificationBody += "; ";
|
||||
}
|
||||
if (chatInformation && (chatInformation->type == TDLibWrapper::ChatTypeBasicGroup ||
|
||||
(chatInformation->type == TDLibWrapper::ChatTypeSupergroup && !chatInformation->isChannel))) {
|
||||
// Add author
|
||||
|
@ -352,15 +362,9 @@ void NotificationManager::publishNotification(const NotificationGroup *notificat
|
|||
} else {
|
||||
fullName = FernschreiberUtils::getUserName(tdLibWrapper->getUserInformation(senderInformation.value(USER_ID).toString()));
|
||||
}
|
||||
|
||||
notificationBody = notificationBody + fullName.trimmed() + ": ";
|
||||
notificationBody += fullName.trimmed() + ": ";
|
||||
}
|
||||
notificationBody += FernschreiberUtils::getMessageShortText(tdLibWrapper, messageMap.value(CONTENT).toMap(), (chatInformation ? chatInformation->isChannel : false), tdLibWrapper->getUserInformation().value(ID).toLongLong(), senderInformation );
|
||||
nemoNotification->setBody(notificationBody);
|
||||
} else {
|
||||
// Either we have more than one notification or we have no content to display
|
||||
LOG("Group" << notificationGroup->notificationGroupId << "has" << notificationGroup->totalCount << "notifications");
|
||||
notificationBody = tr("%Ln unread messages", "", notificationGroup->totalCount);
|
||||
}
|
||||
|
||||
const QString summary(chatInformation ? chatInformation->title : QString());
|
||||
|
@ -377,7 +381,11 @@ void NotificationManager::publishNotification(const NotificationGroup *notificat
|
|||
nemoNotification->setHintValue(HINT_VISIBILITY, QString());
|
||||
nemoNotification->setUrgency(Notification::Low);
|
||||
} else {
|
||||
if (!appSettings->notificationSuppressContent()) {
|
||||
nemoNotification->setPreviewBody(notificationBody);
|
||||
} else {
|
||||
nemoNotification->setPreviewBody(tr("%Ln unread messages", "", notificationGroup->totalCount));
|
||||
}
|
||||
nemoNotification->setPreviewSummary(summary);
|
||||
nemoNotification->setHintValue(HINT_SUPPRESS_SOUND, !appSettings->notificationSoundsEnabled());
|
||||
nemoNotification->setHintValue(HINT_DISPLAY_ON, appSettings->notificationTurnsDisplayOn());
|
||||
|
|
|
@ -46,6 +46,7 @@ namespace {
|
|||
const QString UNREAD_COUNT("unread_count");
|
||||
const QString UNREAD_MENTION_COUNT("unread_mention_count");
|
||||
const QString UNREAD_REACTION_COUNT("unread_reaction_count");
|
||||
const QString AVAILABLE_REACTIONS("available_reactions");
|
||||
const QString TEXT("text");
|
||||
const QString LAST_READ_INBOX_MESSAGE_ID("last_read_inbox_message_id");
|
||||
const QString LAST_READ_OUTBOX_MESSAGE_ID("last_read_outbox_message_id");
|
||||
|
@ -60,6 +61,11 @@ namespace {
|
|||
const QString CONTENT("content");
|
||||
const QString NEW_CONTENT("new_content");
|
||||
const QString SETS("sets");
|
||||
const QString EMOJIS("emojis");
|
||||
const QString REPLY_TO("reply_to");
|
||||
const QString REPLY_IN_CHAT_ID("reply_in_chat_id");
|
||||
const QString REPLY_TO_MESSAGE_ID("reply_to_message_id");
|
||||
const QString DRAFT_MESSAGE("draft_message");
|
||||
|
||||
const QString _TYPE("@type");
|
||||
const QString _EXTRA("@extra");
|
||||
|
@ -70,8 +76,11 @@ namespace {
|
|||
const QString TYPE_MESSAGE("message");
|
||||
const QString TYPE_STICKER("sticker");
|
||||
const QString TYPE_MESSAGE_STICKER("messageSticker");
|
||||
const QString TYPE_MESSAGE_REPLY_TO_MESSAGE("messageReplyToMessage");
|
||||
const QString TYPE_MESSAGE_ANIMATED_EMOJI("messageAnimatedEmoji");
|
||||
const QString TYPE_ANIMATED_EMOJI("animatedEmoji");
|
||||
const QString TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE("inputMessageReplyToMessage");
|
||||
const QString TYPE_DRAFT_MESSAGE("draftMessage");
|
||||
}
|
||||
|
||||
static QString getChatPositionOrder(const QVariantMap &position)
|
||||
|
@ -115,11 +124,14 @@ TDLibReceiver::TDLibReceiver(void *tdLibClient, QObject *parent) : QThread(paren
|
|||
handlers.insert("updateChatPosition", &TDLibReceiver::processUpdateChatPosition);
|
||||
handlers.insert("updateChatReadInbox", &TDLibReceiver::processUpdateChatReadInbox);
|
||||
handlers.insert("updateChatReadOutbox", &TDLibReceiver::processUpdateChatReadOutbox);
|
||||
handlers.insert("updateChatAvailableReactions", &TDLibReceiver::processUpdateChatAvailableReactions);
|
||||
handlers.insert("updateBasicGroup", &TDLibReceiver::processUpdateBasicGroup);
|
||||
handlers.insert("updateSupergroup", &TDLibReceiver::processUpdateSuperGroup);
|
||||
handlers.insert("updateChatOnlineMemberCount", &TDLibReceiver::processChatOnlineMemberCountUpdated);
|
||||
handlers.insert("messages", &TDLibReceiver::processMessages);
|
||||
handlers.insert("sponsoredMessage", &TDLibReceiver::processSponsoredMessage);
|
||||
handlers.insert("foundChatMessages", &TDLibReceiver::processFoundChatMessages);
|
||||
handlers.insert("sponsoredMessage", &TDLibReceiver::processSponsoredMessage); // TdLib <= 1.8.7
|
||||
handlers.insert("sponsoredMessages", &TDLibReceiver::processSponsoredMessages); // TdLib >= 1.8.8
|
||||
handlers.insert("updateNewMessage", &TDLibReceiver::processUpdateNewMessage);
|
||||
handlers.insert("message", &TDLibReceiver::processMessage);
|
||||
handlers.insert("messageLinkInfo", &TDLibReceiver::processMessageLinkInfo);
|
||||
|
@ -150,6 +162,7 @@ TDLibReceiver::TDLibReceiver(void *tdLibClient, QObject *parent) : QThread(paren
|
|||
handlers.insert("updateChatPinnedMessage", &TDLibReceiver::processUpdateChatPinnedMessage);
|
||||
handlers.insert("updateMessageIsPinned", &TDLibReceiver::processUpdateMessageIsPinned);
|
||||
handlers.insert("users", &TDLibReceiver::processUsers);
|
||||
handlers.insert("messageSenders", &TDLibReceiver::processMessageSenders);
|
||||
handlers.insert("error", &TDLibReceiver::processError);
|
||||
handlers.insert("ok", &TDLibReceiver::ok);
|
||||
handlers.insert("secretChat", &TDLibReceiver::processSecretChat);
|
||||
|
@ -165,8 +178,10 @@ TDLibReceiver::TDLibReceiver(void *tdLibClient, QObject *parent) : QThread(paren
|
|||
handlers.insert("updateMessageInteractionInfo", &TDLibReceiver::processUpdateMessageInteractionInfo);
|
||||
handlers.insert("sessions", &TDLibReceiver::processSessions);
|
||||
handlers.insert("availableReactions", &TDLibReceiver::processAvailableReactions);
|
||||
handlers.insert("updateMessageMentionRead", &TDLibReceiver::processUpdateChatUnreadMentionCount);
|
||||
handlers.insert("updateChatUnreadMentionCount", &TDLibReceiver::processUpdateChatUnreadMentionCount);
|
||||
handlers.insert("updateChatUnreadReactionCount", &TDLibReceiver::processUpdateChatUnreadReactionCount);
|
||||
handlers.insert("updateActiveEmojiReactions", &TDLibReceiver::processUpdateActiveEmojiReactions);
|
||||
}
|
||||
|
||||
void TDLibReceiver::setActive(bool active)
|
||||
|
@ -350,6 +365,14 @@ void TDLibReceiver::processUpdateChatReadOutbox(const QVariantMap &receivedInfor
|
|||
emit chatReadOutboxUpdated(chat_id, last_read_outbox_message_id);
|
||||
}
|
||||
|
||||
void TDLibReceiver::processUpdateChatAvailableReactions(const QVariantMap &receivedInformation)
|
||||
{
|
||||
const qlonglong chat_id(receivedInformation.value(CHAT_ID).toLongLong());
|
||||
const QVariantMap available_reactions(receivedInformation.value(AVAILABLE_REACTIONS).toMap());
|
||||
LOG("Available reactions updated for" << chat_id << "new information:" << available_reactions);
|
||||
emit chatAvailableReactionsUpdated(chat_id, available_reactions);
|
||||
}
|
||||
|
||||
void TDLibReceiver::processUpdateBasicGroup(const QVariantMap &receivedInformation)
|
||||
{
|
||||
const QVariantMap basicGroup(receivedInformation.value(BASIC_GROUP).toMap());
|
||||
|
@ -380,13 +403,33 @@ void TDLibReceiver::processMessages(const QVariantMap &receivedInformation)
|
|||
emit messagesReceived(cleanupList(receivedInformation.value(MESSAGES).toList()), total_count);
|
||||
}
|
||||
|
||||
void TDLibReceiver::processFoundChatMessages(const QVariantMap &receivedInformation)
|
||||
{
|
||||
const int total_count = receivedInformation.value(TOTAL_COUNT).toInt();
|
||||
LOG("Received found chat messages, amount: " << total_count);
|
||||
emit messagesReceived(cleanupList(receivedInformation.value(MESSAGES).toList()), total_count);
|
||||
}
|
||||
|
||||
void TDLibReceiver::processSponsoredMessage(const QVariantMap &receivedInformation)
|
||||
{
|
||||
// TdLib <= 1.8.7
|
||||
const qlonglong chatId = receivedInformation.value(_EXTRA).toLongLong(); // See TDLibWrapper::getChatSponsoredMessage
|
||||
LOG("Received sponsored message for chat" << chatId);
|
||||
emit sponsoredMessageReceived(chatId, receivedInformation);
|
||||
}
|
||||
|
||||
void TDLibReceiver::processSponsoredMessages(const QVariantMap &receivedInformation)
|
||||
{
|
||||
// TdLib >= 1.8.8
|
||||
const qlonglong chatId = receivedInformation.value(_EXTRA).toLongLong(); // See TDLibWrapper::getChatSponsoredMessage
|
||||
const QVariantList messages(receivedInformation.value(MESSAGES).toList());
|
||||
LOG("Received" << messages.count() << "sponsored messages for chat" << chatId);
|
||||
QListIterator<QVariant> it(messages);
|
||||
while (it.hasNext()) {
|
||||
emit sponsoredMessageReceived(chatId, it.next().toMap());
|
||||
}
|
||||
}
|
||||
|
||||
void TDLibReceiver::processUpdateNewMessage(const QVariantMap &receivedInformation)
|
||||
{
|
||||
const QVariantMap message = receivedInformation.value(MESSAGE).toMap();
|
||||
|
@ -400,7 +443,7 @@ void TDLibReceiver::processMessage(const QVariantMap &receivedInformation)
|
|||
const qlonglong chatId = receivedInformation.value(CHAT_ID).toLongLong();
|
||||
const qlonglong messageId = receivedInformation.value(ID).toLongLong();
|
||||
LOG("Received message " << chatId << messageId);
|
||||
emit messageInformation(chatId, messageId, receivedInformation);
|
||||
emit messageInformation(chatId, messageId, cleanupMap(receivedInformation));
|
||||
}
|
||||
|
||||
void TDLibReceiver::processMessageLinkInfo(const QVariantMap &receivedInformation)
|
||||
|
@ -425,7 +468,7 @@ void TDLibReceiver::processMessageSendSucceeded(const QVariantMap &receivedInfor
|
|||
const QVariantMap message = receivedInformation.value(MESSAGE).toMap();
|
||||
const qlonglong messageId = message.value(ID).toLongLong();
|
||||
LOG("Message send succeeded" << messageId << oldMessageId);
|
||||
emit messageSendSucceeded(messageId, oldMessageId, message);
|
||||
emit messageSendSucceeded(messageId, oldMessageId, cleanupMap(message));
|
||||
}
|
||||
|
||||
void TDLibReceiver::processUpdateActiveNotifications(const QVariantMap &receivedInformation)
|
||||
|
@ -602,6 +645,12 @@ void TDLibReceiver::processUsers(const QVariantMap &receivedInformation)
|
|||
emit usersReceived(receivedInformation.value(_EXTRA).toString(), receivedInformation.value("user_ids").toList(), receivedInformation.value(TOTAL_COUNT).toInt());
|
||||
}
|
||||
|
||||
void TDLibReceiver::processMessageSenders(const QVariantMap &receivedInformation)
|
||||
{
|
||||
LOG("Received Message Senders");
|
||||
emit messageSendersReceived(receivedInformation.value(_EXTRA).toString(), receivedInformation.value("senders").toList(), receivedInformation.value(TOTAL_COUNT).toInt());
|
||||
}
|
||||
|
||||
void TDLibReceiver::processError(const QVariantMap &receivedInformation)
|
||||
{
|
||||
LOG("Received an error");
|
||||
|
@ -652,7 +701,7 @@ void TDLibReceiver::processUpdateChatIsMarkedAsUnread(const QVariantMap &receive
|
|||
void TDLibReceiver::processUpdateChatDraftMessage(const QVariantMap &receivedInformation)
|
||||
{
|
||||
LOG("Draft message was updated");
|
||||
emit chatDraftMessageUpdated(receivedInformation.value(CHAT_ID).toLongLong(), receivedInformation.value("draft_message").toMap(), findChatPositionOrder(receivedInformation.value(POSITIONS).toList()));
|
||||
emit chatDraftMessageUpdated(receivedInformation.value(CHAT_ID).toLongLong(), cleanupMap(receivedInformation.value(DRAFT_MESSAGE).toMap()), findChatPositionOrder(receivedInformation.value(POSITIONS).toList()));
|
||||
}
|
||||
|
||||
void TDLibReceiver::processInlineQueryResults(const QVariantMap &receivedInformation)
|
||||
|
@ -689,8 +738,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)
|
||||
|
@ -704,6 +754,8 @@ void TDLibReceiver::processAvailableReactions(const QVariantMap &receivedInforma
|
|||
|
||||
void TDLibReceiver::processUpdateChatUnreadMentionCount(const QVariantMap &receivedInformation)
|
||||
{
|
||||
// Handles both updateMessageMentionRead and updateChatUnreadMentionCount
|
||||
// They both have chat_id and unread_mention_count which is all we need
|
||||
const qlonglong chatId = receivedInformation.value(CHAT_ID).toLongLong();
|
||||
const int unreadMentionCount = receivedInformation.value(UNREAD_MENTION_COUNT).toInt();
|
||||
LOG("Chat unread mention count updated" << chatId << unreadMentionCount);
|
||||
|
@ -718,6 +770,13 @@ void TDLibReceiver::processUpdateChatUnreadReactionCount(const QVariantMap &rece
|
|||
emit chatUnreadReactionCountUpdated(chatId, unreadReactionCount);
|
||||
}
|
||||
|
||||
void TDLibReceiver::processUpdateActiveEmojiReactions(const QVariantMap &receivedInformation)
|
||||
{
|
||||
// updateActiveEmojiReactions was introduced between 1.8.5 and 1.8.6
|
||||
// See https://github.com/tdlib/td/commit/d29d367
|
||||
emit activeEmojiReactionsUpdated(receivedInformation.value(EMOJIS).toStringList());
|
||||
}
|
||||
|
||||
// Recursively removes (some) unused entries from QVariantMaps to reduce
|
||||
// memory usage. QStrings allocated by QVariantMaps are the top consumers
|
||||
// of memory. The biggest saving is achieved by removing "outline" from
|
||||
|
@ -747,17 +806,65 @@ const QVariantMap TDLibReceiver::cleanupMap(const QVariantMap& map, bool *update
|
|||
return animated_emoji;
|
||||
}
|
||||
} else if (type == TYPE_MESSAGE) {
|
||||
bool cleaned = false;
|
||||
const QVariantMap content(cleanupMap(map.value(CONTENT).toMap(), &cleaned));
|
||||
if (cleaned) {
|
||||
QVariantMap message(map);
|
||||
bool messageChanged = false;
|
||||
const QVariantMap content(cleanupMap(map.value(CONTENT).toMap(), &messageChanged));
|
||||
if (messageChanged) {
|
||||
message.remove(CONTENT);
|
||||
message.insert(CONTENT, content);
|
||||
}
|
||||
if (map.contains(REPLY_TO)) {
|
||||
// In TdLib 1.8.15 reply_to_message_id and reply_in_chat_id attributes
|
||||
// had been replaced with reply_to structure, e.g:
|
||||
//
|
||||
// "reply_to": {
|
||||
// "@type": "messageReplyToMessage",
|
||||
// "chat_id": -1001234567890,
|
||||
// "is_quote_manual": false,
|
||||
// "message_id": 234567890,
|
||||
// "origin_send_date": 0
|
||||
// }
|
||||
//
|
||||
QVariantMap reply_to(message.value(REPLY_TO).toMap());
|
||||
if (reply_to.value(_TYPE).toString() == TYPE_MESSAGE_REPLY_TO_MESSAGE) {
|
||||
if (reply_to.contains(MESSAGE_ID) &&
|
||||
!message.contains(REPLY_TO_MESSAGE_ID)) {
|
||||
message.insert(REPLY_TO_MESSAGE_ID, reply_to.value(MESSAGE_ID));
|
||||
}
|
||||
if (reply_to.contains(CHAT_ID) &&
|
||||
!message.contains(REPLY_IN_CHAT_ID)) {
|
||||
message.insert(REPLY_IN_CHAT_ID, reply_to.value(CHAT_ID));
|
||||
}
|
||||
reply_to.remove(_TYPE);
|
||||
reply_to.insert(_TYPE, TYPE_MESSAGE_REPLY_TO_MESSAGE);
|
||||
message.insert(REPLY_TO, reply_to);
|
||||
messageChanged = true;
|
||||
}
|
||||
}
|
||||
if (messageChanged) {
|
||||
message.remove(_TYPE);
|
||||
message.insert(_TYPE, TYPE_MESSAGE); // Replace with a shared value
|
||||
if (updated) *updated = true;
|
||||
return message;
|
||||
}
|
||||
} else if (type == TYPE_DRAFT_MESSAGE) {
|
||||
QVariantMap draftMessage(map);
|
||||
QVariantMap reply_to(draftMessage.value(REPLY_TO).toMap());
|
||||
// In TdLib 1.8.21 reply_to_message_id has been replaced with reply_to
|
||||
if (reply_to.value(_TYPE).toString() == TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE) {
|
||||
if (reply_to.contains(MESSAGE_ID) &&
|
||||
!draftMessage.contains(REPLY_TO_MESSAGE_ID)) {
|
||||
// reply_to_message_id is what QML (still) expects
|
||||
draftMessage.insert(REPLY_TO_MESSAGE_ID, reply_to.value(MESSAGE_ID));
|
||||
}
|
||||
reply_to.remove(_TYPE);
|
||||
reply_to.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE); // Shared value
|
||||
draftMessage.insert(REPLY_TO, reply_to);
|
||||
draftMessage.remove(_TYPE);
|
||||
draftMessage.insert(_TYPE, DRAFT_MESSAGE); // Shared value
|
||||
if (updated) *updated = true;
|
||||
return draftMessage;
|
||||
}
|
||||
} else if (type == TYPE_MESSAGE_STICKER) {
|
||||
bool cleaned = false;
|
||||
const QVariantMap content(cleanupMap(map.value(CONTENT).toMap(), &cleaned));
|
||||
|
|
|
@ -52,6 +52,7 @@ signals:
|
|||
void chatPinnedUpdated(qlonglong chatId, bool isPinned);
|
||||
void chatReadInboxUpdated(const QString &chatId, const QString &lastReadInboxMessageId, int unreadCount);
|
||||
void chatReadOutboxUpdated(const QString &chatId, const QString &lastReadOutboxMessageId);
|
||||
void chatAvailableReactionsUpdated(const qlonglong &chatId, const QVariantMap &availableReactions);
|
||||
void basicGroupUpdated(qlonglong groupId, const QVariantMap &groupInformation);
|
||||
void superGroupUpdated(qlonglong groupId, const QVariantMap &groupInformation);
|
||||
void chatOnlineMemberCountUpdated(const QString &chatId, int onlineMemberCount);
|
||||
|
@ -88,7 +89,8 @@ signals:
|
|||
void chatTitleUpdated(const QString &chatId, const QString &title);
|
||||
void chatPinnedMessageUpdated(qlonglong chatId, qlonglong pinnedMessageId);
|
||||
void messageIsPinnedUpdated(qlonglong chatId, qlonglong messageId, bool isPinned);
|
||||
void usersReceived(const QString &extra, const QVariantList &userIds, int totalUsers);
|
||||
void usersReceived(const QString &extra, const QVariantList &senders, int totalUsers);
|
||||
void messageSendersReceived(const QString &extra, const QVariantList &userIds, int totalUsers);
|
||||
void errorReceived(const int code, const QString &message, const QString &extra);
|
||||
void secretChat(qlonglong secretChatId, const QVariantMap &secretChat);
|
||||
void secretChatUpdated(qlonglong secretChatId, const QVariantMap &secretChat);
|
||||
|
@ -101,10 +103,11 @@ 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);
|
||||
void activeEmojiReactionsUpdated(const QStringList& emojis);
|
||||
|
||||
private:
|
||||
typedef void (TDLibReceiver::*Handler)(const QVariantMap &);
|
||||
|
@ -134,11 +137,14 @@ private:
|
|||
void processUpdateChatPosition(const QVariantMap &receivedInformation);
|
||||
void processUpdateChatReadInbox(const QVariantMap &receivedInformation);
|
||||
void processUpdateChatReadOutbox(const QVariantMap &receivedInformation);
|
||||
void processUpdateChatAvailableReactions(const QVariantMap &receivedInformation);
|
||||
void processUpdateBasicGroup(const QVariantMap &receivedInformation);
|
||||
void processUpdateSuperGroup(const QVariantMap &receivedInformation);
|
||||
void processChatOnlineMemberCountUpdated(const QVariantMap &receivedInformation);
|
||||
void processMessages(const QVariantMap &receivedInformation);
|
||||
void processFoundChatMessages(const QVariantMap &receivedInformation);
|
||||
void processSponsoredMessage(const QVariantMap &receivedInformation);
|
||||
void processSponsoredMessages(const QVariantMap &receivedInformation);
|
||||
void processUpdateNewMessage(const QVariantMap &receivedInformation);
|
||||
void processMessage(const QVariantMap &receivedInformation);
|
||||
void processMessageLinkInfo(const QVariantMap &receivedInformation);
|
||||
|
@ -170,6 +176,7 @@ private:
|
|||
void processUpdateChatPinnedMessage(const QVariantMap &receivedInformation);
|
||||
void processUpdateMessageIsPinned(const QVariantMap &receivedInformation);
|
||||
void processUsers(const QVariantMap &receivedInformation);
|
||||
void processMessageSenders(const QVariantMap &receivedInformation);
|
||||
void processError(const QVariantMap &receivedInformation);
|
||||
void processSecretChat(const QVariantMap &receivedInformation);
|
||||
void processUpdateSecretChat(const QVariantMap &receivedInformation);
|
||||
|
@ -186,6 +193,7 @@ private:
|
|||
void processAvailableReactions(const QVariantMap &receivedInformation);
|
||||
void processUpdateChatUnreadMentionCount(const QVariantMap &receivedInformation);
|
||||
void processUpdateChatUnreadReactionCount(const QVariantMap &receivedInformation);
|
||||
void processUpdateActiveEmojiReactions(const QVariantMap &receivedInformation);
|
||||
};
|
||||
|
||||
#endif // TDLIBRECEIVER_H
|
||||
|
|
|
@ -36,6 +36,9 @@
|
|||
#define DEBUG_MODULE TDLibWrapper
|
||||
#include "debuglog.h"
|
||||
|
||||
#define VERSION_NUMBER(x,y,z) \
|
||||
((((x) & 0x3ff) << 20) | (((y) & 0x3ff) << 10) | ((z) & 0x3ff))
|
||||
|
||||
namespace {
|
||||
const QString STATUS("status");
|
||||
const QString ID("id");
|
||||
|
@ -45,26 +48,40 @@ 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");
|
||||
const QString REPLY_TO_MESSAGE_ID("reply_to_message_id");
|
||||
const QString REPLY_TO("reply_to");
|
||||
const QString _TYPE("@type");
|
||||
const QString _EXTRA("@extra");
|
||||
const QString CHAT_LIST_MAIN("chatListMain");
|
||||
const QString CHAT_AVAILABLE_REACTIONS("available_reactions");
|
||||
const QString CHAT_AVAILABLE_REACTIONS_ALL("chatAvailableReactionsAll");
|
||||
const QString CHAT_AVAILABLE_REACTIONS_SOME("chatAvailableReactionsSome");
|
||||
const QString REACTIONS("reactions");
|
||||
const QString REACTION_TYPE("reaction_type");
|
||||
const QString REACTION_TYPE_EMOJI("reactionTypeEmoji");
|
||||
const QString EMOJI("emoji");
|
||||
const QString TYPE_MESSAGE_REPLY_TO_MESSAGE("messageReplyToMessage");
|
||||
const QString TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE("inputMessageReplyToMessage");
|
||||
}
|
||||
|
||||
TDLibWrapper::TDLibWrapper(AppSettings *appSettings, MceInterface *mceInterface, QObject *parent)
|
||||
TDLibWrapper::TDLibWrapper(AppSettings *settings, MceInterface *mce, QObject *parent)
|
||||
: QObject(parent)
|
||||
, tdLibClient(td_json_client_create())
|
||||
, manager(new QNetworkAccessManager(this))
|
||||
, networkConfigurationManager(new QNetworkConfigurationManager(this))
|
||||
, appSettings(settings)
|
||||
, mceInterface(mce)
|
||||
, authorizationState(AuthorizationState::Closed)
|
||||
, versionNumber(0)
|
||||
, joinChatRequested(false)
|
||||
, isLoggingOut(false)
|
||||
{
|
||||
LOG("Initializing TD Lib...");
|
||||
this->appSettings = appSettings;
|
||||
this->mceInterface = mceInterface;
|
||||
this->tdLibClient = td_json_client_create();
|
||||
this->authorizationState = AuthorizationState::Closed;
|
||||
this->isLoggingOut = false;
|
||||
|
||||
initializeTDLibReceiver();
|
||||
|
||||
|
@ -120,6 +137,7 @@ void TDLibWrapper::initializeTDLibReceiver() {
|
|||
connect(this->tdLibReceiver, SIGNAL(chatOrderUpdated(QString, QString)), this, SIGNAL(chatOrderUpdated(QString, QString)));
|
||||
connect(this->tdLibReceiver, SIGNAL(chatReadInboxUpdated(QString, QString, int)), this, SIGNAL(chatReadInboxUpdated(QString, QString, int)));
|
||||
connect(this->tdLibReceiver, SIGNAL(chatReadOutboxUpdated(QString, QString)), this, SIGNAL(chatReadOutboxUpdated(QString, QString)));
|
||||
connect(this->tdLibReceiver, SIGNAL(chatAvailableReactionsUpdated(qlonglong, QVariantMap)), this, SLOT(handleAvailableReactionsUpdated(qlonglong, QVariantMap)));
|
||||
connect(this->tdLibReceiver, SIGNAL(basicGroupUpdated(qlonglong, QVariantMap)), this, SLOT(handleBasicGroupUpdated(qlonglong, QVariantMap)));
|
||||
connect(this->tdLibReceiver, SIGNAL(superGroupUpdated(qlonglong, QVariantMap)), this, SLOT(handleSuperGroupUpdated(qlonglong, QVariantMap)));
|
||||
connect(this->tdLibReceiver, SIGNAL(chatOnlineMemberCountUpdated(QString, int)), this, SIGNAL(chatOnlineMemberCountUpdated(QString, int)));
|
||||
|
@ -159,6 +177,7 @@ void TDLibWrapper::initializeTDLibReceiver() {
|
|||
connect(this->tdLibReceiver, SIGNAL(chatPinnedMessageUpdated(qlonglong, qlonglong)), this, SIGNAL(chatPinnedMessageUpdated(qlonglong, qlonglong)));
|
||||
connect(this->tdLibReceiver, SIGNAL(messageIsPinnedUpdated(qlonglong, qlonglong, bool)), this, SLOT(handleMessageIsPinnedUpdated(qlonglong, qlonglong, bool)));
|
||||
connect(this->tdLibReceiver, SIGNAL(usersReceived(QString, QVariantList, int)), this, SIGNAL(usersReceived(QString, QVariantList, int)));
|
||||
connect(this->tdLibReceiver, SIGNAL(messageSendersReceived(QString, QVariantList, int)), this, SIGNAL(messageSendersReceived(QString, QVariantList, int)));
|
||||
connect(this->tdLibReceiver, SIGNAL(errorReceived(int, QString, QString)), this, SLOT(handleErrorReceived(int, QString, QString)));
|
||||
connect(this->tdLibReceiver, SIGNAL(contactsImported(QVariantList, QVariantList)), this, SIGNAL(contactsImported(QVariantList, QVariantList)));
|
||||
connect(this->tdLibReceiver, SIGNAL(messageEditedUpdated(qlonglong, qlonglong, QVariantMap)), this, SIGNAL(messageEditedUpdated(qlonglong, qlonglong, QVariantMap)));
|
||||
|
@ -170,10 +189,11 @@ 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)));
|
||||
connect(this->tdLibReceiver, SIGNAL(activeEmojiReactionsUpdated(QStringList)), this, SLOT(handleActiveEmojiReactionsUpdated(QStringList)));
|
||||
|
||||
this->tdLibReceiver->start();
|
||||
}
|
||||
|
@ -192,7 +212,7 @@ void TDLibWrapper::sendRequest(const QVariantMap &requestObject)
|
|||
|
||||
QString TDLibWrapper::getVersion()
|
||||
{
|
||||
return this->version;
|
||||
return this->versionString;
|
||||
}
|
||||
|
||||
TDLibWrapper::AuthorizationState TDLibWrapper::getAuthorizationState()
|
||||
|
@ -255,7 +275,7 @@ void TDLibWrapper::logout()
|
|||
{
|
||||
LOG("Logging out");
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert("@type", "logOut");
|
||||
requestObject.insert(_TYPE, "logOut");
|
||||
this->sendRequest(requestObject);
|
||||
this->isLoggingOut = true;
|
||||
|
||||
|
@ -389,15 +409,24 @@ static bool compareReplacements(const QVariant &replacement1, const QVariant &re
|
|||
}
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendTextMessage(const QString &chatId, const QString &message, const QString &replyToMessageId)
|
||||
QVariantMap TDLibWrapper::newSendMessageRequest(qlonglong chatId, qlonglong replyToMessageId)
|
||||
{
|
||||
QVariantMap request;
|
||||
request.insert(_TYPE, "sendMessage");
|
||||
request.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId) {
|
||||
QVariantMap replyTo;
|
||||
replyTo.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE);
|
||||
replyTo.insert(MESSAGE_ID, replyToMessageId);
|
||||
request.insert(REPLY_TO, replyTo);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendTextMessage(qlonglong chatId, const QString &message, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending text message" << chatId << message << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessageText");
|
||||
|
||||
|
@ -436,7 +465,7 @@ void TDLibWrapper::sendTextMessage(const QString &chatId, const QString &message
|
|||
QVariantMap entityType;
|
||||
entityType.insert(_TYPE, "textEntityTypeMentionName");
|
||||
entityType.insert("user_id", nextReplacement.value("userId").toString());
|
||||
entity.insert("type", entityType);
|
||||
entity.insert(TYPE, entityType);
|
||||
entities.append(entity);
|
||||
offsetCorrection += replacementLength - replacementPlainText.length();
|
||||
}
|
||||
|
@ -450,17 +479,13 @@ void TDLibWrapper::sendTextMessage(const QString &chatId, const QString &message
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendPhotoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendPhotoMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending photo message" << chatId << filePath << message << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessagePhoto");
|
||||
|
||||
QVariantMap formattedText;
|
||||
formattedText.insert("text", message);
|
||||
formattedText.insert(_TYPE, "formattedText");
|
||||
|
@ -474,17 +499,13 @@ void TDLibWrapper::sendPhotoMessage(const QString &chatId, const QString &filePa
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendVideoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendVideoMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending video message" << chatId << filePath << message << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessageVideo");
|
||||
|
||||
QVariantMap formattedText;
|
||||
formattedText.insert("text", message);
|
||||
formattedText.insert(_TYPE, "formattedText");
|
||||
|
@ -498,17 +519,13 @@ void TDLibWrapper::sendVideoMessage(const QString &chatId, const QString &filePa
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendDocumentMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendDocumentMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending document message" << chatId << filePath << message << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessageDocument");
|
||||
|
||||
QVariantMap formattedText;
|
||||
formattedText.insert("text", message);
|
||||
formattedText.insert(_TYPE, "formattedText");
|
||||
|
@ -522,17 +539,13 @@ void TDLibWrapper::sendDocumentMessage(const QString &chatId, const QString &fil
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendVoiceNoteMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendVoiceNoteMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending voice note message" << chatId << filePath << message << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessageVoiceNote");
|
||||
|
||||
QVariantMap formattedText;
|
||||
formattedText.insert("text", message);
|
||||
formattedText.insert(_TYPE, "formattedText");
|
||||
|
@ -546,24 +559,19 @@ void TDLibWrapper::sendVoiceNoteMessage(const QString &chatId, const QString &fi
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendLocationMessage(const QString &chatId, double latitude, double longitude, double horizontalAccuracy, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendLocationMessage(qlonglong chatId, double latitude, double longitude, double horizontalAccuracy, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending location message" << chatId << latitude << longitude << horizontalAccuracy << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessageLocation");
|
||||
|
||||
QVariantMap location;
|
||||
location.insert("latitude", latitude);
|
||||
location.insert("longitude", longitude);
|
||||
location.insert("horizontal_accuracy", horizontalAccuracy);
|
||||
location.insert(_TYPE, "location");
|
||||
inputMessageContent.insert("location", location);
|
||||
|
||||
inputMessageContent.insert("live_period", 0);
|
||||
inputMessageContent.insert("heading", 0);
|
||||
inputMessageContent.insert("proximity_alert_radius", 0);
|
||||
|
@ -572,21 +580,16 @@ void TDLibWrapper::sendLocationMessage(const QString &chatId, double latitude, d
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendStickerMessage(qlonglong chatId, const QString &fileId, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending sticker message" << chatId << fileId << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessageSticker");
|
||||
|
||||
QVariantMap stickerInputFile;
|
||||
stickerInputFile.insert(_TYPE, "inputFileRemote");
|
||||
stickerInputFile.insert("id", fileId);
|
||||
stickerInputFile.insert(ID, fileId);
|
||||
|
||||
inputMessageContent.insert("sticker", stickerInputFile);
|
||||
|
||||
|
@ -594,15 +597,10 @@ void TDLibWrapper::sendStickerMessage(const QString &chatId, const QString &file
|
|||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::sendPollMessage(const QString &chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &explanation, const QString &replyToMessageId)
|
||||
void TDLibWrapper::sendPollMessage(qlonglong chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &explanation, qlonglong replyToMessageId)
|
||||
{
|
||||
LOG("Sending poll message" << chatId << question << replyToMessageId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "sendMessage");
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
if (replyToMessageId != "0") {
|
||||
requestObject.insert("reply_to_message_id", replyToMessageId);
|
||||
}
|
||||
QVariantMap requestObject(newSendMessageRequest(chatId, replyToMessageId));
|
||||
QVariantMap inputMessageContent;
|
||||
inputMessageContent.insert(_TYPE, "inputMessagePoll");
|
||||
|
||||
|
@ -620,7 +618,7 @@ void TDLibWrapper::sendPollMessage(const QString &chatId, const QString &questio
|
|||
pollType.insert("allow_multiple_answers", multiple);
|
||||
}
|
||||
|
||||
inputMessageContent.insert("type", pollType);
|
||||
inputMessageContent.insert(TYPE, pollType);
|
||||
inputMessageContent.insert("question", question);
|
||||
inputMessageContent.insert("options", options);
|
||||
inputMessageContent.insert("is_anonymous", anonymous);
|
||||
|
@ -709,7 +707,11 @@ void TDLibWrapper::getChatSponsoredMessage(qlonglong chatId)
|
|||
{
|
||||
LOG("Retrieving sponsored message" << chatId);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "getChatSponsoredMessage");
|
||||
// getChatSponsoredMessage has been replaced with getChatSponsoredMessages
|
||||
// between 1.8.7 and 1.8.8
|
||||
// See https://github.com/tdlib/td/commit/ec1310a
|
||||
requestObject.insert(_TYPE, QString((versionNumber > VERSION_NUMBER(1,8,7)) ?
|
||||
"getChatSponsoredMessages" : "getChatSponsoredMessage"));
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
requestObject.insert(_EXTRA, chatId); // see TDLibReceiver::processSponsoredMessage
|
||||
this->sendRequest(requestObject);
|
||||
|
@ -1171,9 +1173,18 @@ void TDLibWrapper::setChatDraftMessage(qlonglong chatId, qlonglong threadId, qlo
|
|||
inputMessageContent.insert(_TYPE, "inputMessageText");
|
||||
inputMessageContent.insert("text", formattedText);
|
||||
draftMessage.insert(_TYPE, "draftMessage");
|
||||
draftMessage.insert("reply_to_message_id", replyToMessageId);
|
||||
draftMessage.insert("input_message_text", inputMessageContent);
|
||||
|
||||
if (versionNumber > VERSION_NUMBER(1,8,20)) {
|
||||
QVariantMap replyTo;
|
||||
replyTo.insert(_TYPE, TYPE_INPUT_MESSAGE_REPLY_TO_MESSAGE);
|
||||
replyTo.insert(CHAT_ID, chatId);
|
||||
replyTo.insert(MESSAGE_ID, replyToMessageId);
|
||||
draftMessage.insert(REPLY_TO, replyTo);
|
||||
} else {
|
||||
draftMessage.insert(REPLY_TO_MESSAGE_ID, replyToMessageId);
|
||||
}
|
||||
|
||||
requestObject.insert("draft_message", draftMessage);
|
||||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
@ -1433,8 +1444,8 @@ void TDLibWrapper::getMessageAvailableReactions(qlonglong chatId, qlonglong mess
|
|||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "getMessageAvailableReactions");
|
||||
requestObject.insert(_EXTRA, QString::number(messageId));
|
||||
requestObject.insert("chat_id", chatId);
|
||||
requestObject.insert("message_id", messageId);
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
requestObject.insert(MESSAGE_ID, messageId);
|
||||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
|
@ -1453,15 +1464,52 @@ void TDLibWrapper::getPageSource(const QString &address)
|
|||
connect(reply, SIGNAL(finished()), this, SLOT(handleGetPageSourceFinished()));
|
||||
}
|
||||
|
||||
void TDLibWrapper::setMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction)
|
||||
void TDLibWrapper::addMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction)
|
||||
{
|
||||
LOG("Set message reaction" << chatId << messageId << reaction);
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "setMessageReaction");
|
||||
requestObject.insert("chat_id", chatId);
|
||||
requestObject.insert("message_id", messageId);
|
||||
requestObject.insert("reaction", reaction);
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
requestObject.insert(MESSAGE_ID, messageId);
|
||||
requestObject.insert("is_big", false);
|
||||
if (versionNumber > VERSION_NUMBER(1,8,5)) {
|
||||
// "reaction_type": {
|
||||
// "@type": "reactionTypeEmoji",
|
||||
// "emoji": "..."
|
||||
// }
|
||||
QVariantMap reactionType;
|
||||
reactionType.insert(_TYPE, REACTION_TYPE_EMOJI);
|
||||
reactionType.insert(EMOJI, reaction);
|
||||
requestObject.insert(REACTION_TYPE, reactionType);
|
||||
requestObject.insert(_TYPE, "addMessageReaction");
|
||||
LOG("Add message reaction" << chatId << messageId << reaction);
|
||||
} else {
|
||||
requestObject.insert("reaction", reaction);
|
||||
requestObject.insert(_TYPE, "setMessageReaction");
|
||||
LOG("Toggle message reaction" << chatId << messageId << reaction);
|
||||
}
|
||||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
void TDLibWrapper::removeMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction)
|
||||
{
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(CHAT_ID, chatId);
|
||||
requestObject.insert(MESSAGE_ID, messageId);
|
||||
if (versionNumber > VERSION_NUMBER(1,8,5)) {
|
||||
// "reaction_type": {
|
||||
// "@type": "reactionTypeEmoji",
|
||||
// "emoji": "..."
|
||||
// }
|
||||
QVariantMap reactionType;
|
||||
reactionType.insert(_TYPE, REACTION_TYPE_EMOJI);
|
||||
reactionType.insert(EMOJI, reaction);
|
||||
requestObject.insert(REACTION_TYPE, reactionType);
|
||||
requestObject.insert(_TYPE, "removeMessageReaction");
|
||||
LOG("Remove message reaction" << chatId << messageId << reaction);
|
||||
} else {
|
||||
requestObject.insert("reaction", reaction);
|
||||
requestObject.insert(_TYPE, "setMessageReaction");
|
||||
LOG("Toggle message reaction" << chatId << messageId << reaction);
|
||||
}
|
||||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
|
@ -1494,11 +1542,19 @@ void TDLibWrapper::setNetworkType(NetworkType networkType)
|
|||
break;
|
||||
}
|
||||
|
||||
requestObject.insert("type", networkTypeObject);
|
||||
requestObject.insert(TYPE, networkTypeObject);
|
||||
|
||||
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);
|
||||
|
@ -1575,6 +1631,49 @@ QVariantMap TDLibWrapper::getChat(const QString &chatId)
|
|||
return this->chats.value(chatId).toMap();
|
||||
}
|
||||
|
||||
QStringList TDLibWrapper::getChatReactions(const QString &chatId)
|
||||
{
|
||||
LOG("Obtaining chat reactions for chat" << chatId);
|
||||
const QVariant available_reactions(chats.value(chatId).toMap().value(CHAT_AVAILABLE_REACTIONS));
|
||||
const QVariantMap map(available_reactions.toMap());
|
||||
const QString reactions_type(map.value(_TYPE).toString());
|
||||
if (reactions_type == CHAT_AVAILABLE_REACTIONS_ALL) {
|
||||
LOG("Chat uses all available reactions, currently available number" << activeEmojiReactions.size());
|
||||
return activeEmojiReactions;
|
||||
} else if (reactions_type == CHAT_AVAILABLE_REACTIONS_SOME) {
|
||||
LOG("Chat uses reduced set of reactions");
|
||||
const QVariantList reactions(map.value(REACTIONS).toList());
|
||||
const int n = reactions.count();
|
||||
QStringList emojis;
|
||||
|
||||
// "available_reactions": {
|
||||
// "@type": "chatAvailableReactionsSome",
|
||||
// "reactions": [
|
||||
// {
|
||||
// "@type": "reactionTypeEmoji",
|
||||
// "emoji": "..."
|
||||
// },
|
||||
emojis.reserve(n);
|
||||
for (int i = 0; i < n; i++) {
|
||||
const QVariantMap reaction(reactions.at(i).toMap());
|
||||
if (reaction.value(_TYPE).toString() == REACTION_TYPE_EMOJI) {
|
||||
const QString emoji(reaction.value(EMOJI).toString());
|
||||
if (!emoji.isEmpty()) {
|
||||
emojis.append(emoji);
|
||||
}
|
||||
}
|
||||
}
|
||||
LOG("Found emojis for this chat" << emojis.size());
|
||||
return emojis;
|
||||
} else if (reactions_type.isEmpty()) {
|
||||
LOG("No chat reaction type specified, using all reactions");
|
||||
return available_reactions.toStringList();
|
||||
} else {
|
||||
LOG("Unknown chat reaction type" << reactions_type);
|
||||
return QStringList();
|
||||
}
|
||||
}
|
||||
|
||||
QVariantMap TDLibWrapper::getSecretChatFromCache(qlonglong secretChatId)
|
||||
{
|
||||
return this->secretChats.value(secretChatId);
|
||||
|
@ -1645,7 +1744,16 @@ DBusAdaptor *TDLibWrapper::getDBusAdaptor()
|
|||
|
||||
void TDLibWrapper::handleVersionDetected(const QString &version)
|
||||
{
|
||||
this->version = version;
|
||||
this->versionString = version;
|
||||
const QStringList parts(version.split('.'));
|
||||
uint major, minor, release;
|
||||
bool ok;
|
||||
if (parts.count() >= 3 &&
|
||||
(major = parts.at(0).toInt(&ok), ok) &&
|
||||
(minor = parts.at(1).toInt(&ok), ok) &&
|
||||
(release = parts.at(2).toInt(&ok), ok)) {
|
||||
versionNumber = VERSION_NUMBER(major, minor, release);
|
||||
}
|
||||
emit versionDetected(version);
|
||||
}
|
||||
|
||||
|
@ -1758,15 +1866,15 @@ void TDLibWrapper::handleConnectionStateChanged(const QString &connectionState)
|
|||
|
||||
void TDLibWrapper::handleUserUpdated(const QVariantMap &userInformation)
|
||||
{
|
||||
QString updatedUserId = userInformation.value("id").toString();
|
||||
QString updatedUserId = userInformation.value(ID).toString();
|
||||
if (updatedUserId == this->options.value("my_id").toString()) {
|
||||
LOG("Own user information updated :)");
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -1774,24 +1882,24 @@ void TDLibWrapper::handleUserStatusUpdated(const QString &userId, const QVariant
|
|||
{
|
||||
if (userId == this->options.value("my_id").toString()) {
|
||||
LOG("Own user status information updated :)");
|
||||
this->userInformation.insert("status", userStatusInformation);
|
||||
this->userInformation.insert(STATUS, userStatusInformation);
|
||||
}
|
||||
LOG("User status information updated:" << userId << userStatusInformation.value(_TYPE).toString());
|
||||
QVariantMap updatedUserInformation = this->allUsers.value(userId).toMap();
|
||||
updatedUserInformation.insert("status", userStatusInformation);
|
||||
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);
|
||||
}
|
||||
|
||||
void TDLibWrapper::handleFileUpdated(const QVariantMap &fileInformation)
|
||||
{
|
||||
emit fileUpdated(fileInformation.value("id").toInt(), fileInformation);
|
||||
emit fileUpdated(fileInformation.value(ID).toInt(), fileInformation);
|
||||
}
|
||||
|
||||
void TDLibWrapper::handleNewChatDiscovered(const QVariantMap &chatInformation)
|
||||
{
|
||||
QString chatId = chatInformation.value("id").toString();
|
||||
QString chatId = chatInformation.value(ID).toString();
|
||||
this->chats.insert(chatId, chatInformation);
|
||||
emit newChatDiscovered(chatId, chatInformation);
|
||||
}
|
||||
|
@ -1831,6 +1939,17 @@ void TDLibWrapper::handleUnreadChatCountUpdated(const QVariantMap &chatCountInfo
|
|||
}
|
||||
}
|
||||
|
||||
void TDLibWrapper::handleAvailableReactionsUpdated(qlonglong chatId, const QVariantMap &availableReactions)
|
||||
{
|
||||
LOG("Updating available reactions for chat" << chatId << availableReactions);
|
||||
QString chatIdString = QString::number(chatId);
|
||||
QVariantMap chatInformation = this->getChat(chatIdString);
|
||||
chatInformation.insert(CHAT_AVAILABLE_REACTIONS, availableReactions);
|
||||
this->chats.insert(chatIdString, chatInformation);
|
||||
emit chatAvailableReactionsUpdated(chatId, availableReactions);
|
||||
|
||||
}
|
||||
|
||||
void TDLibWrapper::handleBasicGroupUpdated(qlonglong groupId, const QVariantMap &groupInformation)
|
||||
{
|
||||
emit basicGroupUpdated(updateGroup(groupId, groupInformation, &basicGroups)->groupId);
|
||||
|
@ -1856,7 +1975,7 @@ void TDLibWrapper::handleStickerSets(const QVariantList &stickerSets)
|
|||
QListIterator<QVariant> stickerSetIterator(stickerSets);
|
||||
while (stickerSetIterator.hasNext()) {
|
||||
QVariantMap stickerSet = stickerSetIterator.next().toMap();
|
||||
this->getStickerSet(stickerSet.value("id").toString());
|
||||
this->getStickerSet(stickerSet.value(ID).toString());
|
||||
}
|
||||
emit this->stickerSetsReceived(stickerSets);
|
||||
}
|
||||
|
@ -1988,6 +2107,14 @@ void TDLibWrapper::handleSponsoredMessage(qlonglong chatId, const QVariantMap &m
|
|||
}
|
||||
}
|
||||
|
||||
void TDLibWrapper::handleActiveEmojiReactionsUpdated(const QStringList& emojis)
|
||||
{
|
||||
if (activeEmojiReactions != emojis) {
|
||||
activeEmojiReactions = emojis;
|
||||
LOG(emojis.count() << "reaction(s) available");
|
||||
emit reactionsUpdated();
|
||||
}
|
||||
}
|
||||
|
||||
void TDLibWrapper::handleNetworkConfigurationChanged(const QNetworkConfiguration &config)
|
||||
{
|
||||
|
@ -2077,28 +2204,40 @@ void TDLibWrapper::handleGetPageSourceFinished()
|
|||
}
|
||||
}
|
||||
|
||||
QVariantMap& TDLibWrapper::fillTdlibParameters(QVariantMap& parameters)
|
||||
{
|
||||
parameters.insert("api_id", TDLIB_API_ID);
|
||||
parameters.insert("api_hash", TDLIB_API_HASH);
|
||||
parameters.insert("database_directory", QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/tdlib");
|
||||
bool onlineOnlyMode = this->appSettings->onlineOnlyMode();
|
||||
parameters.insert("use_file_database", !onlineOnlyMode);
|
||||
parameters.insert("use_chat_info_database", !onlineOnlyMode);
|
||||
parameters.insert("use_message_database", !onlineOnlyMode);
|
||||
parameters.insert("use_secret_chats", true);
|
||||
parameters.insert("system_language_code", QLocale::system().name());
|
||||
QSettings hardwareSettings("/etc/hw-release", QSettings::NativeFormat);
|
||||
parameters.insert("device_model", hardwareSettings.value("NAME", "Unknown Mobile Device").toString());
|
||||
parameters.insert("system_version", QSysInfo::prettyProductName());
|
||||
parameters.insert("application_version", "0.17");
|
||||
parameters.insert("enable_storage_optimizer", appSettings->storageOptimizer());
|
||||
// parameters.insert("use_test_dc", true);
|
||||
return parameters;
|
||||
}
|
||||
|
||||
void TDLibWrapper::setInitialParameters()
|
||||
{
|
||||
LOG("Sending initial parameters to TD Lib");
|
||||
QVariantMap requestObject;
|
||||
requestObject.insert(_TYPE, "setTdlibParameters");
|
||||
// tdlibParameters were inlined between 1.8.5 and 1.8.6
|
||||
// See https://github.com/tdlib/td/commit/f6a2ecd
|
||||
if (versionNumber > VERSION_NUMBER(1,8,5)) {
|
||||
fillTdlibParameters(requestObject);
|
||||
} else {
|
||||
QVariantMap initialParameters;
|
||||
initialParameters.insert("api_id", TDLIB_API_ID);
|
||||
initialParameters.insert("api_hash", TDLIB_API_HASH);
|
||||
initialParameters.insert("database_directory", QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/tdlib");
|
||||
bool onlineOnlyMode = this->appSettings->onlineOnlyMode();
|
||||
initialParameters.insert("use_file_database", !onlineOnlyMode);
|
||||
initialParameters.insert("use_chat_info_database", !onlineOnlyMode);
|
||||
initialParameters.insert("use_message_database", !onlineOnlyMode);
|
||||
initialParameters.insert("use_secret_chats", true);
|
||||
initialParameters.insert("system_language_code", QLocale::system().name());
|
||||
QSettings hardwareSettings("/etc/hw-release", QSettings::NativeFormat);
|
||||
initialParameters.insert("device_model", hardwareSettings.value("NAME", "Unknown Mobile Device").toString());
|
||||
initialParameters.insert("system_version", QSysInfo::prettyProductName());
|
||||
initialParameters.insert("application_version", "0.17");
|
||||
initialParameters.insert("enable_storage_optimizer", appSettings->storageOptimizer());
|
||||
// initialParameters.insert("use_test_dc", true);
|
||||
fillTdlibParameters(initialParameters);
|
||||
requestObject.insert("parameters", initialParameters);
|
||||
}
|
||||
this->sendRequest(requestObject);
|
||||
}
|
||||
|
||||
|
|
|
@ -148,6 +148,7 @@ public:
|
|||
Q_INVOKABLE QVariantMap getSuperGroup(qlonglong groupId) const;
|
||||
Q_INVOKABLE QVariantMap getChat(const QString &chatId);
|
||||
Q_INVOKABLE QVariantMap getSecretChatFromCache(qlonglong secretChatId);
|
||||
Q_INVOKABLE QStringList getChatReactions(const QString &chatId);
|
||||
Q_INVOKABLE QString getOptionString(const QString &optionName);
|
||||
Q_INVOKABLE void copyFileToDownloads(const QString &filePath, bool openAfterCopy = false);
|
||||
Q_INVOKABLE void openFileOnDevice(const QString &filePath);
|
||||
|
@ -175,14 +176,14 @@ public:
|
|||
Q_INVOKABLE void viewMessage(qlonglong chatId, qlonglong messageId, bool force);
|
||||
Q_INVOKABLE void pinMessage(const QString &chatId, const QString &messageId, bool disableNotification = false);
|
||||
Q_INVOKABLE void unpinMessage(const QString &chatId, const QString &messageId);
|
||||
Q_INVOKABLE void sendTextMessage(const QString &chatId, const QString &message, const QString &replyToMessageId = "0");
|
||||
Q_INVOKABLE void sendPhotoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
|
||||
Q_INVOKABLE void sendVideoMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
|
||||
Q_INVOKABLE void sendDocumentMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
|
||||
Q_INVOKABLE void sendVoiceNoteMessage(const QString &chatId, const QString &filePath, const QString &message, const QString &replyToMessageId = "0");
|
||||
Q_INVOKABLE void sendLocationMessage(const QString &chatId, double latitude, double longitude, double horizontalAccuracy, const QString &replyToMessageId = "0");
|
||||
Q_INVOKABLE void sendStickerMessage(const QString &chatId, const QString &fileId, const QString &replyToMessageId = "0");
|
||||
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 sendTextMessage(qlonglong chatId, const QString &message, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendPhotoMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendVideoMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendDocumentMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendVoiceNoteMessage(qlonglong chatId, const QString &filePath, const QString &message, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendLocationMessage(qlonglong chatId, double latitude, double longitude, double horizontalAccuracy, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendStickerMessage(qlonglong chatId, const QString &fileId, qlonglong replyToMessageId = 0);
|
||||
Q_INVOKABLE void sendPollMessage(qlonglong chatId, const QString &question, const QVariantList &options, bool anonymous, int correctOption, bool multiple, const QString &explanation, qlonglong 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, const QString &extra = "");
|
||||
|
@ -248,8 +249,10 @@ public:
|
|||
Q_INVOKABLE void terminateSession(const QString &sessionId);
|
||||
Q_INVOKABLE void getMessageAvailableReactions(qlonglong chatId, qlonglong messageId);
|
||||
Q_INVOKABLE void getPageSource(const QString &address);
|
||||
Q_INVOKABLE void setMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction);
|
||||
Q_INVOKABLE void addMessageReaction(qlonglong chatId, qlonglong messageId, const QString &reaction);
|
||||
Q_INVOKABLE void removeMessageReaction(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);
|
||||
|
@ -277,6 +280,7 @@ signals:
|
|||
void chatPinnedUpdated(qlonglong chatId, bool isPinned);
|
||||
void chatReadInboxUpdated(const QString &chatId, const QString &lastReadInboxMessageId, int unreadCount);
|
||||
void chatReadOutboxUpdated(const QString &chatId, const QString &lastReadOutboxMessageId);
|
||||
void chatAvailableReactionsUpdated(const qlonglong &chatId, const QVariantMap &availableReactions);
|
||||
void userUpdated(const QString &userId, const QVariantMap &userInformation);
|
||||
void ownUserUpdated(const QVariantMap &userInformation);
|
||||
void basicGroupUpdated(qlonglong groupId);
|
||||
|
@ -320,6 +324,7 @@ signals:
|
|||
void chatTitleUpdated(const QString &chatId, const QString &title);
|
||||
void chatPinnedMessageUpdated(qlonglong chatId, qlonglong pinnedMessageId);
|
||||
void usersReceived(const QString &extra, const QVariantList &userIds, int totalUsers);
|
||||
void messageSendersReceived(const QString &extra, const QVariantList &senders, int totalUsers);
|
||||
void errorReceived(int code, const QString &message, const QString &extra);
|
||||
void contactsImported(const QVariantList &importerCount, const QVariantList &userIds);
|
||||
void messageNotFound(qlonglong chatId, qlonglong messageId);
|
||||
|
@ -330,12 +335,13 @@ 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);
|
||||
void chatUnreadReactionCountUpdated(qlonglong chatId, int unreadReactionCount);
|
||||
void tgUrlFound(const QString &tgUrl);
|
||||
void reactionsUpdated();
|
||||
|
||||
public slots:
|
||||
void handleVersionDetected(const QString &version);
|
||||
|
@ -349,6 +355,7 @@ public slots:
|
|||
void handleChatReceived(const QVariantMap &chatInformation);
|
||||
void handleUnreadMessageCountUpdated(const QVariantMap &messageCountInformation);
|
||||
void handleUnreadChatCountUpdated(const QVariantMap &chatCountInformation);
|
||||
void handleAvailableReactionsUpdated(qlonglong chatId, const QVariantMap &availableReactions);
|
||||
void handleBasicGroupUpdated(qlonglong groupId, const QVariantMap &groupInformation);
|
||||
void handleSuperGroupUpdated(qlonglong groupId, const QVariantMap &groupInformation);
|
||||
void handleStickerSets(const QVariantList &stickerSets);
|
||||
|
@ -364,7 +371,7 @@ public slots:
|
|||
void handleUpdatedUserPrivacySettingRules(const QVariantMap &updatedRules);
|
||||
void handleSponsoredMessage(qlonglong chatId, const QVariantMap &message);
|
||||
void handleNetworkConfigurationChanged(const QNetworkConfiguration &config);
|
||||
|
||||
void handleActiveEmojiReactionsUpdated(const QStringList& emojis);
|
||||
void handleGetPageSourceFinished();
|
||||
|
||||
private:
|
||||
|
@ -372,7 +379,9 @@ private:
|
|||
void setInitialParameters();
|
||||
void setEncryptionKey();
|
||||
void setLogVerbosityLevel();
|
||||
QVariantMap &fillTdlibParameters(QVariantMap ¶meters);
|
||||
const Group *updateGroup(qlonglong groupId, const QVariantMap &groupInfo, QHash<qlonglong,Group*> *groups);
|
||||
QVariantMap newSendMessageRequest(qlonglong chatId, qlonglong replyToMessageId);
|
||||
void initializeTDLibReceiver();
|
||||
|
||||
private:
|
||||
|
@ -383,7 +392,7 @@ private:
|
|||
MceInterface *mceInterface;
|
||||
TDLibReceiver *tdLibReceiver;
|
||||
DBusInterface *dbusInterface;
|
||||
QString version;
|
||||
QString versionString;
|
||||
TDLibWrapper::AuthorizationState authorizationState;
|
||||
QVariantMap authorizationStateData;
|
||||
TDLibWrapper::ConnectionState connectionState;
|
||||
|
@ -399,7 +408,9 @@ private:
|
|||
QHash<qlonglong,Group*> basicGroups;
|
||||
QHash<qlonglong,Group*> superGroups;
|
||||
EmojiSearchWorker emojiSearchWorker;
|
||||
QStringList activeEmojiReactions;
|
||||
|
||||
int versionNumber;
|
||||
QString activeChatSearchName;
|
||||
bool joinChatRequested;
|
||||
bool isLoggingOut;
|
||||
|
|
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Gelöschtes Konto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation>Drücke zweimal auf eine Nachricht, um eine Reaktion auszuwählen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1582,6 +1586,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Wenn Töne eingeschaltet sind, wird Fernschreiber den aktuellen Sailfish OS-Hinweiston für Chats verwenden, der in den Systemeinstellungen konfiguriert werden kann.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation>Immer bei Hinweisen die Nachricht ausgeben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation>Zusätzlich zur Anzahl der ungelesenen Nachrichten wird immer die neuste Nachricht an Hinweise angefügt.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation>Ungelesene Nachrichten hervorheben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation>Unterhaltungen mit ungelesenen Nachrichten hervorheben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation>Inhalte in Hinweisen verbergen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation>Zu zitierter Nachricht springen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation>Beim Tippen auf eine zitierte Nachricht zu dieser springen anstatt es in einem Overlay anzuzeigen.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1679,10 +1711,6 @@
|
|||
<source>This app</source>
|
||||
<translation>Diese App</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP-Adresse: %1, Herkunft: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Aktiv seit: %1, zuletzt online: %2</translation>
|
||||
|
@ -1695,6 +1723,41 @@
|
|||
<source>Sessions</source>
|
||||
<translation>Sitzungen</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation>
|
||||
<numerusform>%1 Tag</numerusform>
|
||||
<numerusform>%1 Tage</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation>1 Woche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation>1 Monat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation>3 Monate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation>6 Monate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation>1 Jahr</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation>Timeout von Sitzungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation>Inaktive Sitzungen werden nach dieser Zeitdauer abgeschaltet</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Deleted User</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1584,6 +1588,34 @@ messages</numerusform>
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation>Always append message preview to notifications</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1689,14 +1721,45 @@ messages</numerusform>
|
|||
<source>This app</source>
|
||||
<translation>This app</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP address: %1, origin: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Active since: %1, last online: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation>
|
||||
<numerusform>%1 day</numerusform>
|
||||
<numerusform>%1 days</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1583,6 +1587,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Kun äänet ovat käytössä, Fernschreiber käyttää Sailfish OS:n ilmoitusääniä keskusteluille, jotia voit muuttaa järjestelmäasetuksista.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1688,14 +1720,45 @@
|
|||
<source>This app</source>
|
||||
<translation>Tämä sovellus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP-osoite: %1, sijainti: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Aktiivinen %1 alkaen, viimeksi paikalla: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="en">
|
||||
<TS version="2.1" language="fr">
|
||||
<context>
|
||||
<name>AboutPage</name>
|
||||
<message>
|
||||
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Supprimer l'utilisateur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation>Toucher deux fois sur un message pour réagir</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1166,7 +1170,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>No contacts found.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Aucun contact trouvé</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -1582,6 +1586,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Lorsque le son est activé, Fernschreiber utilisera le réglage de Sailfish OS. Celui-ci est paramétrable depuis les paramètres du système.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation>Toujours visualiser le message dans les notifications</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation>En plus d'afficher le nombre de messages non-lus, le dernier message sera également ajouté aux notifications.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation>Mettre en valeur les messages non-lus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation>Mettre en valeur les conversations avec des messages non-lus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation>Masquer le contenu dans les notifications</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1687,14 +1719,45 @@
|
|||
<source>This app</source>
|
||||
<translation>Cette app</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>Adresse IP : %1, origine : %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Actif depuis : %1, en ligne : %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation>
|
||||
<numerusform>%1 jour(s)</numerusform>
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation>1 semaine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation>1 mois</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation>3 mois</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation>6 mois</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation>1 année</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation>Délai d'inactivité de session</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation>Sessions inactives seront terminées après ce délai</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -473,6 +473,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1555,6 +1559,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1661,11 +1693,41 @@
|
|||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
|
|
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1582,6 +1586,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Quando i suoni di notifica sono attivi, Fernschreiber utilizza l'attuale suono di notifica per i messaggi scelto per Sailfish OS, il quale può essere modificato dalle impostazioni di sistema.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1688,11 +1720,42 @@
|
|||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
|
|
|
@ -493,6 +493,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Usunięty użytkownik</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1609,6 +1613,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Gdy dźwięki są włączone, Fernschreiber użyje bieżącego dźwięku powiadomienia Sailfish OS do czatów, które można skonfigurować w ustawieniach systemu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1714,14 +1746,46 @@
|
|||
<source>This app</source>
|
||||
<translation>Ta aplikacja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>Adres IP: %1, oryginalny: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Aktywny od: %1, ostatnio aktywny: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
<numerusform></numerusform>
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -348,11 +348,11 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Leave Chat</source>
|
||||
<translation>Выйти из Чата</translation>
|
||||
<translation>Выйти из чата</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Join Chat</source>
|
||||
<translation>Зайти в Чат</translation>
|
||||
<translation>Зайти в чат</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Leaving chat</source>
|
||||
|
@ -427,7 +427,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Search in Chat</source>
|
||||
<translation>Найти в Чате</translation>
|
||||
<translation>Поиск в чате</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search in chat...</source>
|
||||
|
@ -493,6 +493,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Удалённый пользователь</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1159,7 +1163,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Secret Chat</source>
|
||||
<translation>Секретный Чат</translation>
|
||||
<translation>Секретный чат</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>End-to-end-encrypted, accessible on this device only</source>
|
||||
|
@ -1241,7 +1245,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>New Chat</source>
|
||||
<translation>Новый Чат</translation>
|
||||
<translation>Новый чат</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Filter your chats...</source>
|
||||
|
@ -1249,7 +1253,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Search Chats</source>
|
||||
<translation>Найти Чаты</translation>
|
||||
<translation>Поиск чатов</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Download of %1 successful.</source>
|
||||
|
@ -1460,7 +1464,7 @@
|
|||
<name>SearchChatsPage</name>
|
||||
<message>
|
||||
<source>No chats found.</source>
|
||||
<translation>Чаты не найдены</translation>
|
||||
<translation>Ничего не найдено</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Searching chats...</source>
|
||||
|
@ -1468,7 +1472,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Private Chat</source>
|
||||
<translation>Приватный Чат</translation>
|
||||
<translation>Приватный чат</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Group</source>
|
||||
|
@ -1496,7 +1500,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Search Chats</source>
|
||||
<translation>Найти Чаты</translation>
|
||||
<translation>Поиск чатов</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Search a chat...</source>
|
||||
|
@ -1612,6 +1616,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Если звуки разрешены, Fernschreiber использует звук, выбранный для чатов в настройках Sailfish OS.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation>Всегда показывать последнее сообщение на экране событий</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation>Включать в текст на экране событий не только количество непрочитанных сообщений, но и содержимое последнего сообщения.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation>Выделять непрочитанные сообщения</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation>Помечать чаты и каналы с непрочитанными сообщениями другим шрифтом и цветом.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation>Не показывать содержимое сообщений в уведомлениях</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation>Переходить к цитируемому сообщению</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation>По нажатию на цитируемое сообщение, переходить к нему в чате вместо отображения во всплывающем окне.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1717,14 +1749,46 @@
|
|||
<source>This app</source>
|
||||
<translation>Это приложение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP-адрес: %1, регион: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Активен с: %1, был онлайн: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation>
|
||||
<numerusform>%1 день</numerusform>
|
||||
<numerusform>%1 дня</numerusform>
|
||||
<numerusform>%1 дней</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation>1 неделя</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation>1 месяц</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation>3 месяца</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation>6 месяцев</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation>1 год</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation>Таймаут неактивности</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation>Неактивные сеансы будут автоматически завершены через указанное время.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -493,6 +493,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Odstránený používateľ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation>Dvojitým klepnutím na správu vybrať reakciu</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1583,7 +1587,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Use non-graphical feedback (sound, vibration) for notifications</source>
|
||||
<translation>Pre upozornenia použiť negrafickú reakciu (zvuk, vibrovanie)</translation>
|
||||
<translation>Pre oznamy použiť negrafickú reakciu (zvuk, vibrovanie)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>All events</source>
|
||||
|
@ -1603,11 +1607,39 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>Enable notification sounds</source>
|
||||
<translation>Povoliť zvukové upozornenia</translation>
|
||||
<translation>Povoliť zvukové oznamy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>Keď sú povolené zvukové upozornenia, Fernschreiber použije aktuálne zvukové upozornenia Sailfish OS pre čety, ktoré môžu byť upravené v nastaveniach systému.</translation>
|
||||
<translation>Keď sú povolené zvukové oznamy, Fernschreiber použije aktuálne zvukové oznamy Sailfish OS pre čety, ktoré môžu byť upravené v nastaveniach systému.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation>K upozorneniam vždy pripojiť ukážku správy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation>Okrem zobrazenia počtu neprečítaných správ pripojiť k upozorneniam aj najnovšiu správu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation>Zvýrazniť neprečítané správy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation>Zvýrazniť konverzácie s neprečítanými správami</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation>V upozorneniach skryť obsah</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation>Prejsť na citovanú správu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation>Citovanú správu otvoriť v čete namiesto v náhľade.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -1714,14 +1746,46 @@
|
|||
<source>This app</source>
|
||||
<translation>Táto aplikácia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP adresa: %1, pôvod: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Aktívna od: %1, naposledy pripojená: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation>
|
||||
<numerusform>%1 deň</numerusform>
|
||||
<numerusform>%1 dni</numerusform>
|
||||
<numerusform>%1 dní</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation>1 týždeň</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation>1 mesiac</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation>3 mesiace</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation>6 mesiacov</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation>1 rok</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation>Časový limit relácie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation>Neaktívne relácie budú po tomto časovom rámci ukončené</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -185,7 +185,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>ID has been copied to the clipboard.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ID har kopierats till urklipp.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation>Tog bort användare</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation>Dubbeltryck på ett meddelande för att välja en reaktion</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1166,7 +1170,7 @@
|
|||
</message>
|
||||
<message>
|
||||
<source>No contacts found.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Inga kontakter hittades.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
|
@ -1582,6 +1586,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>När ljud är aktiverat, använder Fernschreiber aktuell Sailfish-signal för chatt-avisering, vilken kan ställas in i systemets ljudinställningar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation>Visa alltid förhandsgranskning av meddelanden i aviseringar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation>Förutom att visa antalet olästa meddelanden kommer det senaste meddelandet också att visas i aviseringarna.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation>Färgmarkera olästa meddelanden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation>Färgmarkera konversationer med olästa meddelanden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation>Dölj innehåll i aviseringar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation>Gå till citerat meddelande</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation>Vid tryck på ett citerat meddelande öppnas det i chatten istället för att visas i ett överlägg.</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1687,14 +1719,45 @@
|
|||
<source>This app</source>
|
||||
<translation>Denna app</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP-adress: %1, ursprung: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>Aktiv sedan: %1, senast online: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation>
|
||||
<numerusform>%1 dag</numerusform>
|
||||
<numerusform>%1 dagar</numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation>1 vecka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation>1 månad</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation>3 månader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation>6 månader</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation>1 år</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation>Tidsgräns för session</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation>Inaktiva sessioner avslutas efter den här tidsramen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -473,6 +473,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1556,6 +1560,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation>如果开启声音,Fernschreiber 会采用当前旗鱼系统通知声音作为对话通知声音,你可以在系统设置进行配置。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1661,14 +1693,44 @@
|
|||
<source>This app</source>
|
||||
<translation>此应用</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<translation>IP 地址: %1, 地点: %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation>活跃时间: %1, 上次在线: %2</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsStorage</name>
|
||||
|
|
|
@ -483,6 +483,10 @@
|
|||
<source>Deleted User</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Double-tap on a message to choose a reaction</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ChatSelectionPage</name>
|
||||
|
@ -1582,6 +1586,34 @@
|
|||
<source>When sounds are enabled, Fernschreiber will use the current Sailfish OS notification sound for chats, which can be configured in the system settings.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Always append message preview to notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>In addition to showing the number of unread messages, the latest message will also be appended to notifications.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Highlight Conversations with unread messages</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Hide content in notifications</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Go to quoted message</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>When tapping a quoted message, open it in chat instead of showing it in an overlay.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsPage</name>
|
||||
|
@ -1688,11 +1720,42 @@
|
|||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>IP address: %1, origin: %2</source>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<source>%1 day(s)</source>
|
||||
<translation type="unfinished">
|
||||
<numerusform></numerusform>
|
||||
<numerusform></numerusform>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 week</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Active since: %1, last online: %2</source>
|
||||
<source>1 month</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>3 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>6 months</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>1 year</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Session Timeout</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Inactive sessions will be terminated after this timeframe</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
|
|