2020-08-20 01:24:24 +03:00
/ *
2020-10-19 20:34:47 +03:00
Copyright ( C ) 2020 Sebastian J . Wolf and other contributors
2020-08-20 01:24:24 +03:00
This file is part of Fernschreiber .
Fernschreiber is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
Fernschreiber is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with Fernschreiber . If not , see < http : //www.gnu.org/licenses/>.
* /
2020-08-21 13:53:03 +03:00
2020-08-19 17:47:59 +03:00
function getUserName ( userInformation ) {
2020-08-21 00:56:21 +03:00
var firstName = typeof userInformation . first _name !== "undefined" ? userInformation . first _name : "" ;
var lastName = typeof userInformation . last _name !== "undefined" ? userInformation . last _name : "" ;
return ( firstName + " " + lastName ) . trim ( ) ;
2020-08-19 17:47:59 +03:00
}
2020-08-20 01:24:24 +03:00
2020-09-30 01:09:51 +03:00
function getMessageText ( message , simple , myself ) {
2020-08-20 01:24:24 +03:00
if ( message . content [ '@type' ] === 'messageText' ) {
2020-08-24 16:27:44 +03:00
if ( simple ) {
return message . content . text . text ;
} else {
return enhanceMessageText ( message . content . text ) ;
}
2020-08-20 01:24:24 +03:00
}
2020-08-21 13:53:03 +03:00
if ( message . content [ '@type' ] === 'messageSticker' ) {
2020-08-27 00:14:29 +03:00
return simple ? qsTr ( "Sticker: %1" ) . arg ( message . content . sticker . emoji ) : "" ;
2020-08-21 13:53:03 +03:00
}
2020-08-21 00:56:21 +03:00
if ( message . content [ '@type' ] === 'messagePhoto' ) {
2020-08-24 16:27:44 +03:00
if ( message . content . caption . text !== "" ) {
2020-08-25 00:02:08 +03:00
return simple ? qsTr ( "Picture: %1" ) . arg ( message . content . caption . text ) : enhanceMessageText ( message . content . caption )
2020-08-24 16:27:44 +03:00
} else {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent a picture" , "myself" ) : qsTr ( "sent a picture" ) ) : "" ;
2020-08-24 16:27:44 +03:00
}
2020-08-21 00:56:21 +03:00
}
if ( message . content [ '@type' ] === 'messageVideo' ) {
2020-08-24 16:27:44 +03:00
if ( message . content . caption . text !== "" ) {
2020-08-25 00:02:08 +03:00
return simple ? qsTr ( "Video: %1" ) . arg ( message . content . caption . text ) : enhanceMessageText ( message . content . caption )
2020-08-24 16:27:44 +03:00
} else {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent a video" , "myself" ) : qsTr ( "sent a video" ) ) : "" ;
2020-08-28 14:02:54 +03:00
}
}
2020-11-14 22:02:34 +03:00
if ( message . content [ '@type' ] === 'messageVideoNote' ) {
return simple ? ( myself ? qsTr ( "sent a video note" , "myself" ) : qsTr ( "sent a video note" ) ) : "" ;
}
2020-08-28 14:02:54 +03:00
if ( message . content [ '@type' ] === 'messageAnimation' ) {
if ( message . content . caption . text !== "" ) {
return simple ? qsTr ( "Animation: %1" ) . arg ( message . content . caption . text ) : enhanceMessageText ( message . content . caption )
} else {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent an animation" , "myself" ) : qsTr ( "sent an animation" ) ) : "" ;
2020-08-24 16:27:44 +03:00
}
2020-08-22 22:43:20 +03:00
}
if ( message . content [ '@type' ] === 'messageAudio' ) {
2020-08-24 16:27:44 +03:00
if ( message . content . caption . text !== "" ) {
2020-08-25 00:02:08 +03:00
return simple ? qsTr ( "Audio: %1" ) . arg ( message . content . caption . text ) : enhanceMessageText ( message . content . caption )
2020-08-24 16:27:44 +03:00
} else {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent an audio" , "myself" ) : qsTr ( "sent an audio" ) ) : "" ;
2020-08-24 16:27:44 +03:00
}
2020-08-22 22:43:20 +03:00
}
if ( message . content [ '@type' ] === 'messageVoiceNote' ) {
2020-08-24 16:27:44 +03:00
if ( message . content . caption . text !== "" ) {
2020-08-25 00:02:08 +03:00
return simple ? qsTr ( "Voice Note: %1" ) . arg ( message . content . caption . text ) : enhanceMessageText ( message . content . caption )
2020-08-24 16:27:44 +03:00
} else {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent a voice note" , "myself" ) : qsTr ( "sent a voice note" ) ) : "" ;
2020-08-24 16:27:44 +03:00
}
2020-08-22 22:43:20 +03:00
}
2020-08-28 17:18:33 +03:00
if ( message . content [ '@type' ] === 'messageDocument' ) {
if ( message . content . document . file _name !== "" ) {
2020-10-07 23:59:00 +03:00
return simple ? qsTr ( "Document: %1" ) . arg ( message . content . document . file _name ) : ( message . content . document . file _name + ( message . content . caption . text !== "" ? ( "<br />" + enhanceMessageText ( message . content . caption ) ) : "" ) ) . trim ( ) ;
2020-08-28 17:18:33 +03:00
} else {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent a document" , "myself" ) : qsTr ( "sent a document" ) ) : "" ;
2020-08-28 17:18:33 +03:00
}
}
2020-08-22 22:43:20 +03:00
if ( message . content [ '@type' ] === 'messageLocation' ) {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent a location" , "myself" ) : qsTr ( "sent a location" ) ) : "" ;
2020-09-29 22:58:14 +03:00
}
if ( message . content [ '@type' ] === 'messageVenue' ) {
2020-09-30 01:09:51 +03:00
return simple ? ( myself ? qsTr ( "sent a venue" , "myself" ) : qsTr ( "sent a venue" ) ) : ( "<b>" + message . content . venue . title + "</b>, " + message . content . venue . address ) ;
2020-08-21 00:56:21 +03:00
}
if ( message . content [ '@type' ] === 'messageContactRegistered' ) {
2020-09-30 01:09:51 +03:00
return myself ? qsTr ( "have registered with Telegram" ) : qsTr ( "has registered with Telegram" ) ;
2020-08-21 00:56:21 +03:00
}
if ( message . content [ '@type' ] === 'messageChatJoinByLink' ) {
2020-09-30 01:09:51 +03:00
return myself ? qsTr ( "joined this chat" , "myself" ) : qsTr ( "joined this chat" ) ;
2020-08-21 00:56:21 +03:00
}
2020-08-21 13:53:03 +03:00
if ( message . content [ '@type' ] === 'messageChatAddMembers' ) {
2020-09-30 01:09:51 +03:00
return myself ? qsTr ( "were added to this chat" , "myself" ) : qsTr ( "was added to this chat" ) ;
2020-08-21 13:53:03 +03:00
}
2020-08-21 19:03:51 +03:00
if ( message . content [ '@type' ] === 'messageChatDeleteMember' ) {
2020-09-30 01:09:51 +03:00
return myself ? qsTr ( "left this chat" , "myself" ) : qsTr ( "left this chat" ) ;
2020-08-21 19:03:51 +03:00
}
2020-10-19 13:20:02 +03:00
if ( message . content [ '@type' ] === 'messageChatChangeTitle' ) {
return myself ? qsTr ( "changed the chat title to %1" , "myself" ) . arg ( message . content . title ) : qsTr ( "changed the chat title to %1" ) . arg ( message . content . title ) ;
}
2020-10-23 11:29:50 +03:00
if ( message . content [ '@type' ] === 'messagePoll' ) {
2020-10-30 00:39:43 +03:00
if ( message . content . poll . type [ '@type' ] === "pollTypeQuiz" ) {
if ( message . content . poll . is _anonymous ) {
2020-10-30 21:07:06 +03:00
return simple ? ( myself ? qsTr ( "sent an anonymous quiz" , "myself" ) : qsTr ( "sent an anonymous quiz" ) ) : ( "<b>" + qsTr ( "Anonymous Quiz" ) + "</b>" ) ;
2020-10-23 11:29:50 +03:00
}
2020-10-30 21:07:06 +03:00
return simple ? ( myself ? qsTr ( "sent a quiz" , "myself" ) : qsTr ( "sent a quiz" ) ) : ( "<b>" + qsTr ( "Quiz" ) + "</b>" ) ;
2020-10-23 11:29:50 +03:00
}
2020-10-30 00:39:43 +03:00
if ( message . content . poll . is _anonymous ) {
2020-10-30 21:07:06 +03:00
return simple ? ( myself ? qsTr ( "sent an anonymous poll" , "myself" ) : qsTr ( "sent an anonymous poll" ) ) : ( "<b>" + qsTr ( "Anonymous Poll" ) + "</b>" ) ;
2020-10-23 11:29:50 +03:00
}
2020-10-30 21:07:06 +03:00
return simple ? ( myself ? qsTr ( "sent a poll" , "myself" ) : qsTr ( "sent a poll" ) ) : ( "<b>" + qsTr ( "Poll" ) + "</b>" ) ;
2020-10-23 11:29:50 +03:00
}
2020-11-05 16:06:41 +03:00
if ( message . content [ '@type' ] === 'messageBasicGroupChatCreate' || message . content [ '@type' ] === 'messageSupergroupChatCreate' ) {
return myself ? qsTr ( "created this group" , "myself" ) : qsTr ( "created this group" ) ;
}
if ( message . content [ '@type' ] === 'messageChatChangePhoto' ) {
return myself ? qsTr ( "changed the chat photo" , "myself" ) : qsTr ( "changed the chat photo" ) ;
}
if ( message . content [ '@type' ] === 'messageChatDeletePhoto' ) {
return myself ? qsTr ( "deleted the chat photo" , "myself" ) : qsTr ( "deleted the chat photo" ) ;
}
if ( message . content [ '@type' ] === 'messageChatSetTtl' ) {
return myself ? qsTr ( "changed the secret chat TTL setting" , "myself; TTL = Time To Live" ) : qsTr ( "changed the secret chat TTL setting" , "TTL = Time To Live" ) ;
}
if ( message . content [ '@type' ] === 'messageChatUpgradeFrom' || message . content [ '@type' ] === 'messageChatUpgradeTo' ) {
return myself ? qsTr ( "upgraded this group to a supergroup" , "myself" ) : qsTr ( "upgraded this group to a supergroup" ) ;
}
if ( message . content [ '@type' ] === 'messageCustomServiceAction' ) {
return message . content . text ;
}
if ( message . content [ '@type' ] === 'messagePinMessage' ) {
return myself ? qsTr ( "changed the pinned message" , "myself" ) : qsTr ( "changed the pinned message" ) ;
}
if ( message . content [ '@type' ] === 'messageExpiredPhoto' ) {
return myself ? qsTr ( "sent a self-destructing photo that is expired" , "myself" ) : qsTr ( "sent a self-destructing photo that is expired" ) ;
}
if ( message . content [ '@type' ] === 'messageExpiredVideo' ) {
return myself ? qsTr ( "sent a self-destructing video that is expired" , "myself" ) : qsTr ( "sent a self-destructing video that is expired" ) ;
}
if ( message . content [ '@type' ] === 'messageScreenshotTaken' ) {
return myself ? qsTr ( "created a screenshot in this chat" , "myself" ) : qsTr ( "created a screenshot in this chat" ) ;
}
if ( message . content [ '@type' ] === 'messageUnsupported' ) {
return myself ? qsTr ( "sent an unsupported message" , "myself" ) : qsTr ( "sent an unsupported message" ) ;
}
2020-10-19 13:20:02 +03:00
2020-11-05 16:06:41 +03:00
return myself ? qsTr ( "sent an unsupported message: %1" , "myself; %1 is message type" ) . arg ( message . content [ '@type' ] . substring ( 7 ) ) : qsTr ( "sent an unsupported message: %1" , "%1 is message type" ) . arg ( message . content [ '@type' ] . substring ( 7 ) ) ;
}
2020-10-19 13:20:02 +03:00
function getChatPartnerStatusText ( statusType , was _online ) {
switch ( statusType ) {
case "userStatusEmpty" :
return qsTr ( "was never online" ) ;
case "userStatusLastMonth" :
return qsTr ( "offline, last online: last month" ) ;
case "userStatusLastWeek" :
return qsTr ( "offline, last online: last week" ) ;
case "userStatusOffline" :
return qsTr ( "offline, last online: %1" ) . arg ( getDateTimeElapsed ( was _online ) ) ;
case "userStatusOnline" :
return qsTr ( "online" ) ;
case "userStatusRecently" :
return qsTr ( "offline, was recently online" ) ;
}
}
function getChatMemberStatusText ( statusType ) {
// chatMemberStatusAdministrator, chatMemberStatusBanned, chatMemberStatusCreator, chatMemberStatusLeft, chatMemberStatusMember, and chatMemberStatusRestricted.
switch ( statusType ) {
case "chatMemberStatusAdministrator" :
return qsTr ( "Admin" , "channel user role" ) ;
case "chatMemberStatusBanned" :
return qsTr ( "Banned" , "channel user role" ) ;
case "chatMemberStatusCreator" :
return qsTr ( "Creator" , "channel user role" ) ;
case "chatMemberStatusRestricted" :
return qsTr ( "Restricted" , "channel user role" ) ;
case "chatMemberStatusLeft" :
case "chatMemberStatusMember" :
return ""
}
return statusType || "" ;
}
2020-09-24 10:55:05 +03:00
function getShortenedCount ( count ) {
if ( count >= 1000000 ) {
return qsTr ( "%1M" ) . arg ( ( count / 1000000 ) . toLocaleString ( Qt . locale ( ) , 'f' , 0 ) ) ;
} else if ( count >= 1000 ) {
return qsTr ( "%1K" ) . arg ( ( count / 1000 ) . toLocaleString ( Qt . locale ( ) , 'f' , 0 ) ) ;
} else {
return count ;
}
}
2020-08-20 01:24:24 +03:00
function getDateTimeElapsed ( timestamp ) {
return Format . formatDate ( new Date ( timestamp * 1000 ) , Formatter . DurationElapsed ) ;
}
2020-08-24 16:27:44 +03:00
2020-11-03 01:42:23 +03:00
function getDateTimeTranslated ( timestamp ) {
return new Date ( timestamp * 1000 ) . toLocaleString ( ) ;
}
2020-11-02 00:55:43 +03:00
function MessageInsertion ( offset , insertionString , removeLength ) {
2020-08-24 16:27:44 +03:00
this . offset = offset ;
this . insertionString = insertionString ;
2020-11-02 00:55:43 +03:00
this . removeLength = removeLength ;
2020-08-24 16:27:44 +03:00
}
MessageInsertion . prototype . toString = function insertionToString ( ) {
2020-11-02 00:55:43 +03:00
return "Offset: " + this . offset + ", Insertion String: " + this . insertionString + ", Remove Length: " + this . removeLength ;
}
function handleHtmlEntity ( messageText , messageInsertions , originalString , replacementString ) {
var continueSearch = true ;
var fromIndex = 0 ;
var nextIndex = 0 ;
while ( continueSearch ) {
nextIndex = messageText . indexOf ( originalString , fromIndex ) ;
if ( nextIndex < 0 ) {
continueSearch = false ;
} else {
messageInsertions . push ( new MessageInsertion ( nextIndex , replacementString , originalString . length ) ) ;
fromIndex = nextIndex + 1 ;
}
}
2020-08-24 16:27:44 +03:00
}
2020-11-19 13:41:32 +03:00
function enhanceHtmlEntities ( simpleText ) {
var messageInsertions = [ ] ;
var messageText = simpleText ;
handleHtmlEntity ( messageText , messageInsertions , "&" , "&" ) ;
handleHtmlEntity ( messageText , messageInsertions , "<" , "<" ) ;
handleHtmlEntity ( messageText , messageInsertions , ">" , ">" ) ;
messageInsertions . sort ( function ( a , b ) { return ( b . offset + b . removeLength ) - ( a . offset + a . removeLength ) } ) ;
for ( var z = 0 ; z < messageInsertions . length ; z ++ ) {
messageText = messageText . substring ( 0 , messageInsertions [ z ] . offset ) + messageInsertions [ z ] . insertionString + messageText . substring ( messageInsertions [ z ] . offset + messageInsertions [ z ] . removeLength ) ;
}
return messageText ;
}
2020-08-24 16:27:44 +03:00
function enhanceMessageText ( formattedText ) {
var messageInsertions = [ ] ;
2020-11-02 00:55:43 +03:00
var messageText = formattedText . text ;
handleHtmlEntity ( messageText , messageInsertions , "&" , "&" ) ;
handleHtmlEntity ( messageText , messageInsertions , "<" , "<" ) ;
handleHtmlEntity ( messageText , messageInsertions , ">" , ">" ) ;
2020-08-24 16:27:44 +03:00
for ( var i = 0 ; i < formattedText . entities . length ; i ++ ) {
if ( formattedText . entities [ i ] [ '@type' ] !== "textEntity" ) {
continue ;
}
var entityType = formattedText . entities [ i ] . type [ '@type' ] ;
if ( entityType === "textEntityTypeBold" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<b>" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</b>" , 0 ) ) ;
2020-08-24 16:27:44 +03:00
}
2020-08-24 17:30:19 +03:00
if ( entityType === "textEntityTypeUrl" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<a href=\"" + messageText . substring ( formattedText . entities [ i ] . offset , ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) ) + "\">" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</a>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeCode" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<pre>" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</pre>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeEmailAddress" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<a href=\"mailto:" + messageText . substring ( formattedText . entities [ i ] . offset , ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) ) + "\">" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</a>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeItalic" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<i>" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</i>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeMention" ) {
2020-11-04 00:21:01 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<a href=\"user://" + messageText . substring ( formattedText . entities [ i ] . offset , ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) ) + "\">" , 0 ) ) ;
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</a>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeMentionName" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<a href=\"userId://" + formattedText . entities [ i ] . type . user _id + "\">" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</a>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypePhoneNumber" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<a href=\"tel:" + messageText . substring ( formattedText . entities [ i ] . offset , ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) ) + "\">" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</a>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypePre" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<pre>" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</pre>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypePreCode" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<pre>" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</pre>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeTextUrl" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<a href=\"" + formattedText . entities [ i ] . type . url + "\">" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</a>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
if ( entityType === "textEntityTypeUnderline" ) {
2020-11-02 00:55:43 +03:00
messageInsertions . push ( new MessageInsertion ( formattedText . entities [ i ] . offset , "<u>" , 0 ) ) ;
messageInsertions . push ( new MessageInsertion ( ( formattedText . entities [ i ] . offset + formattedText . entities [ i ] . length ) , "</u>" , 0 ) ) ;
2020-08-24 17:30:19 +03:00
}
2020-08-24 16:27:44 +03:00
}
2020-11-03 02:03:00 +03:00
messageInsertions . sort ( function ( a , b ) { return ( b . offset + b . removeLength ) - ( a . offset + a . removeLength ) } ) ;
2020-08-24 16:27:44 +03:00
for ( var z = 0 ; z < messageInsertions . length ; z ++ ) {
2020-11-02 00:55:43 +03:00
messageText = messageText . substring ( 0 , messageInsertions [ z ] . offset ) + messageInsertions [ z ] . insertionString + messageText . substring ( messageInsertions [ z ] . offset + messageInsertions [ z ] . removeLength ) ;
2020-08-24 16:27:44 +03:00
}
messageText = messageText . replace ( new RegExp ( "\r?\n" , "g" ) , "<br>" ) ;
2020-11-15 12:05:27 +03:00
// var spaceRegex = /\s{2,}/g;
// function spaceReplacer(match, p1, offset, string) {
// var replaceString = "";
// for (var i = 0; i < match.length; i++) {
// replaceString += " ";
// }
// return replaceString;
// }
// messageText = messageText.replace(spaceRegex, spaceReplacer);
2020-08-24 16:27:44 +03:00
return messageText ;
}
2020-08-24 17:30:19 +03:00
function handleLink ( link ) {
2020-11-08 23:13:04 +03:00
var tMePrefix = tdLibWrapper . getOptionString ( "t_me_url" ) ;
2020-08-24 17:30:19 +03:00
if ( link . indexOf ( "user://" ) === 0 ) {
2020-11-10 01:22:24 +03:00
var userName = link . substring ( 8 ) ;
var userInformation = tdLibWrapper . getUserInformationByName ( userName ) ;
if ( typeof userInformation . id === "undefined" ) {
appNotification . show ( qsTr ( "Unable to find user %1" ) . arg ( userName ) ) ;
} else {
tdLibWrapper . createPrivateChat ( userInformation . id ) ;
}
2020-11-04 00:21:01 +03:00
} else if ( link . indexOf ( "userId://" ) === 0 ) {
tdLibWrapper . createPrivateChat ( link . substring ( 9 ) ) ;
2020-11-08 23:13:04 +03:00
} else if ( link . indexOf ( "tg://" ) === 0 ) {
console . log ( "Special TG link: " + link ) ;
if ( link . indexOf ( "tg://join?invite=" ) === 0 ) {
tdLibWrapper . joinChatByInviteLink ( tMePrefix + "joinchat/" + link . substring ( 17 ) ) ;
} else if ( link . indexOf ( "tg://resolve?domain=" ) === 0 ) {
tdLibWrapper . searchPublicChat ( link . substring ( 20 ) ) ;
}
2020-08-24 17:30:19 +03:00
} else {
2020-11-04 01:39:09 +03:00
if ( link . indexOf ( tMePrefix ) === 0 ) {
if ( link . indexOf ( "joinchat" ) !== - 1 ) {
2020-11-08 23:13:04 +03:00
console . log ( "Joining Chat: " + link ) ;
2020-11-04 01:39:09 +03:00
tdLibWrapper . joinChatByInviteLink ( link ) ;
// Do the necessary stuff to open the chat if successful
// Fail with nice error message if it doesn't work
} else {
2020-11-08 23:13:04 +03:00
console . log ( "Search public chat: " + link . substring ( tMePrefix . length ) ) ;
2020-11-04 01:39:09 +03:00
tdLibWrapper . searchPublicChat ( link . substring ( tMePrefix . length ) ) ;
// Check responses for updateBasicGroup or updateSupergroup
// Fire createBasicGroupChat or createSupergroupChat
// Do the necessary stuff to open the chat
// Fail with nice error message if chat can't be found
}
} else {
Qt . openUrlExternally ( link ) ;
}
2020-08-24 17:30:19 +03:00
}
}
2020-08-28 11:41:18 +03:00
function getVideoHeight ( videoWidth , videoData ) {
if ( typeof videoData !== "undefined" ) {
2020-09-30 00:37:56 +03:00
if ( videoData . height === 0 ) {
return videoWidth ;
} else {
var aspectRatio = videoData . height / videoData . width ;
return Math . round ( videoWidth * aspectRatio ) ;
}
2020-08-28 11:41:18 +03:00
} else {
return 1 ;
}
}
2020-10-19 13:20:02 +03:00
function replaceUrlsWithLinks ( string ) {
return string . replace ( /((\w+):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g , "<a href=\"$1\">$1</a>" ) ;
}
2020-11-15 01:50:12 +03:00
function sortMessagesArrayByDate ( messages ) {
messages . sort ( function ( a , b ) {
return a . date - b . date ;
} ) ;
}
function getMessagesArrayIds ( messages ) {
sortMessagesArrayByDate ( messages ) ;
return messages . map ( function ( message ) { return message . id . toString ( ) } ) ;
}
function getMessagesArrayText ( messages ) {
sortMessagesArrayByDate ( messages ) ;
var lastSenderName = "" ;
var lines = [ ] ;
for ( var i = 0 ; i < messages . length ; i += 1 ) {
var senderName = getUserName ( tdLibWrapper . getUserInformation ( messages [ i ] . sender _user _id ) ) ;
if ( senderName !== lastSenderName ) {
lines . push ( senderName ) ;
}
lastSenderName = senderName ;
lines . push ( getMessageText ( messages [ i ] , true , false ) ) ;
lines . push ( "" ) ;
}
return lines . join ( "\n" ) ;
}
2020-11-16 16:37:14 +03:00
function handleErrorMessage ( code , message ) {
if ( code === 404 ) {
// Silently ignore 404 Not Found messages (occur sometimes, without clear context...)
return ;
}
if ( message === "USER_ALREADY_PARTICIPANT" ) {
appNotification . show ( qsTr ( "You are already a member of this chat." ) ) ;
} else {
appNotification . show ( message ) ;
}
}
2020-11-16 12:28:16 +03:00
function getMessagesNeededForwardPermissions ( messages ) {
2020-11-18 13:13:05 +03:00
var neededPermissions = [ "can_send_messages" ]
2020-11-16 12:28:16 +03:00
2020-11-18 13:13:05 +03:00
var mediaMessageTypes = [ "messageAudio" , "messageDocument" , "messagePhoto" , "messageVideo" , "messageVideoNote" , "messageVoiceNote" ]
2020-11-16 12:28:16 +03:00
var otherMessageTypes = [ "messageAnimation" , "messageGame" , "messageSticker" ]
2020-11-16 14:25:47 +03:00
for ( var i = 0 ; i < messages . length && neededPermissions . length < 3 ; i += 1 ) {
2020-11-18 13:13:05 +03:00
var type = messages [ i ] [ "content" ] [ "@type" ]
var permission = ""
2020-11-16 12:28:16 +03:00
if ( type === "messageText" ) {
2020-11-18 13:13:05 +03:00
continue
2020-11-16 12:28:16 +03:00
} else if ( type === "messagePoll" ) {
2020-11-18 13:13:05 +03:00
permission = "can_send_polls"
2020-11-16 12:28:16 +03:00
} else if ( mediaMessageTypes . indexOf ( type ) > - 1 ) {
2020-11-18 13:13:05 +03:00
permission = "can_send_media_messages"
2020-11-16 12:28:16 +03:00
} else if ( otherMessageTypes . indexOf ( type ) > - 1 ) {
2020-11-18 13:13:05 +03:00
permission = "can_send_other_messages"
2020-11-16 12:28:16 +03:00
}
if ( permission !== "" && neededPermissions . indexOf ( permission ) === - 1 ) {
2020-11-18 13:13:05 +03:00
neededPermissions . push ( permission )
2020-11-16 12:28:16 +03:00
}
}
2020-11-18 13:13:05 +03:00
return neededPermissions
2020-11-16 12:28:16 +03:00
}