diff --git a/app/img/icons/General.png b/app/img/icons/General.png index 045dccad..16d772ae 100644 Binary files a/app/img/icons/General.png and b/app/img/icons/General.png differ diff --git a/app/img/icons/General_2x.png b/app/img/icons/General_2x.png index aa2e7ec8..72b8b7a3 100644 Binary files a/app/img/icons/General_2x.png and b/app/img/icons/General_2x.png differ diff --git a/app/img/icons/IconsetSmiles.png b/app/img/icons/IconsetSmiles.png index b244cb76..128f3608 100644 Binary files a/app/img/icons/IconsetSmiles.png and b/app/img/icons/IconsetSmiles.png differ diff --git a/app/img/icons/IconsetSmiles_2x.png b/app/img/icons/IconsetSmiles_2x.png index 6618c24b..d6594207 100644 Binary files a/app/img/icons/IconsetSmiles_2x.png and b/app/img/icons/IconsetSmiles_2x.png differ diff --git a/app/index.html b/app/index.html index bb28e8e6..9f77c6fa 100644 --- a/app/index.html +++ b/app/index.html @@ -64,7 +64,7 @@ - + diff --git a/app/js/controllers.js b/app/js/controllers.js index c3c6a7c1..c726dc7c 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -160,7 +160,6 @@ angular.module('myApp.controllers', ['myApp.i18n']) function saveAuth (result) { MtpApiManager.setUserAuth(options.dcID, { - expires: result.expires, id: result.user.id }); $timeout.cancel(callTimeout); @@ -408,9 +407,12 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.$on('$routeUpdate', updateCurDialog); + var pendingParams = false; $scope.$on('history_focus', function (e, peerData) { $modalStack.dismissAll(); - if (peerData.peerString == $scope.curDialog.peer && peerData.messageID == $scope.curDialog.messageID) { + if (peerData.peerString == $scope.curDialog.peer && + peerData.messageID == $scope.curDialog.messageID && + !peerData.startParam) { $scope.$broadcast(peerData.messageID ? 'ui_history_change_scroll' : 'ui_history_focus'); } else { var peerID = AppPeersManager.getPeerID(peerData.peerString); @@ -421,7 +423,19 @@ angular.module('myApp.controllers', ['myApp.i18n']) peer = '@' + username; } } - $location.url('/im?p=' + peer + (peerData.messageID ? '&m=' + peerData.messageID : '')); + if (peerData.messageID || peerData.startParam) { + pendingParams = { + messageID: peerData.messageID, + startParam: peerData.startParam + }; + } else { + pendingParams = false; + } + if ($routeParams.p != peer) { + $location.url('/im?p=' + peer); + } else { + updateCurDialog(); + } } }); @@ -569,21 +583,24 @@ angular.module('myApp.controllers', ['myApp.i18n']) } else { lastSearch = false; } + var addParams = pendingParams || {}; + pendingParams = false; + addParams.messageID = parseInt(addParams.messageID) || false; + addParams.startParam = addParams.startParam || false; + if ($routeParams.p && $routeParams.p.charAt(0) == '@') { if ($scope.curDialog === undefined) { $scope.curDialog = {}; } AppUsersManager.resolveUsername($routeParams.p.substr(1)).then(function (userID) { - $scope.curDialog = { - peer: AppUsersManager.getUserString(userID), - messageID: parseInt($routeParams.m) || false - }; + $scope.curDialog = angular.extend({ + peer: AppUsersManager.getUserString(userID) + }, addParams); }); } else { - $scope.curDialog = { - peer: $routeParams.p || false, - messageID: parseInt($routeParams.m) || false - }; + $scope.curDialog = angular.extend({ + peer: $routeParams.p || false + }, addParams); } } @@ -639,6 +656,9 @@ angular.module('myApp.controllers', ['myApp.i18n']) var topMessages = []; var topToDialogs = {}; angular.forEach(dialogsUpdated, function (dialog, peerID) { + if ($scope.noUsers && peerID > 0) { + return; + } topToDialogs[dialog.top_message] = dialog; topMessages.push(dialog.top_message); }); @@ -738,8 +758,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $location.url( '/im' + ($scope.curDialog.peer - ? '?p=' + $scope.curDialog.peer + - ($scope.curDialog.messageID ? '&m=' + $scope.curDialog.messageID : '') + ? '?p=' + $scope.curDialog.peer : '' ) ); @@ -777,7 +796,11 @@ angular.module('myApp.controllers', ['myApp.i18n']) return AppMessagesManager.getSearch({_: 'inputPeerEmpty'}, $scope.search.query, {_: 'inputMessagesFilterEmpty'}, maxID); }); } else { - promise = AppMessagesManager.getDialogs($scope.search.query, maxID); + var query = $scope.search.query; + if ($scope.noUsers) { + query = '%pg ' + (query || ''); + } + promise = AppMessagesManager.getDialogs(query, maxID); } return promise.then(function (result) { @@ -862,7 +885,10 @@ angular.module('myApp.controllers', ['myApp.i18n']) return; } - if (!hasMore && !searchMessages && ($scope.search.query || !$scope.dialogs.length)) { + if (!hasMore && + !searchMessages && + !$scope.noUsers && + ($scope.search.query || !$scope.dialogs.length)) { showMoreConversations(); return; } @@ -937,7 +963,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }, 500); } - if ($scope.search.query) { + if ($scope.search.query && !$scope.noMessages) { searchMessages = true; loadDialogs(); } @@ -947,7 +973,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) .controller('AppImHistoryController', function ($scope, $location, $timeout, $rootScope, MtpApiManager, AppUsersManager, AppChatsManager, AppMessagesManager, AppPeersManager, ApiUpdatesManager, PeersSelectService, IdleManager, StatusManager, ErrorService) { - $scope.$watch('curDialog', applyDialogSelect); + $scope.$watchCollection('curDialog', applyDialogSelect); ApiUpdatesManager.attach(); IdleManager.start(); @@ -967,6 +993,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.selectedReply = selectedReply; $scope.selectedCancel = selectedCancel; $scope.selectedFlush = selectedFlush; + $scope.botStart = botStart; $scope.toggleEdit = toggleEdit; $scope.toggleMedia = toggleMedia; @@ -1007,8 +1034,9 @@ angular.module('myApp.controllers', ['myApp.i18n']) var newPeer = newDialog.peer || $scope.curDialog.peer || ''; peerID = AppPeersManager.getPeerID(newPeer); - - if (peerID == $scope.curDialog.peerID && oldDialog.messageID == newDialog.messageID) { + if (peerID == $scope.curDialog.peerID && + oldDialog.messageID == newDialog.messageID && + oldDialog.startParam == newDialog.startParam) { return false; } @@ -1017,9 +1045,12 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.curDialog.inputPeer = AppPeersManager.getInputPeer(newPeer); $scope.historyFilter.mediaType = false; + updateStartBot(); selectedCancel(true); - if (oldDialog.peer && oldDialog.peer == newDialog.peer && newDialog.messageID) { + if (oldDialog.peer && + oldDialog.peer == newDialog.peer && + newDialog.messageID) { messageFocusHistory(); } else if (peerID) { @@ -1108,6 +1139,36 @@ angular.module('myApp.controllers', ['myApp.i18n']) } } + function updateStartBot () { + var wasStartBot = $scope.historyState.startBot; + if (!peerID || + peerID < 0 || + !AppUsersManager.isBot(peerID) || + $scope.historyFilter.mediaType || + $scope.curDialog.messageID) { + $scope.historyState.startBot = false; + } + else if ( + $scope.state.empty || ( + peerHistory && + peerHistory.messages.length == 1 && + peerHistory.messages[0].action && + peerHistory.messages[0].action._ == 'messageActionBotIntro' + ) + ) { + $scope.historyState.startBot = 2; + } + else if ($scope.curDialog.startParam) { + $scope.historyState.startBot = 1; + } + else { + $scope.historyState.startBot = false; + } + if (wasStartBot != $scope.historyState.startBot) { + $scope.$broadcast('ui_panel_update'); + } + } + function messageFocusHistory () { var history = historiesQueueFind(peerID); @@ -1310,6 +1371,8 @@ angular.module('myApp.controllers', ['myApp.i18n']) AppMessagesManager.readHistory($scope.curDialog.inputPeer); + updateStartBot(); + }, function () { safeReplaceObject($scope.state, {error: true}); }); @@ -1325,16 +1388,47 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.$broadcast('ui_history_change'); } + function botStart () { + AppMessagesManager.startBot(peerID, 0, $scope.curDialog.startParam); + $scope.curDialog.startParam = false; + } + function toggleMessage (messageID, $event) { - var target = $event.target, - shiftClick = $event.shiftKey; + if ($scope.historyState.startBot) { + return false; + } - if (shiftClick) { - $scope.$broadcast('ui_selection_clear'); + if (!$scope.historyState.selectActions) { + var sel = ( + window.getSelection && window.getSelection() || + document.getSelection && document.getSelection() || + document.selection && document.selection.createRange().text || '' + ).toString().replace(/^\s+|\s+$/g, ''); + if (sel) { + return false; + } + + var target = $event.target; + while (target) { + if (target.className.indexOf('im_message_outer_wrap') != -1) { + break; + } + if (target.tagName == 'A' || + target.onclick || + target.getAttribute('ng-click')) { + return false; + } + var events = $._data(target, 'events'); + if (events && (events.click || events.mousedown)) { + return false; + } + target = target.parentNode; + } } - if (!$scope.historyState.selectActions && !$(target).hasClass('icon-select-tick') && !$(target).hasClass('im_content_message_select_area')) { - return false; + var shiftClick = $event.shiftKey; + if (shiftClick) { + $scope.$broadcast('ui_selection_clear'); } if ($scope.selectedMsgs[messageID]) { @@ -1382,6 +1476,11 @@ angular.module('myApp.controllers', ['myApp.i18n']) } function selectedCancel (noBroadcast) { + if (!noBroadcast && + $scope.curDialog.startParam) { + delete $scope.curDialog.startParam; + return; + } $scope.selectedMsgs = {}; $scope.selectedCount = 0; $scope.historyState.selectActions = false; @@ -1416,7 +1515,6 @@ angular.module('myApp.controllers', ['myApp.i18n']) } } - function selectedForward () { if ($scope.selectedCount > 0) { var selectedMessageIDs = []; @@ -1493,6 +1591,16 @@ angular.module('myApp.controllers', ['myApp.i18n']) loadAfterSync = false; }); + $scope.$on('reply_button_press', function (e, button) { + var replyKeyboard = $scope.historyState.replyKeyboard; + if (!replyKeyboard) { + return; + } + AppMessagesManager.sendText(peerID, button.text, { + replyToMsgID: peerID < 0 && replyKeyboard.id + }); + }); + var typingTimeouts = {}; $scope.$on('history_append', function (e, addedMessage) { @@ -1552,6 +1660,8 @@ angular.module('myApp.controllers', ['myApp.i18n']) AppMessagesManager.readHistory($scope.curDialog.inputPeer); }); } + + updateStartBot(); } }); @@ -1644,6 +1754,8 @@ angular.module('myApp.controllers', ['myApp.i18n']) AppMessagesManager.readHistory($scope.curDialog.inputPeer); }); } + + updateStartBot(); } }); @@ -1673,6 +1785,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.$broadcast('messages_regroup'); if (historyUpdate.peerID == $scope.curDialog.peerID) { $scope.state.empty = !newMessages.length; + updateStartBot(); } }); @@ -1683,6 +1796,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) history.ids = []; if (dialog.peerID == $scope.curDialog.peerID) { $scope.state.empty = true; + updateStartBot(); } } }); @@ -1737,7 +1851,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.$on('user_update', angular.noop); }) - .controller('AppImSendController', function ($scope, $timeout, MtpApiManager, Storage, AppChatsManager, AppUsersManager, AppPeersManager, AppDocsManager, AppMessagesManager, MtpApiFileManager) { + .controller('AppImSendController', function ($scope, $timeout, MtpApiManager, Storage, AppProfileManager, AppChatsManager, AppUsersManager, AppPeersManager, AppDocsManager, AppMessagesManager, MtpApiFileManager, RichTextProcessor) { $scope.$watch('curDialog.peer', resetDraft); $scope.$on('user_update', angular.noop); @@ -1746,11 +1860,28 @@ angular.module('myApp.controllers', ['myApp.i18n']) }); $scope.$on('ui_typing', onTyping); - $scope.draftMessage = {text: '', send: sendMessage, replyClear: replyClear}; + $scope.draftMessage = { + text: '', + send: sendMessage, + replyClear: replyClear + }; $scope.mentions = {}; + $scope.commands = {}; $scope.$watch('draftMessage.text', onMessageChange); $scope.$watch('draftMessage.files', onFilesSelected); $scope.$watch('draftMessage.sticker', onStickerSelected); + $scope.$watch('draftMessage.command', onCommandSelected); + + $scope.$on('history_reply_markup', function (e, peerData) { + if (peerData.peerID == $scope.curDialog.peerID) { + updateReplyKeyboard(); + } + }); + + $scope.replyKeyboardToggle = replyKeyboardToggle; + $scope.toggleSlash = toggleSlash; + + var replyToMarkup = false; function sendMessage (e) { $scope.$broadcast('ui_message_before_send'); @@ -1822,9 +1953,53 @@ angular.module('myApp.controllers', ['myApp.i18n']) }); } + function updateCommands () { + var peerID = $scope.curDialog.peerID; + + AppProfileManager.getPeerBots(peerID).then(function (peerBots) { + if (!peerBots.length) { + safeReplaceObject($scope.commands, {}); + $scope.$broadcast('mentions_update'); + return; + } + + var needMentions = peerBots.length > 1; + var commandsList = []; + var commandsIndex = SearchIndexManager.createIndex(); + + angular.forEach(peerBots, function (peerBot) { + var mention = ''; + if (needMentions) { + var bot = AppUsersManager.getUser(peerBot.id); + if (bot && bot.username) { + mention += '@' + bot.username; + } + } + var botSearchText = AppUsersManager.getUserSearchText(peerBot.id); + angular.forEach(peerBot.commands, function (description, command) { + var value = '/' + command + mention; + commandsList.push({ + botID: peerBot.id, + value: value, + rDescription: RichTextProcessor.wrapRichText(description, {noLinks: true, noLineBreaks: true}) + }); + SearchIndexManager.indexObject(value, botSearchText + ' ' + command + ' ' + description, commandsIndex); + }) + }); + + safeReplaceObject($scope.commands, { + list: commandsList, + index: commandsIndex + }); + $scope.$broadcast('mentions_update'); + }); + } + function resetDraft (newPeer) { updateMentions(); + updateCommands(); replyClear(); + updateReplyKeyboard(); if (newPeer) { Storage.get('draft' + $scope.curDialog.peerID).then(function (draftText) { @@ -1843,13 +2018,67 @@ angular.module('myApp.controllers', ['myApp.i18n']) function replySelect(messageID) { $scope.draftMessage.replyToMessage = AppMessagesManager.wrapForDialog(messageID); $scope.$broadcast('ui_peer_reply'); + replyToMarkup = false; } function replyClear() { + var message = $scope.draftMessage.replyToMessage; + if (message && + $scope.historyState.replyKeyboard && + $scope.historyState.replyKeyboard.id == message.id && + !$scope.historyState.replyKeyboard.pFlags.hidden) { + $scope.historyState.replyKeyboard.pFlags.hidden = true; + $scope.$broadcast('ui_keyboard_update'); + } delete $scope.draftMessage.replyToMessage; $scope.$broadcast('ui_peer_reply'); } + function toggleSlash ($event) { + if ($scope.draftMessage.text && + $scope.draftMessage.text.charAt(0) == '/') { + $scope.draftMessage.text = ''; + } else { + $scope.draftMessage.text = '/'; + } + $scope.$broadcast('ui_peer_draft'); + return cancelEvent($event); + } + + function updateReplyKeyboard () { + var peerID = $scope.curDialog.peerID; + var replyKeyboard = AppMessagesManager.getReplyKeyboard(peerID); + if (replyKeyboard) { + replyKeyboard = AppMessagesManager.wrapReplyMarkup(replyKeyboard); + } + // console.log('update reply markup', peerID, replyKeyboard); + $scope.historyState.replyKeyboard = replyKeyboard; + + var addReplyMessage = + replyKeyboard && + !replyKeyboard.hidden && + (replyKeyboard._ == 'replyKeyboardForceReply' || + (replyKeyboard._ == 'replyKeyboardMarkup' && peerID < 0)); + + if (addReplyMessage) { + replySelect(replyKeyboard.id); + replyToMarkup = true; + } + else if (replyToMarkup) { + replyClear(); + } + $scope.$broadcast('ui_keyboard_update'); + } + + function replyKeyboardToggle ($event) { + var replyKeyboard = $scope.historyState.replyKeyboard; + if (replyKeyboard) { + replyKeyboard.pFlags.hidden = !replyKeyboard.pFlags.hidden; + updateReplyKeyboard(); + } + return cancelEvent($event); + } + function onMessageChange(newVal) { // console.log('ctrl text changed', newVal); // console.trace('ctrl text changed', newVal); @@ -1916,6 +2145,17 @@ angular.module('myApp.controllers', ['myApp.i18n']) } delete $scope.draftMessage.sticker; } + + function onCommandSelected (command) { + if (!command) { + return; + } + AppMessagesManager.sendText($scope.curDialog.peerID, command); + delete $scope.draftMessage.sticker; + delete $scope.draftMessage.text; + $scope.$broadcast('ui_message_send'); + $scope.$broadcast('ui_peer_draft'); + } }) .controller('AppLangSelectController', function ($scope, _, Storage, ErrorService, AppRuntimeManager) { @@ -2156,8 +2396,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.nav = {}; $scope.canForward = true; - var inputUser = AppUsersManager.getUserInput($scope.userID), - list = [$scope.photoID], + var list = [$scope.photoID], maxID = $scope.photoID, preloaded = {}, myID = 0, @@ -2165,7 +2404,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) updatePrevNext(); - AppPhotosManager.getUserPhotos(inputUser, 0, 1000).then(function (userpicCachedResult) { + AppPhotosManager.getUserPhotos($scope.userID, 0, 1000).then(function (userpicCachedResult) { if (userpicCachedResult.photos.indexOf($scope.photoID) >= 0) { list = userpicCachedResult.photos; maxID = list[list.length - 1]; @@ -2234,7 +2473,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) function loadMore () { if (loadingPromise) return loadingPromise; - return loadingPromise = AppPhotosManager.getUserPhotos(inputUser, maxID).then(function (userpicResult) { + return loadingPromise = AppPhotosManager.getUserPhotos($scope.userID, maxID).then(function (userpicResult) { if (userpicResult.photos.length) { maxID = userpicResult.photos[userpicResult.photos.length - 1]; list = list.concat(userpicResult.photos); @@ -2503,7 +2742,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) - .controller('UserModalController', function ($scope, $location, $rootScope, $modal, AppUsersManager, MtpApiManager, NotificationsManager, AppPhotosManager, AppMessagesManager, AppPeersManager, PeersSelectService, ErrorService) { + .controller('UserModalController', function ($scope, $location, $rootScope, AppProfileManager, $modal, AppUsersManager, MtpApiManager, NotificationsManager, AppPhotosManager, AppMessagesManager, AppPeersManager, PeersSelectService, ErrorService) { var peerString = AppUsersManager.getUserString($scope.userID); @@ -2513,23 +2752,10 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.settings = {notifications: true}; - MtpApiManager.invokeApi('users.getFullUser', { - id: AppUsersManager.getUserInput($scope.userID) - }).then(function (userFullResult) { - if ($scope.override && $scope.override.phone_number) { - userFullResult.user.phone = $scope.override.phone_number; - if ($scope.override.first_name || $scope.override.last_name) { - userFullResult.user.first_name = $scope.override.first_name; - userFullResult.user.last_name = $scope.override.last_name; - } - AppUsersManager.saveApiUser(userFullResult.user); - } else { - AppUsersManager.saveApiUser(userFullResult.user, true); - } - AppPhotosManager.savePhoto(userFullResult.profile_photo); - $scope.blocked = userFullResult.blocked; + AppProfileManager.getProfile($scope.userID, $scope.override).then(function (userFull) { + $scope.blocked = userFull.blocked; + $scope.bot_info = userFull.bot_info; - NotificationsManager.savePeerSettings($scope.userID, userFullResult.notify_settings); NotificationsManager.getPeerMuted($scope.userID).then(function (muted) { $scope.settings.notifications = !muted; @@ -2538,11 +2764,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) return false; } NotificationsManager.getPeerSettings($scope.userID).then(function (settings) { - if (newValue) { - settings.mute_until = 0; - } else { - settings.mute_until = 2000000000; - } + settings.mute_until = newValue ? 0 : 2000000000; NotificationsManager.updatePeerSettings($scope.userID, settings); }); }); @@ -2588,6 +2810,26 @@ angular.module('myApp.controllers', ['myApp.i18n']) }); }; + $scope.inviteToGroup = function () { + PeersSelectService.selectPeer({ + confirm_type: 'INVITE_TO_GROUP', + noUsers: true + }).then(function (peerString) { + var peerID = AppPeersManager.getPeerID(peerString); + var chatID = peerID < 0 ? -peerID : 0; + AppMessagesManager.startBot($scope.user.id, chatID).then(function () { + $rootScope.$broadcast('history_focus', {peerString: peerString}); + }); + }); + }; + + $scope.sendCommand = function (command) { + AppMessagesManager.sendText($scope.userID, '/' + command); + $rootScope.$broadcast('history_focus', { + peerString: peerString + }); + }; + $scope.toggleBlock = function (block) { MtpApiManager.invokeApi(block ? 'contacts.block' : 'contacts.unblock', { id: AppUsersManager.getUserInput($scope.userID) @@ -2690,11 +2932,9 @@ angular.module('myApp.controllers', ['myApp.i18n']) }; $scope.kickFromGroup = function (userID) { - var user = AppUsersManager.getUser(userID); - MtpApiManager.invokeApi('messages.deleteChatUser', { chat_id: $scope.chatID, - user_id: {_: 'inputUserForeign', user_id: userID, access_hash: user.access_hash || '0'} + user_id: AppUsersManager.getUserInput(userID) }).then(onChatUpdated); }; @@ -2783,7 +3023,9 @@ angular.module('myApp.controllers', ['myApp.i18n']) id: {_: 'inputUserSelf'} }).then(function (userFullResult) { AppUsersManager.saveApiUser(userFullResult.user); - AppPhotosManager.savePhoto(userFullResult.profile_photo); + AppPhotosManager.savePhoto(userFullResult.profile_photo, { + user_id: userFullResult.user.id + }); }); $scope.notify = {volume: 0.5}; @@ -2854,8 +3096,10 @@ angular.module('myApp.controllers', ['myApp.i18n']) crop: {_: 'inputPhotoCropAuto'} }).then(function (updateResult) { AppUsersManager.saveApiUsers(updateResult.users); - AppPhotosManager.savePhoto(updateResult.photo); MtpApiManager.getUserID().then(function (id) { + AppPhotosManager.savePhoto(updateResult.photo, { + user_id: id + }); ApiUpdatesManager.processUpdateMessage({ _: 'updateShort', update: { diff --git a/app/js/directives.js b/app/js/directives.js index 4314a4bf..b6dabd93 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -339,6 +339,16 @@ angular.module('myApp.directives', ['myApp.filters']) }; function link ($scope, element, attrs) { + if (attrs.watch) { + $scope.$watch('replyMessage', function () { + checkMessage($scope, element); + }); + } else { + checkMessage($scope, element); + } + } + + function checkMessage ($scope, element) { var message = $scope.replyMessage; if (!message.loading) { updateMessage($scope, element); @@ -395,7 +405,7 @@ angular.module('myApp.directives', ['myApp.filters']) var peerID = AppMessagesManager.getMessagePeer(message); var peerString = AppPeersManager.getPeerString(peerID); - $rootScope.$broadcast('history_focus', {peerString: peerString, messageID: message.id}); + $rootScope.$broadcast('history_focus', {peerString: peerString, messageID: message.id}); }) } @@ -403,6 +413,41 @@ angular.module('myApp.directives', ['myApp.filters']) }) + .directive('myReplyMarkup', function() { + + return { + templateUrl: templateUrl('reply_markup'), + scope: { + 'replyMarkup': '=myReplyMarkup' + }, + link: link + }; + + function link ($scope, element, attrs) { + var scrollable = $('.reply_markup', element); + var scroller = new Scroller(scrollable, { + classPrefix: 'reply_markup', + maxHeight: 170 + }); + $scope.buttonSend = function (button) { + $scope.$emit('reply_button_press', button); + } + + $scope.$on('ui_keyboard_update', function () { + onContentLoaded(function () { + scroller.updateHeight(); + scroller.scrollTo(0); + $scope.$emit('ui_panel_update'); + }) + }); + onContentLoaded(function () { + scroller.updateHeight(); + $scope.$emit('ui_panel_update'); + }); + } + + }) + .directive('myMessagePhoto', function(AppPhotosManager) { return { scope: { @@ -563,7 +608,7 @@ angular.module('myApp.directives', ['myApp.filters']) onContentLoaded(function () { var selectedDialog = $(scrollableWrap).find('.active a.im_dialog')[0]; if (selectedDialog) { - scrollToDialog(selectedDialog.parentNode); + scrollToNode(scrollableWrap, selectedDialog.parentNode, dialogsWrap); } }); }); @@ -621,7 +666,7 @@ angular.module('myApp.directives', ['myApp.filters']) if (nextDialogWrap) { $(nextDialogWrap).find('a').trigger('mousedown'); - scrollToDialog(nextDialogWrap); + scrollToNode(scrollableWrap, nextDialogWrap, dialogsWrap); } return cancelEvent(e); @@ -681,29 +726,13 @@ angular.module('myApp.directives', ['myApp.filters']) } if (nextDialogWrap) { - scrollToDialog(nextDialogWrap); + scrollToNode(scrollableWrap, nextDialogWrap, dialogsWrap); } return cancelEvent(e); } } - function scrollToDialog(dialogWrap) { - var elTop = dialogWrap.offsetTop - 15, - elHeight = dialogWrap.offsetHeight + 30, - scrollTop = scrollableWrap.scrollTop, - viewportHeight = scrollableWrap.clientHeight; - - if (scrollTop > elTop) { // we are below the dialog to scroll - scrollableWrap.scrollTop = elTop; - $(dialogsWrap).nanoScroller({flash: true}); - } - else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the dialog to scroll - scrollableWrap.scrollTop = elTop + elHeight - viewportHeight; - $(dialogsWrap).nanoScroller({flash: true}); - } - } - } @@ -1295,7 +1324,8 @@ angular.module('myApp.directives', ['myApp.filters']) link: link, scope: { draftMessage: '=', - mentions: '=' + mentions: '=', + commands: '=' } }; @@ -1363,8 +1393,8 @@ angular.module('myApp.directives', ['myApp.filters']) getSendOnEnter: function () { return sendOnEnter; }, - getPeerImage: function (element, peerID) { - if (cachedPeerPhotos[peerID]) { + getPeerImage: function (element, peerID, noReplace) { + if (cachedPeerPhotos[peerID] && !noReplace) { element.replaceWith(cachedPeerPhotos[peerID]); return; } @@ -1376,8 +1406,14 @@ angular.module('myApp.directives', ['myApp.filters']) }); }, mentions: $scope.mentions, + commands: $scope.commands, onMessageSubmit: onMessageSubmit, - onFilePaste: onFilePaste + onFilePaste: onFilePaste, + onCommandSend: function (command) { + $scope.$apply(function () { + $scope.draftMessage.command = command; + }); + } }); var richTextarea = composer.richTextareaEl[0]; @@ -1465,6 +1501,9 @@ angular.module('myApp.directives', ['myApp.filters']) if (!Config.Navigator.touch) { composer.focus(); } + onContentLoaded(function () { + composer.checkAutocomplete(true); + }); if (emojiTooltip) { emojiTooltip.hide(); } @@ -1838,8 +1877,10 @@ angular.module('myApp.directives', ['myApp.filters']) } if ($scope.document.url) { - $scope.isActive = !$scope.isActive; - $scope.$emit('ui_height'); + onContentLoaded(function () { + $scope.isActive = !$scope.isActive; + $scope.$emit('ui_height'); + }) return; } @@ -1859,7 +1900,7 @@ angular.module('myApp.directives', ['myApp.filters']) } }) - .directive('myLoadSticker', function(MtpApiFileManager, FileManager) { + .directive('myLoadSticker', function(MtpApiFileManager, FileManager, AppStickersManager) { var emptySrc = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; @@ -1876,13 +1917,7 @@ angular.module('myApp.directives', ['myApp.filters']) .addClass(attrs.imgClass); var setSrc = function (blob) { - if (WebpManager.isWebpSupported()) { - imgElement.attr('src', FileManager.getUrl(blob, 'image/webp')); - return; - } - FileManager.getByteArray(blob).then(function (bytes) { - imgElement.attr('src', WebpManager.getPngUrlFromData(bytes)); - }); + imgElement.attr('src', FileManager.getUrl(blob)); }; imgElement.css({ @@ -1894,12 +1929,16 @@ angular.module('myApp.directives', ['myApp.filters']) height: $scope.document.thumb.height }); - var smallLocation = $scope.document.thumb.location; + var smallLocation = angular.copy($scope.document.thumb.location); + smallLocation.sticker = true; + var fullLocation = { _: 'inputDocumentFileLocation', id: $scope.document.id, access_hash: $scope.document.access_hash, - dc_id: $scope.document.dc_id + dc_id: $scope.document.dc_id, + file_name: $scope.document.file_name, + sticker: true }; @@ -1932,6 +1971,14 @@ angular.module('myApp.directives', ['myApp.filters']) console.log('Download sticker failed', e, fullLocation); }); } + + if (attrs.open && $scope.document.stickerSetInput) { + element + .addClass('clickable') + .on('click', function () { + AppStickersManager.openStickerset($scope.document.stickerSetInput); + }); + } } }) @@ -2415,8 +2462,8 @@ angular.module('myApp.directives', ['myApp.filters']) update = function () { var user = AppUsersManager.getUser(userID); element - .html(statusFilter(user)) - .toggleClass('status_online', user.status && user.status._ == 'userStatusOnline'); + .html(statusFilter(user, attrs.botChatPrivacy)) + .toggleClass('status_online', user.status && user.status._ == 'userStatusOnline' || false); }; $scope.$watch(attrs.myUserStatus, function (newUserID) { @@ -2606,7 +2653,6 @@ angular.module('myApp.directives', ['myApp.filters']) }; function link($scope, element, attrs) { - element.addClass('peer_photo_init'); var peerID, peer, peerPhoto; @@ -2682,6 +2728,7 @@ angular.module('myApp.directives', ['myApp.filters']) } $scope.$watch(attrs.myPeerPhotolink, setPeerID); + setPeerID($scope.$eval(attrs.myPeerPhotolink)); if (attrs.watch) { $scope.$on('user_update', function (e, updUserID) { diff --git a/app/js/filters.js b/app/js/filters.js index a17757bc..a76121a7 100644 --- a/app/js/filters.js +++ b/app/js/filters.js @@ -31,8 +31,11 @@ angular.module('myApp.filters', ['myApp.i18n']) .filter('userStatus', function($filter, _) { var relativeTimeFilter = $filter('relativeTime'); - return function (user) { - var statusType = user && user.status && user.status._ || 'userStatusEmpty'; + return function (user, botChatPrivacy) { + var statusType = user && user.status && user.status._; + if (!statusType) { + statusType = user.pFlags.bot ? 'userStatusBot' : 'userStatusEmpty'; + } switch (statusType) { case 'userStatusOnline': return _('user_status_online'); @@ -49,6 +52,16 @@ angular.module('myApp.filters', ['myApp.i18n']) case 'userStatusLastMonth': return _('user_status_last_month'); + case 'userStatusBot': + if (botChatPrivacy) { + if (user.pFlags.botNoPrivacy) { + return _('user_status_bot_noprivacy'); + } else { + return _('user_status_bot_privacy'); + } + } + return _('user_status_bot'); + case 'userStatusEmpty': default: return _('user_status_long_ago'); @@ -69,7 +82,9 @@ angular.module('myApp.filters', ['myApp.i18n']) var dateFilter = $filter('date'); return function (timestamp, extended) { - + if (!timestamp) { + return ''; + } var ticks = timestamp * 1000, diff = Math.abs(tsNow() - ticks), format = 'shortTime'; @@ -157,7 +172,7 @@ angular.module('myApp.filters', ['myApp.i18n']) return size + ' b'; } else if (size < 1048576) { - return Math.round(size / 1024) + ' Kb'; + return Math.round(size / 1024) + ' KB'; } var mbs = size / 1048576; if (progressing) { diff --git a/app/js/lib/config.js b/app/js/lib/config.js index 36f6d6ab..904e844d 100644 --- a/app/js/lib/config.js +++ b/app/js/lib/config.js @@ -42,10 +42,12 @@ Config.Navigator = { (navigator.userAgent || '').toLowerCase().indexOf('mac') != -1, retina: window.devicePixelRatio > 1, ffos: navigator.userAgent.search(/mobi.+Gecko/i) != -1, - touch: screen.width <= 768, + touch: screen.width <= 768 || ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch, mobile: screen.width && screen.width < 480 || navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1 }; +// Touch detect: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js + Config.I18n = { locale: 'en-us', supported: [ @@ -91,9 +93,9 @@ Config.Schema.MTProto = {"constructors":[{"id":"481674261","predicate":"vector", // From https://github.com/stephenmathieson/node-tlds/blob/master/index.js Config.TLD = ["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"]; -Config.Schema.API = {"constructors":[{"id":"-1132882121","predicate":"boolFalse","params":[],"type":"Bool"},{"id":"-1720552011","predicate":"boolTrue","params":[],"type":"Bool"},{"id":"481674261","predicate":"vector","params":[],"type":"Vector t"},{"id":"-994444869","predicate":"error","params":[{"name":"code","type":"int"},{"name":"text","type":"string"}],"type":"Error"},{"id":"1450380236","predicate":"null","params":[],"type":"Null"},{"id":"2134579434","predicate":"inputPeerEmpty","params":[],"type":"InputPeer"},{"id":"2107670217","predicate":"inputPeerSelf","params":[],"type":"InputPeer"},{"id":"270785512","predicate":"inputPeerContact","params":[{"name":"user_id","type":"int"}],"type":"InputPeer"},{"id":"-1690012891","predicate":"inputPeerForeign","params":[{"name":"user_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputPeer"},{"id":"396093539","predicate":"inputPeerChat","params":[{"name":"chat_id","type":"int"}],"type":"InputPeer"},{"id":"-1182234929","predicate":"inputUserEmpty","params":[],"type":"InputUser"},{"id":"-138301121","predicate":"inputUserSelf","params":[],"type":"InputUser"},{"id":"-2031530139","predicate":"inputUserContact","params":[{"name":"user_id","type":"int"}],"type":"InputUser"},{"id":"1700689151","predicate":"inputUserForeign","params":[{"name":"user_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputUser"},{"id":"-208488460","predicate":"inputPhoneContact","params":[{"name":"client_id","type":"long"},{"name":"phone","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"InputContact"},{"id":"-181407105","predicate":"inputFile","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"name","type":"string"},{"name":"md5_checksum","type":"string"}],"type":"InputFile"},{"id":"-1771768449","predicate":"inputMediaEmpty","params":[],"type":"InputMedia"},{"id":"-139464256","predicate":"inputMediaUploadedPhoto","params":[{"name":"file","type":"InputFile"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-373312269","predicate":"inputMediaPhoto","params":[{"name":"id","type":"InputPhoto"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-104578748","predicate":"inputMediaGeoPoint","params":[{"name":"geo_point","type":"InputGeoPoint"}],"type":"InputMedia"},{"id":"-1494984313","predicate":"inputMediaContact","params":[{"name":"phone_number","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"InputMedia"},{"id":"-515910468","predicate":"inputMediaUploadedVideo","params":[{"name":"file","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-1761896484","predicate":"inputMediaUploadedThumbVideo","params":[{"name":"file","type":"InputFile"},{"name":"thumb","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-1821749571","predicate":"inputMediaVideo","params":[{"name":"id","type":"InputVideo"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"480546647","predicate":"inputChatPhotoEmpty","params":[],"type":"InputChatPhoto"},{"id":"-1809496270","predicate":"inputChatUploadedPhoto","params":[{"name":"file","type":"InputFile"},{"name":"crop","type":"InputPhotoCrop"}],"type":"InputChatPhoto"},{"id":"-1293828344","predicate":"inputChatPhoto","params":[{"name":"id","type":"InputPhoto"},{"name":"crop","type":"InputPhotoCrop"}],"type":"InputChatPhoto"},{"id":"-457104426","predicate":"inputGeoPointEmpty","params":[],"type":"InputGeoPoint"},{"id":"-206066487","predicate":"inputGeoPoint","params":[{"name":"lat","type":"double"},{"name":"long","type":"double"}],"type":"InputGeoPoint"},{"id":"483901197","predicate":"inputPhotoEmpty","params":[],"type":"InputPhoto"},{"id":"-74070332","predicate":"inputPhoto","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputPhoto"},{"id":"1426648181","predicate":"inputVideoEmpty","params":[],"type":"InputVideo"},{"id":"-296249774","predicate":"inputVideo","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputVideo"},{"id":"342061462","predicate":"inputFileLocation","params":[{"name":"volume_id","type":"long"},{"name":"local_id","type":"int"},{"name":"secret","type":"long"}],"type":"InputFileLocation"},{"id":"1023632620","predicate":"inputVideoFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"-1377390588","predicate":"inputPhotoCropAuto","params":[],"type":"InputPhotoCrop"},{"id":"-644787419","predicate":"inputPhotoCrop","params":[{"name":"crop_left","type":"double"},{"name":"crop_top","type":"double"},{"name":"crop_width","type":"double"}],"type":"InputPhotoCrop"},{"id":"1996904104","predicate":"inputAppEvent","params":[{"name":"time","type":"double"},{"name":"type","type":"string"},{"name":"peer","type":"long"},{"name":"data","type":"string"}],"type":"InputAppEvent"},{"id":"-1649296275","predicate":"peerUser","params":[{"name":"user_id","type":"int"}],"type":"Peer"},{"id":"-1160714821","predicate":"peerChat","params":[{"name":"chat_id","type":"int"}],"type":"Peer"},{"id":"-1432995067","predicate":"storage.fileUnknown","params":[],"type":"storage.FileType"},{"id":"8322574","predicate":"storage.fileJpeg","params":[],"type":"storage.FileType"},{"id":"-891180321","predicate":"storage.fileGif","params":[],"type":"storage.FileType"},{"id":"172975040","predicate":"storage.filePng","params":[],"type":"storage.FileType"},{"id":"-1373745011","predicate":"storage.filePdf","params":[],"type":"storage.FileType"},{"id":"1384777335","predicate":"storage.fileMp3","params":[],"type":"storage.FileType"},{"id":"1258941372","predicate":"storage.fileMov","params":[],"type":"storage.FileType"},{"id":"1086091090","predicate":"storage.filePartial","params":[],"type":"storage.FileType"},{"id":"-1278304028","predicate":"storage.fileMp4","params":[],"type":"storage.FileType"},{"id":"276907596","predicate":"storage.fileWebp","params":[],"type":"storage.FileType"},{"id":"2086234950","predicate":"fileLocationUnavailable","params":[{"name":"volume_id","type":"long"},{"name":"local_id","type":"int"},{"name":"secret","type":"long"}],"type":"FileLocation"},{"id":"1406570614","predicate":"fileLocation","params":[{"name":"dc_id","type":"int"},{"name":"volume_id","type":"long"},{"name":"local_id","type":"int"},{"name":"secret","type":"long"}],"type":"FileLocation"},{"id":"537022650","predicate":"userEmpty","params":[{"name":"id","type":"int"}],"type":"User"},{"id":"476112392","predicate":"userSelf","params":[{"name":"id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"},{"name":"phone","type":"string"},{"name":"photo","type":"UserProfilePhoto"},{"name":"status","type":"UserStatus"}],"type":"User"},{"id":"-894214632","predicate":"userContact","params":[{"name":"id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"},{"name":"access_hash","type":"long"},{"name":"phone","type":"string"},{"name":"photo","type":"UserProfilePhoto"},{"name":"status","type":"UserStatus"}],"type":"User"},{"id":"-640891665","predicate":"userRequest","params":[{"name":"id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"},{"name":"access_hash","type":"long"},{"name":"phone","type":"string"},{"name":"photo","type":"UserProfilePhoto"},{"name":"status","type":"UserStatus"}],"type":"User"},{"id":"123533224","predicate":"userForeign","params":[{"name":"id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"},{"name":"access_hash","type":"long"},{"name":"photo","type":"UserProfilePhoto"},{"name":"status","type":"UserStatus"}],"type":"User"},{"id":"-704549510","predicate":"userDeleted","params":[{"name":"id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"}],"type":"User"},{"id":"1326562017","predicate":"userProfilePhotoEmpty","params":[],"type":"UserProfilePhoto"},{"id":"-715532088","predicate":"userProfilePhoto","params":[{"name":"photo_id","type":"long"},{"name":"photo_small","type":"FileLocation"},{"name":"photo_big","type":"FileLocation"}],"type":"UserProfilePhoto"},{"id":"164646985","predicate":"userStatusEmpty","params":[],"type":"UserStatus"},{"id":"-306628279","predicate":"userStatusOnline","params":[{"name":"expires","type":"int"}],"type":"UserStatus"},{"id":"9203775","predicate":"userStatusOffline","params":[{"name":"was_online","type":"int"}],"type":"UserStatus"},{"id":"-1683826688","predicate":"chatEmpty","params":[{"name":"id","type":"int"}],"type":"Chat"},{"id":"1855757255","predicate":"chat","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"photo","type":"ChatPhoto"},{"name":"participants_count","type":"int"},{"name":"date","type":"int"},{"name":"left","type":"Bool"},{"name":"version","type":"int"}],"type":"Chat"},{"id":"-83047359","predicate":"chatForbidden","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"date","type":"int"}],"type":"Chat"},{"id":"-891418735","predicate":"chatFull","params":[{"name":"id","type":"int"},{"name":"participants","type":"ChatParticipants"},{"name":"chat_photo","type":"Photo"},{"name":"notify_settings","type":"PeerNotifySettings"},{"name":"exported_invite","type":"ExportedChatInvite"}],"type":"ChatFull"},{"id":"-925415106","predicate":"chatParticipant","params":[{"name":"user_id","type":"int"},{"name":"inviter_id","type":"int"},{"name":"date","type":"int"}],"type":"ChatParticipant"},{"id":"265468810","predicate":"chatParticipantsForbidden","params":[{"name":"chat_id","type":"int"}],"type":"ChatParticipants"},{"id":"2017571861","predicate":"chatParticipants","params":[{"name":"chat_id","type":"int"},{"name":"admin_id","type":"int"},{"name":"participants","type":"Vector"},{"name":"version","type":"int"}],"type":"ChatParticipants"},{"id":"935395612","predicate":"chatPhotoEmpty","params":[],"type":"ChatPhoto"},{"id":"1632839530","predicate":"chatPhoto","params":[{"name":"photo_small","type":"FileLocation"},{"name":"photo_big","type":"FileLocation"}],"type":"ChatPhoto"},{"id":"-2082087340","predicate":"messageEmpty","params":[{"name":"id","type":"int"}],"type":"Message"},{"id":"-1481959023","predicate":"message","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"name":"fwd_from_id","type":"flags.2?int"},{"name":"fwd_date","type":"flags.2?int"},{"name":"reply_to_msg_id","type":"flags.3?int"},{"name":"date","type":"int"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"}],"type":"Message"},{"id":"495384334","predicate":"messageService","params":[{"name":"flags","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"name":"date","type":"int"},{"name":"action","type":"MessageAction"}],"type":"Message"},{"id":"1038967584","predicate":"messageMediaEmpty","params":[],"type":"MessageMedia"},{"id":"1032643901","predicate":"messageMediaPhoto","params":[{"name":"photo","type":"Photo"},{"name":"caption","type":"string"}],"type":"MessageMedia"},{"id":"1540298357","predicate":"messageMediaVideo","params":[{"name":"video","type":"Video"},{"name":"caption","type":"string"}],"type":"MessageMedia"},{"id":"1457575028","predicate":"messageMediaGeo","params":[{"name":"geo","type":"GeoPoint"}],"type":"MessageMedia"},{"id":"1585262393","predicate":"messageMediaContact","params":[{"name":"phone_number","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"user_id","type":"int"}],"type":"MessageMedia"},{"id":"-1618676578","predicate":"messageMediaUnsupported","params":[],"type":"MessageMedia"},{"id":"-1230047312","predicate":"messageActionEmpty","params":[],"type":"MessageAction"},{"id":"-1503425638","predicate":"messageActionChatCreate","params":[{"name":"title","type":"string"},{"name":"users","type":"Vector"}],"type":"MessageAction"},{"id":"-1247687078","predicate":"messageActionChatEditTitle","params":[{"name":"title","type":"string"}],"type":"MessageAction"},{"id":"2144015272","predicate":"messageActionChatEditPhoto","params":[{"name":"photo","type":"Photo"}],"type":"MessageAction"},{"id":"-1780220945","predicate":"messageActionChatDeletePhoto","params":[],"type":"MessageAction"},{"id":"1581055051","predicate":"messageActionChatAddUser","params":[{"name":"user_id","type":"int"}],"type":"MessageAction"},{"id":"-1297179892","predicate":"messageActionChatDeleteUser","params":[{"name":"user_id","type":"int"}],"type":"MessageAction"},{"id":"-1042448310","predicate":"dialog","params":[{"name":"peer","type":"Peer"},{"name":"top_message","type":"int"},{"name":"read_inbox_max_id","type":"int"},{"name":"unread_count","type":"int"},{"name":"notify_settings","type":"PeerNotifySettings"}],"type":"Dialog"},{"id":"590459437","predicate":"photoEmpty","params":[{"name":"id","type":"long"}],"type":"Photo"},{"id":"-1014792074","predicate":"photo","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"geo","type":"GeoPoint"},{"name":"sizes","type":"Vector"}],"type":"Photo"},{"id":"236446268","predicate":"photoSizeEmpty","params":[{"name":"type","type":"string"}],"type":"PhotoSize"},{"id":"2009052699","predicate":"photoSize","params":[{"name":"type","type":"string"},{"name":"location","type":"FileLocation"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"size","type":"int"}],"type":"PhotoSize"},{"id":"-374917894","predicate":"photoCachedSize","params":[{"name":"type","type":"string"},{"name":"location","type":"FileLocation"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"bytes","type":"bytes"}],"type":"PhotoSize"},{"id":"-1056548696","predicate":"videoEmpty","params":[{"name":"id","type":"long"}],"type":"Video"},{"id":"-291550643","predicate":"video","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"duration","type":"int"},{"name":"size","type":"int"},{"name":"thumb","type":"PhotoSize"},{"name":"dc_id","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"Video"},{"id":"286776671","predicate":"geoPointEmpty","params":[],"type":"GeoPoint"},{"id":"541710092","predicate":"geoPoint","params":[{"name":"long","type":"double"},{"name":"lat","type":"double"}],"type":"GeoPoint"},{"id":"-2128698738","predicate":"auth.checkedPhone","params":[{"name":"phone_registered","type":"Bool"}],"type":"auth.CheckedPhone"},{"id":"-269659687","predicate":"auth.sentCode","params":[{"name":"phone_registered","type":"Bool"},{"name":"phone_code_hash","type":"string"},{"name":"send_call_timeout","type":"int"},{"name":"is_password","type":"Bool"}],"type":"auth.SentCode"},{"id":"-155815004","predicate":"auth.authorization","params":[{"name":"expires","type":"int"},{"name":"user","type":"User"}],"type":"auth.Authorization"},{"id":"-543777747","predicate":"auth.exportedAuthorization","params":[{"name":"id","type":"int"},{"name":"bytes","type":"bytes"}],"type":"auth.ExportedAuthorization"},{"id":"-1195615476","predicate":"inputNotifyPeer","params":[{"name":"peer","type":"InputPeer"}],"type":"InputNotifyPeer"},{"id":"423314455","predicate":"inputNotifyUsers","params":[],"type":"InputNotifyPeer"},{"id":"1251338318","predicate":"inputNotifyChats","params":[],"type":"InputNotifyPeer"},{"id":"-1540769658","predicate":"inputNotifyAll","params":[],"type":"InputNotifyPeer"},{"id":"-265263912","predicate":"inputPeerNotifyEventsEmpty","params":[],"type":"InputPeerNotifyEvents"},{"id":"-395694988","predicate":"inputPeerNotifyEventsAll","params":[],"type":"InputPeerNotifyEvents"},{"id":"1185074840","predicate":"inputPeerNotifySettings","params":[{"name":"mute_until","type":"int"},{"name":"sound","type":"string"},{"name":"show_previews","type":"Bool"},{"name":"events_mask","type":"int"}],"type":"InputPeerNotifySettings"},{"id":"-1378534221","predicate":"peerNotifyEventsEmpty","params":[],"type":"PeerNotifyEvents"},{"id":"1830677896","predicate":"peerNotifyEventsAll","params":[],"type":"PeerNotifyEvents"},{"id":"1889961234","predicate":"peerNotifySettingsEmpty","params":[],"type":"PeerNotifySettings"},{"id":"-1923214866","predicate":"peerNotifySettings","params":[{"name":"mute_until","type":"int"},{"name":"sound","type":"string"},{"name":"show_previews","type":"Bool"},{"name":"events_mask","type":"int"}],"type":"PeerNotifySettings"},{"id":"-860866985","predicate":"wallPaper","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"sizes","type":"Vector"},{"name":"color","type":"int"}],"type":"WallPaper"},{"id":"1997575642","predicate":"userFull","params":[{"name":"user","type":"User"},{"name":"link","type":"contacts.Link"},{"name":"profile_photo","type":"Photo"},{"name":"notify_settings","type":"PeerNotifySettings"},{"name":"blocked","type":"Bool"},{"name":"real_first_name","type":"string"},{"name":"real_last_name","type":"string"}],"type":"UserFull"},{"id":"-116274796","predicate":"contact","params":[{"name":"user_id","type":"int"},{"name":"mutual","type":"Bool"}],"type":"Contact"},{"id":"-805141448","predicate":"importedContact","params":[{"name":"user_id","type":"int"},{"name":"client_id","type":"long"}],"type":"ImportedContact"},{"id":"1444661369","predicate":"contactBlocked","params":[{"name":"user_id","type":"int"},{"name":"date","type":"int"}],"type":"ContactBlocked"},{"id":"1038193057","predicate":"contactSuggested","params":[{"name":"user_id","type":"int"},{"name":"mutual_contacts","type":"int"}],"type":"ContactSuggested"},{"id":"-748155807","predicate":"contactStatus","params":[{"name":"user_id","type":"int"},{"name":"status","type":"UserStatus"}],"type":"ContactStatus"},{"id":"909233996","predicate":"chatLocated","params":[{"name":"chat_id","type":"int"},{"name":"distance","type":"int"}],"type":"ChatLocated"},{"id":"986597452","predicate":"contacts.link","params":[{"name":"my_link","type":"ContactLink"},{"name":"foreign_link","type":"ContactLink"},{"name":"user","type":"User"}],"type":"contacts.Link"},{"id":"-1219778094","predicate":"contacts.contactsNotModified","params":[],"type":"contacts.Contacts"},{"id":"1871416498","predicate":"contacts.contacts","params":[{"name":"contacts","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Contacts"},{"id":"-1387117803","predicate":"contacts.importedContacts","params":[{"name":"imported","type":"Vector"},{"name":"retry_contacts","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.ImportedContacts"},{"id":"471043349","predicate":"contacts.blocked","params":[{"name":"blocked","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Blocked"},{"id":"-1878523231","predicate":"contacts.blockedSlice","params":[{"name":"count","type":"int"},{"name":"blocked","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Blocked"},{"id":"1447681221","predicate":"contacts.suggested","params":[{"name":"results","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Suggested"},{"id":"364538944","predicate":"messages.dialogs","params":[{"name":"dialogs","type":"Vector"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Dialogs"},{"id":"1910543603","predicate":"messages.dialogsSlice","params":[{"name":"count","type":"int"},{"name":"dialogs","type":"Vector"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Dialogs"},{"id":"-1938715001","predicate":"messages.messages","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Messages"},{"id":"189033187","predicate":"messages.messagesSlice","params":[{"name":"count","type":"int"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Messages"},{"id":"1062078024","predicate":"messages.messageEmpty","params":[],"type":"messages.Message"},{"id":"1279084531","predicate":"messages.sentMessage","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"media","type":"MessageMedia"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"messages.SentMessage"},{"id":"1694474197","predicate":"messages.chats","params":[{"name":"chats","type":"Vector"}],"type":"messages.Chats"},{"id":"-438840932","predicate":"messages.chatFull","params":[{"name":"full_chat","type":"ChatFull"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.ChatFull"},{"id":"-1269012015","predicate":"messages.affectedHistory","params":[{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"1474492012","predicate":"inputMessagesFilterEmpty","params":[],"type":"MessagesFilter"},{"id":"-1777752804","predicate":"inputMessagesFilterPhotos","params":[],"type":"MessagesFilter"},{"id":"-1614803355","predicate":"inputMessagesFilterVideo","params":[],"type":"MessagesFilter"},{"id":"1458172132","predicate":"inputMessagesFilterPhotoVideo","params":[],"type":"MessagesFilter"},{"id":"-648121413","predicate":"inputMessagesFilterPhotoVideoDocuments","params":[],"type":"MessagesFilter"},{"id":"-1629621880","predicate":"inputMessagesFilterDocument","params":[],"type":"MessagesFilter"},{"id":"-808946398","predicate":"inputMessagesFilterAudio","params":[],"type":"MessagesFilter"},{"id":"522914557","predicate":"updateNewMessage","params":[{"name":"message","type":"Message"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"1318109142","predicate":"updateMessageID","params":[{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"Update"},{"id":"-1576161051","predicate":"updateDeleteMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"1548249383","predicate":"updateUserTyping","params":[{"name":"user_id","type":"int"},{"name":"action","type":"SendMessageAction"}],"type":"Update"},{"id":"-1704596961","predicate":"updateChatUserTyping","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"int"},{"name":"action","type":"SendMessageAction"}],"type":"Update"},{"id":"125178264","predicate":"updateChatParticipants","params":[{"name":"participants","type":"ChatParticipants"}],"type":"Update"},{"id":"469489699","predicate":"updateUserStatus","params":[{"name":"user_id","type":"int"},{"name":"status","type":"UserStatus"}],"type":"Update"},{"id":"-1489818765","predicate":"updateUserName","params":[{"name":"user_id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"}],"type":"Update"},{"id":"-1791935732","predicate":"updateUserPhoto","params":[{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"photo","type":"UserProfilePhoto"},{"name":"previous","type":"Bool"}],"type":"Update"},{"id":"628472761","predicate":"updateContactRegistered","params":[{"name":"user_id","type":"int"},{"name":"date","type":"int"}],"type":"Update"},{"id":"-1657903163","predicate":"updateContactLink","params":[{"name":"user_id","type":"int"},{"name":"my_link","type":"ContactLink"},{"name":"foreign_link","type":"ContactLink"}],"type":"Update"},{"id":"-1895411046","predicate":"updateNewAuthorization","params":[{"name":"auth_key_id","type":"long"},{"name":"date","type":"int"},{"name":"device","type":"string"},{"name":"location","type":"string"}],"type":"Update"},{"id":"-1519637954","predicate":"updates.state","params":[{"name":"pts","type":"int"},{"name":"qts","type":"int"},{"name":"date","type":"int"},{"name":"seq","type":"int"},{"name":"unread_count","type":"int"}],"type":"updates.State"},{"id":"1567990072","predicate":"updates.differenceEmpty","params":[{"name":"date","type":"int"},{"name":"seq","type":"int"}],"type":"updates.Difference"},{"id":"16030880","predicate":"updates.difference","params":[{"name":"new_messages","type":"Vector"},{"name":"new_encrypted_messages","type":"Vector"},{"name":"other_updates","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"state","type":"updates.State"}],"type":"updates.Difference"},{"id":"-1459938943","predicate":"updates.differenceSlice","params":[{"name":"new_messages","type":"Vector"},{"name":"new_encrypted_messages","type":"Vector"},{"name":"other_updates","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"intermediate_state","type":"updates.State"}],"type":"updates.Difference"},{"id":"-484987010","predicate":"updatesTooLong","params":[],"type":"Updates"},{"id":"-312729305","predicate":"updateShortMessage","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"user_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"date","type":"int"},{"name":"fwd_from_id","type":"flags.2?int"},{"name":"fwd_date","type":"flags.2?int"},{"name":"reply_to_msg_id","type":"flags.3?int"}],"type":"Updates"},{"id":"1378061116","predicate":"updateShortChatMessage","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"chat_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"date","type":"int"},{"name":"fwd_from_id","type":"flags.2?int"},{"name":"fwd_date","type":"flags.2?int"},{"name":"reply_to_msg_id","type":"flags.3?int"}],"type":"Updates"},{"id":"2027216577","predicate":"updateShort","params":[{"name":"update","type":"Update"},{"name":"date","type":"int"}],"type":"Updates"},{"id":"1918567619","predicate":"updatesCombined","params":[{"name":"updates","type":"Vector"},{"name":"users","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"date","type":"int"},{"name":"seq_start","type":"int"},{"name":"seq","type":"int"}],"type":"Updates"},{"id":"1957577280","predicate":"updates","params":[{"name":"updates","type":"Vector"},{"name":"users","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"date","type":"int"},{"name":"seq","type":"int"}],"type":"Updates"},{"id":"-1916114267","predicate":"photos.photos","params":[{"name":"photos","type":"Vector"},{"name":"users","type":"Vector"}],"type":"photos.Photos"},{"id":"352657236","predicate":"photos.photosSlice","params":[{"name":"count","type":"int"},{"name":"photos","type":"Vector"},{"name":"users","type":"Vector"}],"type":"photos.Photos"},{"id":"539045032","predicate":"photos.photo","params":[{"name":"photo","type":"Photo"},{"name":"users","type":"Vector"}],"type":"photos.Photo"},{"id":"157948117","predicate":"upload.file","params":[{"name":"type","type":"storage.FileType"},{"name":"mtime","type":"int"},{"name":"bytes","type":"bytes"}],"type":"upload.File"},{"id":"784507964","predicate":"dcOption","params":[{"name":"id","type":"int"},{"name":"hostname","type":"string"},{"name":"ip_address","type":"string"},{"name":"port","type":"int"}],"type":"DcOption"},{"id":"1311946900","predicate":"config","params":[{"name":"date","type":"int"},{"name":"expires","type":"int"},{"name":"test_mode","type":"Bool"},{"name":"this_dc","type":"int"},{"name":"dc_options","type":"Vector"},{"name":"chat_size_max","type":"int"},{"name":"broadcast_size_max","type":"int"},{"name":"forwarded_count_max","type":"int"},{"name":"online_update_period_ms","type":"int"},{"name":"offline_blur_timeout_ms","type":"int"},{"name":"offline_idle_timeout_ms","type":"int"},{"name":"online_cloud_timeout_ms","type":"int"},{"name":"notify_cloud_delay_ms","type":"int"},{"name":"notify_default_delay_ms","type":"int"},{"name":"chat_big_size","type":"int"},{"name":"push_chat_period_ms","type":"int"},{"name":"push_chat_limit","type":"int"},{"name":"disabled_features","type":"Vector"}],"type":"Config"},{"id":"-1910892683","predicate":"nearestDc","params":[{"name":"country","type":"string"},{"name":"this_dc","type":"int"},{"name":"nearest_dc","type":"int"}],"type":"NearestDc"},{"id":"-1987579119","predicate":"help.appUpdate","params":[{"name":"id","type":"int"},{"name":"critical","type":"Bool"},{"name":"url","type":"string"},{"name":"text","type":"string"}],"type":"help.AppUpdate"},{"id":"-1000708810","predicate":"help.noAppUpdate","params":[],"type":"help.AppUpdate"},{"id":"415997816","predicate":"help.inviteText","params":[{"name":"message","type":"string"}],"type":"help.InviteText"},{"id":"899786339","predicate":"messages.sentMessageLink","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"media","type":"MessageMedia"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"links","type":"Vector"},{"name":"seq","type":"int"}],"type":"messages.SentMessage"},{"id":"1960072954","predicate":"inputGeoChat","params":[{"name":"chat_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputGeoChat"},{"id":"1301143240","predicate":"inputNotifyGeoChatPeer","params":[{"name":"peer","type":"InputGeoChat"}],"type":"InputNotifyPeer"},{"id":"1978329690","predicate":"geoChat","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"title","type":"string"},{"name":"address","type":"string"},{"name":"venue","type":"string"},{"name":"geo","type":"GeoPoint"},{"name":"photo","type":"ChatPhoto"},{"name":"participants_count","type":"int"},{"name":"date","type":"int"},{"name":"checked_in","type":"Bool"},{"name":"version","type":"int"}],"type":"Chat"},{"id":"1613830811","predicate":"geoChatMessageEmpty","params":[{"name":"chat_id","type":"int"},{"name":"id","type":"int"}],"type":"GeoChatMessage"},{"id":"1158019297","predicate":"geoChatMessage","params":[{"name":"chat_id","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"date","type":"int"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"}],"type":"GeoChatMessage"},{"id":"-749755826","predicate":"geoChatMessageService","params":[{"name":"chat_id","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"date","type":"int"},{"name":"action","type":"MessageAction"}],"type":"GeoChatMessage"},{"id":"397498251","predicate":"geochats.statedMessage","params":[{"name":"message","type":"GeoChatMessage"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"seq","type":"int"}],"type":"geochats.StatedMessage"},{"id":"1224651367","predicate":"geochats.located","params":[{"name":"results","type":"Vector"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"geochats.Located"},{"id":"-783127119","predicate":"geochats.messages","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"geochats.Messages"},{"id":"-1135057944","predicate":"geochats.messagesSlice","params":[{"name":"count","type":"int"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"geochats.Messages"},{"id":"1862504124","predicate":"messageActionGeoChatCreate","params":[{"name":"title","type":"string"},{"name":"address","type":"string"}],"type":"MessageAction"},{"id":"209540062","predicate":"messageActionGeoChatCheckin","params":[],"type":"MessageAction"},{"id":"1516823543","predicate":"updateNewGeoChatMessage","params":[{"name":"message","type":"GeoChatMessage"}],"type":"Update"},{"id":"1662091044","predicate":"wallPaperSolid","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"bg_color","type":"int"},{"name":"color","type":"int"}],"type":"WallPaper"},{"id":"314359194","predicate":"updateNewEncryptedMessage","params":[{"name":"message","type":"EncryptedMessage"},{"name":"qts","type":"int"}],"type":"Update"},{"id":"386986326","predicate":"updateEncryptedChatTyping","params":[{"name":"chat_id","type":"int"}],"type":"Update"},{"id":"-1264392051","predicate":"updateEncryption","params":[{"name":"chat","type":"EncryptedChat"},{"name":"date","type":"int"}],"type":"Update"},{"id":"956179895","predicate":"updateEncryptedMessagesRead","params":[{"name":"chat_id","type":"int"},{"name":"max_date","type":"int"},{"name":"date","type":"int"}],"type":"Update"},{"id":"-1417756512","predicate":"encryptedChatEmpty","params":[{"name":"id","type":"int"}],"type":"EncryptedChat"},{"id":"1006044124","predicate":"encryptedChatWaiting","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"admin_id","type":"int"},{"name":"participant_id","type":"int"}],"type":"EncryptedChat"},{"id":"-931638658","predicate":"encryptedChatRequested","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"admin_id","type":"int"},{"name":"participant_id","type":"int"},{"name":"g_a","type":"bytes"}],"type":"EncryptedChat"},{"id":"-94974410","predicate":"encryptedChat","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"admin_id","type":"int"},{"name":"participant_id","type":"int"},{"name":"g_a_or_b","type":"bytes"},{"name":"key_fingerprint","type":"long"}],"type":"EncryptedChat"},{"id":"332848423","predicate":"encryptedChatDiscarded","params":[{"name":"id","type":"int"}],"type":"EncryptedChat"},{"id":"-247351839","predicate":"inputEncryptedChat","params":[{"name":"chat_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputEncryptedChat"},{"id":"-1038136962","predicate":"encryptedFileEmpty","params":[],"type":"EncryptedFile"},{"id":"1248893260","predicate":"encryptedFile","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"size","type":"int"},{"name":"dc_id","type":"int"},{"name":"key_fingerprint","type":"int"}],"type":"EncryptedFile"},{"id":"406307684","predicate":"inputEncryptedFileEmpty","params":[],"type":"InputEncryptedFile"},{"id":"1690108678","predicate":"inputEncryptedFileUploaded","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"md5_checksum","type":"string"},{"name":"key_fingerprint","type":"int"}],"type":"InputEncryptedFile"},{"id":"1511503333","predicate":"inputEncryptedFile","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputEncryptedFile"},{"id":"-182231723","predicate":"inputEncryptedFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"-317144808","predicate":"encryptedMessage","params":[{"name":"random_id","type":"long"},{"name":"chat_id","type":"int"},{"name":"date","type":"int"},{"name":"bytes","type":"bytes"},{"name":"file","type":"EncryptedFile"}],"type":"EncryptedMessage"},{"id":"594758406","predicate":"encryptedMessageService","params":[{"name":"random_id","type":"long"},{"name":"chat_id","type":"int"},{"name":"date","type":"int"},{"name":"bytes","type":"bytes"}],"type":"EncryptedMessage"},{"id":"-1058912715","predicate":"messages.dhConfigNotModified","params":[{"name":"random","type":"bytes"}],"type":"messages.DhConfig"},{"id":"740433629","predicate":"messages.dhConfig","params":[{"name":"g","type":"int"},{"name":"p","type":"bytes"},{"name":"version","type":"int"},{"name":"random","type":"bytes"}],"type":"messages.DhConfig"},{"id":"1443858741","predicate":"messages.sentEncryptedMessage","params":[{"name":"date","type":"int"}],"type":"messages.SentEncryptedMessage"},{"id":"-1802240206","predicate":"messages.sentEncryptedFile","params":[{"name":"date","type":"int"},{"name":"file","type":"EncryptedFile"}],"type":"messages.SentEncryptedMessage"},{"id":"-95482955","predicate":"inputFileBig","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"name","type":"string"}],"type":"InputFile"},{"id":"767652808","predicate":"inputEncryptedFileBigUploaded","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"key_fingerprint","type":"int"}],"type":"InputEncryptedFile"},{"id":"974056226","predicate":"updateChatParticipantAdd","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"int"},{"name":"inviter_id","type":"int"},{"name":"version","type":"int"}],"type":"Update"},{"id":"1851755554","predicate":"updateChatParticipantDelete","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"int"},{"name":"version","type":"int"}],"type":"Update"},{"id":"-1906403213","predicate":"updateDcOptions","params":[{"name":"dc_options","type":"Vector"}],"type":"Update"},{"id":"1313442987","predicate":"inputMediaUploadedAudio","params":[{"name":"file","type":"InputFile"},{"name":"duration","type":"int"},{"name":"mime_type","type":"string"}],"type":"InputMedia"},{"id":"-1986820223","predicate":"inputMediaAudio","params":[{"name":"id","type":"InputAudio"}],"type":"InputMedia"},{"id":"-1610888","predicate":"inputMediaUploadedDocument","params":[{"name":"file","type":"InputFile"},{"name":"mime_type","type":"string"},{"name":"attributes","type":"Vector"}],"type":"InputMedia"},{"id":"1095242886","predicate":"inputMediaUploadedThumbDocument","params":[{"name":"file","type":"InputFile"},{"name":"thumb","type":"InputFile"},{"name":"mime_type","type":"string"},{"name":"attributes","type":"Vector"}],"type":"InputMedia"},{"id":"-779818943","predicate":"inputMediaDocument","params":[{"name":"id","type":"InputDocument"}],"type":"InputMedia"},{"id":"802824708","predicate":"messageMediaDocument","params":[{"name":"document","type":"Document"}],"type":"MessageMedia"},{"id":"-961117440","predicate":"messageMediaAudio","params":[{"name":"audio","type":"Audio"}],"type":"MessageMedia"},{"id":"-648356732","predicate":"inputAudioEmpty","params":[],"type":"InputAudio"},{"id":"2010398975","predicate":"inputAudio","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputAudio"},{"id":"1928391342","predicate":"inputDocumentEmpty","params":[],"type":"InputDocument"},{"id":"410618194","predicate":"inputDocument","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputDocument"},{"id":"1960591437","predicate":"inputAudioFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"1313188841","predicate":"inputDocumentFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"1483311320","predicate":"audioEmpty","params":[{"name":"id","type":"long"}],"type":"Audio"},{"id":"-945003370","predicate":"audio","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"duration","type":"int"},{"name":"mime_type","type":"string"},{"name":"size","type":"int"},{"name":"dc_id","type":"int"}],"type":"Audio"},{"id":"922273905","predicate":"documentEmpty","params":[{"name":"id","type":"long"}],"type":"Document"},{"id":"-106717361","predicate":"document","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"mime_type","type":"string"},{"name":"size","type":"int"},{"name":"thumb","type":"PhotoSize"},{"name":"dc_id","type":"int"},{"name":"attributes","type":"Vector"}],"type":"Document"},{"id":"398898678","predicate":"help.support","params":[{"name":"phone_number","type":"string"},{"name":"user","type":"User"}],"type":"help.Support"},{"id":"-1613493288","predicate":"notifyPeer","params":[{"name":"peer","type":"Peer"}],"type":"NotifyPeer"},{"id":"-1261946036","predicate":"notifyUsers","params":[],"type":"NotifyPeer"},{"id":"-1073230141","predicate":"notifyChats","params":[],"type":"NotifyPeer"},{"id":"1959820384","predicate":"notifyAll","params":[],"type":"NotifyPeer"},{"id":"-2131957734","predicate":"updateUserBlocked","params":[{"name":"user_id","type":"int"},{"name":"blocked","type":"Bool"}],"type":"Update"},{"id":"-1094555409","predicate":"updateNotifySettings","params":[{"name":"peer","type":"NotifyPeer"},{"name":"notify_settings","type":"PeerNotifySettings"}],"type":"Update"},{"id":"-484053553","predicate":"auth.sentAppCode","params":[{"name":"phone_registered","type":"Bool"},{"name":"phone_code_hash","type":"string"},{"name":"send_call_timeout","type":"int"},{"name":"is_password","type":"Bool"}],"type":"auth.SentCode"},{"id":"381645902","predicate":"sendMessageTypingAction","params":[],"type":"SendMessageAction"},{"id":"-44119819","predicate":"sendMessageCancelAction","params":[],"type":"SendMessageAction"},{"id":"-1584933265","predicate":"sendMessageRecordVideoAction","params":[],"type":"SendMessageAction"},{"id":"-378127636","predicate":"sendMessageUploadVideoAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"-718310409","predicate":"sendMessageRecordAudioAction","params":[],"type":"SendMessageAction"},{"id":"-212740181","predicate":"sendMessageUploadAudioAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"-774682074","predicate":"sendMessageUploadPhotoAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"-1441998364","predicate":"sendMessageUploadDocumentAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"393186209","predicate":"sendMessageGeoLocationAction","params":[],"type":"SendMessageAction"},{"id":"1653390447","predicate":"sendMessageChooseContactAction","params":[],"type":"SendMessageAction"},{"id":"-360210539","predicate":"contactFound","params":[{"name":"user_id","type":"int"}],"type":"ContactFound"},{"id":"90570766","predicate":"contacts.found","params":[{"name":"results","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Found"},{"id":"942527460","predicate":"updateServiceNotification","params":[{"name":"type","type":"string"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"},{"name":"popup","type":"Bool"}],"type":"Update"},{"id":"-496024847","predicate":"userStatusRecently","params":[],"type":"UserStatus"},{"id":"129960444","predicate":"userStatusLastWeek","params":[],"type":"UserStatus"},{"id":"2011940674","predicate":"userStatusLastMonth","params":[],"type":"UserStatus"},{"id":"-298113238","predicate":"updatePrivacy","params":[{"name":"key","type":"PrivacyKey"},{"name":"rules","type":"Vector"}],"type":"Update"},{"id":"1335282456","predicate":"inputPrivacyKeyStatusTimestamp","params":[],"type":"InputPrivacyKey"},{"id":"-1137792208","predicate":"privacyKeyStatusTimestamp","params":[],"type":"PrivacyKey"},{"id":"218751099","predicate":"inputPrivacyValueAllowContacts","params":[],"type":"InputPrivacyRule"},{"id":"407582158","predicate":"inputPrivacyValueAllowAll","params":[],"type":"InputPrivacyRule"},{"id":"320652927","predicate":"inputPrivacyValueAllowUsers","params":[{"name":"users","type":"Vector"}],"type":"InputPrivacyRule"},{"id":"195371015","predicate":"inputPrivacyValueDisallowContacts","params":[],"type":"InputPrivacyRule"},{"id":"-697604407","predicate":"inputPrivacyValueDisallowAll","params":[],"type":"InputPrivacyRule"},{"id":"-1877932953","predicate":"inputPrivacyValueDisallowUsers","params":[{"name":"users","type":"Vector"}],"type":"InputPrivacyRule"},{"id":"-123988","predicate":"privacyValueAllowContacts","params":[],"type":"PrivacyRule"},{"id":"1698855810","predicate":"privacyValueAllowAll","params":[],"type":"PrivacyRule"},{"id":"1297858060","predicate":"privacyValueAllowUsers","params":[{"name":"users","type":"Vector"}],"type":"PrivacyRule"},{"id":"-125240806","predicate":"privacyValueDisallowContacts","params":[],"type":"PrivacyRule"},{"id":"-1955338397","predicate":"privacyValueDisallowAll","params":[],"type":"PrivacyRule"},{"id":"209668535","predicate":"privacyValueDisallowUsers","params":[{"name":"users","type":"Vector"}],"type":"PrivacyRule"},{"id":"1430961007","predicate":"account.privacyRules","params":[{"name":"rules","type":"Vector"},{"name":"users","type":"Vector"}],"type":"account.PrivacyRules"},{"id":"-1194283041","predicate":"accountDaysTTL","params":[{"name":"days","type":"int"}],"type":"AccountDaysTTL"},{"id":"-1527411636","predicate":"account.sentChangePhoneCode","params":[{"name":"phone_code_hash","type":"string"},{"name":"send_call_timeout","type":"int"}],"type":"account.SentChangePhoneCode"},{"id":"314130811","predicate":"updateUserPhone","params":[{"name":"user_id","type":"int"},{"name":"phone","type":"string"}],"type":"Update"},{"id":"1815593308","predicate":"documentAttributeImageSize","params":[{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"DocumentAttribute"},{"id":"297109817","predicate":"documentAttributeAnimated","params":[],"type":"DocumentAttribute"},{"id":"978674434","predicate":"documentAttributeSticker","params":[{"name":"alt","type":"string"},{"name":"stickerset","type":"InputStickerSet"}],"type":"DocumentAttribute"},{"id":"1494273227","predicate":"documentAttributeVideo","params":[{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"DocumentAttribute"},{"id":"85215461","predicate":"documentAttributeAudio","params":[{"name":"duration","type":"int"}],"type":"DocumentAttribute"},{"id":"358154344","predicate":"documentAttributeFilename","params":[{"name":"file_name","type":"string"}],"type":"DocumentAttribute"},{"id":"-244016606","predicate":"messages.stickersNotModified","params":[],"type":"messages.Stickers"},{"id":"-1970352846","predicate":"messages.stickers","params":[{"name":"hash","type":"string"},{"name":"stickers","type":"Vector"}],"type":"messages.Stickers"},{"id":"313694676","predicate":"stickerPack","params":[{"name":"emoticon","type":"string"},{"name":"documents","type":"Vector"}],"type":"StickerPack"},{"id":"-395967805","predicate":"messages.allStickersNotModified","params":[],"type":"messages.AllStickers"},{"id":"1558401772","predicate":"messages.allStickers","params":[{"name":"hash","type":"string"},{"name":"packs","type":"Vector"},{"name":"sets","type":"Vector"},{"name":"documents","type":"Vector"}],"type":"messages.AllStickers"},{"id":"-1369215196","predicate":"disabledFeature","params":[{"name":"feature","type":"string"},{"name":"description","type":"string"}],"type":"DisabledFeature"},{"id":"-1721631396","predicate":"updateReadHistoryInbox","params":[{"name":"peer","type":"Peer"},{"name":"max_id","type":"int"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"791617983","predicate":"updateReadHistoryOutbox","params":[{"name":"peer","type":"Peer"},{"name":"max_id","type":"int"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"-2066640507","predicate":"messages.affectedMessages","params":[{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"messages.AffectedMessages"},{"id":"1599050311","predicate":"contactLinkUnknown","params":[],"type":"ContactLink"},{"id":"-17968211","predicate":"contactLinkNone","params":[],"type":"ContactLink"},{"id":"646922073","predicate":"contactLinkHasPhone","params":[],"type":"ContactLink"},{"id":"-721239344","predicate":"contactLinkContact","params":[],"type":"ContactLink"},{"id":"751004017","predicate":"updateWebPage","params":[{"name":"webpage","type":"WebPage"}],"type":"Update"},{"id":"-350980120","predicate":"webPageEmpty","params":[{"name":"id","type":"long"}],"type":"WebPage"},{"id":"-981018084","predicate":"webPagePending","params":[{"name":"id","type":"long"},{"name":"date","type":"int"}],"type":"WebPage"},{"id":"-1558273867","predicate":"webPage","params":[{"name":"flags","type":"#"},{"name":"id","type":"long"},{"name":"url","type":"string"},{"name":"display_url","type":"string"},{"name":"type","type":"flags.0?string"},{"name":"site_name","type":"flags.1?string"},{"name":"title","type":"flags.2?string"},{"name":"description","type":"flags.3?string"},{"name":"photo","type":"flags.4?Photo"},{"name":"embed_url","type":"flags.5?string"},{"name":"embed_type","type":"flags.5?string"},{"name":"embed_width","type":"flags.6?int"},{"name":"embed_height","type":"flags.6?int"},{"name":"duration","type":"flags.7?int"},{"name":"author","type":"flags.8?string"}],"type":"WebPage"},{"id":"-1557277184","predicate":"messageMediaWebPage","params":[{"name":"webpage","type":"WebPage"}],"type":"MessageMedia"},{"id":"2079516406","predicate":"authorization","params":[{"name":"hash","type":"long"},{"name":"flags","type":"int"},{"name":"device_model","type":"string"},{"name":"platform","type":"string"},{"name":"system_version","type":"string"},{"name":"api_id","type":"int"},{"name":"app_name","type":"string"},{"name":"app_version","type":"string"},{"name":"date_created","type":"int"},{"name":"date_active","type":"int"},{"name":"ip","type":"string"},{"name":"country","type":"string"},{"name":"region","type":"string"}],"type":"Authorization"},{"id":"307276766","predicate":"account.authorizations","params":[{"name":"authorizations","type":"Vector"}],"type":"account.Authorizations"},{"id":"-1764049896","predicate":"account.noPassword","params":[{"name":"new_salt","type":"bytes"},{"name":"email_unconfirmed_pattern","type":"string"}],"type":"account.Password"},{"id":"2081952796","predicate":"account.password","params":[{"name":"current_salt","type":"bytes"},{"name":"new_salt","type":"bytes"},{"name":"hint","type":"string"},{"name":"has_recovery","type":"Bool"},{"name":"email_unconfirmed_pattern","type":"string"}],"type":"account.Password"},{"id":"-1212732749","predicate":"account.passwordSettings","params":[{"name":"email","type":"string"}],"type":"account.PasswordSettings"},{"id":"-1124314324","predicate":"account.passwordInputSettings","params":[{"name":"flags","type":"#"},{"name":"new_salt","type":"flags.0?bytes"},{"name":"new_password_hash","type":"flags.0?bytes"},{"name":"hint","type":"flags.0?string"},{"name":"email","type":"flags.1?string"}],"type":"account.PasswordInputSettings"},{"id":"326715557","predicate":"auth.passwordRecovery","params":[{"name":"email_pattern","type":"string"}],"type":"auth.PasswordRecovery"},{"id":"673687578","predicate":"inputMediaVenue","params":[{"name":"geo_point","type":"InputGeoPoint"},{"name":"title","type":"string"},{"name":"address","type":"string"},{"name":"provider","type":"string"},{"name":"venue_id","type":"string"}],"type":"InputMedia"},{"id":"2031269663","predicate":"messageMediaVenue","params":[{"name":"geo","type":"GeoPoint"},{"name":"title","type":"string"},{"name":"address","type":"string"},{"name":"provider","type":"string"},{"name":"venue_id","type":"string"}],"type":"MessageMedia"},{"id":"-1551583367","predicate":"receivedNotifyMessage","params":[{"name":"id","type":"int"},{"name":"flags","type":"int"}],"type":"ReceivedNotifyMessage"},{"id":"1776236393","predicate":"chatInviteEmpty","params":[],"type":"ExportedChatInvite"},{"id":"-64092740","predicate":"chatInviteExported","params":[{"name":"link","type":"string"}],"type":"ExportedChatInvite"},{"id":"1516793212","predicate":"chatInviteAlready","params":[{"name":"chat","type":"Chat"}],"type":"ChatInvite"},{"id":"-829325875","predicate":"chatInvite","params":[{"name":"title","type":"string"}],"type":"ChatInvite"},{"id":"-123931160","predicate":"messageActionChatJoinedByLink","params":[{"name":"inviter_id","type":"int"}],"type":"MessageAction"},{"id":"1757493555","predicate":"updateReadMessagesContents","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"-4838507","predicate":"inputStickerSetEmpty","params":[],"type":"InputStickerSet"},{"id":"-1645763991","predicate":"inputStickerSetID","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputStickerSet"},{"id":"-2044933984","predicate":"inputStickerSetShortName","params":[{"name":"short_name","type":"string"}],"type":"InputStickerSet"},{"id":"-1482409193","predicate":"stickerSet","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"title","type":"string"},{"name":"short_name","type":"string"}],"type":"StickerSet"},{"id":"-1240849242","predicate":"messages.stickerSet","params":[{"name":"set","type":"StickerSet"},{"name":"packs","type":"Vector"},{"name":"documents","type":"Vector"}],"type":"messages.StickerSet"}],"methods":[{"id":"-878758099","method":"invokeAfterMsg","params":[{"name":"msg_id","type":"long"},{"name":"query","type":"!X"}],"type":"X"},{"id":"1036301552","method":"invokeAfterMsgs","params":[{"name":"msg_ids","type":"Vector"},{"name":"query","type":"!X"}],"type":"X"},{"id":"1877286395","method":"auth.checkPhone","params":[{"name":"phone_number","type":"string"}],"type":"auth.CheckedPhone"},{"id":"1988976461","method":"auth.sendCode","params":[{"name":"phone_number","type":"string"},{"name":"sms_type","type":"int"},{"name":"api_id","type":"int"},{"name":"api_hash","type":"string"},{"name":"lang_code","type":"string"}],"type":"auth.SentCode"},{"id":"63247716","method":"auth.sendCall","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"}],"type":"Bool"},{"id":"453408308","method":"auth.signUp","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"},{"name":"phone_code","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"auth.Authorization"},{"id":"-1126886015","method":"auth.signIn","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"},{"name":"phone_code","type":"string"}],"type":"auth.Authorization"},{"id":"1461180992","method":"auth.logOut","params":[],"type":"Bool"},{"id":"-1616179942","method":"auth.resetAuthorizations","params":[],"type":"Bool"},{"id":"1998331287","method":"auth.sendInvites","params":[{"name":"phone_numbers","type":"Vector"},{"name":"message","type":"string"}],"type":"Bool"},{"id":"-440401971","method":"auth.exportAuthorization","params":[{"name":"dc_id","type":"int"}],"type":"auth.ExportedAuthorization"},{"id":"-470837741","method":"auth.importAuthorization","params":[{"name":"id","type":"int"},{"name":"bytes","type":"bytes"}],"type":"auth.Authorization"},{"id":"-841733627","method":"auth.bindTempAuthKey","params":[{"name":"perm_auth_key_id","type":"long"},{"name":"nonce","type":"long"},{"name":"expires_at","type":"int"},{"name":"encrypted_message","type":"bytes"}],"type":"Bool"},{"id":"1147957548","method":"account.registerDevice","params":[{"name":"token_type","type":"int"},{"name":"token","type":"string"},{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"app_sandbox","type":"Bool"},{"name":"lang_code","type":"string"}],"type":"Bool"},{"id":"1707432768","method":"account.unregisterDevice","params":[{"name":"token_type","type":"int"},{"name":"token","type":"string"}],"type":"Bool"},{"id":"-2067899501","method":"account.updateNotifySettings","params":[{"name":"peer","type":"InputNotifyPeer"},{"name":"settings","type":"InputPeerNotifySettings"}],"type":"Bool"},{"id":"313765169","method":"account.getNotifySettings","params":[{"name":"peer","type":"InputNotifyPeer"}],"type":"PeerNotifySettings"},{"id":"-612493497","method":"account.resetNotifySettings","params":[],"type":"Bool"},{"id":"-259486360","method":"account.updateProfile","params":[{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"User"},{"id":"1713919532","method":"account.updateStatus","params":[{"name":"offline","type":"Bool"}],"type":"Bool"},{"id":"-1068696894","method":"account.getWallPapers","params":[],"type":"Vector"},{"id":"227648840","method":"users.getUsers","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"-902781519","method":"users.getFullUser","params":[{"name":"id","type":"InputUser"}],"type":"UserFull"},{"id":"-995929106","method":"contacts.getStatuses","params":[],"type":"Vector"},{"id":"583445000","method":"contacts.getContacts","params":[{"name":"hash","type":"string"}],"type":"contacts.Contacts"},{"id":"-634342611","method":"contacts.importContacts","params":[{"name":"contacts","type":"Vector"},{"name":"replace","type":"Bool"}],"type":"contacts.ImportedContacts"},{"id":"-847825880","method":"contacts.getSuggested","params":[{"name":"limit","type":"int"}],"type":"contacts.Suggested"},{"id":"-1902823612","method":"contacts.deleteContact","params":[{"name":"id","type":"InputUser"}],"type":"contacts.Link"},{"id":"1504393374","method":"contacts.deleteContacts","params":[{"name":"id","type":"Vector"}],"type":"Bool"},{"id":"858475004","method":"contacts.block","params":[{"name":"id","type":"InputUser"}],"type":"Bool"},{"id":"-448724803","method":"contacts.unblock","params":[{"name":"id","type":"InputUser"}],"type":"Bool"},{"id":"-176409329","method":"contacts.getBlocked","params":[{"name":"offset","type":"int"},{"name":"limit","type":"int"}],"type":"contacts.Blocked"},{"id":"-2065352905","method":"contacts.exportCard","params":[],"type":"Vector"},{"id":"1340184318","method":"contacts.importCard","params":[{"name":"export_card","type":"Vector"}],"type":"User"},{"id":"1109588596","method":"messages.getMessages","params":[{"name":"id","type":"Vector"}],"type":"messages.Messages"},{"id":"-321970698","method":"messages.getDialogs","params":[{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"messages.Dialogs"},{"id":"-1834885329","method":"messages.getHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"messages.Messages"},{"id":"132772523","method":"messages.search","params":[{"name":"peer","type":"InputPeer"},{"name":"q","type":"string"},{"name":"filter","type":"MessagesFilter"},{"name":"min_date","type":"int"},{"name":"max_date","type":"int"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"messages.Messages"},{"id":"-1336990448","method":"messages.readHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"max_id","type":"int"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"-185009311","method":"messages.deleteHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"-1510897371","method":"messages.deleteMessages","params":[{"name":"id","type":"Vector"}],"type":"messages.AffectedMessages"},{"id":"94983360","method":"messages.receivedMessages","params":[{"name":"max_id","type":"int"}],"type":"Vector"},{"id":"-1551737264","method":"messages.setTyping","params":[{"name":"peer","type":"InputPeer"},{"name":"action","type":"SendMessageAction"}],"type":"Bool"},{"id":"-1696755930","method":"messages.sendMessage","params":[{"name":"flags","type":"#"},{"name":"peer","type":"InputPeer"},{"name":"reply_to_msg_id","type":"flags.0?int"},{"name":"message","type":"string"},{"name":"random_id","type":"long"}],"type":"messages.SentMessage"},{"id":"762913713","method":"messages.sendMedia","params":[{"name":"flags","type":"#"},{"name":"peer","type":"InputPeer"},{"name":"reply_to_msg_id","type":"flags.0?int"},{"name":"media","type":"InputMedia"},{"name":"random_id","type":"long"}],"type":"Updates"},{"id":"1440838285","method":"messages.forwardMessages","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"Vector"},{"name":"random_id","type":"Vector"}],"type":"Updates"},{"id":"1013621127","method":"messages.getChats","params":[{"name":"id","type":"Vector"}],"type":"messages.Chats"},{"id":"998448230","method":"messages.getFullChat","params":[{"name":"chat_id","type":"int"}],"type":"messages.ChatFull"},{"id":"-599447467","method":"messages.editChatTitle","params":[{"name":"chat_id","type":"int"},{"name":"title","type":"string"}],"type":"Updates"},{"id":"-900957736","method":"messages.editChatPhoto","params":[{"name":"chat_id","type":"int"},{"name":"photo","type":"InputChatPhoto"}],"type":"Updates"},{"id":"-106911223","method":"messages.addChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"},{"name":"fwd_limit","type":"int"}],"type":"Updates"},{"id":"-530505962","method":"messages.deleteChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"}],"type":"Updates"},{"id":"164303470","method":"messages.createChat","params":[{"name":"users","type":"Vector"},{"name":"title","type":"string"}],"type":"Updates"},{"id":"-304838614","method":"updates.getState","params":[],"type":"updates.State"},{"id":"168039573","method":"updates.getDifference","params":[{"name":"pts","type":"int"},{"name":"date","type":"int"},{"name":"qts","type":"int"}],"type":"updates.Difference"},{"id":"-285902432","method":"photos.updateProfilePhoto","params":[{"name":"id","type":"InputPhoto"},{"name":"crop","type":"InputPhotoCrop"}],"type":"UserProfilePhoto"},{"id":"-720397176","method":"photos.uploadProfilePhoto","params":[{"name":"file","type":"InputFile"},{"name":"caption","type":"string"},{"name":"geo_point","type":"InputGeoPoint"},{"name":"crop","type":"InputPhotoCrop"}],"type":"photos.Photo"},{"id":"-2016444625","method":"photos.deletePhotos","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"-1291540959","method":"upload.saveFilePart","params":[{"name":"file_id","type":"long"},{"name":"file_part","type":"int"},{"name":"bytes","type":"bytes"}],"type":"Bool"},{"id":"-475607115","method":"upload.getFile","params":[{"name":"location","type":"InputFileLocation"},{"name":"offset","type":"int"},{"name":"limit","type":"int"}],"type":"upload.File"},{"id":"-990308245","method":"help.getConfig","params":[],"type":"Config"},{"id":"531836966","method":"help.getNearestDc","params":[],"type":"NearestDc"},{"id":"-938300290","method":"help.getAppUpdate","params":[{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"lang_code","type":"string"}],"type":"help.AppUpdate"},{"id":"1862465352","method":"help.saveAppLog","params":[{"name":"events","type":"Vector"}],"type":"Bool"},{"id":"-1532407418","method":"help.getInviteText","params":[{"name":"lang_code","type":"string"}],"type":"help.InviteText"},{"id":"-1209117380","method":"photos.getUserPhotos","params":[{"name":"user_id","type":"InputUser"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"photos.Photos"},{"id":"865483769","method":"messages.forwardMessage","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"Updates"},{"id":"-1082919718","method":"messages.sendBroadcast","params":[{"name":"contacts","type":"Vector"},{"name":"random_id","type":"Vector"},{"name":"message","type":"string"},{"name":"media","type":"InputMedia"}],"type":"Updates"},{"id":"2132356495","method":"geochats.getLocated","params":[{"name":"geo_point","type":"InputGeoPoint"},{"name":"radius","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Located"},{"id":"-515735953","method":"geochats.getRecents","params":[{"name":"offset","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Messages"},{"id":"1437853947","method":"geochats.checkin","params":[{"name":"peer","type":"InputGeoChat"}],"type":"geochats.StatedMessage"},{"id":"1730338159","method":"geochats.getFullChat","params":[{"name":"peer","type":"InputGeoChat"}],"type":"messages.ChatFull"},{"id":"1284383347","method":"geochats.editChatTitle","params":[{"name":"peer","type":"InputGeoChat"},{"name":"title","type":"string"},{"name":"address","type":"string"}],"type":"geochats.StatedMessage"},{"id":"903355029","method":"geochats.editChatPhoto","params":[{"name":"peer","type":"InputGeoChat"},{"name":"photo","type":"InputChatPhoto"}],"type":"geochats.StatedMessage"},{"id":"-808598451","method":"geochats.search","params":[{"name":"peer","type":"InputGeoChat"},{"name":"q","type":"string"},{"name":"filter","type":"MessagesFilter"},{"name":"min_date","type":"int"},{"name":"max_date","type":"int"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Messages"},{"id":"-1254131096","method":"geochats.getHistory","params":[{"name":"peer","type":"InputGeoChat"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Messages"},{"id":"146319145","method":"geochats.setTyping","params":[{"name":"peer","type":"InputGeoChat"},{"name":"typing","type":"Bool"}],"type":"Bool"},{"id":"102432836","method":"geochats.sendMessage","params":[{"name":"peer","type":"InputGeoChat"},{"name":"message","type":"string"},{"name":"random_id","type":"long"}],"type":"geochats.StatedMessage"},{"id":"-1192173825","method":"geochats.sendMedia","params":[{"name":"peer","type":"InputGeoChat"},{"name":"media","type":"InputMedia"},{"name":"random_id","type":"long"}],"type":"geochats.StatedMessage"},{"id":"235482646","method":"geochats.createGeoChat","params":[{"name":"title","type":"string"},{"name":"geo_point","type":"InputGeoPoint"},{"name":"address","type":"string"},{"name":"venue","type":"string"}],"type":"geochats.StatedMessage"},{"id":"651135312","method":"messages.getDhConfig","params":[{"name":"version","type":"int"},{"name":"random_length","type":"int"}],"type":"messages.DhConfig"},{"id":"-162681021","method":"messages.requestEncryption","params":[{"name":"user_id","type":"InputUser"},{"name":"random_id","type":"int"},{"name":"g_a","type":"bytes"}],"type":"EncryptedChat"},{"id":"1035731989","method":"messages.acceptEncryption","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"g_b","type":"bytes"},{"name":"key_fingerprint","type":"long"}],"type":"EncryptedChat"},{"id":"-304536635","method":"messages.discardEncryption","params":[{"name":"chat_id","type":"int"}],"type":"Bool"},{"id":"2031374829","method":"messages.setEncryptedTyping","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"typing","type":"Bool"}],"type":"Bool"},{"id":"2135648522","method":"messages.readEncryptedHistory","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"max_date","type":"int"}],"type":"Bool"},{"id":"-1451792525","method":"messages.sendEncrypted","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"random_id","type":"long"},{"name":"data","type":"bytes"}],"type":"messages.SentEncryptedMessage"},{"id":"-1701831834","method":"messages.sendEncryptedFile","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"random_id","type":"long"},{"name":"data","type":"bytes"},{"name":"file","type":"InputEncryptedFile"}],"type":"messages.SentEncryptedMessage"},{"id":"852769188","method":"messages.sendEncryptedService","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"random_id","type":"long"},{"name":"data","type":"bytes"}],"type":"messages.SentEncryptedMessage"},{"id":"1436924774","method":"messages.receivedQueue","params":[{"name":"max_qts","type":"int"}],"type":"Vector"},{"id":"-562337987","method":"upload.saveBigFilePart","params":[{"name":"file_id","type":"long"},{"name":"file_part","type":"int"},{"name":"file_total_parts","type":"int"},{"name":"bytes","type":"bytes"}],"type":"Bool"},{"id":"1769565673","method":"initConnection","params":[{"name":"api_id","type":"int"},{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"lang_code","type":"string"},{"name":"query","type":"!X"}],"type":"X"},{"id":"-1663104819","method":"help.getSupport","params":[],"type":"help.Support"},{"id":"229241832","method":"auth.sendSms","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"}],"type":"Bool"},{"id":"916930423","method":"messages.readMessageContents","params":[{"name":"id","type":"Vector"}],"type":"messages.AffectedMessages"},{"id":"655677548","method":"account.checkUsername","params":[{"name":"username","type":"string"}],"type":"Bool"},{"id":"1040964988","method":"account.updateUsername","params":[{"name":"username","type":"string"}],"type":"User"},{"id":"301470424","method":"contacts.search","params":[{"name":"q","type":"string"},{"name":"limit","type":"int"}],"type":"contacts.Found"},{"id":"-623130288","method":"account.getPrivacy","params":[{"name":"key","type":"InputPrivacyKey"}],"type":"account.PrivacyRules"},{"id":"-906486552","method":"account.setPrivacy","params":[{"name":"key","type":"InputPrivacyKey"},{"name":"rules","type":"Vector"}],"type":"account.PrivacyRules"},{"id":"1099779595","method":"account.deleteAccount","params":[{"name":"reason","type":"string"}],"type":"Bool"},{"id":"150761757","method":"account.getAccountTTL","params":[],"type":"AccountDaysTTL"},{"id":"608323678","method":"account.setAccountTTL","params":[{"name":"ttl","type":"AccountDaysTTL"}],"type":"Bool"},{"id":"-627372787","method":"invokeWithLayer","params":[{"name":"layer","type":"int"},{"name":"query","type":"!X"}],"type":"X"},{"id":"200282908","method":"contacts.resolveUsername","params":[{"name":"username","type":"string"}],"type":"User"},{"id":"-1543001868","method":"account.sendChangePhoneCode","params":[{"name":"phone_number","type":"string"}],"type":"account.SentChangePhoneCode"},{"id":"1891839707","method":"account.changePhone","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"},{"name":"phone_code","type":"string"}],"type":"User"},{"id":"-1373446075","method":"messages.getStickers","params":[{"name":"emoticon","type":"string"},{"name":"hash","type":"string"}],"type":"messages.Stickers"},{"id":"-1438922648","method":"messages.getAllStickers","params":[{"name":"hash","type":"string"}],"type":"messages.AllStickers"},{"id":"954152242","method":"account.updateDeviceLocked","params":[{"name":"period","type":"int"}],"type":"Bool"},{"id":"623001124","method":"messages.getWebPagePreview","params":[{"name":"message","type":"string"}],"type":"MessageMedia"},{"id":"-484392616","method":"account.getAuthorizations","params":[],"type":"account.Authorizations"},{"id":"-545786948","method":"account.resetAuthorization","params":[{"name":"hash","type":"long"}],"type":"Bool"},{"id":"1418342645","method":"account.getPassword","params":[],"type":"account.Password"},{"id":"-1131605573","method":"account.getPasswordSettings","params":[{"name":"current_password_hash","type":"bytes"}],"type":"account.PasswordSettings"},{"id":"-92517498","method":"account.updatePasswordSettings","params":[{"name":"current_password_hash","type":"bytes"},{"name":"new_settings","type":"account.PasswordInputSettings"}],"type":"Bool"},{"id":"174260510","method":"auth.checkPassword","params":[{"name":"password_hash","type":"bytes"}],"type":"auth.Authorization"},{"id":"-661144474","method":"auth.requestPasswordRecovery","params":[],"type":"auth.PasswordRecovery"},{"id":"1319464594","method":"auth.recoverPassword","params":[{"name":"code","type":"string"}],"type":"auth.Authorization"},{"id":"-1080796745","method":"invokeWithoutUpdates","params":[{"name":"query","type":"!X"}],"type":"X"},{"id":"2106086025","method":"messages.exportChatInvite","params":[{"name":"chat_id","type":"int"}],"type":"ExportedChatInvite"},{"id":"1051570619","method":"messages.checkChatInvite","params":[{"name":"hash","type":"string"}],"type":"ChatInvite"},{"id":"1817183516","method":"messages.importChatInvite","params":[{"name":"hash","type":"string"}],"type":"Updates"},{"id":"639215886","method":"messages.getStickerSet","params":[{"name":"stickerset","type":"InputStickerSet"}],"type":"messages.StickerSet"},{"id":"-272893207","method":"messages.installStickerSet","params":[{"name":"stickerset","type":"InputStickerSet"}],"type":"Bool"},{"id":"-110209570","method":"messages.uninstallStickerSet","params":[{"name":"stickerset","type":"InputStickerSet"}],"type":"Bool"}]}; +Config.Schema.API = {"constructors":[{"id":"-1132882121","predicate":"boolFalse","params":[],"type":"Bool"},{"id":"-1720552011","predicate":"boolTrue","params":[],"type":"Bool"},{"id":"481674261","predicate":"vector","params":[],"type":"Vector t"},{"id":"-994444869","predicate":"error","params":[{"name":"code","type":"int"},{"name":"text","type":"string"}],"type":"Error"},{"id":"1450380236","predicate":"null","params":[],"type":"Null"},{"id":"2134579434","predicate":"inputPeerEmpty","params":[],"type":"InputPeer"},{"id":"2107670217","predicate":"inputPeerSelf","params":[],"type":"InputPeer"},{"id":"396093539","predicate":"inputPeerChat","params":[{"name":"chat_id","type":"int"}],"type":"InputPeer"},{"id":"-1182234929","predicate":"inputUserEmpty","params":[],"type":"InputUser"},{"id":"-138301121","predicate":"inputUserSelf","params":[],"type":"InputUser"},{"id":"-208488460","predicate":"inputPhoneContact","params":[{"name":"client_id","type":"long"},{"name":"phone","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"InputContact"},{"id":"-181407105","predicate":"inputFile","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"name","type":"string"},{"name":"md5_checksum","type":"string"}],"type":"InputFile"},{"id":"-1771768449","predicate":"inputMediaEmpty","params":[],"type":"InputMedia"},{"id":"-139464256","predicate":"inputMediaUploadedPhoto","params":[{"name":"file","type":"InputFile"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-373312269","predicate":"inputMediaPhoto","params":[{"name":"id","type":"InputPhoto"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-104578748","predicate":"inputMediaGeoPoint","params":[{"name":"geo_point","type":"InputGeoPoint"}],"type":"InputMedia"},{"id":"-1494984313","predicate":"inputMediaContact","params":[{"name":"phone_number","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"InputMedia"},{"id":"-515910468","predicate":"inputMediaUploadedVideo","params":[{"name":"file","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-1761896484","predicate":"inputMediaUploadedThumbVideo","params":[{"name":"file","type":"InputFile"},{"name":"thumb","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"-1821749571","predicate":"inputMediaVideo","params":[{"name":"id","type":"InputVideo"},{"name":"caption","type":"string"}],"type":"InputMedia"},{"id":"480546647","predicate":"inputChatPhotoEmpty","params":[],"type":"InputChatPhoto"},{"id":"-1809496270","predicate":"inputChatUploadedPhoto","params":[{"name":"file","type":"InputFile"},{"name":"crop","type":"InputPhotoCrop"}],"type":"InputChatPhoto"},{"id":"-1293828344","predicate":"inputChatPhoto","params":[{"name":"id","type":"InputPhoto"},{"name":"crop","type":"InputPhotoCrop"}],"type":"InputChatPhoto"},{"id":"-457104426","predicate":"inputGeoPointEmpty","params":[],"type":"InputGeoPoint"},{"id":"-206066487","predicate":"inputGeoPoint","params":[{"name":"lat","type":"double"},{"name":"long","type":"double"}],"type":"InputGeoPoint"},{"id":"483901197","predicate":"inputPhotoEmpty","params":[],"type":"InputPhoto"},{"id":"-74070332","predicate":"inputPhoto","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputPhoto"},{"id":"1426648181","predicate":"inputVideoEmpty","params":[],"type":"InputVideo"},{"id":"-296249774","predicate":"inputVideo","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputVideo"},{"id":"342061462","predicate":"inputFileLocation","params":[{"name":"volume_id","type":"long"},{"name":"local_id","type":"int"},{"name":"secret","type":"long"}],"type":"InputFileLocation"},{"id":"1023632620","predicate":"inputVideoFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"-1377390588","predicate":"inputPhotoCropAuto","params":[],"type":"InputPhotoCrop"},{"id":"-644787419","predicate":"inputPhotoCrop","params":[{"name":"crop_left","type":"double"},{"name":"crop_top","type":"double"},{"name":"crop_width","type":"double"}],"type":"InputPhotoCrop"},{"id":"1996904104","predicate":"inputAppEvent","params":[{"name":"time","type":"double"},{"name":"type","type":"string"},{"name":"peer","type":"long"},{"name":"data","type":"string"}],"type":"InputAppEvent"},{"id":"-1649296275","predicate":"peerUser","params":[{"name":"user_id","type":"int"}],"type":"Peer"},{"id":"-1160714821","predicate":"peerChat","params":[{"name":"chat_id","type":"int"}],"type":"Peer"},{"id":"-1432995067","predicate":"storage.fileUnknown","params":[],"type":"storage.FileType"},{"id":"8322574","predicate":"storage.fileJpeg","params":[],"type":"storage.FileType"},{"id":"-891180321","predicate":"storage.fileGif","params":[],"type":"storage.FileType"},{"id":"172975040","predicate":"storage.filePng","params":[],"type":"storage.FileType"},{"id":"-1373745011","predicate":"storage.filePdf","params":[],"type":"storage.FileType"},{"id":"1384777335","predicate":"storage.fileMp3","params":[],"type":"storage.FileType"},{"id":"1258941372","predicate":"storage.fileMov","params":[],"type":"storage.FileType"},{"id":"1086091090","predicate":"storage.filePartial","params":[],"type":"storage.FileType"},{"id":"-1278304028","predicate":"storage.fileMp4","params":[],"type":"storage.FileType"},{"id":"276907596","predicate":"storage.fileWebp","params":[],"type":"storage.FileType"},{"id":"2086234950","predicate":"fileLocationUnavailable","params":[{"name":"volume_id","type":"long"},{"name":"local_id","type":"int"},{"name":"secret","type":"long"}],"type":"FileLocation"},{"id":"1406570614","predicate":"fileLocation","params":[{"name":"dc_id","type":"int"},{"name":"volume_id","type":"long"},{"name":"local_id","type":"int"},{"name":"secret","type":"long"}],"type":"FileLocation"},{"id":"537022650","predicate":"userEmpty","params":[{"name":"id","type":"int"}],"type":"User"},{"id":"1326562017","predicate":"userProfilePhotoEmpty","params":[],"type":"UserProfilePhoto"},{"id":"-715532088","predicate":"userProfilePhoto","params":[{"name":"photo_id","type":"long"},{"name":"photo_small","type":"FileLocation"},{"name":"photo_big","type":"FileLocation"}],"type":"UserProfilePhoto"},{"id":"164646985","predicate":"userStatusEmpty","params":[],"type":"UserStatus"},{"id":"-306628279","predicate":"userStatusOnline","params":[{"name":"expires","type":"int"}],"type":"UserStatus"},{"id":"9203775","predicate":"userStatusOffline","params":[{"name":"was_online","type":"int"}],"type":"UserStatus"},{"id":"-1683826688","predicate":"chatEmpty","params":[{"name":"id","type":"int"}],"type":"Chat"},{"id":"1855757255","predicate":"chat","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"photo","type":"ChatPhoto"},{"name":"participants_count","type":"int"},{"name":"date","type":"int"},{"name":"left","type":"Bool"},{"name":"version","type":"int"}],"type":"Chat"},{"id":"-83047359","predicate":"chatForbidden","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"date","type":"int"}],"type":"Chat"},{"id":"771925524","predicate":"chatFull","params":[{"name":"id","type":"int"},{"name":"participants","type":"ChatParticipants"},{"name":"chat_photo","type":"Photo"},{"name":"notify_settings","type":"PeerNotifySettings"},{"name":"exported_invite","type":"ExportedChatInvite"},{"name":"bot_info","type":"Vector"}],"type":"ChatFull"},{"id":"-925415106","predicate":"chatParticipant","params":[{"name":"user_id","type":"int"},{"name":"inviter_id","type":"int"},{"name":"date","type":"int"}],"type":"ChatParticipant"},{"id":"265468810","predicate":"chatParticipantsForbidden","params":[{"name":"chat_id","type":"int"}],"type":"ChatParticipants"},{"id":"2017571861","predicate":"chatParticipants","params":[{"name":"chat_id","type":"int"},{"name":"admin_id","type":"int"},{"name":"participants","type":"Vector"},{"name":"version","type":"int"}],"type":"ChatParticipants"},{"id":"935395612","predicate":"chatPhotoEmpty","params":[],"type":"ChatPhoto"},{"id":"1632839530","predicate":"chatPhoto","params":[{"name":"photo_small","type":"FileLocation"},{"name":"photo_big","type":"FileLocation"}],"type":"ChatPhoto"},{"id":"-2082087340","predicate":"messageEmpty","params":[{"name":"id","type":"int"}],"type":"Message"},{"id":"-1023016155","predicate":"message","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"name":"fwd_from_id","type":"flags.2?int"},{"name":"fwd_date","type":"flags.2?int"},{"name":"reply_to_msg_id","type":"flags.3?int"},{"name":"date","type":"int"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"},{"name":"reply_markup","type":"flags.6?ReplyMarkup"}],"type":"Message"},{"id":"495384334","predicate":"messageService","params":[{"name":"flags","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"name":"date","type":"int"},{"name":"action","type":"MessageAction"}],"type":"Message"},{"id":"1038967584","predicate":"messageMediaEmpty","params":[],"type":"MessageMedia"},{"id":"1032643901","predicate":"messageMediaPhoto","params":[{"name":"photo","type":"Photo"},{"name":"caption","type":"string"}],"type":"MessageMedia"},{"id":"1540298357","predicate":"messageMediaVideo","params":[{"name":"video","type":"Video"},{"name":"caption","type":"string"}],"type":"MessageMedia"},{"id":"1457575028","predicate":"messageMediaGeo","params":[{"name":"geo","type":"GeoPoint"}],"type":"MessageMedia"},{"id":"1585262393","predicate":"messageMediaContact","params":[{"name":"phone_number","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"user_id","type":"int"}],"type":"MessageMedia"},{"id":"-1618676578","predicate":"messageMediaUnsupported","params":[],"type":"MessageMedia"},{"id":"-1230047312","predicate":"messageActionEmpty","params":[],"type":"MessageAction"},{"id":"-1503425638","predicate":"messageActionChatCreate","params":[{"name":"title","type":"string"},{"name":"users","type":"Vector"}],"type":"MessageAction"},{"id":"-1247687078","predicate":"messageActionChatEditTitle","params":[{"name":"title","type":"string"}],"type":"MessageAction"},{"id":"2144015272","predicate":"messageActionChatEditPhoto","params":[{"name":"photo","type":"Photo"}],"type":"MessageAction"},{"id":"-1780220945","predicate":"messageActionChatDeletePhoto","params":[],"type":"MessageAction"},{"id":"1581055051","predicate":"messageActionChatAddUser","params":[{"name":"user_id","type":"int"}],"type":"MessageAction"},{"id":"-1297179892","predicate":"messageActionChatDeleteUser","params":[{"name":"user_id","type":"int"}],"type":"MessageAction"},{"id":"-1042448310","predicate":"dialog","params":[{"name":"peer","type":"Peer"},{"name":"top_message","type":"int"},{"name":"read_inbox_max_id","type":"int"},{"name":"unread_count","type":"int"},{"name":"notify_settings","type":"PeerNotifySettings"}],"type":"Dialog"},{"id":"590459437","predicate":"photoEmpty","params":[{"name":"id","type":"long"}],"type":"Photo"},{"id":"-840088834","predicate":"photo","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"sizes","type":"Vector"}],"type":"Photo"},{"id":"236446268","predicate":"photoSizeEmpty","params":[{"name":"type","type":"string"}],"type":"PhotoSize"},{"id":"2009052699","predicate":"photoSize","params":[{"name":"type","type":"string"},{"name":"location","type":"FileLocation"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"size","type":"int"}],"type":"PhotoSize"},{"id":"-374917894","predicate":"photoCachedSize","params":[{"name":"type","type":"string"},{"name":"location","type":"FileLocation"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"bytes","type":"bytes"}],"type":"PhotoSize"},{"id":"-1056548696","predicate":"videoEmpty","params":[{"name":"id","type":"long"}],"type":"Video"},{"id":"-148338733","predicate":"video","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"duration","type":"int"},{"name":"mime_type","type":"string"},{"name":"size","type":"int"},{"name":"thumb","type":"PhotoSize"},{"name":"dc_id","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"Video"},{"id":"286776671","predicate":"geoPointEmpty","params":[],"type":"GeoPoint"},{"id":"541710092","predicate":"geoPoint","params":[{"name":"long","type":"double"},{"name":"lat","type":"double"}],"type":"GeoPoint"},{"id":"-2128698738","predicate":"auth.checkedPhone","params":[{"name":"phone_registered","type":"Bool"}],"type":"auth.CheckedPhone"},{"id":"-269659687","predicate":"auth.sentCode","params":[{"name":"phone_registered","type":"Bool"},{"name":"phone_code_hash","type":"string"},{"name":"send_call_timeout","type":"int"},{"name":"is_password","type":"Bool"}],"type":"auth.SentCode"},{"id":"-16553231","predicate":"auth.authorization","params":[{"name":"user","type":"User"}],"type":"auth.Authorization"},{"id":"-543777747","predicate":"auth.exportedAuthorization","params":[{"name":"id","type":"int"},{"name":"bytes","type":"bytes"}],"type":"auth.ExportedAuthorization"},{"id":"-1195615476","predicate":"inputNotifyPeer","params":[{"name":"peer","type":"InputPeer"}],"type":"InputNotifyPeer"},{"id":"423314455","predicate":"inputNotifyUsers","params":[],"type":"InputNotifyPeer"},{"id":"1251338318","predicate":"inputNotifyChats","params":[],"type":"InputNotifyPeer"},{"id":"-1540769658","predicate":"inputNotifyAll","params":[],"type":"InputNotifyPeer"},{"id":"-265263912","predicate":"inputPeerNotifyEventsEmpty","params":[],"type":"InputPeerNotifyEvents"},{"id":"-395694988","predicate":"inputPeerNotifyEventsAll","params":[],"type":"InputPeerNotifyEvents"},{"id":"1185074840","predicate":"inputPeerNotifySettings","params":[{"name":"mute_until","type":"int"},{"name":"sound","type":"string"},{"name":"show_previews","type":"Bool"},{"name":"events_mask","type":"int"}],"type":"InputPeerNotifySettings"},{"id":"-1378534221","predicate":"peerNotifyEventsEmpty","params":[],"type":"PeerNotifyEvents"},{"id":"1830677896","predicate":"peerNotifyEventsAll","params":[],"type":"PeerNotifyEvents"},{"id":"1889961234","predicate":"peerNotifySettingsEmpty","params":[],"type":"PeerNotifySettings"},{"id":"-1923214866","predicate":"peerNotifySettings","params":[{"name":"mute_until","type":"int"},{"name":"sound","type":"string"},{"name":"show_previews","type":"Bool"},{"name":"events_mask","type":"int"}],"type":"PeerNotifySettings"},{"id":"-860866985","predicate":"wallPaper","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"sizes","type":"Vector"},{"name":"color","type":"int"}],"type":"WallPaper"},{"id":"1518971995","predicate":"userFull","params":[{"name":"user","type":"User"},{"name":"link","type":"contacts.Link"},{"name":"profile_photo","type":"Photo"},{"name":"notify_settings","type":"PeerNotifySettings"},{"name":"blocked","type":"Bool"},{"name":"bot_info","type":"BotInfo"}],"type":"UserFull"},{"id":"-116274796","predicate":"contact","params":[{"name":"user_id","type":"int"},{"name":"mutual","type":"Bool"}],"type":"Contact"},{"id":"-805141448","predicate":"importedContact","params":[{"name":"user_id","type":"int"},{"name":"client_id","type":"long"}],"type":"ImportedContact"},{"id":"1444661369","predicate":"contactBlocked","params":[{"name":"user_id","type":"int"},{"name":"date","type":"int"}],"type":"ContactBlocked"},{"id":"1038193057","predicate":"contactSuggested","params":[{"name":"user_id","type":"int"},{"name":"mutual_contacts","type":"int"}],"type":"ContactSuggested"},{"id":"-748155807","predicate":"contactStatus","params":[{"name":"user_id","type":"int"},{"name":"status","type":"UserStatus"}],"type":"ContactStatus"},{"id":"909233996","predicate":"chatLocated","params":[{"name":"chat_id","type":"int"},{"name":"distance","type":"int"}],"type":"ChatLocated"},{"id":"986597452","predicate":"contacts.link","params":[{"name":"my_link","type":"ContactLink"},{"name":"foreign_link","type":"ContactLink"},{"name":"user","type":"User"}],"type":"contacts.Link"},{"id":"-1219778094","predicate":"contacts.contactsNotModified","params":[],"type":"contacts.Contacts"},{"id":"1871416498","predicate":"contacts.contacts","params":[{"name":"contacts","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Contacts"},{"id":"-1387117803","predicate":"contacts.importedContacts","params":[{"name":"imported","type":"Vector"},{"name":"retry_contacts","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.ImportedContacts"},{"id":"471043349","predicate":"contacts.blocked","params":[{"name":"blocked","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Blocked"},{"id":"-1878523231","predicate":"contacts.blockedSlice","params":[{"name":"count","type":"int"},{"name":"blocked","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Blocked"},{"id":"1447681221","predicate":"contacts.suggested","params":[{"name":"results","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Suggested"},{"id":"364538944","predicate":"messages.dialogs","params":[{"name":"dialogs","type":"Vector"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Dialogs"},{"id":"1910543603","predicate":"messages.dialogsSlice","params":[{"name":"count","type":"int"},{"name":"dialogs","type":"Vector"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Dialogs"},{"id":"-1938715001","predicate":"messages.messages","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Messages"},{"id":"189033187","predicate":"messages.messagesSlice","params":[{"name":"count","type":"int"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Messages"},{"id":"1062078024","predicate":"messages.messageEmpty","params":[],"type":"messages.Message"},{"id":"1279084531","predicate":"messages.sentMessage","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"media","type":"MessageMedia"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"messages.SentMessage"},{"id":"1694474197","predicate":"messages.chats","params":[{"name":"chats","type":"Vector"}],"type":"messages.Chats"},{"id":"-438840932","predicate":"messages.chatFull","params":[{"name":"full_chat","type":"ChatFull"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.ChatFull"},{"id":"-1269012015","predicate":"messages.affectedHistory","params":[{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"1474492012","predicate":"inputMessagesFilterEmpty","params":[],"type":"MessagesFilter"},{"id":"-1777752804","predicate":"inputMessagesFilterPhotos","params":[],"type":"MessagesFilter"},{"id":"-1614803355","predicate":"inputMessagesFilterVideo","params":[],"type":"MessagesFilter"},{"id":"1458172132","predicate":"inputMessagesFilterPhotoVideo","params":[],"type":"MessagesFilter"},{"id":"-648121413","predicate":"inputMessagesFilterPhotoVideoDocuments","params":[],"type":"MessagesFilter"},{"id":"-1629621880","predicate":"inputMessagesFilterDocument","params":[],"type":"MessagesFilter"},{"id":"-808946398","predicate":"inputMessagesFilterAudio","params":[],"type":"MessagesFilter"},{"id":"1526462308","predicate":"inputMessagesFilterAudioDocuments","params":[],"type":"MessagesFilter"},{"id":"522914557","predicate":"updateNewMessage","params":[{"name":"message","type":"Message"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"1318109142","predicate":"updateMessageID","params":[{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"Update"},{"id":"-1576161051","predicate":"updateDeleteMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"1548249383","predicate":"updateUserTyping","params":[{"name":"user_id","type":"int"},{"name":"action","type":"SendMessageAction"}],"type":"Update"},{"id":"-1704596961","predicate":"updateChatUserTyping","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"int"},{"name":"action","type":"SendMessageAction"}],"type":"Update"},{"id":"125178264","predicate":"updateChatParticipants","params":[{"name":"participants","type":"ChatParticipants"}],"type":"Update"},{"id":"469489699","predicate":"updateUserStatus","params":[{"name":"user_id","type":"int"},{"name":"status","type":"UserStatus"}],"type":"Update"},{"id":"-1489818765","predicate":"updateUserName","params":[{"name":"user_id","type":"int"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"},{"name":"username","type":"string"}],"type":"Update"},{"id":"-1791935732","predicate":"updateUserPhoto","params":[{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"photo","type":"UserProfilePhoto"},{"name":"previous","type":"Bool"}],"type":"Update"},{"id":"628472761","predicate":"updateContactRegistered","params":[{"name":"user_id","type":"int"},{"name":"date","type":"int"}],"type":"Update"},{"id":"-1657903163","predicate":"updateContactLink","params":[{"name":"user_id","type":"int"},{"name":"my_link","type":"ContactLink"},{"name":"foreign_link","type":"ContactLink"}],"type":"Update"},{"id":"-1895411046","predicate":"updateNewAuthorization","params":[{"name":"auth_key_id","type":"long"},{"name":"date","type":"int"},{"name":"device","type":"string"},{"name":"location","type":"string"}],"type":"Update"},{"id":"-1519637954","predicate":"updates.state","params":[{"name":"pts","type":"int"},{"name":"qts","type":"int"},{"name":"date","type":"int"},{"name":"seq","type":"int"},{"name":"unread_count","type":"int"}],"type":"updates.State"},{"id":"1567990072","predicate":"updates.differenceEmpty","params":[{"name":"date","type":"int"},{"name":"seq","type":"int"}],"type":"updates.Difference"},{"id":"16030880","predicate":"updates.difference","params":[{"name":"new_messages","type":"Vector"},{"name":"new_encrypted_messages","type":"Vector"},{"name":"other_updates","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"state","type":"updates.State"}],"type":"updates.Difference"},{"id":"-1459938943","predicate":"updates.differenceSlice","params":[{"name":"new_messages","type":"Vector"},{"name":"new_encrypted_messages","type":"Vector"},{"name":"other_updates","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"intermediate_state","type":"updates.State"}],"type":"updates.Difference"},{"id":"-484987010","predicate":"updatesTooLong","params":[],"type":"Updates"},{"id":"-312729305","predicate":"updateShortMessage","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"user_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"date","type":"int"},{"name":"fwd_from_id","type":"flags.2?int"},{"name":"fwd_date","type":"flags.2?int"},{"name":"reply_to_msg_id","type":"flags.3?int"}],"type":"Updates"},{"id":"1378061116","predicate":"updateShortChatMessage","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"chat_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"date","type":"int"},{"name":"fwd_from_id","type":"flags.2?int"},{"name":"fwd_date","type":"flags.2?int"},{"name":"reply_to_msg_id","type":"flags.3?int"}],"type":"Updates"},{"id":"2027216577","predicate":"updateShort","params":[{"name":"update","type":"Update"},{"name":"date","type":"int"}],"type":"Updates"},{"id":"1918567619","predicate":"updatesCombined","params":[{"name":"updates","type":"Vector"},{"name":"users","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"date","type":"int"},{"name":"seq_start","type":"int"},{"name":"seq","type":"int"}],"type":"Updates"},{"id":"1957577280","predicate":"updates","params":[{"name":"updates","type":"Vector"},{"name":"users","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"date","type":"int"},{"name":"seq","type":"int"}],"type":"Updates"},{"id":"-1916114267","predicate":"photos.photos","params":[{"name":"photos","type":"Vector"},{"name":"users","type":"Vector"}],"type":"photos.Photos"},{"id":"352657236","predicate":"photos.photosSlice","params":[{"name":"count","type":"int"},{"name":"photos","type":"Vector"},{"name":"users","type":"Vector"}],"type":"photos.Photos"},{"id":"539045032","predicate":"photos.photo","params":[{"name":"photo","type":"Photo"},{"name":"users","type":"Vector"}],"type":"photos.Photo"},{"id":"157948117","predicate":"upload.file","params":[{"name":"type","type":"storage.FileType"},{"name":"mtime","type":"int"},{"name":"bytes","type":"bytes"}],"type":"upload.File"},{"id":"98092748","predicate":"dcOption","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"ip_address","type":"string"},{"name":"port","type":"int"}],"type":"DcOption"},{"id":"1311946900","predicate":"config","params":[{"name":"date","type":"int"},{"name":"expires","type":"int"},{"name":"test_mode","type":"Bool"},{"name":"this_dc","type":"int"},{"name":"dc_options","type":"Vector"},{"name":"chat_size_max","type":"int"},{"name":"broadcast_size_max","type":"int"},{"name":"forwarded_count_max","type":"int"},{"name":"online_update_period_ms","type":"int"},{"name":"offline_blur_timeout_ms","type":"int"},{"name":"offline_idle_timeout_ms","type":"int"},{"name":"online_cloud_timeout_ms","type":"int"},{"name":"notify_cloud_delay_ms","type":"int"},{"name":"notify_default_delay_ms","type":"int"},{"name":"chat_big_size","type":"int"},{"name":"push_chat_period_ms","type":"int"},{"name":"push_chat_limit","type":"int"},{"name":"disabled_features","type":"Vector"}],"type":"Config"},{"id":"-1910892683","predicate":"nearestDc","params":[{"name":"country","type":"string"},{"name":"this_dc","type":"int"},{"name":"nearest_dc","type":"int"}],"type":"NearestDc"},{"id":"-1987579119","predicate":"help.appUpdate","params":[{"name":"id","type":"int"},{"name":"critical","type":"Bool"},{"name":"url","type":"string"},{"name":"text","type":"string"}],"type":"help.AppUpdate"},{"id":"-1000708810","predicate":"help.noAppUpdate","params":[],"type":"help.AppUpdate"},{"id":"415997816","predicate":"help.inviteText","params":[{"name":"message","type":"string"}],"type":"help.InviteText"},{"id":"899786339","predicate":"messages.sentMessageLink","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"media","type":"MessageMedia"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"},{"name":"links","type":"Vector"},{"name":"seq","type":"int"}],"type":"messages.SentMessage"},{"id":"1960072954","predicate":"inputGeoChat","params":[{"name":"chat_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputGeoChat"},{"id":"1301143240","predicate":"inputNotifyGeoChatPeer","params":[{"name":"peer","type":"InputGeoChat"}],"type":"InputNotifyPeer"},{"id":"1978329690","predicate":"geoChat","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"title","type":"string"},{"name":"address","type":"string"},{"name":"venue","type":"string"},{"name":"geo","type":"GeoPoint"},{"name":"photo","type":"ChatPhoto"},{"name":"participants_count","type":"int"},{"name":"date","type":"int"},{"name":"checked_in","type":"Bool"},{"name":"version","type":"int"}],"type":"Chat"},{"id":"1613830811","predicate":"geoChatMessageEmpty","params":[{"name":"chat_id","type":"int"},{"name":"id","type":"int"}],"type":"GeoChatMessage"},{"id":"1158019297","predicate":"geoChatMessage","params":[{"name":"chat_id","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"date","type":"int"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"}],"type":"GeoChatMessage"},{"id":"-749755826","predicate":"geoChatMessageService","params":[{"name":"chat_id","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"date","type":"int"},{"name":"action","type":"MessageAction"}],"type":"GeoChatMessage"},{"id":"397498251","predicate":"geochats.statedMessage","params":[{"name":"message","type":"GeoChatMessage"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"seq","type":"int"}],"type":"geochats.StatedMessage"},{"id":"1224651367","predicate":"geochats.located","params":[{"name":"results","type":"Vector"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"geochats.Located"},{"id":"-783127119","predicate":"geochats.messages","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"geochats.Messages"},{"id":"-1135057944","predicate":"geochats.messagesSlice","params":[{"name":"count","type":"int"},{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"geochats.Messages"},{"id":"1862504124","predicate":"messageActionGeoChatCreate","params":[{"name":"title","type":"string"},{"name":"address","type":"string"}],"type":"MessageAction"},{"id":"209540062","predicate":"messageActionGeoChatCheckin","params":[],"type":"MessageAction"},{"id":"1516823543","predicate":"updateNewGeoChatMessage","params":[{"name":"message","type":"GeoChatMessage"}],"type":"Update"},{"id":"1662091044","predicate":"wallPaperSolid","params":[{"name":"id","type":"int"},{"name":"title","type":"string"},{"name":"bg_color","type":"int"},{"name":"color","type":"int"}],"type":"WallPaper"},{"id":"314359194","predicate":"updateNewEncryptedMessage","params":[{"name":"message","type":"EncryptedMessage"},{"name":"qts","type":"int"}],"type":"Update"},{"id":"386986326","predicate":"updateEncryptedChatTyping","params":[{"name":"chat_id","type":"int"}],"type":"Update"},{"id":"-1264392051","predicate":"updateEncryption","params":[{"name":"chat","type":"EncryptedChat"},{"name":"date","type":"int"}],"type":"Update"},{"id":"956179895","predicate":"updateEncryptedMessagesRead","params":[{"name":"chat_id","type":"int"},{"name":"max_date","type":"int"},{"name":"date","type":"int"}],"type":"Update"},{"id":"-1417756512","predicate":"encryptedChatEmpty","params":[{"name":"id","type":"int"}],"type":"EncryptedChat"},{"id":"1006044124","predicate":"encryptedChatWaiting","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"admin_id","type":"int"},{"name":"participant_id","type":"int"}],"type":"EncryptedChat"},{"id":"-931638658","predicate":"encryptedChatRequested","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"admin_id","type":"int"},{"name":"participant_id","type":"int"},{"name":"g_a","type":"bytes"}],"type":"EncryptedChat"},{"id":"-94974410","predicate":"encryptedChat","params":[{"name":"id","type":"int"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"admin_id","type":"int"},{"name":"participant_id","type":"int"},{"name":"g_a_or_b","type":"bytes"},{"name":"key_fingerprint","type":"long"}],"type":"EncryptedChat"},{"id":"332848423","predicate":"encryptedChatDiscarded","params":[{"name":"id","type":"int"}],"type":"EncryptedChat"},{"id":"-247351839","predicate":"inputEncryptedChat","params":[{"name":"chat_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputEncryptedChat"},{"id":"-1038136962","predicate":"encryptedFileEmpty","params":[],"type":"EncryptedFile"},{"id":"1248893260","predicate":"encryptedFile","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"size","type":"int"},{"name":"dc_id","type":"int"},{"name":"key_fingerprint","type":"int"}],"type":"EncryptedFile"},{"id":"406307684","predicate":"inputEncryptedFileEmpty","params":[],"type":"InputEncryptedFile"},{"id":"1690108678","predicate":"inputEncryptedFileUploaded","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"md5_checksum","type":"string"},{"name":"key_fingerprint","type":"int"}],"type":"InputEncryptedFile"},{"id":"1511503333","predicate":"inputEncryptedFile","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputEncryptedFile"},{"id":"-182231723","predicate":"inputEncryptedFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"-317144808","predicate":"encryptedMessage","params":[{"name":"random_id","type":"long"},{"name":"chat_id","type":"int"},{"name":"date","type":"int"},{"name":"bytes","type":"bytes"},{"name":"file","type":"EncryptedFile"}],"type":"EncryptedMessage"},{"id":"594758406","predicate":"encryptedMessageService","params":[{"name":"random_id","type":"long"},{"name":"chat_id","type":"int"},{"name":"date","type":"int"},{"name":"bytes","type":"bytes"}],"type":"EncryptedMessage"},{"id":"-1058912715","predicate":"messages.dhConfigNotModified","params":[{"name":"random","type":"bytes"}],"type":"messages.DhConfig"},{"id":"740433629","predicate":"messages.dhConfig","params":[{"name":"g","type":"int"},{"name":"p","type":"bytes"},{"name":"version","type":"int"},{"name":"random","type":"bytes"}],"type":"messages.DhConfig"},{"id":"1443858741","predicate":"messages.sentEncryptedMessage","params":[{"name":"date","type":"int"}],"type":"messages.SentEncryptedMessage"},{"id":"-1802240206","predicate":"messages.sentEncryptedFile","params":[{"name":"date","type":"int"},{"name":"file","type":"EncryptedFile"}],"type":"messages.SentEncryptedMessage"},{"id":"-95482955","predicate":"inputFileBig","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"name","type":"string"}],"type":"InputFile"},{"id":"767652808","predicate":"inputEncryptedFileBigUploaded","params":[{"name":"id","type":"long"},{"name":"parts","type":"int"},{"name":"key_fingerprint","type":"int"}],"type":"InputEncryptedFile"},{"id":"974056226","predicate":"updateChatParticipantAdd","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"int"},{"name":"inviter_id","type":"int"},{"name":"version","type":"int"}],"type":"Update"},{"id":"1851755554","predicate":"updateChatParticipantDelete","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"int"},{"name":"version","type":"int"}],"type":"Update"},{"id":"-1906403213","predicate":"updateDcOptions","params":[{"name":"dc_options","type":"Vector"}],"type":"Update"},{"id":"1313442987","predicate":"inputMediaUploadedAudio","params":[{"name":"file","type":"InputFile"},{"name":"duration","type":"int"},{"name":"mime_type","type":"string"}],"type":"InputMedia"},{"id":"-1986820223","predicate":"inputMediaAudio","params":[{"name":"id","type":"InputAudio"}],"type":"InputMedia"},{"id":"-1610888","predicate":"inputMediaUploadedDocument","params":[{"name":"file","type":"InputFile"},{"name":"mime_type","type":"string"},{"name":"attributes","type":"Vector"}],"type":"InputMedia"},{"id":"1095242886","predicate":"inputMediaUploadedThumbDocument","params":[{"name":"file","type":"InputFile"},{"name":"thumb","type":"InputFile"},{"name":"mime_type","type":"string"},{"name":"attributes","type":"Vector"}],"type":"InputMedia"},{"id":"-779818943","predicate":"inputMediaDocument","params":[{"name":"id","type":"InputDocument"}],"type":"InputMedia"},{"id":"802824708","predicate":"messageMediaDocument","params":[{"name":"document","type":"Document"}],"type":"MessageMedia"},{"id":"-961117440","predicate":"messageMediaAudio","params":[{"name":"audio","type":"Audio"}],"type":"MessageMedia"},{"id":"-648356732","predicate":"inputAudioEmpty","params":[],"type":"InputAudio"},{"id":"2010398975","predicate":"inputAudio","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputAudio"},{"id":"1928391342","predicate":"inputDocumentEmpty","params":[],"type":"InputDocument"},{"id":"410618194","predicate":"inputDocument","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputDocument"},{"id":"1960591437","predicate":"inputAudioFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"1313188841","predicate":"inputDocumentFileLocation","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputFileLocation"},{"id":"1483311320","predicate":"audioEmpty","params":[{"name":"id","type":"long"}],"type":"Audio"},{"id":"-102543275","predicate":"audio","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"duration","type":"int"},{"name":"mime_type","type":"string"},{"name":"size","type":"int"},{"name":"dc_id","type":"int"}],"type":"Audio"},{"id":"922273905","predicate":"documentEmpty","params":[{"name":"id","type":"long"}],"type":"Document"},{"id":"-106717361","predicate":"document","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"date","type":"int"},{"name":"mime_type","type":"string"},{"name":"size","type":"int"},{"name":"thumb","type":"PhotoSize"},{"name":"dc_id","type":"int"},{"name":"attributes","type":"Vector"}],"type":"Document"},{"id":"398898678","predicate":"help.support","params":[{"name":"phone_number","type":"string"},{"name":"user","type":"User"}],"type":"help.Support"},{"id":"-1613493288","predicate":"notifyPeer","params":[{"name":"peer","type":"Peer"}],"type":"NotifyPeer"},{"id":"-1261946036","predicate":"notifyUsers","params":[],"type":"NotifyPeer"},{"id":"-1073230141","predicate":"notifyChats","params":[],"type":"NotifyPeer"},{"id":"1959820384","predicate":"notifyAll","params":[],"type":"NotifyPeer"},{"id":"-2131957734","predicate":"updateUserBlocked","params":[{"name":"user_id","type":"int"},{"name":"blocked","type":"Bool"}],"type":"Update"},{"id":"-1094555409","predicate":"updateNotifySettings","params":[{"name":"peer","type":"NotifyPeer"},{"name":"notify_settings","type":"PeerNotifySettings"}],"type":"Update"},{"id":"-484053553","predicate":"auth.sentAppCode","params":[{"name":"phone_registered","type":"Bool"},{"name":"phone_code_hash","type":"string"},{"name":"send_call_timeout","type":"int"},{"name":"is_password","type":"Bool"}],"type":"auth.SentCode"},{"id":"381645902","predicate":"sendMessageTypingAction","params":[],"type":"SendMessageAction"},{"id":"-44119819","predicate":"sendMessageCancelAction","params":[],"type":"SendMessageAction"},{"id":"-1584933265","predicate":"sendMessageRecordVideoAction","params":[],"type":"SendMessageAction"},{"id":"-378127636","predicate":"sendMessageUploadVideoAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"-718310409","predicate":"sendMessageRecordAudioAction","params":[],"type":"SendMessageAction"},{"id":"-212740181","predicate":"sendMessageUploadAudioAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"-774682074","predicate":"sendMessageUploadPhotoAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"-1441998364","predicate":"sendMessageUploadDocumentAction","params":[{"name":"progress","type":"int"}],"type":"SendMessageAction"},{"id":"393186209","predicate":"sendMessageGeoLocationAction","params":[],"type":"SendMessageAction"},{"id":"1653390447","predicate":"sendMessageChooseContactAction","params":[],"type":"SendMessageAction"},{"id":"-360210539","predicate":"contactFound","params":[{"name":"user_id","type":"int"}],"type":"ContactFound"},{"id":"90570766","predicate":"contacts.found","params":[{"name":"results","type":"Vector"},{"name":"users","type":"Vector"}],"type":"contacts.Found"},{"id":"942527460","predicate":"updateServiceNotification","params":[{"name":"type","type":"string"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"},{"name":"popup","type":"Bool"}],"type":"Update"},{"id":"-496024847","predicate":"userStatusRecently","params":[],"type":"UserStatus"},{"id":"129960444","predicate":"userStatusLastWeek","params":[],"type":"UserStatus"},{"id":"2011940674","predicate":"userStatusLastMonth","params":[],"type":"UserStatus"},{"id":"-298113238","predicate":"updatePrivacy","params":[{"name":"key","type":"PrivacyKey"},{"name":"rules","type":"Vector"}],"type":"Update"},{"id":"1335282456","predicate":"inputPrivacyKeyStatusTimestamp","params":[],"type":"InputPrivacyKey"},{"id":"-1137792208","predicate":"privacyKeyStatusTimestamp","params":[],"type":"PrivacyKey"},{"id":"218751099","predicate":"inputPrivacyValueAllowContacts","params":[],"type":"InputPrivacyRule"},{"id":"407582158","predicate":"inputPrivacyValueAllowAll","params":[],"type":"InputPrivacyRule"},{"id":"320652927","predicate":"inputPrivacyValueAllowUsers","params":[{"name":"users","type":"Vector"}],"type":"InputPrivacyRule"},{"id":"195371015","predicate":"inputPrivacyValueDisallowContacts","params":[],"type":"InputPrivacyRule"},{"id":"-697604407","predicate":"inputPrivacyValueDisallowAll","params":[],"type":"InputPrivacyRule"},{"id":"-1877932953","predicate":"inputPrivacyValueDisallowUsers","params":[{"name":"users","type":"Vector"}],"type":"InputPrivacyRule"},{"id":"-123988","predicate":"privacyValueAllowContacts","params":[],"type":"PrivacyRule"},{"id":"1698855810","predicate":"privacyValueAllowAll","params":[],"type":"PrivacyRule"},{"id":"1297858060","predicate":"privacyValueAllowUsers","params":[{"name":"users","type":"Vector"}],"type":"PrivacyRule"},{"id":"-125240806","predicate":"privacyValueDisallowContacts","params":[],"type":"PrivacyRule"},{"id":"-1955338397","predicate":"privacyValueDisallowAll","params":[],"type":"PrivacyRule"},{"id":"209668535","predicate":"privacyValueDisallowUsers","params":[{"name":"users","type":"Vector"}],"type":"PrivacyRule"},{"id":"1430961007","predicate":"account.privacyRules","params":[{"name":"rules","type":"Vector"},{"name":"users","type":"Vector"}],"type":"account.PrivacyRules"},{"id":"-1194283041","predicate":"accountDaysTTL","params":[{"name":"days","type":"int"}],"type":"AccountDaysTTL"},{"id":"-1527411636","predicate":"account.sentChangePhoneCode","params":[{"name":"phone_code_hash","type":"string"},{"name":"send_call_timeout","type":"int"}],"type":"account.SentChangePhoneCode"},{"id":"314130811","predicate":"updateUserPhone","params":[{"name":"user_id","type":"int"},{"name":"phone","type":"string"}],"type":"Update"},{"id":"1815593308","predicate":"documentAttributeImageSize","params":[{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"DocumentAttribute"},{"id":"297109817","predicate":"documentAttributeAnimated","params":[],"type":"DocumentAttribute"},{"id":"978674434","predicate":"documentAttributeSticker","params":[{"name":"alt","type":"string"},{"name":"stickerset","type":"InputStickerSet"}],"type":"DocumentAttribute"},{"id":"1494273227","predicate":"documentAttributeVideo","params":[{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"DocumentAttribute"},{"id":"-556656416","predicate":"documentAttributeAudio","params":[{"name":"duration","type":"int"},{"name":"title","type":"string"},{"name":"performer","type":"string"}],"type":"DocumentAttribute"},{"id":"358154344","predicate":"documentAttributeFilename","params":[{"name":"file_name","type":"string"}],"type":"DocumentAttribute"},{"id":"-244016606","predicate":"messages.stickersNotModified","params":[],"type":"messages.Stickers"},{"id":"-1970352846","predicate":"messages.stickers","params":[{"name":"hash","type":"string"},{"name":"stickers","type":"Vector"}],"type":"messages.Stickers"},{"id":"313694676","predicate":"stickerPack","params":[{"name":"emoticon","type":"string"},{"name":"documents","type":"Vector"}],"type":"StickerPack"},{"id":"-395967805","predicate":"messages.allStickersNotModified","params":[],"type":"messages.AllStickers"},{"id":"-719474725","predicate":"messages.allStickers","params":[{"name":"hash","type":"string"},{"name":"sets","type":"Vector"}],"type":"messages.AllStickers"},{"id":"-1369215196","predicate":"disabledFeature","params":[{"name":"feature","type":"string"},{"name":"description","type":"string"}],"type":"DisabledFeature"},{"id":"-1721631396","predicate":"updateReadHistoryInbox","params":[{"name":"peer","type":"Peer"},{"name":"max_id","type":"int"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"791617983","predicate":"updateReadHistoryOutbox","params":[{"name":"peer","type":"Peer"},{"name":"max_id","type":"int"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"-2066640507","predicate":"messages.affectedMessages","params":[{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"messages.AffectedMessages"},{"id":"1599050311","predicate":"contactLinkUnknown","params":[],"type":"ContactLink"},{"id":"-17968211","predicate":"contactLinkNone","params":[],"type":"ContactLink"},{"id":"646922073","predicate":"contactLinkHasPhone","params":[],"type":"ContactLink"},{"id":"-721239344","predicate":"contactLinkContact","params":[],"type":"ContactLink"},{"id":"751004017","predicate":"updateWebPage","params":[{"name":"webpage","type":"WebPage"}],"type":"Update"},{"id":"-350980120","predicate":"webPageEmpty","params":[{"name":"id","type":"long"}],"type":"WebPage"},{"id":"-981018084","predicate":"webPagePending","params":[{"name":"id","type":"long"},{"name":"date","type":"int"}],"type":"WebPage"},{"id":"-1558273867","predicate":"webPage","params":[{"name":"flags","type":"#"},{"name":"id","type":"long"},{"name":"url","type":"string"},{"name":"display_url","type":"string"},{"name":"type","type":"flags.0?string"},{"name":"site_name","type":"flags.1?string"},{"name":"title","type":"flags.2?string"},{"name":"description","type":"flags.3?string"},{"name":"photo","type":"flags.4?Photo"},{"name":"embed_url","type":"flags.5?string"},{"name":"embed_type","type":"flags.5?string"},{"name":"embed_width","type":"flags.6?int"},{"name":"embed_height","type":"flags.6?int"},{"name":"duration","type":"flags.7?int"},{"name":"author","type":"flags.8?string"}],"type":"WebPage"},{"id":"-1557277184","predicate":"messageMediaWebPage","params":[{"name":"webpage","type":"WebPage"}],"type":"MessageMedia"},{"id":"2079516406","predicate":"authorization","params":[{"name":"hash","type":"long"},{"name":"flags","type":"int"},{"name":"device_model","type":"string"},{"name":"platform","type":"string"},{"name":"system_version","type":"string"},{"name":"api_id","type":"int"},{"name":"app_name","type":"string"},{"name":"app_version","type":"string"},{"name":"date_created","type":"int"},{"name":"date_active","type":"int"},{"name":"ip","type":"string"},{"name":"country","type":"string"},{"name":"region","type":"string"}],"type":"Authorization"},{"id":"307276766","predicate":"account.authorizations","params":[{"name":"authorizations","type":"Vector"}],"type":"account.Authorizations"},{"id":"-1764049896","predicate":"account.noPassword","params":[{"name":"new_salt","type":"bytes"},{"name":"email_unconfirmed_pattern","type":"string"}],"type":"account.Password"},{"id":"2081952796","predicate":"account.password","params":[{"name":"current_salt","type":"bytes"},{"name":"new_salt","type":"bytes"},{"name":"hint","type":"string"},{"name":"has_recovery","type":"Bool"},{"name":"email_unconfirmed_pattern","type":"string"}],"type":"account.Password"},{"id":"-1212732749","predicate":"account.passwordSettings","params":[{"name":"email","type":"string"}],"type":"account.PasswordSettings"},{"id":"-1124314324","predicate":"account.passwordInputSettings","params":[{"name":"flags","type":"#"},{"name":"new_salt","type":"flags.0?bytes"},{"name":"new_password_hash","type":"flags.0?bytes"},{"name":"hint","type":"flags.0?string"},{"name":"email","type":"flags.1?string"}],"type":"account.PasswordInputSettings"},{"id":"326715557","predicate":"auth.passwordRecovery","params":[{"name":"email_pattern","type":"string"}],"type":"auth.PasswordRecovery"},{"id":"673687578","predicate":"inputMediaVenue","params":[{"name":"geo_point","type":"InputGeoPoint"},{"name":"title","type":"string"},{"name":"address","type":"string"},{"name":"provider","type":"string"},{"name":"venue_id","type":"string"}],"type":"InputMedia"},{"id":"2031269663","predicate":"messageMediaVenue","params":[{"name":"geo","type":"GeoPoint"},{"name":"title","type":"string"},{"name":"address","type":"string"},{"name":"provider","type":"string"},{"name":"venue_id","type":"string"}],"type":"MessageMedia"},{"id":"-1551583367","predicate":"receivedNotifyMessage","params":[{"name":"id","type":"int"},{"name":"flags","type":"int"}],"type":"ReceivedNotifyMessage"},{"id":"1776236393","predicate":"chatInviteEmpty","params":[],"type":"ExportedChatInvite"},{"id":"-64092740","predicate":"chatInviteExported","params":[{"name":"link","type":"string"}],"type":"ExportedChatInvite"},{"id":"1516793212","predicate":"chatInviteAlready","params":[{"name":"chat","type":"Chat"}],"type":"ChatInvite"},{"id":"-829325875","predicate":"chatInvite","params":[{"name":"title","type":"string"}],"type":"ChatInvite"},{"id":"-123931160","predicate":"messageActionChatJoinedByLink","params":[{"name":"inviter_id","type":"int"}],"type":"MessageAction"},{"id":"1757493555","predicate":"updateReadMessagesContents","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"},{"name":"pts_count","type":"int"}],"type":"Update"},{"id":"-4838507","predicate":"inputStickerSetEmpty","params":[],"type":"InputStickerSet"},{"id":"-1645763991","predicate":"inputStickerSetID","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"}],"type":"InputStickerSet"},{"id":"-2044933984","predicate":"inputStickerSetShortName","params":[{"name":"short_name","type":"string"}],"type":"InputStickerSet"},{"id":"-852477119","predicate":"stickerSet","params":[{"name":"flags","type":"#"},{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"title","type":"string"},{"name":"short_name","type":"string"},{"name":"count","type":"int"},{"name":"hash","type":"int"}],"type":"StickerSet"},{"id":"-1240849242","predicate":"messages.stickerSet","params":[{"name":"set","type":"StickerSet"},{"name":"packs","type":"Vector"},{"name":"documents","type":"Vector"}],"type":"messages.StickerSet"},{"id":"585404530","predicate":"user","params":[{"name":"flags","type":"#"},{"name":"id","type":"int"},{"name":"access_hash","type":"flags.0?long"},{"name":"first_name","type":"flags.1?string"},{"name":"last_name","type":"flags.2?string"},{"name":"username","type":"flags.3?string"},{"name":"phone","type":"flags.4?string"},{"name":"photo","type":"flags.5?UserProfilePhoto"},{"name":"status","type":"flags.6?UserStatus"},{"name":"bot_info_version","type":"flags.14?int"}],"type":"User"},{"id":"-1032140601","predicate":"botCommand","params":[{"name":"command","type":"string"},{"name":"description","type":"string"}],"type":"BotCommand"},{"id":"-1154598962","predicate":"botInfoEmpty","params":[],"type":"BotInfo"},{"id":"164583517","predicate":"botInfo","params":[{"name":"user_id","type":"int"},{"name":"version","type":"int"},{"name":"share_text","type":"string"},{"name":"description","type":"string"},{"name":"commands","type":"Vector"}],"type":"BotInfo"},{"id":"-1560655744","predicate":"keyboardButton","params":[{"name":"text","type":"string"}],"type":"KeyboardButton"},{"id":"2002815875","predicate":"keyboardButtonRow","params":[{"name":"buttons","type":"Vector"}],"type":"KeyboardButtonRow"},{"id":"-1606526075","predicate":"replyKeyboardHide","params":[{"name":"flags","type":"#"}],"type":"ReplyMarkup"},{"id":"-200242528","predicate":"replyKeyboardForceReply","params":[{"name":"flags","type":"#"}],"type":"ReplyMarkup"},{"id":"889353612","predicate":"replyKeyboardMarkup","params":[{"name":"flags","type":"#"},{"name":"rows","type":"Vector"}],"type":"ReplyMarkup"},{"id":"2072935910","predicate":"inputPeerUser","params":[{"name":"user_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputPeer"},{"id":"-668391402","predicate":"inputUser","params":[{"name":"user_id","type":"int"},{"name":"access_hash","type":"long"}],"type":"InputUser"},{"id":"-1350696044","predicate":"help.appChangelogEmpty","params":[],"type":"help.AppChangelog"},{"id":"1181279933","predicate":"help.appChangelog","params":[{"name":"text","type":"string"}],"type":"help.AppChangelog"}],"methods":[{"id":"-878758099","method":"invokeAfterMsg","params":[{"name":"msg_id","type":"long"},{"name":"query","type":"!X"}],"type":"X"},{"id":"1036301552","method":"invokeAfterMsgs","params":[{"name":"msg_ids","type":"Vector"},{"name":"query","type":"!X"}],"type":"X"},{"id":"1877286395","method":"auth.checkPhone","params":[{"name":"phone_number","type":"string"}],"type":"auth.CheckedPhone"},{"id":"1988976461","method":"auth.sendCode","params":[{"name":"phone_number","type":"string"},{"name":"sms_type","type":"int"},{"name":"api_id","type":"int"},{"name":"api_hash","type":"string"},{"name":"lang_code","type":"string"}],"type":"auth.SentCode"},{"id":"63247716","method":"auth.sendCall","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"}],"type":"Bool"},{"id":"453408308","method":"auth.signUp","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"},{"name":"phone_code","type":"string"},{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"auth.Authorization"},{"id":"-1126886015","method":"auth.signIn","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"},{"name":"phone_code","type":"string"}],"type":"auth.Authorization"},{"id":"1461180992","method":"auth.logOut","params":[],"type":"Bool"},{"id":"-1616179942","method":"auth.resetAuthorizations","params":[],"type":"Bool"},{"id":"1998331287","method":"auth.sendInvites","params":[{"name":"phone_numbers","type":"Vector"},{"name":"message","type":"string"}],"type":"Bool"},{"id":"-440401971","method":"auth.exportAuthorization","params":[{"name":"dc_id","type":"int"}],"type":"auth.ExportedAuthorization"},{"id":"-470837741","method":"auth.importAuthorization","params":[{"name":"id","type":"int"},{"name":"bytes","type":"bytes"}],"type":"auth.Authorization"},{"id":"-841733627","method":"auth.bindTempAuthKey","params":[{"name":"perm_auth_key_id","type":"long"},{"name":"nonce","type":"long"},{"name":"expires_at","type":"int"},{"name":"encrypted_message","type":"bytes"}],"type":"Bool"},{"id":"1147957548","method":"account.registerDevice","params":[{"name":"token_type","type":"int"},{"name":"token","type":"string"},{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"app_sandbox","type":"Bool"},{"name":"lang_code","type":"string"}],"type":"Bool"},{"id":"1707432768","method":"account.unregisterDevice","params":[{"name":"token_type","type":"int"},{"name":"token","type":"string"}],"type":"Bool"},{"id":"-2067899501","method":"account.updateNotifySettings","params":[{"name":"peer","type":"InputNotifyPeer"},{"name":"settings","type":"InputPeerNotifySettings"}],"type":"Bool"},{"id":"313765169","method":"account.getNotifySettings","params":[{"name":"peer","type":"InputNotifyPeer"}],"type":"PeerNotifySettings"},{"id":"-612493497","method":"account.resetNotifySettings","params":[],"type":"Bool"},{"id":"-259486360","method":"account.updateProfile","params":[{"name":"first_name","type":"string"},{"name":"last_name","type":"string"}],"type":"User"},{"id":"1713919532","method":"account.updateStatus","params":[{"name":"offline","type":"Bool"}],"type":"Bool"},{"id":"-1068696894","method":"account.getWallPapers","params":[],"type":"Vector"},{"id":"227648840","method":"users.getUsers","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"-902781519","method":"users.getFullUser","params":[{"name":"id","type":"InputUser"}],"type":"UserFull"},{"id":"-995929106","method":"contacts.getStatuses","params":[],"type":"Vector"},{"id":"583445000","method":"contacts.getContacts","params":[{"name":"hash","type":"string"}],"type":"contacts.Contacts"},{"id":"-634342611","method":"contacts.importContacts","params":[{"name":"contacts","type":"Vector"},{"name":"replace","type":"Bool"}],"type":"contacts.ImportedContacts"},{"id":"-847825880","method":"contacts.getSuggested","params":[{"name":"limit","type":"int"}],"type":"contacts.Suggested"},{"id":"-1902823612","method":"contacts.deleteContact","params":[{"name":"id","type":"InputUser"}],"type":"contacts.Link"},{"id":"1504393374","method":"contacts.deleteContacts","params":[{"name":"id","type":"Vector"}],"type":"Bool"},{"id":"858475004","method":"contacts.block","params":[{"name":"id","type":"InputUser"}],"type":"Bool"},{"id":"-448724803","method":"contacts.unblock","params":[{"name":"id","type":"InputUser"}],"type":"Bool"},{"id":"-176409329","method":"contacts.getBlocked","params":[{"name":"offset","type":"int"},{"name":"limit","type":"int"}],"type":"contacts.Blocked"},{"id":"-2065352905","method":"contacts.exportCard","params":[],"type":"Vector"},{"id":"1340184318","method":"contacts.importCard","params":[{"name":"export_card","type":"Vector"}],"type":"User"},{"id":"1109588596","method":"messages.getMessages","params":[{"name":"id","type":"Vector"}],"type":"messages.Messages"},{"id":"-321970698","method":"messages.getDialogs","params":[{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"messages.Dialogs"},{"id":"-1834885329","method":"messages.getHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"messages.Messages"},{"id":"132772523","method":"messages.search","params":[{"name":"peer","type":"InputPeer"},{"name":"q","type":"string"},{"name":"filter","type":"MessagesFilter"},{"name":"min_date","type":"int"},{"name":"max_date","type":"int"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"messages.Messages"},{"id":"-1336990448","method":"messages.readHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"max_id","type":"int"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"-185009311","method":"messages.deleteHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"-1510897371","method":"messages.deleteMessages","params":[{"name":"id","type":"Vector"}],"type":"messages.AffectedMessages"},{"id":"94983360","method":"messages.receivedMessages","params":[{"name":"max_id","type":"int"}],"type":"Vector"},{"id":"-1551737264","method":"messages.setTyping","params":[{"name":"peer","type":"InputPeer"},{"name":"action","type":"SendMessageAction"}],"type":"Bool"},{"id":"-61479243","method":"messages.sendMessage","params":[{"name":"flags","type":"#"},{"name":"peer","type":"InputPeer"},{"name":"reply_to_msg_id","type":"flags.0?int"},{"name":"message","type":"string"},{"name":"random_id","type":"long"},{"name":"reply_markup","type":"flags.2?ReplyMarkup"}],"type":"messages.SentMessage"},{"id":"-923703407","method":"messages.sendMedia","params":[{"name":"flags","type":"#"},{"name":"peer","type":"InputPeer"},{"name":"reply_to_msg_id","type":"flags.0?int"},{"name":"media","type":"InputMedia"},{"name":"random_id","type":"long"},{"name":"reply_markup","type":"flags.2?ReplyMarkup"}],"type":"Updates"},{"id":"1440838285","method":"messages.forwardMessages","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"Vector"},{"name":"random_id","type":"Vector"}],"type":"Updates"},{"id":"1013621127","method":"messages.getChats","params":[{"name":"id","type":"Vector"}],"type":"messages.Chats"},{"id":"998448230","method":"messages.getFullChat","params":[{"name":"chat_id","type":"int"}],"type":"messages.ChatFull"},{"id":"-599447467","method":"messages.editChatTitle","params":[{"name":"chat_id","type":"int"},{"name":"title","type":"string"}],"type":"Updates"},{"id":"-900957736","method":"messages.editChatPhoto","params":[{"name":"chat_id","type":"int"},{"name":"photo","type":"InputChatPhoto"}],"type":"Updates"},{"id":"-106911223","method":"messages.addChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"},{"name":"fwd_limit","type":"int"}],"type":"Updates"},{"id":"-530505962","method":"messages.deleteChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"}],"type":"Updates"},{"id":"164303470","method":"messages.createChat","params":[{"name":"users","type":"Vector"},{"name":"title","type":"string"}],"type":"Updates"},{"id":"-304838614","method":"updates.getState","params":[],"type":"updates.State"},{"id":"168039573","method":"updates.getDifference","params":[{"name":"pts","type":"int"},{"name":"date","type":"int"},{"name":"qts","type":"int"}],"type":"updates.Difference"},{"id":"-285902432","method":"photos.updateProfilePhoto","params":[{"name":"id","type":"InputPhoto"},{"name":"crop","type":"InputPhotoCrop"}],"type":"UserProfilePhoto"},{"id":"-720397176","method":"photos.uploadProfilePhoto","params":[{"name":"file","type":"InputFile"},{"name":"caption","type":"string"},{"name":"geo_point","type":"InputGeoPoint"},{"name":"crop","type":"InputPhotoCrop"}],"type":"photos.Photo"},{"id":"-2016444625","method":"photos.deletePhotos","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"-1291540959","method":"upload.saveFilePart","params":[{"name":"file_id","type":"long"},{"name":"file_part","type":"int"},{"name":"bytes","type":"bytes"}],"type":"Bool"},{"id":"-475607115","method":"upload.getFile","params":[{"name":"location","type":"InputFileLocation"},{"name":"offset","type":"int"},{"name":"limit","type":"int"}],"type":"upload.File"},{"id":"-990308245","method":"help.getConfig","params":[],"type":"Config"},{"id":"531836966","method":"help.getNearestDc","params":[],"type":"NearestDc"},{"id":"-938300290","method":"help.getAppUpdate","params":[{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"lang_code","type":"string"}],"type":"help.AppUpdate"},{"id":"1862465352","method":"help.saveAppLog","params":[{"name":"events","type":"Vector"}],"type":"Bool"},{"id":"-1532407418","method":"help.getInviteText","params":[{"name":"lang_code","type":"string"}],"type":"help.InviteText"},{"id":"-1848823128","method":"photos.getUserPhotos","params":[{"name":"user_id","type":"InputUser"},{"name":"offset","type":"int"},{"name":"max_id","type":"long"},{"name":"limit","type":"int"}],"type":"photos.Photos"},{"id":"865483769","method":"messages.forwardMessage","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"Updates"},{"id":"-1082919718","method":"messages.sendBroadcast","params":[{"name":"contacts","type":"Vector"},{"name":"random_id","type":"Vector"},{"name":"message","type":"string"},{"name":"media","type":"InputMedia"}],"type":"Updates"},{"id":"2132356495","method":"geochats.getLocated","params":[{"name":"geo_point","type":"InputGeoPoint"},{"name":"radius","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Located"},{"id":"-515735953","method":"geochats.getRecents","params":[{"name":"offset","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Messages"},{"id":"1437853947","method":"geochats.checkin","params":[{"name":"peer","type":"InputGeoChat"}],"type":"geochats.StatedMessage"},{"id":"1730338159","method":"geochats.getFullChat","params":[{"name":"peer","type":"InputGeoChat"}],"type":"messages.ChatFull"},{"id":"1284383347","method":"geochats.editChatTitle","params":[{"name":"peer","type":"InputGeoChat"},{"name":"title","type":"string"},{"name":"address","type":"string"}],"type":"geochats.StatedMessage"},{"id":"903355029","method":"geochats.editChatPhoto","params":[{"name":"peer","type":"InputGeoChat"},{"name":"photo","type":"InputChatPhoto"}],"type":"geochats.StatedMessage"},{"id":"-808598451","method":"geochats.search","params":[{"name":"peer","type":"InputGeoChat"},{"name":"q","type":"string"},{"name":"filter","type":"MessagesFilter"},{"name":"min_date","type":"int"},{"name":"max_date","type":"int"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Messages"},{"id":"-1254131096","method":"geochats.getHistory","params":[{"name":"peer","type":"InputGeoChat"},{"name":"offset","type":"int"},{"name":"max_id","type":"int"},{"name":"limit","type":"int"}],"type":"geochats.Messages"},{"id":"146319145","method":"geochats.setTyping","params":[{"name":"peer","type":"InputGeoChat"},{"name":"typing","type":"Bool"}],"type":"Bool"},{"id":"102432836","method":"geochats.sendMessage","params":[{"name":"peer","type":"InputGeoChat"},{"name":"message","type":"string"},{"name":"random_id","type":"long"}],"type":"geochats.StatedMessage"},{"id":"-1192173825","method":"geochats.sendMedia","params":[{"name":"peer","type":"InputGeoChat"},{"name":"media","type":"InputMedia"},{"name":"random_id","type":"long"}],"type":"geochats.StatedMessage"},{"id":"235482646","method":"geochats.createGeoChat","params":[{"name":"title","type":"string"},{"name":"geo_point","type":"InputGeoPoint"},{"name":"address","type":"string"},{"name":"venue","type":"string"}],"type":"geochats.StatedMessage"},{"id":"651135312","method":"messages.getDhConfig","params":[{"name":"version","type":"int"},{"name":"random_length","type":"int"}],"type":"messages.DhConfig"},{"id":"-162681021","method":"messages.requestEncryption","params":[{"name":"user_id","type":"InputUser"},{"name":"random_id","type":"int"},{"name":"g_a","type":"bytes"}],"type":"EncryptedChat"},{"id":"1035731989","method":"messages.acceptEncryption","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"g_b","type":"bytes"},{"name":"key_fingerprint","type":"long"}],"type":"EncryptedChat"},{"id":"-304536635","method":"messages.discardEncryption","params":[{"name":"chat_id","type":"int"}],"type":"Bool"},{"id":"2031374829","method":"messages.setEncryptedTyping","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"typing","type":"Bool"}],"type":"Bool"},{"id":"2135648522","method":"messages.readEncryptedHistory","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"max_date","type":"int"}],"type":"Bool"},{"id":"-1451792525","method":"messages.sendEncrypted","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"random_id","type":"long"},{"name":"data","type":"bytes"}],"type":"messages.SentEncryptedMessage"},{"id":"-1701831834","method":"messages.sendEncryptedFile","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"random_id","type":"long"},{"name":"data","type":"bytes"},{"name":"file","type":"InputEncryptedFile"}],"type":"messages.SentEncryptedMessage"},{"id":"852769188","method":"messages.sendEncryptedService","params":[{"name":"peer","type":"InputEncryptedChat"},{"name":"random_id","type":"long"},{"name":"data","type":"bytes"}],"type":"messages.SentEncryptedMessage"},{"id":"1436924774","method":"messages.receivedQueue","params":[{"name":"max_qts","type":"int"}],"type":"Vector"},{"id":"-562337987","method":"upload.saveBigFilePart","params":[{"name":"file_id","type":"long"},{"name":"file_part","type":"int"},{"name":"file_total_parts","type":"int"},{"name":"bytes","type":"bytes"}],"type":"Bool"},{"id":"1769565673","method":"initConnection","params":[{"name":"api_id","type":"int"},{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"lang_code","type":"string"},{"name":"query","type":"!X"}],"type":"X"},{"id":"-1663104819","method":"help.getSupport","params":[],"type":"help.Support"},{"id":"229241832","method":"auth.sendSms","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"}],"type":"Bool"},{"id":"916930423","method":"messages.readMessageContents","params":[{"name":"id","type":"Vector"}],"type":"messages.AffectedMessages"},{"id":"655677548","method":"account.checkUsername","params":[{"name":"username","type":"string"}],"type":"Bool"},{"id":"1040964988","method":"account.updateUsername","params":[{"name":"username","type":"string"}],"type":"User"},{"id":"301470424","method":"contacts.search","params":[{"name":"q","type":"string"},{"name":"limit","type":"int"}],"type":"contacts.Found"},{"id":"-623130288","method":"account.getPrivacy","params":[{"name":"key","type":"InputPrivacyKey"}],"type":"account.PrivacyRules"},{"id":"-906486552","method":"account.setPrivacy","params":[{"name":"key","type":"InputPrivacyKey"},{"name":"rules","type":"Vector"}],"type":"account.PrivacyRules"},{"id":"1099779595","method":"account.deleteAccount","params":[{"name":"reason","type":"string"}],"type":"Bool"},{"id":"150761757","method":"account.getAccountTTL","params":[],"type":"AccountDaysTTL"},{"id":"608323678","method":"account.setAccountTTL","params":[{"name":"ttl","type":"AccountDaysTTL"}],"type":"Bool"},{"id":"-627372787","method":"invokeWithLayer","params":[{"name":"layer","type":"int"},{"name":"query","type":"!X"}],"type":"X"},{"id":"200282908","method":"contacts.resolveUsername","params":[{"name":"username","type":"string"}],"type":"User"},{"id":"-1543001868","method":"account.sendChangePhoneCode","params":[{"name":"phone_number","type":"string"}],"type":"account.SentChangePhoneCode"},{"id":"1891839707","method":"account.changePhone","params":[{"name":"phone_number","type":"string"},{"name":"phone_code_hash","type":"string"},{"name":"phone_code","type":"string"}],"type":"User"},{"id":"-1373446075","method":"messages.getStickers","params":[{"name":"emoticon","type":"string"},{"name":"hash","type":"string"}],"type":"messages.Stickers"},{"id":"-1438922648","method":"messages.getAllStickers","params":[{"name":"hash","type":"string"}],"type":"messages.AllStickers"},{"id":"954152242","method":"account.updateDeviceLocked","params":[{"name":"period","type":"int"}],"type":"Bool"},{"id":"1738800940","method":"auth.importBotAuthorization","params":[{"name":"flags","type":"int"},{"name":"api_id","type":"int"},{"name":"api_hash","type":"string"},{"name":"bot_auth_token","type":"string"}],"type":"auth.Authorization"},{"id":"623001124","method":"messages.getWebPagePreview","params":[{"name":"message","type":"string"}],"type":"MessageMedia"},{"id":"-484392616","method":"account.getAuthorizations","params":[],"type":"account.Authorizations"},{"id":"-545786948","method":"account.resetAuthorization","params":[{"name":"hash","type":"long"}],"type":"Bool"},{"id":"1418342645","method":"account.getPassword","params":[],"type":"account.Password"},{"id":"-1131605573","method":"account.getPasswordSettings","params":[{"name":"current_password_hash","type":"bytes"}],"type":"account.PasswordSettings"},{"id":"-92517498","method":"account.updatePasswordSettings","params":[{"name":"current_password_hash","type":"bytes"},{"name":"new_settings","type":"account.PasswordInputSettings"}],"type":"Bool"},{"id":"174260510","method":"auth.checkPassword","params":[{"name":"password_hash","type":"bytes"}],"type":"auth.Authorization"},{"id":"-661144474","method":"auth.requestPasswordRecovery","params":[],"type":"auth.PasswordRecovery"},{"id":"1319464594","method":"auth.recoverPassword","params":[{"name":"code","type":"string"}],"type":"auth.Authorization"},{"id":"-1080796745","method":"invokeWithoutUpdates","params":[{"name":"query","type":"!X"}],"type":"X"},{"id":"2106086025","method":"messages.exportChatInvite","params":[{"name":"chat_id","type":"int"}],"type":"ExportedChatInvite"},{"id":"1051570619","method":"messages.checkChatInvite","params":[{"name":"hash","type":"string"}],"type":"ChatInvite"},{"id":"1817183516","method":"messages.importChatInvite","params":[{"name":"hash","type":"string"}],"type":"Updates"},{"id":"639215886","method":"messages.getStickerSet","params":[{"name":"stickerset","type":"InputStickerSet"}],"type":"messages.StickerSet"},{"id":"2066793382","method":"messages.installStickerSet","params":[{"name":"stickerset","type":"InputStickerSet"},{"name":"disabled","type":"Bool"}],"type":"Bool"},{"id":"-110209570","method":"messages.uninstallStickerSet","params":[{"name":"stickerset","type":"InputStickerSet"}],"type":"Bool"},{"id":"457052156","method":"messages.startBot","params":[{"name":"bot","type":"InputUser"},{"name":"chat_id","type":"int"},{"name":"random_id","type":"long"},{"name":"start_param","type":"string"}],"type":"Updates"},{"id":"1537966002","method":"help.getAppChangelog","params":[{"name":"device_model","type":"string"},{"name":"system_version","type":"string"},{"name":"app_version","type":"string"},{"name":"lang_code","type":"string"}],"type":"help.AppChangelog"}]} -Config.Schema.API.layer = 29; +Config.Schema.API.layer = 33; Config.Emoji = {"00a9":["\u00A9",["copyright"]],"00ae":["\u00AE",["registered"]],"203c":["\u203C",["bangbang"]],"2049":["\u2049",["interrobang"]],"2122":["\u2122",["tm"]],"2139":["\u2139",["information_source"]],"2194":["\u2194",["left_right_arrow"]],"2195":["\u2195",["arrow_up_down"]],"2196":["\u2196",["arrow_upper_left"]],"2197":["\u2197",["arrow_upper_right"]],"2198":["\u2198",["arrow_lower_right"]],"2199":["\u2199",["arrow_lower_left"]],"21a9":["\u21A9",["leftwards_arrow_with_hook"]],"21aa":["\u21AA",["arrow_right_hook"]],"231a":["\u231A",["watch"]],"231b":["\u231B",["hourglass"]],"23e9":["\u23E9",["fast_forward"]],"23ea":["\u23EA",["rewind"]],"23eb":["\u23EB",["arrow_double_up"]],"23ec":["\u23EC",["arrow_double_down"]],"23f0":["\u23F0",["alarm_clock"]],"23f3":["\u23F3",["hourglass_flowing_sand"]],"24c2":["\u24C2",["m"]],"25aa":["\u25AA",["black_small_square"]],"25ab":["\u25AB",["white_small_square"]],"25b6":["\u25B6",["arrow_forward"]],"25c0":["\u25C0",["arrow_backward"]],"25fb":["\u25FB",["white_medium_square"]],"25fc":["\u25FC",["black_medium_square"]],"25fd":["\u25FD",["white_medium_small_square"]],"25fe":["\u25FE",["black_medium_small_square"]],"2600":["\u2600",["sunny"]],"2601":["\u2601",["cloud"]],"260e":["\u260E",["phone","telephone"]],"2611":["\u2611",["ballot_box_with_check"]],"2614":["\u2614",["umbrella"]],"2615":["\u2615",["coffee"]],"261d":["\u261D",["point_up"]],"263a":["\u263A",["relaxed"]],"2648":["\u2648",["aries"]],"2649":["\u2649",["taurus"]],"264a":["\u264A",["gemini"]],"264b":["\u264B",["cancer"]],"264c":["\u264C",["leo"]],"264d":["\u264D",["virgo"]],"264e":["\u264E",["libra"]],"264f":["\u264F",["scorpius"]],"2650":["\u2650",["sagittarius"]],"2651":["\u2651",["capricorn"]],"2652":["\u2652",["aquarius"]],"2653":["\u2653",["pisces"]],"2660":["\u2660",["spades"]],"2663":["\u2663",["clubs"]],"2665":["\u2665",["hearts"]],"2666":["\u2666",["diamonds"]],"2668":["\u2668",["hotsprings"]],"267b":["\u267B",["recycle"]],"267f":["\u267F",["wheelchair"]],"2693":["\u2693",["anchor"]],"26a0":["\u26A0",["warning"]],"26a1":["\u26A1",["zap"]],"26aa":["\u26AA",["white_circle"]],"26ab":["\u26AB",["black_circle"]],"26bd":["\u26BD",["soccer"]],"26be":["\u26BE",["baseball"]],"26c4":["\u26C4",["snowman"]],"26c5":["\u26C5",["partly_sunny"]],"26ce":["\u26CE",["ophiuchus"]],"26d4":["\u26D4",["no_entry"]],"26ea":["\u26EA",["church"]],"26f2":["\u26F2",["fountain"]],"26f3":["\u26F3",["golf"]],"26f5":["\u26F5",["boat","sailboat"]],"26fa":["\u26FA",["tent"]],"26fd":["\u26FD",["fuelpump"]],"2702":["\u2702",["scissors"]],"2705":["\u2705",["white_check_mark"]],"2708":["\u2708",["airplane"]],"2709":["\u2709",["email","envelope"]],"270a":["\u270A",["fist"]],"270b":["\u270B",["hand","raised_hand"]],"270c":["\u270C",["v"]],"270f":["\u270F",["pencil2"]],"2712":["\u2712",["black_nib"]],"2714":["\u2714",["heavy_check_mark"]],"2716":["\u2716",["heavy_multiplication_x"]],"2728":["\u2728",["sparkles"]],"2733":["\u2733",["eight_spoked_asterisk"]],"2734":["\u2734",["eight_pointed_black_star"]],"2744":["\u2744",["snowflake"]],"2747":["\u2747",["sparkle"]],"274c":["\u274C",["x"]],"274e":["\u274E",["negative_squared_cross_mark"]],"2753":["\u2753",["question"]],"2754":["\u2754",["grey_question"]],"2755":["\u2755",["grey_exclamation"]],"2757":["\u2757",["exclamation","heavy_exclamation_mark"]],"2764":["\u2764",["heart"],"<3"],"2795":["\u2795",["heavy_plus_sign"]],"2796":["\u2796",["heavy_minus_sign"]],"2797":["\u2797",["heavy_division_sign"]],"27a1":["\u27A1",["arrow_right"]],"27b0":["\u27B0",["curly_loop"]],"27bf":["\u27BF",["loop"]],"2934":["\u2934",["arrow_heading_up"]],"2935":["\u2935",["arrow_heading_down"]],"2b05":["\u2B05",["arrow_left"]],"2b06":["\u2B06",["arrow_up"]],"2b07":["\u2B07",["arrow_down"]],"2b1b":["\u2B1B",["black_large_square"]],"2b1c":["\u2B1C",["white_large_square"]],"2b50":["\u2B50",["star"]],"2b55":["\u2B55",["o"]],"3030":["\u3030",["wavy_dash"]],"303d":["\u303D",["part_alternation_mark"]],"3297":["\u3297",["congratulations"]],"3299":["\u3299",["secret"]],"1f004":["\uD83C\uDC04",["mahjong"]],"1f0cf":["\uD83C\uDCCF",["black_joker"]],"1f170":["\uD83C\uDD70",["a"]],"1f171":["\uD83C\uDD71",["b"]],"1f17e":["\uD83C\uDD7E",["o2"]],"1f17f":["\uD83C\uDD7F",["parking"]],"1f18e":["\uD83C\uDD8E",["ab"]],"1f191":["\uD83C\uDD91",["cl"]],"1f192":["\uD83C\uDD92",["cool"]],"1f193":["\uD83C\uDD93",["free"]],"1f194":["\uD83C\uDD94",["id"]],"1f195":["\uD83C\uDD95",["new"]],"1f196":["\uD83C\uDD96",["ng"]],"1f197":["\uD83C\uDD97",["ok"]],"1f198":["\uD83C\uDD98",["sos"]],"1f199":["\uD83C\uDD99",["up"]],"1f19a":["\uD83C\uDD9A",["vs"]],"1f201":["\uD83C\uDE01",["koko"]],"1f202":["\uD83C\uDE02",["sa"]],"1f21a":["\uD83C\uDE1A",["u7121"]],"1f22f":["\uD83C\uDE2F",["u6307"]],"1f232":["\uD83C\uDE32",["u7981"]],"1f233":["\uD83C\uDE33",["u7a7a"]],"1f234":["\uD83C\uDE34",["u5408"]],"1f235":["\uD83C\uDE35",["u6e80"]],"1f236":["\uD83C\uDE36",["u6709"]],"1f237":["\uD83C\uDE37",["u6708"]],"1f238":["\uD83C\uDE38",["u7533"]],"1f239":["\uD83C\uDE39",["u5272"]],"1f23a":["\uD83C\uDE3A",["u55b6"]],"1f250":["\uD83C\uDE50",["ideograph_advantage"]],"1f251":["\uD83C\uDE51",["accept"]],"1f300":["\uD83C\uDF00",["cyclone"]],"1f301":["\uD83C\uDF01",["foggy"]],"1f302":["\uD83C\uDF02",["closed_umbrella"]],"1f303":["\uD83C\uDF03",["night_with_stars"]],"1f304":["\uD83C\uDF04",["sunrise_over_mountains"]],"1f305":["\uD83C\uDF05",["sunrise"]],"1f306":["\uD83C\uDF06",["city_sunset"]],"1f307":["\uD83C\uDF07",["city_sunrise"]],"1f308":["\uD83C\uDF08",["rainbow"]],"1f309":["\uD83C\uDF09",["bridge_at_night"]],"1f30a":["\uD83C\uDF0A",["ocean"]],"1f30b":["\uD83C\uDF0B",["volcano"]],"1f30c":["\uD83C\uDF0C",["milky_way"]],"1f30d":["\uD83C\uDF0D",["earth_africa"]],"1f30e":["\uD83C\uDF0E",["earth_americas"]],"1f30f":["\uD83C\uDF0F",["earth_asia"]],"1f310":["\uD83C\uDF10",["globe_with_meridians"]],"1f311":["\uD83C\uDF11",["new_moon"]],"1f312":["\uD83C\uDF12",["waxing_crescent_moon"]],"1f313":["\uD83C\uDF13",["first_quarter_moon"]],"1f314":["\uD83C\uDF14",["moon","waxing_gibbous_moon"]],"1f315":["\uD83C\uDF15",["full_moon"]],"1f316":["\uD83C\uDF16",["waning_gibbous_moon"]],"1f317":["\uD83C\uDF17",["last_quarter_moon"]],"1f318":["\uD83C\uDF18",["waning_crescent_moon"]],"1f319":["\uD83C\uDF19",["crescent_moon"]],"1f320":["\uD83C\uDF20",["stars"]],"1f31a":["\uD83C\uDF1A",["new_moon_with_face"]],"1f31b":["\uD83C\uDF1B",["first_quarter_moon_with_face"]],"1f31c":["\uD83C\uDF1C",["last_quarter_moon_with_face"]],"1f31d":["\uD83C\uDF1D",["full_moon_with_face"]],"1f31e":["\uD83C\uDF1E",["sun_with_face"]],"1f31f":["\uD83C\uDF1F",["star2"]],"1f330":["\uD83C\uDF30",["chestnut"]],"1f331":["\uD83C\uDF31",["seedling"]],"1f332":["\uD83C\uDF32",["evergreen_tree"]],"1f333":["\uD83C\uDF33",["deciduous_tree"]],"1f334":["\uD83C\uDF34",["palm_tree"]],"1f335":["\uD83C\uDF35",["cactus"]],"1f337":["\uD83C\uDF37",["tulip"]],"1f338":["\uD83C\uDF38",["cherry_blossom"]],"1f339":["\uD83C\uDF39",["rose"]],"1f33a":["\uD83C\uDF3A",["hibiscus"]],"1f33b":["\uD83C\uDF3B",["sunflower"]],"1f33c":["\uD83C\uDF3C",["blossom"]],"1f33d":["\uD83C\uDF3D",["corn"]],"1f33e":["\uD83C\uDF3E",["ear_of_rice"]],"1f33f":["\uD83C\uDF3F",["herb"]],"1f340":["\uD83C\uDF40",["four_leaf_clover"]],"1f341":["\uD83C\uDF41",["maple_leaf"]],"1f342":["\uD83C\uDF42",["fallen_leaf"]],"1f343":["\uD83C\uDF43",["leaves"]],"1f344":["\uD83C\uDF44",["mushroom"]],"1f345":["\uD83C\uDF45",["tomato"]],"1f346":["\uD83C\uDF46",["eggplant"]],"1f347":["\uD83C\uDF47",["grapes"]],"1f348":["\uD83C\uDF48",["melon"]],"1f349":["\uD83C\uDF49",["watermelon"]],"1f34a":["\uD83C\uDF4A",["tangerine"]],"1f34b":["\uD83C\uDF4B",["lemon"]],"1f34c":["\uD83C\uDF4C",["banana"]],"1f34d":["\uD83C\uDF4D",["pineapple"]],"1f34e":["\uD83C\uDF4E",["apple"]],"1f34f":["\uD83C\uDF4F",["green_apple"]],"1f350":["\uD83C\uDF50",["pear"]],"1f351":["\uD83C\uDF51",["peach"]],"1f352":["\uD83C\uDF52",["cherries"]],"1f353":["\uD83C\uDF53",["strawberry"]],"1f354":["\uD83C\uDF54",["hamburger"]],"1f355":["\uD83C\uDF55",["pizza"]],"1f356":["\uD83C\uDF56",["meat_on_bone"]],"1f357":["\uD83C\uDF57",["poultry_leg"]],"1f358":["\uD83C\uDF58",["rice_cracker"]],"1f359":["\uD83C\uDF59",["rice_ball"]],"1f35a":["\uD83C\uDF5A",["rice"]],"1f35b":["\uD83C\uDF5B",["curry"]],"1f35c":["\uD83C\uDF5C",["ramen"]],"1f35d":["\uD83C\uDF5D",["spaghetti"]],"1f35e":["\uD83C\uDF5E",["bread"]],"1f35f":["\uD83C\uDF5F",["fries"]],"1f360":["\uD83C\uDF60",["sweet_potato"]],"1f361":["\uD83C\uDF61",["dango"]],"1f362":["\uD83C\uDF62",["oden"]],"1f363":["\uD83C\uDF63",["sushi"]],"1f364":["\uD83C\uDF64",["fried_shrimp"]],"1f365":["\uD83C\uDF65",["fish_cake"]],"1f366":["\uD83C\uDF66",["icecream"]],"1f367":["\uD83C\uDF67",["shaved_ice"]],"1f368":["\uD83C\uDF68",["ice_cream"]],"1f369":["\uD83C\uDF69",["doughnut"]],"1f36a":["\uD83C\uDF6A",["cookie"]],"1f36b":["\uD83C\uDF6B",["chocolate_bar"]],"1f36c":["\uD83C\uDF6C",["candy"]],"1f36d":["\uD83C\uDF6D",["lollipop"]],"1f36e":["\uD83C\uDF6E",["custard"]],"1f36f":["\uD83C\uDF6F",["honey_pot"]],"1f370":["\uD83C\uDF70",["cake"]],"1f371":["\uD83C\uDF71",["bento"]],"1f372":["\uD83C\uDF72",["stew"]],"1f373":["\uD83C\uDF73",["egg"]],"1f374":["\uD83C\uDF74",["fork_and_knife"]],"1f375":["\uD83C\uDF75",["tea"]],"1f376":["\uD83C\uDF76",["sake"]],"1f377":["\uD83C\uDF77",["wine_glass"]],"1f378":["\uD83C\uDF78",["cocktail"]],"1f379":["\uD83C\uDF79",["tropical_drink"]],"1f37a":["\uD83C\uDF7A",["beer"]],"1f37b":["\uD83C\uDF7B",["beers"]],"1f37c":["\uD83C\uDF7C",["baby_bottle"]],"1f380":["\uD83C\uDF80",["ribbon"]],"1f381":["\uD83C\uDF81",["gift"]],"1f382":["\uD83C\uDF82",["birthday"]],"1f383":["\uD83C\uDF83",["jack_o_lantern"]],"1f384":["\uD83C\uDF84",["christmas_tree"]],"1f385":["\uD83C\uDF85",["santa"]],"1f386":["\uD83C\uDF86",["fireworks"]],"1f387":["\uD83C\uDF87",["sparkler"]],"1f388":["\uD83C\uDF88",["balloon"]],"1f389":["\uD83C\uDF89",["tada"]],"1f38a":["\uD83C\uDF8A",["confetti_ball"]],"1f38b":["\uD83C\uDF8B",["tanabata_tree"]],"1f38c":["\uD83C\uDF8C",["crossed_flags"]],"1f38d":["\uD83C\uDF8D",["bamboo"]],"1f38e":["\uD83C\uDF8E",["dolls"]],"1f38f":["\uD83C\uDF8F",["flags"]],"1f390":["\uD83C\uDF90",["wind_chime"]],"1f391":["\uD83C\uDF91",["rice_scene"]],"1f392":["\uD83C\uDF92",["school_satchel"]],"1f393":["\uD83C\uDF93",["mortar_board"]],"1f3a0":["\uD83C\uDFA0",["carousel_horse"]],"1f3a1":["\uD83C\uDFA1",["ferris_wheel"]],"1f3a2":["\uD83C\uDFA2",["roller_coaster"]],"1f3a3":["\uD83C\uDFA3",["fishing_pole_and_fish"]],"1f3a4":["\uD83C\uDFA4",["microphone"]],"1f3a5":["\uD83C\uDFA5",["movie_camera"]],"1f3a6":["\uD83C\uDFA6",["cinema"]],"1f3a7":["\uD83C\uDFA7",["headphones"]],"1f3a8":["\uD83C\uDFA8",["art"]],"1f3a9":["\uD83C\uDFA9",["tophat"]],"1f3aa":["\uD83C\uDFAA",["circus_tent"]],"1f3ab":["\uD83C\uDFAB",["ticket"]],"1f3ac":["\uD83C\uDFAC",["clapper"]],"1f3ad":["\uD83C\uDFAD",["performing_arts"]],"1f3ae":["\uD83C\uDFAE",["video_game"]],"1f3af":["\uD83C\uDFAF",["dart"]],"1f3b0":["\uD83C\uDFB0",["slot_machine"]],"1f3b1":["\uD83C\uDFB1",["8ball"]],"1f3b2":["\uD83C\uDFB2",["game_die"]],"1f3b3":["\uD83C\uDFB3",["bowling"]],"1f3b4":["\uD83C\uDFB4",["flower_playing_cards"]],"1f3b5":["\uD83C\uDFB5",["musical_note"]],"1f3b6":["\uD83C\uDFB6",["notes"]],"1f3b7":["\uD83C\uDFB7",["saxophone"]],"1f3b8":["\uD83C\uDFB8",["guitar"]],"1f3b9":["\uD83C\uDFB9",["musical_keyboard"]],"1f3ba":["\uD83C\uDFBA",["trumpet"]],"1f3bb":["\uD83C\uDFBB",["violin"]],"1f3bc":["\uD83C\uDFBC",["musical_score"]],"1f3bd":["\uD83C\uDFBD",["running_shirt_with_sash"]],"1f3be":["\uD83C\uDFBE",["tennis"]],"1f3bf":["\uD83C\uDFBF",["ski"]],"1f3c0":["\uD83C\uDFC0",["basketball"]],"1f3c1":["\uD83C\uDFC1",["checkered_flag"]],"1f3c2":["\uD83C\uDFC2",["snowboarder"]],"1f3c3":["\uD83C\uDFC3",["runner","running"]],"1f3c4":["\uD83C\uDFC4",["surfer"]],"1f3c6":["\uD83C\uDFC6",["trophy"]],"1f3c7":["\uD83C\uDFC7",["horse_racing"]],"1f3c8":["\uD83C\uDFC8",["football"]],"1f3c9":["\uD83C\uDFC9",["rugby_football"]],"1f3ca":["\uD83C\uDFCA",["swimmer"]],"1f3e0":["\uD83C\uDFE0",["house"]],"1f3e1":["\uD83C\uDFE1",["house_with_garden"]],"1f3e2":["\uD83C\uDFE2",["office"]],"1f3e3":["\uD83C\uDFE3",["post_office"]],"1f3e4":["\uD83C\uDFE4",["european_post_office"]],"1f3e5":["\uD83C\uDFE5",["hospital"]],"1f3e6":["\uD83C\uDFE6",["bank"]],"1f3e7":["\uD83C\uDFE7",["atm"]],"1f3e8":["\uD83C\uDFE8",["hotel"]],"1f3e9":["\uD83C\uDFE9",["love_hotel"]],"1f3ea":["\uD83C\uDFEA",["convenience_store"]],"1f3eb":["\uD83C\uDFEB",["school"]],"1f3ec":["\uD83C\uDFEC",["department_store"]],"1f3ed":["\uD83C\uDFED",["factory"]],"1f3ee":["\uD83C\uDFEE",["izakaya_lantern","lantern"]],"1f3ef":["\uD83C\uDFEF",["japanese_castle"]],"1f3f0":["\uD83C\uDFF0",["european_castle"]],"1f400":["\uD83D\uDC00",["rat"]],"1f401":["\uD83D\uDC01",["mouse2"]],"1f402":["\uD83D\uDC02",["ox"]],"1f403":["\uD83D\uDC03",["water_buffalo"]],"1f404":["\uD83D\uDC04",["cow2"]],"1f405":["\uD83D\uDC05",["tiger2"]],"1f406":["\uD83D\uDC06",["leopard"]],"1f407":["\uD83D\uDC07",["rabbit2"]],"1f408":["\uD83D\uDC08",["cat2"]],"1f409":["\uD83D\uDC09",["dragon"]],"1f40a":["\uD83D\uDC0A",["crocodile"]],"1f40b":["\uD83D\uDC0B",["whale2"]],"1f40c":["\uD83D\uDC0C",["snail"]],"1f40d":["\uD83D\uDC0D",["snake"]],"1f40e":["\uD83D\uDC0E",["racehorse"]],"1f40f":["\uD83D\uDC0F",["ram"]],"1f410":["\uD83D\uDC10",["goat"]],"1f411":["\uD83D\uDC11",["sheep"]],"1f412":["\uD83D\uDC12",["monkey"]],"1f413":["\uD83D\uDC13",["rooster"]],"1f414":["\uD83D\uDC14",["chicken"]],"1f415":["\uD83D\uDC15",["dog2"]],"1f416":["\uD83D\uDC16",["pig2"]],"1f417":["\uD83D\uDC17",["boar"]],"1f418":["\uD83D\uDC18",["elephant"]],"1f419":["\uD83D\uDC19",["octopus"]],"1f41a":["\uD83D\uDC1A",["shell"]],"1f41b":["\uD83D\uDC1B",["bug"]],"1f41c":["\uD83D\uDC1C",["ant"]],"1f41d":["\uD83D\uDC1D",["bee","honeybee"]],"1f41e":["\uD83D\uDC1E",["beetle"]],"1f41f":["\uD83D\uDC1F",["fish"]],"1f420":["\uD83D\uDC20",["tropical_fish"]],"1f421":["\uD83D\uDC21",["blowfish"]],"1f422":["\uD83D\uDC22",["turtle"]],"1f423":["\uD83D\uDC23",["hatching_chick"]],"1f424":["\uD83D\uDC24",["baby_chick"]],"1f425":["\uD83D\uDC25",["hatched_chick"]],"1f426":["\uD83D\uDC26",["bird"]],"1f427":["\uD83D\uDC27",["penguin"]],"1f428":["\uD83D\uDC28",["koala"]],"1f429":["\uD83D\uDC29",["poodle"]],"1f42a":["\uD83D\uDC2A",["dromedary_camel"]],"1f42b":["\uD83D\uDC2B",["camel"]],"1f42c":["\uD83D\uDC2C",["dolphin","flipper"]],"1f42d":["\uD83D\uDC2D",["mouse"]],"1f42e":["\uD83D\uDC2E",["cow"]],"1f42f":["\uD83D\uDC2F",["tiger"]],"1f430":["\uD83D\uDC30",["rabbit"]],"1f431":["\uD83D\uDC31",["cat"]],"1f432":["\uD83D\uDC32",["dragon_face"]],"1f433":["\uD83D\uDC33",["whale"]],"1f434":["\uD83D\uDC34",["horse"]],"1f435":["\uD83D\uDC35",["monkey_face"]],"1f436":["\uD83D\uDC36",["dog"]],"1f437":["\uD83D\uDC37",["pig"]],"1f438":["\uD83D\uDC38",["frog"]],"1f439":["\uD83D\uDC39",["hamster"]],"1f43a":["\uD83D\uDC3A",["wolf"]],"1f43b":["\uD83D\uDC3B",["bear"]],"1f43c":["\uD83D\uDC3C",["panda_face"]],"1f43d":["\uD83D\uDC3D",["pig_nose"]],"1f43e":["\uD83D\uDC3E",["feet","paw_prints"]],"1f440":["\uD83D\uDC40",["eyes"]],"1f442":["\uD83D\uDC42",["ear"]],"1f443":["\uD83D\uDC43",["nose"]],"1f444":["\uD83D\uDC44",["lips"]],"1f445":["\uD83D\uDC45",["tongue"]],"1f446":["\uD83D\uDC46",["point_up_2"]],"1f447":["\uD83D\uDC47",["point_down"]],"1f448":["\uD83D\uDC48",["point_left"]],"1f449":["\uD83D\uDC49",["point_right"]],"1f44a":["\uD83D\uDC4A",["facepunch","punch"]],"1f44b":["\uD83D\uDC4B",["wave"]],"1f44c":["\uD83D\uDC4C",["ok_hand"]],"1f44d":["\uD83D\uDC4D",["+1","thumbsup"]],"1f44e":["\uD83D\uDC4E",["-1","thumbsdown"]],"1f44f":["\uD83D\uDC4F",["clap"]],"1f450":["\uD83D\uDC50",["open_hands"]],"1f451":["\uD83D\uDC51",["crown"]],"1f452":["\uD83D\uDC52",["womans_hat"]],"1f453":["\uD83D\uDC53",["eyeglasses"]],"1f454":["\uD83D\uDC54",["necktie"]],"1f455":["\uD83D\uDC55",["shirt","tshirt"]],"1f456":["\uD83D\uDC56",["jeans"]],"1f457":["\uD83D\uDC57",["dress"]],"1f458":["\uD83D\uDC58",["kimono"]],"1f459":["\uD83D\uDC59",["bikini"]],"1f45a":["\uD83D\uDC5A",["womans_clothes"]],"1f45b":["\uD83D\uDC5B",["purse"]],"1f45c":["\uD83D\uDC5C",["handbag"]],"1f45d":["\uD83D\uDC5D",["pouch"]],"1f45e":["\uD83D\uDC5E",["mans_shoe","shoe"]],"1f45f":["\uD83D\uDC5F",["athletic_shoe"]],"1f460":["\uD83D\uDC60",["high_heel"]],"1f461":["\uD83D\uDC61",["sandal"]],"1f462":["\uD83D\uDC62",["boot"]],"1f463":["\uD83D\uDC63",["footprints"]],"1f464":["\uD83D\uDC64",["bust_in_silhouette"]],"1f465":["\uD83D\uDC65",["busts_in_silhouette"]],"1f466":["\uD83D\uDC66",["boy"]],"1f467":["\uD83D\uDC67",["girl"]],"1f468":["\uD83D\uDC68",["man"]],"1f469":["\uD83D\uDC69",["woman"]],"1f46a":["\uD83D\uDC6A",["family"]],"1f46b":["\uD83D\uDC6B",["couple"]],"1f46c":["\uD83D\uDC6C",["two_men_holding_hands"]],"1f46d":["\uD83D\uDC6D",["two_women_holding_hands"]],"1f46e":["\uD83D\uDC6E",["cop"]],"1f46f":["\uD83D\uDC6F",["dancers"]],"1f470":["\uD83D\uDC70",["bride_with_veil"]],"1f471":["\uD83D\uDC71",["person_with_blond_hair"]],"1f472":["\uD83D\uDC72",["man_with_gua_pi_mao"]],"1f473":["\uD83D\uDC73",["man_with_turban"]],"1f474":["\uD83D\uDC74",["older_man"]],"1f475":["\uD83D\uDC75",["older_woman"]],"1f476":["\uD83D\uDC76",["baby"]],"1f477":["\uD83D\uDC77",["construction_worker"]],"1f478":["\uD83D\uDC78",["princess"]],"1f479":["\uD83D\uDC79",["japanese_ogre"]],"1f47a":["\uD83D\uDC7A",["japanese_goblin"]],"1f47b":["\uD83D\uDC7B",["ghost"]],"1f47c":["\uD83D\uDC7C",["angel"]],"1f47d":["\uD83D\uDC7D",["alien"]],"1f47e":["\uD83D\uDC7E",["space_invader"]],"1f47f":["\uD83D\uDC7F",["imp"]],"1f480":["\uD83D\uDC80",["skull"]],"1f481":["\uD83D\uDC81",["information_desk_person"]],"1f482":["\uD83D\uDC82",["guardsman"]],"1f483":["\uD83D\uDC83",["dancer"]],"1f484":["\uD83D\uDC84",["lipstick"]],"1f485":["\uD83D\uDC85",["nail_care"]],"1f486":["\uD83D\uDC86",["massage"]],"1f487":["\uD83D\uDC87",["haircut"]],"1f488":["\uD83D\uDC88",["barber"]],"1f489":["\uD83D\uDC89",["syringe"]],"1f48a":["\uD83D\uDC8A",["pill"]],"1f48b":["\uD83D\uDC8B",["kiss"]],"1f48c":["\uD83D\uDC8C",["love_letter"]],"1f48d":["\uD83D\uDC8D",["ring"]],"1f48e":["\uD83D\uDC8E",["gem"]],"1f48f":["\uD83D\uDC8F",["couplekiss"]],"1f490":["\uD83D\uDC90",["bouquet"]],"1f491":["\uD83D\uDC91",["couple_with_heart"]],"1f492":["\uD83D\uDC92",["wedding"]],"1f493":["\uD83D\uDC93",["heartbeat"]],"1f494":["\uD83D\uDC94",["broken_heart"],"<\/3"],"1f495":["\uD83D\uDC95",["two_hearts"]],"1f496":["\uD83D\uDC96",["sparkling_heart"]],"1f497":["\uD83D\uDC97",["heartpulse"]],"1f498":["\uD83D\uDC98",["cupid"]],"1f499":["\uD83D\uDC99",["blue_heart"],"<3"],"1f49a":["\uD83D\uDC9A",["green_heart"],"<3"],"1f49b":["\uD83D\uDC9B",["yellow_heart"],"<3"],"1f49c":["\uD83D\uDC9C",["purple_heart"],"<3"],"1f49d":["\uD83D\uDC9D",["gift_heart"]],"1f49e":["\uD83D\uDC9E",["revolving_hearts"]],"1f49f":["\uD83D\uDC9F",["heart_decoration"]],"1f4a0":["\uD83D\uDCA0",["diamond_shape_with_a_dot_inside"]],"1f4a1":["\uD83D\uDCA1",["bulb"]],"1f4a2":["\uD83D\uDCA2",["anger"]],"1f4a3":["\uD83D\uDCA3",["bomb"]],"1f4a4":["\uD83D\uDCA4",["zzz"]],"1f4a5":["\uD83D\uDCA5",["boom","collision"]],"1f4a6":["\uD83D\uDCA6",["sweat_drops"]],"1f4a7":["\uD83D\uDCA7",["droplet"]],"1f4a8":["\uD83D\uDCA8",["dash"]],"1f4a9":["\uD83D\uDCA9",["hankey","poop","shit"]],"1f4aa":["\uD83D\uDCAA",["muscle"]],"1f4ab":["\uD83D\uDCAB",["dizzy"]],"1f4ac":["\uD83D\uDCAC",["speech_balloon"]],"1f4ad":["\uD83D\uDCAD",["thought_balloon"]],"1f4ae":["\uD83D\uDCAE",["white_flower"]],"1f4af":["\uD83D\uDCAF",["100"]],"1f4b0":["\uD83D\uDCB0",["moneybag"]],"1f4b1":["\uD83D\uDCB1",["currency_exchange"]],"1f4b2":["\uD83D\uDCB2",["heavy_dollar_sign"]],"1f4b3":["\uD83D\uDCB3",["credit_card"]],"1f4b4":["\uD83D\uDCB4",["yen"]],"1f4b5":["\uD83D\uDCB5",["dollar"]],"1f4b6":["\uD83D\uDCB6",["euro"]],"1f4b7":["\uD83D\uDCB7",["pound"]],"1f4b8":["\uD83D\uDCB8",["money_with_wings"]],"1f4b9":["\uD83D\uDCB9",["chart"]],"1f4ba":["\uD83D\uDCBA",["seat"]],"1f4bb":["\uD83D\uDCBB",["computer"]],"1f4bc":["\uD83D\uDCBC",["briefcase"]],"1f4bd":["\uD83D\uDCBD",["minidisc"]],"1f4be":["\uD83D\uDCBE",["floppy_disk"]],"1f4bf":["\uD83D\uDCBF",["cd"]],"1f4c0":["\uD83D\uDCC0",["dvd"]],"1f4c1":["\uD83D\uDCC1",["file_folder"]],"1f4c2":["\uD83D\uDCC2",["open_file_folder"]],"1f4c3":["\uD83D\uDCC3",["page_with_curl"]],"1f4c4":["\uD83D\uDCC4",["page_facing_up"]],"1f4c5":["\uD83D\uDCC5",["date"]],"1f4c6":["\uD83D\uDCC6",["calendar"]],"1f4c7":["\uD83D\uDCC7",["card_index"]],"1f4c8":["\uD83D\uDCC8",["chart_with_upwards_trend"]],"1f4c9":["\uD83D\uDCC9",["chart_with_downwards_trend"]],"1f4ca":["\uD83D\uDCCA",["bar_chart"]],"1f4cb":["\uD83D\uDCCB",["clipboard"]],"1f4cc":["\uD83D\uDCCC",["pushpin"]],"1f4cd":["\uD83D\uDCCD",["round_pushpin"]],"1f4ce":["\uD83D\uDCCE",["paperclip"]],"1f4cf":["\uD83D\uDCCF",["straight_ruler"]],"1f4d0":["\uD83D\uDCD0",["triangular_ruler"]],"1f4d1":["\uD83D\uDCD1",["bookmark_tabs"]],"1f4d2":["\uD83D\uDCD2",["ledger"]],"1f4d3":["\uD83D\uDCD3",["notebook"]],"1f4d4":["\uD83D\uDCD4",["notebook_with_decorative_cover"]],"1f4d5":["\uD83D\uDCD5",["closed_book"]],"1f4d6":["\uD83D\uDCD6",["book","open_book"]],"1f4d7":["\uD83D\uDCD7",["green_book"]],"1f4d8":["\uD83D\uDCD8",["blue_book"]],"1f4d9":["\uD83D\uDCD9",["orange_book"]],"1f4da":["\uD83D\uDCDA",["books"]],"1f4db":["\uD83D\uDCDB",["name_badge"]],"1f4dc":["\uD83D\uDCDC",["scroll"]],"1f4dd":["\uD83D\uDCDD",["memo","pencil"]],"1f4de":["\uD83D\uDCDE",["telephone_receiver"]],"1f4df":["\uD83D\uDCDF",["pager"]],"1f4e0":["\uD83D\uDCE0",["fax"]],"1f4e1":["\uD83D\uDCE1",["satellite"]],"1f4e2":["\uD83D\uDCE2",["loudspeaker"]],"1f4e3":["\uD83D\uDCE3",["mega"]],"1f4e4":["\uD83D\uDCE4",["outbox_tray"]],"1f4e5":["\uD83D\uDCE5",["inbox_tray"]],"1f4e6":["\uD83D\uDCE6",["package"]],"1f4e7":["\uD83D\uDCE7",["e-mail"]],"1f4e8":["\uD83D\uDCE8",["incoming_envelope"]],"1f4e9":["\uD83D\uDCE9",["envelope_with_arrow"]],"1f4ea":["\uD83D\uDCEA",["mailbox_closed"]],"1f4eb":["\uD83D\uDCEB",["mailbox"]],"1f4ec":["\uD83D\uDCEC",["mailbox_with_mail"]],"1f4ed":["\uD83D\uDCED",["mailbox_with_no_mail"]],"1f4ee":["\uD83D\uDCEE",["postbox"]],"1f4ef":["\uD83D\uDCEF",["postal_horn"]],"1f4f0":["\uD83D\uDCF0",["newspaper"]],"1f4f1":["\uD83D\uDCF1",["iphone"]],"1f4f2":["\uD83D\uDCF2",["calling"]],"1f4f3":["\uD83D\uDCF3",["vibration_mode"]],"1f4f4":["\uD83D\uDCF4",["mobile_phone_off"]],"1f4f5":["\uD83D\uDCF5",["no_mobile_phones"]],"1f4f6":["\uD83D\uDCF6",["signal_strength"]],"1f4f7":["\uD83D\uDCF7",["camera"]],"1f4f9":["\uD83D\uDCF9",["video_camera"]],"1f4fa":["\uD83D\uDCFA",["tv"]],"1f4fb":["\uD83D\uDCFB",["radio"]],"1f4fc":["\uD83D\uDCFC",["vhs"]],"1f500":["\uD83D\uDD00",["twisted_rightwards_arrows"]],"1f501":["\uD83D\uDD01",["repeat"]],"1f502":["\uD83D\uDD02",["repeat_one"]],"1f503":["\uD83D\uDD03",["arrows_clockwise"]],"1f504":["\uD83D\uDD04",["arrows_counterclockwise"]],"1f505":["\uD83D\uDD05",["low_brightness"]],"1f506":["\uD83D\uDD06",["high_brightness"]],"1f507":["\uD83D\uDD07",["mute"]],"1f508":["\uD83D\uDD09",["speaker"]],"1f509":["\uD83D\uDD09",["sound"]],"1f50a":["\uD83D\uDD0A",["loud_sound"]],"1f50b":["\uD83D\uDD0B",["battery"]],"1f50c":["\uD83D\uDD0C",["electric_plug"]],"1f50d":["\uD83D\uDD0D",["mag"]],"1f50e":["\uD83D\uDD0E",["mag_right"]],"1f50f":["\uD83D\uDD0F",["lock_with_ink_pen"]],"1f510":["\uD83D\uDD10",["closed_lock_with_key"]],"1f511":["\uD83D\uDD11",["key"]],"1f512":["\uD83D\uDD12",["lock"]],"1f513":["\uD83D\uDD13",["unlock"]],"1f514":["\uD83D\uDD14",["bell"]],"1f515":["\uD83D\uDD15",["no_bell"]],"1f516":["\uD83D\uDD16",["bookmark"]],"1f517":["\uD83D\uDD17",["link"]],"1f518":["\uD83D\uDD18",["radio_button"]],"1f519":["\uD83D\uDD19",["back"]],"1f51a":["\uD83D\uDD1A",["end"]],"1f51b":["\uD83D\uDD1B",["on"]],"1f51c":["\uD83D\uDD1C",["soon"]],"1f51d":["\uD83D\uDD1D",["top"]],"1f51e":["\uD83D\uDD1E",["underage"]],"1f51f":["\uD83D\uDD1F",["keycap_ten"]],"1f520":["\uD83D\uDD20",["capital_abcd"]],"1f521":["\uD83D\uDD21",["abcd"]],"1f522":["\uD83D\uDD22",["1234"]],"1f523":["\uD83D\uDD23",["symbols"]],"1f524":["\uD83D\uDD24",["abc"]],"1f525":["\uD83D\uDD25",["fire"]],"1f526":["\uD83D\uDD26",["flashlight"]],"1f527":["\uD83D\uDD27",["wrench"]],"1f528":["\uD83D\uDD28",["hammer"]],"1f529":["\uD83D\uDD29",["nut_and_bolt"]],"1f52a":["\uD83D\uDD2A",["hocho"]],"1f52b":["\uD83D\uDD2B",["gun"]],"1f52c":["\uD83D\uDD2C",["microscope"]],"1f52d":["\uD83D\uDD2D",["telescope"]],"1f52e":["\uD83D\uDD2E",["crystal_ball"]],"1f52f":["\uD83D\uDD2F",["six_pointed_star"]],"1f530":["\uD83D\uDD30",["beginner"]],"1f531":["\uD83D\uDD31",["trident"]],"1f532":["\uD83D\uDD32",["black_square_button"]],"1f533":["\uD83D\uDD33",["white_square_button"]],"1f534":["\uD83D\uDD34",["red_circle"]],"1f535":["\uD83D\uDD35",["large_blue_circle"]],"1f536":["\uD83D\uDD36",["large_orange_diamond"]],"1f537":["\uD83D\uDD37",["large_blue_diamond"]],"1f538":["\uD83D\uDD38",["small_orange_diamond"]],"1f539":["\uD83D\uDD39",["small_blue_diamond"]],"1f53a":["\uD83D\uDD3A",["small_red_triangle"]],"1f53b":["\uD83D\uDD3B",["small_red_triangle_down"]],"1f53c":["\uD83D\uDD3C",["arrow_up_small"]],"1f53d":["\uD83D\uDD3D",["arrow_down_small"]],"1f550":["\uD83D\uDD50",["clock1"]],"1f551":["\uD83D\uDD51",["clock2"]],"1f552":["\uD83D\uDD52",["clock3"]],"1f553":["\uD83D\uDD53",["clock4"]],"1f554":["\uD83D\uDD54",["clock5"]],"1f555":["\uD83D\uDD55",["clock6"]],"1f556":["\uD83D\uDD56",["clock7"]],"1f557":["\uD83D\uDD57",["clock8"]],"1f558":["\uD83D\uDD58",["clock9"]],"1f559":["\uD83D\uDD59",["clock10"]],"1f55a":["\uD83D\uDD5A",["clock11"]],"1f55b":["\uD83D\uDD5B",["clock12"]],"1f55c":["\uD83D\uDD5C",["clock130"]],"1f55d":["\uD83D\uDD5D",["clock230"]],"1f55e":["\uD83D\uDD5E",["clock330"]],"1f55f":["\uD83D\uDD5F",["clock430"]],"1f560":["\uD83D\uDD60",["clock530"]],"1f561":["\uD83D\uDD61",["clock630"]],"1f562":["\uD83D\uDD62",["clock730"]],"1f563":["\uD83D\uDD63",["clock830"]],"1f564":["\uD83D\uDD64",["clock930"]],"1f565":["\uD83D\uDD65",["clock1030"]],"1f566":["\uD83D\uDD66",["clock1130"]],"1f567":["\uD83D\uDD67",["clock1230"]],"1f5fb":["\uD83D\uDDFB",["mount_fuji"]],"1f5fc":["\uD83D\uDDFC",["tokyo_tower"]],"1f5fd":["\uD83D\uDDFD",["statue_of_liberty"]],"1f5fe":["\uD83D\uDDFE",["japan"]],"1f5ff":["\uD83D\uDDFF",["moyai"]],"1f600":["\uD83D\uDE00",["grinning"]],"1f601":["\uD83D\uDE01",["grin"]],"1f602":["\uD83D\uDE02",["joy"]],"1f603":["\uD83D\uDE03",["smiley"],":)"],"1f604":["\uD83D\uDE04",["smile"],":)"],"1f605":["\uD83D\uDE05",["sweat_smile"]],"1f606":["\uD83D\uDE06",["laughing","satisfied"]],"1f607":["\uD83D\uDE07",["innocent"]],"1f608":["\uD83D\uDE08",["smiling_imp"]],"1f609":["\uD83D\uDE09",["wink"],";)"],"1f60a":["\uD83D\uDE0A",["blush"]],"1f60b":["\uD83D\uDE0B",["yum"]],"1f60c":["\uD83D\uDE0C",["relieved"]],"1f60d":["\uD83D\uDE0D",["heart_eyes"]],"1f60e":["\uD83D\uDE0E",["sunglasses"]],"1f60f":["\uD83D\uDE0F",["smirk"]],"1f610":["\uD83D\uDE10",["neutral_face"]],"1f611":["\uD83D\uDE11",["expressionless"]],"1f612":["\uD83D\uDE12",["unamused"]],"1f613":["\uD83D\uDE13",["sweat"]],"1f614":["\uD83D\uDE14",["pensive"]],"1f615":["\uD83D\uDE15",["confused"]],"1f616":["\uD83D\uDE16",["confounded"]],"1f617":["\uD83D\uDE17",["kissing"]],"1f618":["\uD83D\uDE18",["kissing_heart"]],"1f619":["\uD83D\uDE19",["kissing_smiling_eyes"]],"1f61a":["\uD83D\uDE1A",["kissing_closed_eyes"]],"1f61b":["\uD83D\uDE1B",["stuck_out_tongue"]],"1f61c":["\uD83D\uDE1C",["stuck_out_tongue_winking_eye"],";p"],"1f61d":["\uD83D\uDE1D",["stuck_out_tongue_closed_eyes"]],"1f61e":["\uD83D\uDE1E",["disappointed"],":("],"1f61f":["\uD83D\uDE1F",["worried"]],"1f620":["\uD83D\uDE20",["angry"]],"1f621":["\uD83D\uDE21",["rage"]],"1f622":["\uD83D\uDE22",["cry"],":'("],"1f623":["\uD83D\uDE23",["persevere"]],"1f624":["\uD83D\uDE24",["triumph"]],"1f625":["\uD83D\uDE25",["disappointed_relieved"]],"1f626":["\uD83D\uDE26",["frowning"]],"1f627":["\uD83D\uDE27",["anguished"]],"1f628":["\uD83D\uDE28",["fearful"]],"1f629":["\uD83D\uDE29",["weary"]],"1f62a":["\uD83D\uDE2A",["sleepy"]],"1f62b":["\uD83D\uDE2B",["tired_face"]],"1f62c":["\uD83D\uDE2C",["grimacing"]],"1f62d":["\uD83D\uDE2D",["sob"],":'("],"1f62e":["\uD83D\uDE2E",["open_mouth"]],"1f62f":["\uD83D\uDE2F",["hushed"]],"1f630":["\uD83D\uDE30",["cold_sweat"]],"1f631":["\uD83D\uDE31",["scream"]],"1f632":["\uD83D\uDE32",["astonished"]],"1f633":["\uD83D\uDE33",["flushed"]],"1f634":["\uD83D\uDE34",["sleeping"]],"1f635":["\uD83D\uDE35",["dizzy_face"]],"1f636":["\uD83D\uDE36",["no_mouth"]],"1f637":["\uD83D\uDE37",["mask"]],"1f638":["\uD83D\uDE38",["smile_cat"]],"1f639":["\uD83D\uDE39",["joy_cat"]],"1f63a":["\uD83D\uDE3A",["smiley_cat"]],"1f63b":["\uD83D\uDE3B",["heart_eyes_cat"]],"1f63c":["\uD83D\uDE3C",["smirk_cat"]],"1f63d":["\uD83D\uDE3D",["kissing_cat"]],"1f63e":["\uD83D\uDE3E",["pouting_cat"]],"1f63f":["\uD83D\uDE3F",["crying_cat_face"]],"1f640":["\uD83D\uDE40",["scream_cat"]],"1f645":["\uD83D\uDE45",["no_good"]],"1f646":["\uD83D\uDE46",["ok_woman"]],"1f647":["\uD83D\uDE47",["bow"]],"1f648":["\uD83D\uDE48",["see_no_evil"]],"1f649":["\uD83D\uDE49",["hear_no_evil"]],"1f64a":["\uD83D\uDE4A",["speak_no_evil"]],"1f64b":["\uD83D\uDE4B",["raising_hand"]],"1f64c":["\uD83D\uDE4C",["raised_hands"]],"1f64d":["\uD83D\uDE4D",["person_frowning"]],"1f64e":["\uD83D\uDE4E",["person_with_pouting_face"]],"1f64f":["\uD83D\uDE4F",["pray"]],"1f680":["\uD83D\uDE80",["rocket"]],"1f681":["\uD83D\uDE81",["helicopter"]],"1f682":["\uD83D\uDE82",["steam_locomotive"]],"1f683":["\uD83D\uDE83",["railway_car"]],"1f68b":["\uD83D\uDE8B",["train"]],"1f684":["\uD83D\uDE84",["bullettrain_side"]],"1f685":["\uD83D\uDE85",["bullettrain_front"]],"1f686":["\uD83D\uDE86",["train2"]],"1f687":["\uD83D\uDE87",["metro"]],"1f688":["\uD83D\uDE88",["light_rail"]],"1f689":["\uD83D\uDE89",["station"]],"1f68a":["\uD83D\uDE8A",["tram"]],"1f68c":["\uD83D\uDE8C",["bus"]],"1f68d":["\uD83D\uDE8D",["oncoming_bus"]],"1f68e":["\uD83D\uDE8E",["trolleybus"]],"1f68f":["\uD83D\uDE8F",["busstop"]],"1f690":["\uD83D\uDE90",["minibus"]],"1f691":["\uD83D\uDE91",["ambulance"]],"1f692":["\uD83D\uDE92",["fire_engine"]],"1f693":["\uD83D\uDE93",["police_car"]],"1f694":["\uD83D\uDE94",["oncoming_police_car"]],"1f695":["\uD83D\uDE95",["taxi"]],"1f696":["\uD83D\uDE96",["oncoming_taxi"]],"1f697":["\uD83D\uDE97",["car","red_car"]],"1f698":["\uD83D\uDE98",["oncoming_automobile"]],"1f699":["\uD83D\uDE99",["blue_car"]],"1f69a":["\uD83D\uDE9A",["truck"]],"1f69b":["\uD83D\uDE9B",["articulated_lorry"]],"1f69c":["\uD83D\uDE9C",["tractor"]],"1f69d":["\uD83D\uDE9D",["monorail"]],"1f69e":["\uD83D\uDE9E",["mountain_railway"]],"1f69f":["\uD83D\uDE9F",["suspension_railway"]],"1f6a0":["\uD83D\uDEA0",["mountain_cableway"]],"1f6a1":["\uD83D\uDEA1",["aerial_tramway"]],"1f6a2":["\uD83D\uDEA2",["ship"]],"1f6a3":["\uD83D\uDEA3",["rowboat"]],"1f6a4":["\uD83D\uDEA4",["speedboat"]],"1f6a5":["\uD83D\uDEA5",["traffic_light"]],"1f6a6":["\uD83D\uDEA6",["vertical_traffic_light"]],"1f6a7":["\uD83D\uDEA7",["construction"]],"1f6a8":["\uD83D\uDEA8",["rotating_light"]],"1f6a9":["\uD83D\uDEA9",["triangular_flag_on_post"]],"1f6aa":["\uD83D\uDEAA",["door"]],"1f6ab":["\uD83D\uDEAB",["no_entry_sign"]],"1f6ac":["\uD83D\uDEAC",["smoking"]],"1f6ad":["\uD83D\uDEAD",["no_smoking"]],"1f6ae":["\uD83D\uDEAE",["put_litter_in_its_place"]],"1f6af":["\uD83D\uDEAF",["do_not_litter"]],"1f6b0":["\uD83D\uDEB0",["potable_water"]],"1f6b1":["\uD83D\uDEB1",["non-potable_water"]],"1f6b2":["\uD83D\uDEB2",["bike"]],"1f6b3":["\uD83D\uDEB3",["no_bicycles"]],"1f6b4":["\uD83D\uDEB4",["bicyclist"]],"1f6b5":["\uD83D\uDEB5",["mountain_bicyclist"]],"1f6b6":["\uD83D\uDEB6",["walking"]],"1f6b7":["\uD83D\uDEB7",["no_pedestrians"]],"1f6b8":["\uD83D\uDEB8",["children_crossing"]],"1f6b9":["\uD83D\uDEB9",["mens"]],"1f6ba":["\uD83D\uDEBA",["womens"]],"1f6bb":["\uD83D\uDEBB",["restroom"]],"1f6bc":["\uD83D\uDEBC",["baby_symbol"]],"1f6bd":["\uD83D\uDEBD",["toilet"]],"1f6be":["\uD83D\uDEBE",["wc"]],"1f6bf":["\uD83D\uDEBF",["shower"]],"1f6c0":["\uD83D\uDEC0",["bath"]],"1f6c1":["\uD83D\uDEC1",["bathtub"]],"1f6c2":["\uD83D\uDEC2",["passport_control"]],"1f6c3":["\uD83D\uDEC3",["customs"]],"1f6c4":["\uD83D\uDEC4",["baggage_claim"]],"1f6c5":["\uD83D\uDEC5",["left_luggage"]],"0023":["\u0023\u20E3",["hash"]],"0030":["\u0030\u20E3",["zero"]],"0031":["\u0031\u20E3",["one"]],"0032":["\u0032\u20E3",["two"]],"0033":["\u0033\u20E3",["three"]],"0034":["\u0034\u20E3",["four"]],"0035":["\u0035\u20E3",["five"]],"0036":["\u0036\u20E3",["six"]],"0037":["\u0037\u20E3",["seven"]],"0038":["\u0038\u20E3",["eight"]],"0039":["\u0039\u20E3",["nine"]],"1f1e8-1f1f3":["\uD83C\uDDE8\uD83C\uDDF3",["cn"]],"1f1e9-1f1ea":["\uD83C\uDDE9\uD83C\uDDEA",["de"]],"1f1ea-1f1f8":["\uD83C\uDDEA\uD83C\uDDF8",["es"]],"1f1eb-1f1f7":["\uD83C\uDDEB\uD83C\uDDF7",["fr"]],"1f1ec-1f1e7":["\uD83C\uDDEC\uD83C\uDDE7",["gb","uk"]],"1f1ee-1f1f9":["\uD83C\uDDEE\uD83C\uDDF9",["it"]],"1f1ef-1f1f5":["\uD83C\uDDEF\uD83C\uDDF5",["jp"]],"1f1f0-1f1f7":["\uD83C\uDDF0\uD83C\uDDF7",["kr"]],"1f1f7-1f1fa":["\uD83C\uDDF7\uD83C\uDDFA",["ru"]],"1f1fa-1f1f8":["\uD83C\uDDFA\uD83C\uDDF8",["us"]]} diff --git a/app/js/lib/mtproto.js b/app/js/lib/mtproto.js index 68da191f..46576ccf 100644 --- a/app/js/lib/mtproto.js +++ b/app/js/lib/mtproto.js @@ -14,7 +14,7 @@ angular.module('izhukov.mtproto', ['izhukov.utils']) ? [ {id: 1, host: '149.154.175.10', port: 80}, {id: 2, host: '149.154.167.40', port: 80}, - {id: 3, host: '174.140.142.5', port: 80} + {id: 3, host: '149.154.175.117', port: 80} ] : [ {id: 1, host: '149.154.175.50', port: 80}, diff --git a/app/js/lib/mtproto_wrapper.js b/app/js/lib/mtproto_wrapper.js index 2d678102..bb7cf600 100644 --- a/app/js/lib/mtproto_wrapper.js +++ b/app/js/lib/mtproto_wrapper.js @@ -255,7 +255,7 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) } }) -.factory('MtpApiFileManager', function (MtpApiManager, $q, FileManager, IdbFileStorage, TmpfsFileStorage, MemoryFileStorage) { +.factory('MtpApiFileManager', function (MtpApiManager, $q, qSync, FileManager, IdbFileStorage, TmpfsFileStorage, MemoryFileStorage, WebpManager) { var cachedFs = false; var cachedFsPromise = false; @@ -318,17 +318,29 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) return 'video' + location.id + '.mp4'; case 'inputDocumentFileLocation': + var fileName = (location.file_name || '').split('.', 2); + var ext = fileName[1] || ''; + if (location.sticker && !WebpManager.isWebpSupported()) { + ext += '.png'; + } + if (fileName.length) { + return fileName[0] + '_' + location.id + '.' + ext; + } return 'doc' + location.id; case 'inputAudioFileLocation': return 'audio' + location.id; - } - if (!location.volume_id) { - console.trace('Empty location', location); + default: + if (!location.volume_id) { + console.trace('Empty location', location); + } + var ext = 'jpg'; + if (location.sticker) { + ext = WebpManager.isWebpSupported() ? 'webp' : 'png'; + } + return location.volume_id + '_' + location.local_id + '_' + location.secret + '.' + ext; } - - return location.volume_id + '_' + location.local_id + '_' + location.secret + '.jpg'; }; function getTempFileName(file) { @@ -374,7 +386,7 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) } // console.log('dload small', location); var fileName = getFileName(location), - mimeType = 'image/jpeg', + mimeType = location.sticker ? 'image/webp' : 'image/jpeg', cachedPromise = cachedSavePromises[fileName] || cachedDownloadPromises[fileName]; if (cachedPromise) { @@ -403,11 +415,20 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) }); }); + var processDownloaded = function (bytes) { + if (!location.sticker || WebpManager.isWebpSupported()) { + return qSync.when(bytes); + } + return WebpManager.getPngBlobFromWebp(bytes); + }; + return fileStorage.getFileWriter(fileName, mimeType).then(function (fileWriter) { return downloadPromise.then(function (result) { - return FileManager.write(fileWriter, result.bytes).then(function () { - return cachedDownloads[fileName] = fileWriter.finalize(); - }); + return processDownloaded(result.bytes).then(function (proccessedResult) { + return FileManager.write(fileWriter, proccessedResult).then(function () { + return cachedDownloads[fileName] = fileWriter.finalize(); + }); + }) }); }); }); @@ -427,6 +448,16 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) options = options || {}; + var processSticker = false; + if (location.sticker && !WebpManager.isWebpSupported()) { + if (options.toFileEntry || size > 524288) { + delete location.sticker; + } else { + processSticker = true; + options.mime = 'image/png'; + } + } + // console.log(dT(), 'Dload file', dcID, location, size); var fileName = getFileName(location), toFileEntry = options.toFileEntry || null, @@ -471,6 +502,13 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) }, function () { var fileWriterPromise = toFileEntry ? FileManager.getFileWriter(toFileEntry) : fileStorage.getFileWriter(fileName, mimeType); + var processDownloaded = function (bytes) { + if (!processSticker) { + return qSync.when(bytes); + } + return WebpManager.getPngBlobFromWebp(bytes); + }; + fileWriterPromise.then(function (fileWriter) { cacheFileWriter = fileWriter; var limit = 524288, @@ -513,20 +551,22 @@ angular.module('izhukov.mtproto.wrapper', ['izhukov.utils', 'izhukov.mtproto']) if (canceled) { return $q.when(); } - return FileManager.write(fileWriter, result.bytes).then(function () { - writeFileDeferred.resolve(); - }, errorHandler).then(function () { - if (isFinal) { - resolved = true; - if (toFileEntry) { - deferred.resolve(); + return processDownloaded(result.bytes).then(function (processedResult) { + return FileManager.write(fileWriter, processedResult).then(function () { + writeFileDeferred.resolve(); + }, errorHandler).then(function () { + if (isFinal) { + resolved = true; + if (toFileEntry) { + deferred.resolve(); + } else { + deferred.resolve(cachedDownloads[fileName] = fileWriter.finalize()); + } } else { - deferred.resolve(cachedDownloads[fileName] = fileWriter.finalize()); - } - } else { - deferred.notify({done: offset + limit, total: size}); - }; - }); + deferred.notify({done: offset + limit, total: size}); + }; + }); + }) }); }); })(offset + limit >= size, offset, writeFileDeferred, writeFilePromise); diff --git a/app/js/lib/ng_utils.js b/app/js/lib/ng_utils.js index b574b5d4..087e3d2e 100644 --- a/app/js/lib/ng_utils.js +++ b/app/js/lib/ng_utils.js @@ -43,7 +43,9 @@ angular.module('izhukov.utils', []) }, reject: function (result) { return {then: function (cb, badcb) { - return badcb(result); + if (badcb) { + return badcb(result); + } }}; } } @@ -205,6 +207,19 @@ angular.module('izhukov.utils', []) return $q.reject(e); } } + else if (fileData.file) { + var deferred = $q.defer(); + fileData.file(function (blob) { + getByteArray(blob).then(function (result) { + deferred.resolve(result); + }, function (error) { + deferred.reject(error); + }) + }, function (error) { + deferred.reject(error); + }); + return deferred.promise; + } return $q.when(fileData); } @@ -408,6 +423,10 @@ angular.module('izhukov.utils', []) return saveFileBase64(db, fileName, blob); } + if (!(blob instanceof Blob)) { + blob = blobConstruct([blob]); + } + try { var objectStore = db.transaction([dbStoreName], IDBTransaction.READ_WRITE || 'readwrite').objectStore(dbStoreName), request = objectStore.put(blob, fileName); @@ -643,6 +662,121 @@ angular.module('izhukov.utils', []) }; }) +.service('WebpManager', function (qSync, $q) { + var nativeWebpSupport = false; + + var image = new Image(); + image.onload = function () { + nativeWebpSupport = this.width === 2 && this.height === 1; + }; + image.onerror = function () { + nativeWebpSupport = false; + }; + image.src = 'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA=='; + + var canvas, context; + + function getCanvasFromWebp(data) { + var start = tsNow(); + + var decoder = new WebPDecoder(); + + var config = decoder.WebPDecoderConfig; + var buffer = config.j || config.output; + var bitstream = config.input; + + if (!decoder.WebPInitDecoderConfig(config)) { + console.error('[webpjs] Library version mismatch!'); + return false; + } + + // console.log('[webpjs] status code', decoder.VP8StatusCode); + var StatusCode = decoder.VP8StatusCode; + + status = decoder.WebPGetFeatures(data, data.length, bitstream); + if (status != (StatusCode.VP8_STATUS_OK || 0)) { + console.error('[webpjs] status error', status, StatusCode); + } + + var mode = decoder.WEBP_CSP_MODE; + buffer.colorspace = mode.MODE_RGBA; + buffer.J = 4; + + try { + status = decoder.WebPDecode(data, data.length, config); + } catch (e) { + status = e; + } + + ok = (status == 0); + if (!ok) { + console.error('[webpjs] decoding failed', status, StatusCode); + return false; + } + + // console.log('[webpjs] decoded: ', buffer.width, buffer.height, bitstream.has_alpha, 'Now saving...'); + var bitmap = buffer.c.RGBA.ma; + + // console.log('[webpjs] done in ', tsNow() - start); + + if (!bitmap) { + return false; + } + var biHeight = buffer.height; + var biWidth = buffer.width; + + if (!canvas || !context) { + canvas = document.createElement('canvas'); + context = canvas.getContext('2d'); + } else { + context.clearRect(0, 0, canvas.width, canvas.height); + } + canvas.height = biHeight; + canvas.width = biWidth; + + var output = context.createImageData(canvas.width, canvas.height); + var outputData = output.data; + + for (var h = 0; h < biHeight; h++) { + for (var w = 0; w < biWidth; w++) { + outputData[0+w*4+(biWidth*4)*h] = bitmap[1+w*4+(biWidth*4)*h]; + outputData[1+w*4+(biWidth*4)*h] = bitmap[2+w*4+(biWidth*4)*h]; + outputData[2+w*4+(biWidth*4)*h] = bitmap[3+w*4+(biWidth*4)*h]; + outputData[3+w*4+(biWidth*4)*h] = bitmap[0+w*4+(biWidth*4)*h]; + + }; + } + + context.putImageData(output, 0, 0); + + return true; + } + + function getPngBlobFromWebp (data) { + if (!getCanvasFromWebp(data)) { + return $q.reject({type: 'WEBP_PROCESS_FAILED'}); + } + if (canvas.toBlob === undefined) { + return qSync.when(dataUrlToBlob(canvas.toDataURL('image/png'))); + } + + var deferred = $q.defer(); + canvas.toBlob(function (blob) { + deferred.resolve(blob); + }, 'image/png'); + return deferred.promise; + } + + return { + isWebpSupported: function () { + return nativeWebpSupport; + }, + getPngBlobFromWebp: getPngBlobFromWebp + } + +}) + + .service('CryptoWorker', function ($timeout, $q) { var webWorker = false, diff --git a/app/js/lib/schema.tl.txt b/app/js/lib/schema.tl.txt index ef3a7c71..a71dcef4 100644 --- a/app/js/lib/schema.tl.txt +++ b/app/js/lib/schema.tl.txt @@ -9,14 +9,10 @@ null#56730bcc = Null; inputPeerEmpty#7f3b18ea = InputPeer; inputPeerSelf#7da07ec9 = InputPeer; -inputPeerContact#1023dbe8 user_id:int = InputPeer; -inputPeerForeign#9b447325 user_id:int access_hash:long = InputPeer; inputPeerChat#179be863 chat_id:int = InputPeer; inputUserEmpty#b98886cf = InputUser; inputUserSelf#f7c1b13f = InputUser; -inputUserContact#86e94f65 user_id:int = InputUser; -inputUserForeign#655e74ff user_id:int access_hash:long = InputUser; inputPhoneContact#f392b7f4 client_id:long phone:string first_name:string last_name:string = InputContact; @@ -70,11 +66,6 @@ fileLocationUnavailable#7c596b46 volume_id:long local_id:int secret:long = FileL fileLocation#53d69076 dc_id:int volume_id:long local_id:int secret:long = FileLocation; userEmpty#200250ba id:int = User; -userSelf#1c60e608 id:int first_name:string last_name:string username:string phone:string photo:UserProfilePhoto status:UserStatus = User; -userContact#cab35e18 id:int first_name:string last_name:string username:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User; -userRequest#d9ccc4ef id:int first_name:string last_name:string username:string access_hash:long phone:string photo:UserProfilePhoto status:UserStatus = User; -userForeign#75cf7a8 id:int first_name:string last_name:string username:string access_hash:long photo:UserProfilePhoto status:UserStatus = User; -userDeleted#d6016d7a id:int first_name:string last_name:string username:string = User; userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto; userProfilePhoto#d559d8c8 photo_id:long photo_small:FileLocation photo_big:FileLocation = UserProfilePhoto; @@ -87,7 +78,7 @@ chatEmpty#9ba2d800 id:int = Chat; chat#6e9c9bc7 id:int title:string photo:ChatPhoto participants_count:int date:int left:Bool version:int = Chat; chatForbidden#fb0ccc41 id:int title:string date:int = Chat; -chatFull#cade0791 id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite = ChatFull; +chatFull#2e02a614 id:int participants:ChatParticipants chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector = ChatFull; chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant; @@ -98,7 +89,7 @@ chatPhotoEmpty#37c1011c = ChatPhoto; chatPhoto#6153276a photo_small:FileLocation photo_big:FileLocation = ChatPhoto; messageEmpty#83e5de54 id:int = Message; -message#a7ab1991 flags:# id:int from_id:int to_id:Peer fwd_from_id:flags.2?int fwd_date:flags.2?int reply_to_msg_id:flags.3?int date:int message:string media:MessageMedia = Message; +message#c3060325 flags:# id:int from_id:int to_id:Peer fwd_from_id:flags.2?int fwd_date:flags.2?int reply_to_msg_id:flags.3?int date:int message:string media:MessageMedia reply_markup:flags.6?ReplyMarkup = Message; messageService#1d86f70e flags:int id:int from_id:int to_id:Peer date:int action:MessageAction = Message; messageMediaEmpty#3ded6320 = MessageMedia; @@ -119,14 +110,14 @@ messageActionChatDeleteUser#b2ae9b0c user_id:int = MessageAction; dialog#c1dd804a peer:Peer top_message:int read_inbox_max_id:int unread_count:int notify_settings:PeerNotifySettings = Dialog; photoEmpty#2331b22d id:long = Photo; -photo#c3838076 id:long access_hash:long user_id:int date:int geo:GeoPoint sizes:Vector = Photo; +photo#cded42fe id:long access_hash:long date:int sizes:Vector = Photo; photoSizeEmpty#e17e23c type:string = PhotoSize; photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize; photoCachedSize#e9a734fa type:string location:FileLocation w:int h:int bytes:bytes = PhotoSize; videoEmpty#c10658a8 id:long = Video; -video#ee9f4a4d id:long access_hash:long user_id:int date:int duration:int size:int thumb:PhotoSize dc_id:int w:int h:int = Video; +video#f72887d3 id:long access_hash:long date:int duration:int mime_type:string size:int thumb:PhotoSize dc_id:int w:int h:int = Video; geoPointEmpty#1117dd5f = GeoPoint; geoPoint#2049d70c long:double lat:double = GeoPoint; @@ -135,7 +126,7 @@ auth.checkedPhone#811ea28e phone_registered:Bool = auth.CheckedPhone; auth.sentCode#efed51d9 phone_registered:Bool phone_code_hash:string send_call_timeout:int is_password:Bool = auth.SentCode; -auth.authorization#f6b673a4 expires:int user:User = auth.Authorization; +auth.authorization#ff036af1 user:User = auth.Authorization; auth.exportedAuthorization#df969c2d id:int bytes:bytes = auth.ExportedAuthorization; @@ -157,7 +148,7 @@ peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool event wallPaper#ccb03657 id:int title:string sizes:Vector color:int = WallPaper; -userFull#771095da user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool real_first_name:string real_last_name:string = UserFull; +userFull#5a89ac5b user:User link:contacts.Link profile_photo:Photo notify_settings:PeerNotifySettings blocked:Bool bot_info:BotInfo = UserFull; contact#f911c994 user_id:int mutual:Bool = Contact; @@ -206,6 +197,7 @@ inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter; inputMessagesFilterPhotoVideoDocuments#d95e73bb = MessagesFilter; inputMessagesFilterDocument#9eddf188 = MessagesFilter; inputMessagesFilterAudio#cfc87522 = MessagesFilter; +inputMessagesFilterAudioDocuments#5afbf764 = MessagesFilter; updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update; updateMessageID#4e90bfd6 id:int random_id:long = Update; @@ -240,7 +232,7 @@ photos.photo#20212ca8 photo:Photo users:Vector = photos.Photo; upload.file#96a18d5 type:storage.FileType mtime:int bytes:bytes = upload.File; -dcOption#2ec2a43c id:int hostname:string ip_address:string port:int = DcOption; +dcOption#5d8c6cc flags:# id:int ip_address:string port:int = DcOption; config#4e32b894 date:int expires:int test_mode:Bool this_dc:int dc_options:Vector chat_size_max:int broadcast_size_max:int forwarded_count_max:int online_update_period_ms:int offline_blur_timeout_ms:int offline_idle_timeout_ms:int online_cloud_timeout_ms:int notify_cloud_delay_ms:int notify_default_delay_ms:int chat_big_size:int push_chat_period_ms:int push_chat_limit:int disabled_features:Vector = Config; @@ -335,7 +327,7 @@ inputAudioFileLocation#74dc404d id:long access_hash:long = InputFileLocation; inputDocumentFileLocation#4e45abe9 id:long access_hash:long = InputFileLocation; audioEmpty#586988d8 id:long = Audio; -audio#c7ac6496 id:long access_hash:long user_id:int date:int duration:int mime_type:string size:int dc_id:int = Audio; +audio#f9e35055 id:long access_hash:long date:int duration:int mime_type:string size:int dc_id:int = Audio; documentEmpty#36f8c871 id:long = Document; document#f9a39f4f id:long access_hash:long date:int mime_type:string size:int thumb:PhotoSize dc_id:int attributes:Vector = Document; @@ -405,7 +397,7 @@ documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute; documentAttributeAnimated#11b58939 = DocumentAttribute; documentAttributeSticker#3a556302 alt:string stickerset:InputStickerSet = DocumentAttribute; documentAttributeVideo#5910cccb duration:int w:int h:int = DocumentAttribute; -documentAttributeAudio#51448e5 duration:int = DocumentAttribute; +documentAttributeAudio#ded218e0 duration:int title:string performer:string = DocumentAttribute; documentAttributeFilename#15590068 file_name:string = DocumentAttribute; messages.stickersNotModified#f1749a22 = messages.Stickers; @@ -414,7 +406,7 @@ messages.stickers#8a8ecd32 hash:string stickers:Vector = messages.Stic stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; messages.allStickersNotModified#e86602c3 = messages.AllStickers; -messages.allStickers#5ce352ec hash:string packs:Vector sets:Vector documents:Vector = messages.AllStickers; +messages.allStickers#d51dafdb hash:string sets:Vector = messages.AllStickers; disabledFeature#ae636f24 feature:string description:string = DisabledFeature; @@ -469,10 +461,32 @@ inputStickerSetEmpty#ffb62b95 = InputStickerSet; inputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet; inputStickerSetShortName#861cc8a0 short_name:string = InputStickerSet; -stickerSet#a7a43b17 id:long access_hash:long title:string short_name:string = StickerSet; +stickerSet#cd303b41 flags:# id:long access_hash:long title:string short_name:string count:int hash:int = StickerSet; messages.stickerSet#b60a24a6 set:StickerSet packs:Vector documents:Vector = messages.StickerSet; +user#22e49072 flags:# id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int = User; + +botCommand#c27ac8c7 command:string description:string = BotCommand; + +botInfoEmpty#bb2e37ce = BotInfo; +botInfo#9cf585d user_id:int version:int share_text:string description:string commands:Vector = BotInfo; + +keyboardButton#a2fa4880 text:string = KeyboardButton; + +keyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow; + +replyKeyboardHide#a03e5b85 flags:# = ReplyMarkup; +replyKeyboardForceReply#f4108aa0 flags:# = ReplyMarkup; +replyKeyboardMarkup#3502758c flags:# rows:Vector = ReplyMarkup; + +inputPeerUser#7b8e7de6 user_id:int access_hash:long = InputPeer; + +inputUser#d8292816 user_id:int access_hash:long = InputUser; + +help.appChangelogEmpty#af7e0394 = help.AppChangelog; +help.appChangelog#4668e6bd text:string = help.AppChangelog; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -524,8 +538,8 @@ messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHis messages.deleteMessages#a5f18925 id:Vector = messages.AffectedMessages; messages.receivedMessages#5a954c0 max_id:int = Vector; messages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool; -messages.sendMessage#9add8f26 flags:# peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long = messages.SentMessage; -messages.sendMedia#2d7923b1 flags:# peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia random_id:long = Updates; +messages.sendMessage#fc55e6b5 flags:# peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup = messages.SentMessage; +messages.sendMedia#c8f16791 flags:# peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia random_id:long reply_markup:flags.2?ReplyMarkup = Updates; messages.forwardMessages#55e1728d peer:InputPeer id:Vector random_id:Vector = Updates; messages.getChats#3c6aa187 id:Vector = messages.Chats; messages.getFullChat#3b831c66 chat_id:int = messages.ChatFull; @@ -551,7 +565,7 @@ help.getAppUpdate#c812ac7e device_model:string system_version:string app_version help.saveAppLog#6f02f748 events:Vector = Bool; help.getInviteText#a4a95186 lang_code:string = help.InviteText; -photos.getUserPhotos#b7ee553c user_id:InputUser offset:int max_id:int limit:int = photos.Photos; +photos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos; messages.forwardMessage#33963bf9 peer:InputPeer id:int random_id:long = Updates; messages.sendBroadcast#bf73f4da contacts:Vector random_id:Vector message:string media:InputMedia = Updates; @@ -613,6 +627,8 @@ messages.getAllStickers#aa3bc868 hash:string = messages.AllStickers; account.updateDeviceLocked#38df3532 period:int = Bool; +auth.importBotAuthorization#67a3ff2c flags:int api_id:int api_hash:string bot_auth_token:string = auth.Authorization; + messages.getWebPagePreview#25223e24 message:string = MessageMedia; account.getAuthorizations#e320c158 = account.Authorizations; @@ -631,5 +647,8 @@ messages.exportChatInvite#7d885289 chat_id:int = ExportedChatInvite; messages.checkChatInvite#3eadb1bb hash:string = ChatInvite; messages.importChatInvite#6c50051c hash:string = Updates; messages.getStickerSet#2619a90e stickerset:InputStickerSet = messages.StickerSet; -messages.installStickerSet#efbbfae9 stickerset:InputStickerSet = Bool; -messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; \ No newline at end of file +messages.installStickerSet#7b30c3a6 stickerset:InputStickerSet disabled:Bool = Bool; +messages.uninstallStickerSet#f96e55de stickerset:InputStickerSet = Bool; +messages.startBot#1b3e0ffc bot:InputUser chat_id:int random_id:long start_param:string = Updates; + +help.getAppChangelog#5bab7fb2 device_model:string system_version:string app_version:string lang_code:string = help.AppChangelog; \ No newline at end of file diff --git a/app/js/lib/tl_utils.js b/app/js/lib/tl_utils.js index a94547e2..56093efc 100644 --- a/app/js/lib/tl_utils.js +++ b/app/js/lib/tl_utils.js @@ -102,6 +102,9 @@ TLSerialization.prototype.storeLong = function (sLong, field) { } } + if (typeof sLong != 'string') { + sLong = sLong ? sLong.toString() : '0'; + } var divRem = bigStringInt(sLong).divideAndRemainder(bigint(0x100000000)); this.writeInt(intToUint(divRem[1].intValue()), (field || '') + ':long[low]'); diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index 9e6bcd2f..22cb9fa5 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -49,6 +49,21 @@ function cancelEvent (event) { return false; } +function getScrollWidth() { + var outer = $('
').css({ + position: 'absolute', + width: 100, + height: 100, + overflow: 'scroll', + top: -9999 + }).appendTo($(document.body)); + + var scrollbarWidth = outer[0].offsetWidth - outer[0].clientWidth; + outer.remove(); + + return scrollbarWidth; +}; + function onCtrlEnter (textarea, cb) { $(textarea).on('keydown', function (e) { if (e.keyCode == 13 && (e.ctrlKey || e.metaKey)) { @@ -222,6 +237,22 @@ function setRichFocus(field, selectNode) { } } +function scrollToNode (scrollable, node, scroller) { + var elTop = node.offsetTop - 15, + elHeight = node.offsetHeight + 30, + scrollTop = scrollable.scrollTop, + viewportHeight = scrollable.clientHeight; + + if (scrollTop > elTop) { // we are below the node to scroll + scrollable.scrollTop = elTop; + $(scroller).nanoScroller({flash: true}); + } + else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the node to scroll + scrollable.scrollTop = elTop + elHeight - viewportHeight; + $(scroller).nanoScroller({flash: true}); + } +} + function onContentLoaded (cb) { setZeroTimeout(cb); } @@ -365,11 +396,15 @@ function versionCompare (ver1, ver2) { } function cleanSearchText (text) { + var hasTag = text.charAt(0) == '%'; text = text.replace(badCharsRe, ' ').replace(trimRe, ''); text = text.replace(/[^A-Za-z0-9]/g, function (ch) { return Config.LatinizeMap[ch] || ch; }); text = text.toLowerCase(); + if (hasTag) { + text = '%' + text; + } return text; } @@ -451,102 +486,3 @@ function versionCompare (ver1, ver2) { }; })(window); - - -(function (global) { - var nativeWebpSupport = false; - - var image = new Image(); - image.onload = function () { - nativeWebpSupport = this.width === 2 && this.height === 1; - }; - image.onerror = function () { - nativeWebpSupport = false; - }; - image.src = 'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA=='; - - var canvas, context; - - - function getPngUrlFromData(data) { - var start = tsNow(); - - var decoder = new WebPDecoder(); - - var config = decoder.WebPDecoderConfig; - var buffer = config.j; - var bitstream = config.input; - - if (!decoder.WebPInitDecoderConfig(config)) { - console.error('[webpjs] Library version mismatch!'); - return false; - } - - // console.log('[webpjs] status code', decoder.VP8StatusCode); - - status = decoder.WebPGetFeatures(data, data.length, bitstream); - if (status != 0) { - console.error('[webpjs] status error', status); - } - - var mode = decoder.WEBP_CSP_MODE; - buffer.J = 4; - - try { - status = decoder.WebPDecode(data, data.length, config); - } catch (e) { - status = e; - } - - ok = (status == 0); - if (!ok) { - console.error('[webpjs] decoding failed', status); - return false; - } - - // console.log('[webpjs] decoded: ', buffer.width, buffer.height, bitstream.has_alpha, 'Now saving...'); - var bitmap = buffer.c.RGBA.ma; - - // console.log('[webpjs] done in ', tsNow() - start); - - if (!bitmap) { - return false; - } - var biHeight = buffer.height; - var biWidth = buffer.width; - - if (!canvas || !context) { - canvas = document.createElement('canvas'); - context = canvas.getContext('2d'); - } else { - context.clearRect(0, 0, canvas.width, canvas.height); - } - canvas.height = biHeight; - canvas.width = biWidth; - - var output = context.createImageData(canvas.width, canvas.height); - var outputData = output.data; - - for (var h = 0; h < biHeight; h++) { - for (var w = 0; w < biWidth; w++) { - outputData[0+w*4+(biWidth*4)*h] = bitmap[1+w*4+(biWidth*4)*h]; - outputData[1+w*4+(biWidth*4)*h] = bitmap[2+w*4+(biWidth*4)*h]; - outputData[2+w*4+(biWidth*4)*h] = bitmap[3+w*4+(biWidth*4)*h]; - outputData[3+w*4+(biWidth*4)*h] = bitmap[0+w*4+(biWidth*4)*h]; - - }; - } - - context.putImageData(output, 0, 0); - - return canvas.toDataURL('image/png'); - } - - - global.WebpManager = { - isWebpSupported: function () { - return nativeWebpSupport; - }, - getPngUrlFromData: getPngUrlFromData - } -})(window); diff --git a/app/js/locales/en-us.json b/app/js/locales/en-us.json index 02d81eaf..52250f93 100644 --- a/app/js/locales/en-us.json +++ b/app/js/locales/en-us.json @@ -115,8 +115,12 @@ "user_modal_block_user": "Block user", "user_modal_unblock_user": "Unblock user", "user_modal_delete_chat": "Delete chat", + "user_modal_add_to_group": "Add to group", "user_modal_info": "Info", "user_modal_phone": "Phone", + "user_modal_about": "About", + "user_modal_bot_settings": "Settings", + "user_modal_bot_help": "Help", "user_modal_username": "Username", "user_modal_settings": "Settings", "user_modal_notifications": "Notifications", @@ -144,6 +148,9 @@ "user_status_last_week": "last seen within a week", "user_status_last_month": "last seen within a month", "user_status_long_ago": "last seen a long time ago", + "user_status_bot": "bot", + "user_status_bot_noprivacy": "has access to messages", + "user_status_bot_privacy": "has no access to messages", "chat_title_deleted": "DELETED", "format_size_progress_mulitple": "{done} of {total} {parts}", "format_size_progress": "{done} of {total}", @@ -274,7 +281,8 @@ "message_service_kicked_user": "removed {user}", "message_service_left_group": "left group", "message_service_joined_by_link": "joined group via invite link", - "message_service_unsupported_action": "Unsupported action {action}", + "message_service_unsupported_action": "unsupported action {action}", + "message_service_bot_intro_header": "What can this bot do?", "error_modal_warning_title": "Warning", "error_modal_bad_request_title": "Error", @@ -390,6 +398,7 @@ "im_delete": "Delete {count}", "im_forward": "Forward {count}", "im_reply": "Reply", + "im_start": "Start", "im_reply_loading": "Loading{dots}", "im_photos_drop_text": "Drop photos here to send", "im_message_field_placeholder": "Write a message...", diff --git a/app/js/message_composer.js b/app/js/message_composer.js index e1e9d2a1..bb8b9478 100644 --- a/app/js/message_composer.js +++ b/app/js/message_composer.js @@ -196,21 +196,6 @@ EmojiTooltip.prototype.onMouseLeave = function (triggerUnshow) { } }; -EmojiTooltip.prototype.getScrollWidth = function() { - var outer = $('
').css({ - position: 'absolute', - width: 100, - height: 100, - overflow: 'scroll', - top: -9999 - }).appendTo($(document.body)); - - var scrollbarWidth = outer[0].offsetWidth - outer[0].clientWidth; - outer.remove(); - - return scrollbarWidth; -}; - EmojiTooltip.prototype.createTooltip = function () { @@ -219,20 +204,12 @@ EmojiTooltip.prototype.createTooltip = function () { } var self = this; - this.tooltipEl = $('
').appendTo(document.body); - - this.tabsEl = $('.composer_emoji_tooltip_tabs', this.tooltip); - this.contentWrapEl = $('.composer_emoji_tooltip_content_wrap', this.tooltip); - this.contentEl = $('.composer_emoji_tooltip_content', this.tooltip); - this.footerEl = $('.composer_emoji_tooltip_footer', this.tooltip); - this.settingsEl = $('.composer_emoji_tooltip_settings', this.tooltip); - - var scrollWidth = this.getScrollWidth(); - if (scrollWidth > 0) { - this.tooltipEl.css({ - width: parseInt(this.tooltipEl.css('width')) + scrollWidth - }); - } + this.tooltipEl = $('
').appendTo(document.body); + + this.tabsEl = $('.composer_emoji_tooltip_tabs', this.tooltipEl); + this.contentEl = $('.composer_emoji_tooltip_content', this.tooltipEl); + this.footerEl = $('.composer_emoji_tooltip_footer', this.tooltipEl); + this.settingsEl = $('.composer_emoji_tooltip_settings', this.tooltipEl); angular.forEach(['recent', 'smile', 'flower', 'bell', 'car', 'grid', 'stickers'], function (tabName, tabIndex) { var tab = $('') @@ -254,9 +231,7 @@ EmojiTooltip.prototype.createTooltip = function () { } }); - if (!Config.Mobile) { - this.contentWrapEl.nanoScroller({preventPageScrolling: true, tabIndex: -1}); - } + this.scroller = new Scroller(this.contentEl, {classPrefix: 'composer_emoji_tooltip'}); this.contentEl.on('mousedown', function (e) { e = e.originalEvent || e; @@ -323,13 +298,7 @@ EmojiTooltip.prototype.updateTabContents = function () { var renderContent = function () { self.contentEl.html(html.join('')); - - if (!Config.Mobile) { - self.contentWrapEl.nanoScroller({scroll: 'top'}); - setTimeout(function () { - self.contentWrapEl.nanoScroller(); - }, 100); - } + self.scroller.reinit(); } if (this.tab == 6) { // Stickers @@ -487,12 +456,15 @@ function MessageComposer (textarea, options) { this.setUpInput(); - this.autoCompleteEl = $('').appendTo(document.body); + this.autoCompleteWrapEl = $('
').appendTo(document.body); + this.autoCompleteEl = $('').appendTo(this.autoCompleteWrapEl); + + this.scroller = new Scroller(this.autoCompleteEl, {maxHeight: 180}); var self = this; this.autoCompleteEl.on('mousedown', function (e) { e = e.originalEvent || e; - var target = $(e.target), mention, code; + var target = $(e.target), mention, code, command; if (target[0].tagName != 'A') { target = $(target[0].parentNode); } @@ -503,9 +475,13 @@ function MessageComposer (textarea, options) { EmojiHelper.pushPopularEmoji(code); } if (mention = target.attr('data-mention')) { - if (self.onMentionSelected) { - self.onMentionSelected(mention); + self.onMentionSelected(mention); + } + if (command = target.attr('data-command')) { + if (self.onCommandSelected) { + self.onCommandSelected(command); } + self.hideSuggestions(); } return cancelEvent(e); }); @@ -517,16 +493,25 @@ function MessageComposer (textarea, options) { this.getSendOnEnter = options.getSendOnEnter; this.onFilePaste = options.onFilePaste; this.mentions = options.mentions; + this.commands = options.commands; this.getPeerImage = options.getPeerImage; + this.onCommandSend = options.onCommandSend; } +MessageComposer.autoCompleteRegEx = /(\s|^)(:|@|\/)([A-Za-z0-9\-\+\*@_]*)$/; + + MessageComposer.prototype.setUpInput = function () { if ('contentEditable' in document.body) { this.setUpRich(); } else { this.setUpPlaintext(); } - this.autoCompleteRegEx = /(?:\s|^)(:|@)([A-Za-z0-9\-\+\*_]*)$/; + + var sbWidth = getScrollWidth(); + if (sbWidth) { + (this.richTextareaEl || this.textareaEl).css({marginRight: -sbWidth}); + } } MessageComposer.prototype.setUpRich = function () { @@ -602,12 +587,14 @@ MessageComposer.prototype.onKeyEvent = function (e) { currentSelected.removeClass('composer_autocomplete_option_active'); if (nextWrap) { $(nextWrap).find('a').addClass('composer_autocomplete_option_active'); + this.scroller.scrollToNode(nextWrap); return cancelEvent(e); } } var childNodes = this.autoCompleteEl[0].childNodes; var nextWrap = childNodes[next ? 0 : childNodes.length - 1]; + this.scroller.scrollToNode(nextWrap); $(nextWrap).find('a').addClass('composer_autocomplete_option_active'); return cancelEvent(e); @@ -618,17 +605,21 @@ MessageComposer.prototype.onKeyEvent = function (e) { if (!currentSelected.length && e.keyCode == 9) { currentSelected = $(this.autoCompleteEl[0].childNodes[0]).find('a'); } - var code, mention; + var code, mention, command; if (code = currentSelected.attr('data-code')) { this.onEmojiSelected(code, true); EmojiHelper.pushPopularEmoji(code); return cancelEvent(e); } if (mention = currentSelected.attr('data-mention')) { - if (this.onMentionSelected) { - this.onMentionSelected(mention); - return cancelEvent(e); + this.onMentionSelected(mention); + return cancelEvent(e); + } + if (command = currentSelected.attr('data-command')) { + if (this.onCommandSelected) { + this.onCommandSelected(command, e.keyCode == 9); } + return cancelEvent(e); } checkSubmit = true; } @@ -692,7 +683,7 @@ MessageComposer.prototype.restoreSelection = function () { -MessageComposer.prototype.checkAutocomplete = function () { +MessageComposer.prototype.checkAutocomplete = function (forceFull) { if (Config.Mobile) { return false; } @@ -708,17 +699,19 @@ MessageComposer.prototype.checkAutocomplete = function () { var value = textarea.value; } - value = value.substr(0, pos); + if (!forceFull) { + value = value.substr(0, pos); + } - var matches = value.match(this.autoCompleteRegEx); + var matches = value.match(MessageComposer.autoCompleteRegEx); if (matches) { if (this.previousQuery == matches[0]) { return; } this.previousQuery = matches[0]; - var query = SearchIndexManager.cleanSearchText(matches[2]); + var query = SearchIndexManager.cleanSearchText(matches[3]); - if (matches[1] == '@') { // mentions + if (matches[2] == '@') { // mentions if (this.mentions && this.mentions.index) { if (query.length) { var foundObject = SearchIndexManager.search(query, this.mentions.index); @@ -742,7 +735,31 @@ MessageComposer.prototype.checkAutocomplete = function () { this.hideSuggestions(); } } - else { // emoji + else if (!matches[1] && matches[2] == '/') { // commands + if (this.commands && this.commands.index) { + if (query.length) { + var foundObject = SearchIndexManager.search(query, this.commands.index); + var foundCommands = []; + var command; + for (var i = 0, length = this.commands.list.length; i < length; i++) { + command = this.commands.list[i]; + if (foundObject[command.value]) { + foundCommands.push(command); + } + } + } else { + var foundCommands = this.commands.list; + } + if (foundCommands.length) { + this.showCommandsSuggestions(foundCommands); + } else { + this.hideSuggestions(); + } + } else { + this.hideSuggestions(); + } + } + else if (matches[2] == ':') { // emoji EmojiHelper.getPopularEmoji((function (popular) { if (query.length) { var found = EmojiHelper.searchEmojis(query); @@ -977,6 +994,25 @@ MessageComposer.prototype.onMentionSelected = function (username) { this.onChange(); } +MessageComposer.prototype.onCommandSelected = function (command, isTab) { + if (isTab) { + if (this.richTextareaEl) { + this.richTextareaEl.html(encodeEntities(command) + ' '); + setRichFocus(this.richTextareaEl[0]); + } + else { + var textarea = this.textareaEl[0]; + textarea.value = command + ' '; + setFieldSelection(textarea); + } + } else { + this.onCommandSend(command); + } + + this.hideSuggestions(); + this.onChange(); +} + MessageComposer.prototype.onChange = function (e) { if (this.richTextareaEl) { delete this.keyupStarted; @@ -1028,6 +1064,13 @@ MessageComposer.prototype.focus = function () { } } +MessageComposer.prototype.renderSuggestions = function (html) { + this.autoCompleteEl.html(html.join('')); + this.autoCompleteWrapEl.show(); + this.scroller.reinit(); + this.updatePosition(); + this.autocompleteShown = true; +} MessageComposer.prototype.showEmojiSuggestions = function (codes) { var html = []; @@ -1052,16 +1095,13 @@ MessageComposer.prototype.showEmojiSuggestions = function (codes) { } } - this.autoCompleteEl.html(html.join('')); - this.autoCompleteEl.show(); - this.updatePosition(); - this.autocompleteShown = true; + this.renderSuggestions(html); } MessageComposer.prototype.showMentionSuggestions = function (users) { var html = []; var user; - var count = Math.min(5, users.length); + var count = users.length; var i; for (i = 0; i < count; i++) { @@ -1069,27 +1109,53 @@ MessageComposer.prototype.showMentionSuggestions = function (users) { html.push('
  • ' + user.rFullName + '@' + user.username + '
  • '); } - this.autoCompleteEl.html(html.join('')); - + this.renderSuggestions(html); var self = this; this.autoCompleteEl.find('.composer_user_photo').each(function (k, element) { self.getPeerImage($(element), element.getAttribute('data-user-id')); }); +} - this.autoCompleteEl.show(); - this.updatePosition(); - this.autocompleteShown = true; +MessageComposer.prototype.showCommandsSuggestions = function (commands) { + var html = []; + var command; + var count = Math.min(200, commands.length); + var i; + + for (i = 0; i < count; i++) { + command = commands[i]; + html.push('
  • ' + encodeEntities(command.value) + '' + command.rDescription + '
  • '); + } + + this.renderSuggestions(html); + + var self = this; + var usedImages = {}; + this.autoCompleteEl.find('.composer_user_photo').each(function (k, element) { + var noReplace = true; + var botID = element.getAttribute('data-user-id'); + if (!usedImages[botID]) { + usedImages[botID] = true; + noReplace = false; + } + self.getPeerImage($(element), botID, noReplace); + }); } MessageComposer.prototype.updatePosition = function () { var offset = (this.richTextareaEl || this.textareaEl).offset(); - var height = this.autoCompleteEl.outerHeight(); var width = (this.richTextareaEl || this.textareaEl).outerWidth(); - this.autoCompleteEl.css({top: offset.top - height, left: offset.left, width: width - 2}); + var height = this.scroller.updateHeight(); + this.autoCompleteWrapEl.css({ + top: offset.top - height, + left: offset.left, + width: width - 2 + }); + this.scroller.update(); } MessageComposer.prototype.hideSuggestions = function () { - this.autoCompleteEl.hide(); + this.autoCompleteWrapEl.hide(); delete this.autocompleteShown; } @@ -1098,3 +1164,92 @@ MessageComposer.prototype.resetTyping = function () { this.lastLength = 0; } + + +function Scroller(content, options) { + options = options || {}; + var classPrefix = options.classPrefix || 'scroller'; + + this.content = $(content); + this.content.wrap('
    '); + + this.scrollable = $(this.content[0].parentNode); + this.scroller = $(this.scrollable[0].parentNode); + this.wrap = $(this.scroller[0].parentNode); + + this.useNano = options.nano !== undefined ? options.nano : !Config.Mobile; + this.maxHeight = options.maxHeight; + this.minHeight = options.minHeight; + + if (this.useNano) { + this.scrollable.addClass('nano-content'); + this.scroller.addClass('nano'); + this.scroller.nanoScroller({preventPageScrolling: true, tabIndex: -1}); + } else { + if (this.maxHeight) { + this.wrap.css({maxHeight: this.maxHeight}); + } + if (this.minHeight) { + this.wrap.css({minHeight: this.minHeight}); + } + } + this.updateHeight(); +} + +Scroller.prototype.update = function () { + if (this.useNano) { + $(this.scroller).nanoScroller(); + } +} + +Scroller.prototype.reinit = function () { + this.scrollTo(0); + if (this.useNano) { + setTimeout((function () { + this.updateHeight(); + }).bind(this), 100) + } +} + +Scroller.prototype.updateHeight = function () { + var height; + if (this.maxHeight || this.minHeight) { + height = this.content[0].offsetHeight; + if (this.maxHeight && height > this.maxHeight) { + height = this.maxHeight; + } + if (this.minHeight && height < this.minHeight) { + height = this.minHeight; + } + this.wrap.css({height: height}); + } else { + height = this.scroller[0].offsetHeight; + } + $(this.scroller).nanoScroller(); + return height; +} + + +Scroller.prototype.scrollTo = function (scrollTop) { + this.scrollable[0].scrollTop = scrollTop; + if (this.useNano) { + $(this.scroller).nanoScroller({flash: true}); + } +} + +Scroller.prototype.scrollToNode = function (node) { + node = node[0] || node; + var elTop = node.offsetTop - 15, + elHeight = node.offsetHeight + 30, + scrollTop = this.scrollable[0].scrollTop, + viewportHeight = this.scrollable[0].clientHeight; + + if (scrollTop > elTop) { // we are below the node to scroll + this.scrollTo(elTop); + } + else if (scrollTop < elTop + elHeight - viewportHeight) { // we are over the node to scroll + this.scrollTo(elTop + elHeight - viewportHeight); + } +} + + diff --git a/app/js/services.js b/app/js/services.js index 7344a9cf..18bdf44e 100755 --- a/app/js/services.js +++ b/app/js/services.js @@ -127,13 +127,26 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) apiUser.sortName = SearchIndexManager.cleanSearchText(apiUser.first_name + ' ' + (apiUser.last_name || '')); + apiUser.pFlags = { + self: (apiUser.flags & (1 << 10)) > 0, + contact: (apiUser.flags & (1 << 11)) > 0, + mutual: (apiUser.flags & (1 << 12)) > 0, + deleted: (apiUser.flags & (1 << 13)) > 0, + bot: (apiUser.flags & (1 << 14)) > 0, + botNoPrivacy: (apiUser.flags & (1 << 15)) > 0, + botNoGroups: (apiUser.flags & (1 << 16)) > 0 + }; + var nameWords = apiUser.sortName.split(' '); var firstWord = nameWords.shift(); var lastWord = nameWords.pop(); apiUser.initials = firstWord.charAt(0) + (lastWord ? lastWord.charAt(0) : firstWord.charAt(1)); - apiUser.sortStatus = getUserStatusForSort(apiUser.status); - + if (apiUser.pFlags.bot) { + apiUser.sortStatus = -1; + } else { + apiUser.sortStatus = getUserStatusForSort(apiUser.status); + } var result = users[userID]; if (result === undefined) { @@ -160,7 +173,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return tsNow(true) + serverTimeOffset - 86400 * 3; case 'userStatusLastWeek': return tsNow(true) + serverTimeOffset - 86400 * 7; - case 'userStatusLastMonth': + case 'userStatusLastMonth': return tsNow(true) + serverTimeOffset - 86400 * 30; } } @@ -179,6 +192,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return getUser(myID); } + function isBot(id) { + return users[id] && users[id].pFlags.bot; + } + function hasUser(id) { return angular.isObject(users[id]); } @@ -210,11 +227,11 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) function getUserInput (id) { var user = getUser(id); - if (user._ == 'userSelf') { + if (user.pFlags.self) { return {_: 'inputUserSelf'}; } return { - _: 'inputUserForeign', + _: 'inputUser', user_id: id, access_hash: user.access_hash || 0 }; @@ -235,6 +252,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } function forceUserOnline (id) { + if (isBot(id)) { + return; + } var user = getUser(id); if (user && user.status && @@ -333,7 +353,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) function deleteContacts (userIDs) { var ids = [] angular.forEach(userIDs, function (userID) { - ids.push({_: 'inputUserContact', user_id: userID}) + ids.push(getUserInput(userID)) }); return MtpApiManager.invokeApi('contacts.deleteContacts', { id: ids @@ -375,6 +395,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }; function setUserStatus (userID, offline) { + if (isBot(userID)) { + return; + } var user = users[userID]; if (user) { var status = offline ? { @@ -441,6 +464,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) getUserString: getUserString, getUserSearchText: getUserSearchText, hasUser: hasUser, + isBot: isBot, importContact: importContact, importContacts: importContacts, deleteContacts: deleteContacts, @@ -751,13 +775,13 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) peerParams = peerString.substr(1).split('_'); return isUser - ? {_: 'inputPeerForeign', user_id: peerParams[0], access_hash: peerParams[1]} + ? {_: 'inputPeerUser', user_id: peerParams[0], access_hash: peerParams[1]} : {_: 'inputPeerChat', chat_id: peerParams[0]}; }, getInputPeerByID: function (peerID) { if (peerID > 0) { return { - _: 'inputPeerForeign', + _: 'inputPeerUser', user_id: peerID, access_hash: AppUsersManager.getUser(peerID).access_hash || 0 }; @@ -771,10 +795,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) getPeerSearchText: function (peerID) { var text; if (peerID > 0) { - text = AppUsersManager.getUserSearchText(peerID); + text = '%pu ' + AppUsersManager.getUserSearchText(peerID); } else if (peerID < 0) { var chat = AppChatsManager.getChat(-peerID); - text = chat.title || ''; + text = '%pg ' + (chat.title || ''); } return text; }, @@ -813,7 +837,88 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } }) -.service('AppMessagesManager', function ($q, $rootScope, $location, $filter, $timeout, $sce, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, AppWebPagesManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, PeersSelectService, Storage, FileManager, TelegramMeWebService, ErrorService, StatusManager, _) { +.service('AppProfileManager', function ($q, AppUsersManager, AppChatsManager, AppPhotosManager, NotificationsManager, MtpApiManager, RichTextProcessor) { + + var botInfos = {}; + + function saveBotInfo (botInfo) { + var botID = botInfo && botInfo.user_id; + if (!botID) { + return false; + } + var commands = {}; + angular.forEach(botInfo.commands, function (botCommand) { + commands[botCommand.command] = botCommand.description; + }) + return botInfos[botID] = { + id: botID, + version: botInfo.version, + shareText: botInfo.share_text, + description: botInfo.description, + rAbout: RichTextProcessor.wrapRichText(botInfo.share_text, {noLinebreaks: true}), + commands: commands + }; + } + + function getProfile (id, override) { + return MtpApiManager.invokeApi('users.getFullUser', { + id: AppUsersManager.getUserInput(id) + }).then(function (userFull) { + if (override && override.phone_number) { + userFull.user.phone = override.phone_number; + if (override.first_name || override.last_name) { + userFull.user.first_name = override.first_name; + userFull.user.last_name = override.last_name; + } + AppUsersManager.saveApiUser(userFull.user); + } else { + AppUsersManager.saveApiUser(userFull.user, true); + } + + AppPhotosManager.savePhoto(userFull.profile_photo, { + user_id: id + }); + + NotificationsManager.savePeerSettings(id, userFull.notify_settings); + + userFull.bot_info = saveBotInfo(userFull.bot_info); + + return userFull; + }); + } + + function getPeerBots (peerID) { + var peerBots = []; + if (peerID >= 0) { + if (!AppUsersManager.isBot(peerID)) { + return $q.when(peerBots); + } + return getProfile(peerID).then(function (userFull) { + var botInfo = userFull.bot_info; + if (botInfo && botInfo._ != 'botInfoEmpty') { + peerBots.push(botInfo); + } + return peerBots; + }); + } + + return AppChatsManager.getChatFull(-peerID).then(function (chatFull) { + angular.forEach(chatFull.bot_info, function (botInfo) { + peerBots.push(saveBotInfo(botInfo)); + }); + return peerBots; + }); + + } + + return { + getProfile: getProfile, + getPeerBots: getPeerBots + } + +}) + +.service('AppMessagesManager', function ($q, $rootScope, $location, $filter, $timeout, $sce, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, AppWebPagesManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, PeersSelectService, Storage, AppProfileManager, FileManager, TelegramMeWebService, ErrorService, StatusManager, _) { var messagesStorage = {}; var messagesForHistory = {}; @@ -866,7 +971,6 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) NotificationsManager.start(); function getDialogs (query, maxID, limit) { - var curDialogStorage = dialogsStorage; if (angular.isString(query) && query.length) { @@ -953,7 +1057,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }); if (historiesStorage[peerID] === undefined) { - historiesStorage[peerID] = {count: null, history: [dialog.top_message], pending: []} + var historyStorage = {count: null, history: [dialog.top_message], pending: []}; + historiesStorage[peerID] = historyStorage; + var message = getMessage(dialog.top_message); + if (mergeReplyKeyboard(historyStorage, message)) { + $rootScope.$broadcast('history_reply_markup', {peerID: peerID}); + } } NotificationsManager.savePeerSettings(peerID, dialog.notify_settings); @@ -993,7 +1102,39 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) AppChatsManager.saveApiChats(historyResult.chats); saveMessages(historyResult.messages); - return historyResult; + var peerID = AppPeersManager.getPeerID(inputPeer); + if ( + peerID < 0 || + !AppUsersManager.isBot(peerID) || + (historyResult.messages.length == limit && limit < historyResult.count) + ) { + return historyResult; + } + + return AppProfileManager.getProfile(peerID).then(function (userFull) { + var description = userFull.bot_info && userFull.bot_info.description; + if (description) { + var messageID = tempID--; + var message = { + _: 'messageService', + id: messageID, + from_id: peerID, + to_id: AppPeersManager.getOutputPeer(peerID), + flags: 0, + date: tsNow(true) + serverTimeOffset, + action: { + _: 'messageActionBotIntro', + description: description + } + }; + saveMessages([message]); + historyResult.messages.push(message); + if (historyResult.count) { + historyResult.count++; + } + } + return historyResult; + }); }); } @@ -1016,6 +1157,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) historyStorage.history.splice(offset, historyStorage.history.length - offset); angular.forEach(historyResult.messages, function (message) { + if (mergeReplyKeyboard(historyStorage, message)) { + $rootScope.$broadcast('history_reply_markup', {peerID: AppPeersManager.getPeerID(inputPeer)}); + } historyStorage.history.push(message.id); }); @@ -1030,6 +1174,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }); }; + function wrapHistoryResult (peerID, result) { + return $q.when(result); + } + function getHistory (inputPeer, maxID, limit, backLimit, prerendered) { var peerID = AppPeersManager.getPeerID(inputPeer), historyStorage = historiesStorage[peerID], @@ -1086,7 +1234,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) if (!maxID && historyStorage.pending.length) { history = historyStorage.pending.slice().concat(history); } - return $q.when({ + return wrapHistoryResult(peerID, { count: historyStorage.count, history: history, unreadOffset: unreadOffset, @@ -1116,12 +1264,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) history = historyStorage.pending.slice().concat(history); } - return { + return wrapHistoryResult(peerID, { count: historyStorage.count, history: history, unreadOffset: unreadOffset, unreadSkip: unreadSkip - }; + }); }) } @@ -1140,15 +1288,88 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) history = historyStorage.pending.slice().concat(history); } - return { + return wrapHistoryResult(peerID, { count: historyStorage.count, history: history, unreadOffset: unreadOffset, unreadSkip: unreadSkip - }; + }); }); } + function getReplyKeyboard (peerID) { + return (historiesStorage[peerID] || {}).reply_markup || false; + } + + function mergeReplyKeyboard (historyStorage, message) { + // console.log('merge', message.id, message.reply_markup, historyStorage.reply_markup); + if (!message.reply_markup && + !message.out && + !message.action) { + return false; + } + var messageReplyMarkup = message.reply_markup; + var lastReplyMarkup = historyStorage.reply_markup; + if (messageReplyMarkup) { + if (lastReplyMarkup && lastReplyMarkup.id >= message.id) { + return false; + } + if (messageReplyMarkup.pFlags.selective && + !(message.flags & 16)) { + return false; + } + if (historyStorage.maxOutID && + message.id < historyStorage.maxOutID && + messageReplyMarkup.pFlags.one_time) { + messageReplyMarkup.pFlags.hidden = true; + } + messageReplyMarkup = angular.extend({ + id: message.id + }, messageReplyMarkup); + if (messageReplyMarkup._ != 'replyKeyboardHide') { + messageReplyMarkup.fromID = message.from_id; + } + historyStorage.reply_markup = messageReplyMarkup; + // console.log('set', historyStorage.reply_markup); + return true; + } + + if (message.out) { + if (lastReplyMarkup) { + if (lastReplyMarkup.pFlags.one_time && + !lastReplyMarkup.pFlags.hidden && + (message.id > lastReplyMarkup.id || message.id < 0) && + message.message) { + lastReplyMarkup.pFlags.hidden = true; + // console.log('set', historyStorage.reply_markup); + return true; + } + } else if (!historyStorage.maxOutID || + message.id > historyStorage.maxOutID) { + historyStorage.maxOutID = message.id; + } + } + + if (message.action && + message.action._ == 'messageActionChatDeleteUser' && + (lastReplyMarkup + ? message.action.user_id == lastReplyMarkup.fromID + : AppUsersManager.isBot(message.action.user_id) + ) + ) { + historyStorage.reply_markup = { + _: 'replyKeyboardHide', + id: message.id, + flags: 0, + pFlags: {} + }; + // console.log('set', historyStorage.reply_markup); + return true; + } + + return false; + } + function getSearch (inputPeer, query, inputFilter, maxID, limit) { var foundMsgs = [], useSearchCache = !query, @@ -1425,30 +1646,42 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) apiMessage.date -= serverTimeOffset; + var mediaContext = { + user_id: apiMessage.from_id, + date: apiMessage.date + }; + if (apiMessage.media) { switch (apiMessage.media._) { case 'messageMediaEmpty': delete apiMessage.media; break; case 'messageMediaPhoto': - AppPhotosManager.savePhoto(apiMessage.media.photo); + AppPhotosManager.savePhoto(apiMessage.media.photo, mediaContext); break; case 'messageMediaVideo': - AppVideoManager.saveVideo(apiMessage.media.video); + AppVideoManager.saveVideo(apiMessage.media.video, mediaContext); break; case 'messageMediaDocument': - AppDocsManager.saveDoc(apiMessage.media.document); + AppDocsManager.saveDoc(apiMessage.media.document, mediaContext); break; case 'messageMediaAudio': AppAudioManager.saveAudio(apiMessage.media.audio); break; case 'messageMediaWebPage': - AppWebPagesManager.saveWebPage(apiMessage.media.webpage, apiMessage.id); + AppWebPagesManager.saveWebPage(apiMessage.media.webpage, apiMessage.id, mediaContext); break; } } if (apiMessage.action && apiMessage.action._ == 'messageActionChatEditPhoto') { - AppPhotosManager.savePhoto(apiMessage.action.photo); + AppPhotosManager.savePhoto(apiMessage.action.photo, mediaContext); + } + if (apiMessage.reply_markup) { + apiMessage.reply_markup.pFlags = { + resize: (apiMessage.reply_markup.flags & 1) > 0, + one_time: (apiMessage.reply_markup.flags & 2) > 0, + selective: (apiMessage.reply_markup.flags & 4) > 0 + }; } }); } @@ -1473,7 +1706,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) MtpApiManager.getUserID().then(function (fromID) { if (peerID != fromID) { - flags |= 3; + flags |= 2; + if (!AppUsersManager.isBot(peerID)) { + flags |= 1; + } } if (replyToMsgID) { flags |= 8; @@ -1601,7 +1837,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) MtpApiManager.getUserID().then(function (fromID) { if (peerID != fromID) { - flags |= 3; + flags |= 2; + if (!AppUsersManager.isBot(peerID)) { + flags |= 1; + } } if (replyToMsgID) { flags |= 8; @@ -1773,12 +2012,20 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) break; } + var flags = 0; + if (peerID != fromID) { + flags |= 2; + if (!AppUsersManager.isBot(peerID)) { + flags |= 1; + } + } + var message = { _: 'message', id: messageID, from_id: fromID, to_id: AppPeersManager.getOutputPeer(peerID), - flags: peerID == fromID ? 0 : 3, + flags: flags, date: tsNow(true) + serverTimeOffset, message: '', media: media, @@ -1849,6 +2096,39 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }); }; + function startBot (botID, chatID, startParam) { + if (startParam) { + var randomID = bigint(nextRandomInt(0xFFFFFFFF)).shiftLeft(32).add(bigint(nextRandomInt(0xFFFFFFFF))).toString(); + + return MtpApiManager.invokeApi('messages.startBot', { + bot: AppUsersManager.getUserInput(botID), + chat_id: chatID, + random_id: randomID, + start_param: startParam + }); + } + + var peerID = chatID ? -chatID : botID; + var inputPeer = AppPeersManager.getInputPeerByID(peerID); + + if (chatID) { + return MtpApiManager.invokeApi('messages.addChatUser', { + chat_id: chatID, + user_id: AppUsersManager.getUserInput(botID) + }).then(function (updates) { + ApiUpdatesManager.processUpdateMessage(updates); + }, function (error) { + if (error && error.type == 'USER_ALREADY_PARTICIPANT') { + var bot = AppUsersManager.getUser(botID); + sendText(-chatID, '/start@' + bot.username); + error.handled = true; + } + }); + } + + return sendText(botID, '/start'); + } + function cancelPendingMessage (randomID) { var pendingData = pendingByRandomID[randomID]; @@ -2027,10 +2307,22 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) message.media.progress = messagesStorage[msgID].media.progress; } + var fromUser = AppUsersManager.getUser(message.from_id); + var fromBot = fromUser.pFlags.bot && fromUser.username || false; + var withBot = (fromBot || + message.to_id && ( + message.to_id.chat_id || + message.to_id.user_id && AppUsersManager.isBot(message.to_id.user_id) + ) + ); + if (message.media) { if (message.media.caption && message.media.caption.length) { - message.media.rCaption = RichTextProcessor.wrapRichText(message.media.caption); + message.media.rCaption = RichTextProcessor.wrapRichText(message.media.caption, { + noCommands: !withBot, + fromBot: fromBot + }); } switch (message.media._) { @@ -2094,6 +2386,13 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) case 'messageActionChatEditTitle': message.action.rTitle = RichTextProcessor.wrapRichText(message.action.title, {noLinks: true, noLinebreaks: true}) || _('chat_title_deleted'); break; + + case 'messageActionBotIntro': + message.action.rDescription = RichTextProcessor.wrapRichText(message.action.description, { + noCommands: !withBot, + fromBot: fromBot + }); + break; } } @@ -2113,7 +2412,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } if (message.message && message.message.length) { - var options = {}; + var options = { + noCommands: !withBot, + fromBot: fromBot + }; if (!Config.Navigator.mobile) { options.extractUrlEmbed = true; } @@ -2132,6 +2434,31 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return messagesForHistory[msgID] = message; } + function wrapReplyMarkup (replyMarkup) { + if (!replyMarkup || + replyMarkup._ == 'replyKeyboardHide') { + return false; + } + if (replyMarkup.wrapped) { + return replyMarkup; + } + var count = replyMarkup.rows && replyMarkup.rows.length || 0; + if (count > 0 && count <= 4 && !replyMarkup.pFlags.resize) { + replyMarkup.splitCount = count; + } + replyMarkup.wrapped = true; + angular.forEach(replyMarkup.rows, function (markupRow) { + angular.forEach(markupRow.buttons, function (markupButton) { + markupButton.rText = RichTextProcessor.wrapRichText(markupButton.text, {noLinks: true, noLinebreaks: true}); + }) + }) + + if (nextRandomInt(1)) { + replyMarkup.rows = replyMarkup.rows.slice(0, 2); + } + return replyMarkup; + } + function fetchSingleMessages () { if (fetchSingleMessagesTimeout !== false) { clearTimeout(fetchSingleMessagesTimeout); @@ -2472,6 +2799,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) saveMessages([message]); + if (mergeReplyKeyboard(historyStorage, message)) { + $rootScope.$broadcast('history_reply_markup', {peerID: peerID}) + } + if (!message.out) { AppUsersManager.forceUserOnline(message.from_id); } @@ -2689,6 +3020,14 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } } historyStorage.history = newHistory; + if (updatedData.count && + historyStorage.count !== null && + historyStorage.count > 0) { + historyStorage.count -= updatedData.count; + if (historyStorage.count < 0) { + historyStorage.count = 0; + } + } for (var i = 0; i < historyStorage.pending.length; i++) { if (!updatedData.msgs[historyStorage.pending[i]]) { @@ -2721,6 +3060,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) getHistory: getHistory, getSearch: getSearch, getMessage: getMessage, + getReplyKeyboard: getReplyKeyboard, readHistory: readHistory, readMessages: readMessages, flushHistory: flushHistory, @@ -2730,10 +3070,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) sendFile: sendFile, sendOther: sendOther, forwardMessages: forwardMessages, + startBot: startBot, openChatInviteLink: openChatInviteLink, getMessagePeer: getMessagePeer, wrapForDialog: wrapForDialog, wrapForHistory: wrapForHistory, + wrapReplyMarkup: wrapReplyMarkup, regroupWrappedHistory: regroupWrappedHistory } }) @@ -2743,8 +3085,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) windowW = $(window).width(), windowH = $(window).height(); - function savePhoto (apiPhoto) { + function savePhoto (apiPhoto, context) { + if (context) { + angular.extend(apiPhoto, context); + } photos[apiPhoto.id] = apiPhoto; + angular.forEach(apiPhoto.sizes, function (photoSize) { if (photoSize._ == 'photoCachedSize') { MtpApiFileManager.saveSmallFile(photoSize.location, photoSize.bytes); @@ -2778,7 +3124,8 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return bestPhotoSize; } - function getUserPhotos (inputUser, maxID, limit) { + function getUserPhotos (userID, maxID, limit) { + var inputUser = AppUsersManager.getUserInput(userID); return MtpApiManager.invokeApi('photos.getUserPhotos', { user_id: inputUser, offset: 0, @@ -2787,8 +3134,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }).then(function (photosResult) { AppUsersManager.saveApiUsers(photosResult.users); var photoIDs = []; + var context = {user_id: userID}; for (var i = 0; i < photosResult.photos.length; i++) { - savePhoto(photosResult.photos[i]); + savePhoto(photosResult.photos[i], context); photoIDs.push(photosResult.photos[i].id) } @@ -2988,9 +3336,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) var webpages = {}; var pendingWebPages = {}; - function saveWebPage (apiWebPage, messageID) { + function saveWebPage (apiWebPage, messageID, mediaContext) { if (apiWebPage.photo && apiWebPage.photo._ === 'photo') { - AppPhotosManager.savePhoto(apiWebPage.photo); + AppPhotosManager.savePhoto(apiWebPage.photo, mediaContext); } else { delete apiWebPage.photo; } @@ -3129,7 +3477,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) windowW = $(window).width(), windowH = $(window).height(); - function saveVideo (apiVideo) { + function saveVideo (apiVideo, context) { + if (context) { + angular.extend(apiVideo, context); + } videos[apiVideo.id] = apiVideo; if (apiVideo.thumb && apiVideo.thumb._ == 'photoCachedSize') { @@ -3322,9 +3673,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) windowW = $(window).width(), windowH = $(window).height(); - function saveDoc (apiDoc) { + function saveDoc (apiDoc, context) { docs[apiDoc.id] = apiDoc; + if (context) { + angular.extend(apiDoc, context); + } if (apiDoc.thumb && apiDoc.thumb._ == 'photoCachedSize') { MtpApiFileManager.saveSmallFile(apiDoc.thumb.location, apiDoc.thumb.bytes); @@ -3338,8 +3692,12 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) case 'documentAttributeFilename': apiDoc.file_name = attribute.file_name; break; - case 'documentAttributeVideo': case 'documentAttributeAudio': + apiDoc.duration = attribute.duration; + apiDoc.audioTitle = attribute.title; + apiDoc.audioPerformer = attribute.performer; + break; + case 'documentAttributeVideo': apiDoc.duration = attribute.duration; break; case 'documentAttributeSticker': @@ -3349,9 +3707,13 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) apiDoc.stickerEmojiRaw = attribute.alt; apiDoc.stickerEmoji = RichTextProcessor.wrapRichText(apiDoc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true}); } - if (attribute.stickerset && - attribute.stickerset._ == 'inputStickerSetID') { - apiDoc.stickerSetID = attribute.stickerset.id; + if (attribute.stickerset) { + if (attribute.stickerset._ == 'inputStickerSetEmpty') { + delete attribute.stickerset; + } + else if (attribute.stickerset._ == 'inputStickerSetID') { + apiDoc.stickerSetInput = attribute.stickerset; + } } break; case 'documentAttributeImageSize': @@ -3432,7 +3794,8 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) inputFileLocation = { _: 'inputDocumentFileLocation', id: docID, - access_hash: doc.access_hash + access_hash: doc.access_hash, + file_name: doc.file_name }; if (historyDoc.downloaded === undefined) { @@ -3450,7 +3813,8 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) inputFileLocation = { _: 'inputDocumentFileLocation', id: docID, - access_hash: doc.access_hash + access_hash: doc.access_hash, + file_name: doc.file_name }; if (historyDoc.downloaded && !toFileEntry) { @@ -3657,6 +4021,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return { start: start, openStickersetLink: openStickersetLink, + openStickerset: openStickerset, installStickerset: installStickerset, getStickers: getStickers, getStickerset: getStickerset, @@ -3667,49 +4032,39 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) if (!started) { started = true; setTimeout(getStickers, 1000); - setInterval(preloadStickers, 900000); } } - function preloadStickers() { - getStickers().then(getStickersImages); - } - function processRawStickers(stickers) { if (applied !== stickers.hash) { applied = stickers.hash; - var i, j, len1, len2, doc, setID, set; + var i, j, len1, len2, doc, set, setItems, fullSet; - len1 = stickers.documents.length; + currentStickersets = []; currentStickers = []; - stickersetItems = {}; + len1 = stickers.sets.length; for (i = 0; i < len1; i++) { - doc = stickers.documents[i]; - AppDocsManager.saveDoc(doc); - currentStickers.push(doc.id); - setID = doc.stickerSetID || 0; - if (stickersetItems[setID] === undefined) { - stickersetItems[setID] = []; + set = stickers.sets[i]; + fullSet = stickers.fullSets[set.id]; + len2 = fullSet.documents.length; + setItems = []; + for (j = 0; j < len2; j++) { + doc = fullSet.documents[j]; + AppDocsManager.saveDoc(doc); + currentStickers.push(doc.id); + setItems.push(doc.id); } - stickersetItems[setID].push(doc.id); - } - - currentStickersets = []; - if (stickersetItems[0] !== undefined) { currentStickersets.push({ - _: 'stickerSetDefault', - id: 0, - docIDs: stickersetItems[0] + id: set.id, + title: set.title, + short_name: set.short_name, + installed: (set.flags & (1 << 0)) > 0, + disabled: (set.flags & (1 << 1)) > 0, + official: (set.flags & (1 << 2)) > 0, + docIDs: setItems }); - } - len1 = stickers.sets.length; - for (i = 0; i < len1; i++) { - set = stickers.sets[i]; installedStickersets[set.id] = true; - set.docIDs = stickersetItems[set.id] || []; - currentStickersets.push(set); } - } return currentStickersets; @@ -3727,35 +4082,61 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return MtpApiManager.invokeApi('messages.getAllStickers', { hash: stickers && stickers.hash || '' }).then(function (newStickers) { - if (newStickers._ == 'messages.allStickersNotModified') { + var notModified = newStickers._ == 'messages.allStickersNotModified'; + if (notModified) { newStickers = stickers; } newStickers.date = tsNow(true) + 3600; newStickers.layer = layer; delete newStickers._; - Storage.set({all_stickers: newStickers}); - return processRawStickers(newStickers); + if (notModified) { + Storage.set({all_stickers: newStickers}); + return processRawStickers(newStickers); + } + + return getStickerSets(newStickers).then(function () { + Storage.set({all_stickers: newStickers}); + return processRawStickers(newStickers); + }); + }); }) } - function downloadStickerThumb (docID) { - var doc = AppDocsManager.getDoc(docID); - return MtpApiFileManager.downloadSmallFile(doc.thumb.location).then(function (blob) { - if (WebpManager.isWebpSupported()) { - return { - id: doc.id, - src: FileManager.getUrl(blob, 'image/webp') - }; + function getStickerSets (allStickers) { + var promises = []; + var cachedSets = allStickers.fullSets || {}; + allStickers.fullSets = {}; + angular.forEach(allStickers.sets, function (shortSet) { + var fullSet = cachedSets[shortSet.id]; + if (fullSet && fullSet.set.hash == shortSet.hash) { + allStickers.fullSets[shortSet.id] = fullSet; + } else { + var promise = MtpApiManager.invokeApi('messages.getStickerSet', { + stickerset: { + _: 'inputStickerSetID', + id: shortSet.id, + access_hash: shortSet.access_hash + } + }).then(function (fullSet) { + allStickers.fullSets[shortSet.id] = fullSet; + }); + promises.push(promise); } + }); + return $q.all(promises); + } - return FileManager.getByteArray(blob).then(function (bytes) { - return { - id: doc.id, - src: WebpManager.getPngUrlFromData(bytes) - }; - }); + function downloadStickerThumb (docID) { + var doc = AppDocsManager.getDoc(docID); + var thumbLocation = angular.copy(doc.thumb.location); + thumbLocation.sticker = true; + return MtpApiFileManager.downloadSmallFile(thumbLocation).then(function (blob) { + return { + id: doc.id, + src: FileManager.getUrl(blob, 'image/webp') + }; }); } @@ -3789,7 +4170,8 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) access_hash: set.access_hash }; return MtpApiManager.invokeApi(method, { - stickerset: inputStickerset + stickerset: inputStickerset, + disabled: false }).then(function (result) { if (uninstall) { delete installedStickersets[set.id]; @@ -3801,11 +4183,15 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } function openStickersetLink (shortName) { - var scope = $rootScope.$new(true); - scope.inputStickerset = { + return openStickerset({ _: 'inputStickerSetShortName', short_name: shortName - }; + }); + } + + function openStickerset (inputStickerset) { + var scope = $rootScope.$new(true); + scope.inputStickerset = inputStickerset; var modal = $modal.open({ templateUrl: templateUrl('stickerset_modal'), controller: 'StickersetModalController', @@ -4062,8 +4448,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) syncPending.ptsAwaiting = true; return false; } - curState.pts = update.pts; - popPts = true; + if (update.pts > curState.pts) { + curState.pts = update.pts; + popPts = true; + } } else if (options.seq > 0) { var seq = options.seq; @@ -4150,13 +4538,13 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) emojiSupported = navigator.userAgent.search(/OS X|iPhone|iPad|iOS|Android/i) != -1, emojiCode; - var emojiRegex = '\\u0023\\u20E3|\\u00a9|\\u00ae|\\u203c|\\u2049|\\u2139|[\\u2194-\\u2199]|\\u21a9|\\u21aa|\\u231a|\\u231b|\\u23e9|[\\u23ea-\\u23ec]|\\u23f0|\\u24c2|\\u25aa|\\u25ab|\\u25b6|\\u2611|\\u2614|\\u26fd|\\u2705|\\u2709|[\\u2795-\\u2797]|\\u27a1|\\u27b0|\\u27bf|\\u2934|\\u2935|[\\u2b05-\\u2b07]|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u3030|\\u303d|\\u3297|\\u3299|[\\uE000-\\uF8FF\\u270A-\\u2764\\u2122\\u25C0\\u25FB-\\u25FE\\u2615\\u263a\\u2648-\\u2653\\u2660-\\u2668\\u267B\\u267F\\u2693\\u261d\\u26A0-\\u26FA\\u2708\\u2702\\u2601\\u260E]|[\\u2600\\u26C4\\u26BE\\u23F3\\u2764]|\\uD83D[\\uDC00-\\uDFFF]|\\uD83C[\\uDDE8-\\uDDFA\uDDEC]\\uD83C[\\uDDEA-\\uDDFA\uDDE7]|[0-9]\\u20e3|\\uD83C[\\uDC00-\\uDFFF]'; + var emojiRegExp = "\\u0023\\u20E3|\\u00a9|\\u00ae|\\u203c|\\u2049|\\u2139|[\\u2194-\\u2199]|\\u21a9|\\u21aa|\\u231a|\\u231b|\\u23e9|[\\u23ea-\\u23ec]|\\u23f0|\\u24c2|\\u25aa|\\u25ab|\\u25b6|\\u2611|\\u2614|\\u26fd|\\u2705|\\u2709|[\\u2795-\\u2797]|\\u27a1|\\u27b0|\\u27bf|\\u2934|\\u2935|[\\u2b05-\\u2b07]|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u3030|\\u303d|\\u3297|\\u3299|[\\uE000-\\uF8FF\\u270A-\\u2764\\u2122\\u25C0\\u25FB-\\u25FE\\u2615\\u263a\\u2648-\\u2653\\u2660-\\u2668\\u267B\\u267F\\u2693\\u261d\\u26A0-\\u26FA\\u2708\\u2702\\u2601\\u260E]|[\\u2600\\u26C4\\u26BE\\u23F3\\u2764]|\\uD83D[\\uDC00-\\uDFFF]|\\uD83C[\\uDDE8-\\uDDFA\uDDEC]\\uD83C[\\uDDEA-\\uDDFA\uDDE7]|[0-9]\\u20e3|\\uD83C[\\uDC00-\\uDFFF]"; for (emojiCode in emojiData) { emojiMap[emojiData[emojiCode][0]] = emojiCode; } - var regexAlphaChars = "a-z" + + var alphaCharsRegExp = "a-z" + "\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff" + // Latin-1 "\\u0100-\\u024f" + // Latin Extended A and B "\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b" + // IPA Extensions @@ -4182,41 +4570,44 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) "\\uff66-\\uff9f" + // half width Katakana "\\uffa1-\\uffdc"; // half width Hangul (Korean) - var regexAlphaNumericChars = "0-9\_" + regexAlphaChars; + var alphaNumericRegExp = "0-9\_" + alphaCharsRegExp; // Based on Regular Expression for URL validation by Diego Perini - var urlRegex = "((?:https?|ftp)://|mailto:)?" + + var urlRegExp = "((?:https?|ftp)://|mailto:)?" + // user:pass authentication "(?:\\S{1,64}(?::\\S{0,64})?@)?" + "(?:" + - // sindresorhus/ip-regex + // sindresorhus/ip-regexp "(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}" + "|" + // host name - "[" + regexAlphaChars + "0-9][" + regexAlphaChars + "0-9\-]{0,64}" + + "[" + alphaCharsRegExp + "0-9][" + alphaCharsRegExp + "0-9\-]{0,64}" + // domain name - "(?:\\.[" + regexAlphaChars + "0-9][" + regexAlphaChars + "0-9\-]{0,64}){0,10}" + + "(?:\\.[" + alphaCharsRegExp + "0-9][" + alphaCharsRegExp + "0-9\-]{0,64}){0,10}" + // TLD identifier - "(?:\\.(xn--[0-9a-z]{2,16}|[" + regexAlphaChars + "]{2,24}))" + + "(?:\\.(xn--[0-9a-z]{2,16}|[" + alphaCharsRegExp + "]{2,24}))" + ")" + // port number "(?::\\d{2,5})?" + // resource path "(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?"; - var regExp = new RegExp('(^|\\s)(@)([a-zA-Z\\d_]{5,32})|(' + urlRegex + ')|(\\n)|(' + emojiRegex + ')|(^|\\s)(#[' + regexAlphaNumericChars + ']{2,64})', 'i'); + var usernameRegExp = "[a-zA-Z\\d_]{5,32}"; + var botCommandRegExp = "\\/([a-zA-Z\\d_]{1,32})(?:@(" + usernameRegExp + "))?(\\s|$)" + + var fullRegExp = new RegExp('(^|\\s)(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\n)|(' + emojiRegExp + ')|(^|\\s)(#[' + alphaNumericRegExp + ']{2,64})|(^|\\s)' + botCommandRegExp, 'i'); - var emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - var youtubeRegex = /^(?:https?:\/\/)?(?:www\.)?youtu(?:|\.be|be\.com|\.b)(?:\/v\/|\/watch\\?v=|e\/|(?:\/\??#)?\/watch(?:.+)v=)(.{11})(?:\&[^\s]*)?/; - var vimeoRegex = /^(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(\d+)/; - var instagramRegex = /^https?:\/\/(?:instagr\.am\/p\/|instagram\.com\/p\/)([a-zA-Z0-9\-\_]+)/i; - var vineRegex = /^https?:\/\/vine\.co\/v\/([a-zA-Z0-9\-\_]+)/i; - var twitterRegex = /^https?:\/\/twitter\.com\/.+?\/status\/\d+/i; - var facebookRegex = /^https?:\/\/(?:www\.|m\.)?facebook\.com\/(?:.+?\/posts\/\d+|(?:story\.php|permalink\.php)\?story_fbid=(\d+)(?:&substory_index=\d+)?&id=(\d+))/i; - var gplusRegex = /^https?:\/\/plus\.google\.com\/\d+\/posts\/[a-zA-Z0-9\-\_]+/i; - var soundcloudRegex = /^https?:\/\/(?:soundcloud\.com|snd\.sc)\/([a-zA-Z0-9%\-\_]+)\/([a-zA-Z0-9%\-\_]+)/i; - var spotifyRegex = /(https?:\/\/(open\.spotify\.com|play\.spotify\.com|spoti\.fi)\/(.+)|spotify:(.+))/i; + var emailRegExp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + var youtubeRegExp = /^(?:https?:\/\/)?(?:www\.)?youtu(?:|\.be|be\.com|\.b)(?:\/v\/|\/watch\\?v=|e\/|(?:\/\??#)?\/watch(?:.+)v=)(.{11})(?:\&[^\s]*)?/; + var vimeoRegExp = /^(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(\d+)/; + var instagramRegExp = /^https?:\/\/(?:instagr\.am\/p\/|instagram\.com\/p\/)([a-zA-Z0-9\-\_]+)/i; + var vineRegExp = /^https?:\/\/vine\.co\/v\/([a-zA-Z0-9\-\_]+)/i; + var twitterRegExp = /^https?:\/\/twitter\.com\/.+?\/status\/\d+/i; + var facebookRegExp = /^https?:\/\/(?:www\.|m\.)?facebook\.com\/(?:.+?\/posts\/\d+|(?:story\.php|permalink\.php)\?story_fbid=(\d+)(?:&substory_index=\d+)?&id=(\d+))/i; + var gplusRegExp = /^https?:\/\/plus\.google\.com\/\d+\/posts\/[a-zA-Z0-9\-\_]+/i; + var soundcloudRegExp = /^https?:\/\/(?:soundcloud\.com|snd\.sc)\/([a-zA-Z0-9%\-\_]+)\/([a-zA-Z0-9%\-\_]+)/i; + var spotifyRegExp = /(https?:\/\/(open\.spotify\.com|play\.spotify\.com|spoti\.fi)\/(.+)|spotify:(.+))/i; var siteHashtags = { Telegram: '#/im?q=%23{1}', @@ -4271,7 +4662,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) // var start = tsNow(); - while ((match = raw.match(regExp))) { + while ((match = raw.match(fullRegExp))) { html.push(encodeEntities(raw.substr(0, match.index))); if (match[3]) { // telegram.me links @@ -4302,7 +4693,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } else if (match[4]) { // URL & e-mail if (!options.noLinks) { - if (emailRegex.test(match[4])) { + if (emailRegExp.test(match[4])) { html.push( '', + encodeEntities('/' + match[12] + (match[13] ? '@' + match[13] : '')), + '', + encodeEntities(match[14]) + ); + } else { + html.push( + encodeEntities(match[0]) + ); + } + } raw = raw.substr(match.index + match[0].length); } @@ -4466,19 +4878,19 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) var embedUrlMatches, result; - if (embedUrlMatches = url.match(youtubeRegex)) { + if (embedUrlMatches = url.match(youtubeRegExp)) { return ['youtube', embedUrlMatches[1]]; } - if (embedUrlMatches = url.match(vimeoRegex)) { + if (embedUrlMatches = url.match(vimeoRegExp)) { return ['vimeo', embedUrlMatches[1]]; } - else if (embedUrlMatches = url.match(instagramRegex)) { + else if (embedUrlMatches = url.match(instagramRegExp)) { return ['instagram', embedUrlMatches[1]]; } - else if (embedUrlMatches = url.match(vineRegex)) { + else if (embedUrlMatches = url.match(vineRegExp)) { return ['vine', embedUrlMatches[1]]; } - else if (embedUrlMatches = url.match(soundcloudRegex)) { + else if (embedUrlMatches = url.match(soundcloudRegExp)) { var badFolders = 'explore,upload,pages,terms-of-use,mobile,jobs,imprint'.split(','); var badSubfolders = 'sets'.split(','); if (badFolders.indexOf(embedUrlMatches[1]) == -1 && @@ -4486,22 +4898,22 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return ['soundcloud', embedUrlMatches[0]]; } } - else if (embedUrlMatches = url.match(spotifyRegex)) { + else if (embedUrlMatches = url.match(spotifyRegExp)) { return ['spotify', embedUrlMatches[3].replace('/', ':')]; } if (!Config.Modes.chrome_packed) { // Need external JS - if (embedUrlMatches = url.match(twitterRegex)) { + if (embedUrlMatches = url.match(twitterRegExp)) { return ['twitter', embedUrlMatches[0]]; } - else if (embedUrlMatches = url.match(facebookRegex)) { + else if (embedUrlMatches = url.match(facebookRegExp)) { if (embedUrlMatches[2]!= undefined){ return ['facebook', "https://www.facebook.com/"+embedUrlMatches[2]+"/posts/"+embedUrlMatches[1]]; } return ['facebook', embedUrlMatches[0]]; } // Sorry, GPlus widget has no `xfbml.render` like callback and is too wide. - // else if (embedUrlMatches = url.match(gplusRegex)) { + // else if (embedUrlMatches = url.match(gplusRegExp)) { // return ['gplus', embedUrlMatches[0]]; // } } @@ -4526,7 +4938,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) text = [], emojiTitle; - while ((match = raw.match(regExp))) { + while ((match = raw.match(fullRegExp))) { text.push(raw.substr(0, match.index)); if (match[8]) { @@ -5184,6 +5596,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) function selectPeer (options) { var scope = $rootScope.$new(); scope.multiSelect = false; + scope.noMessages = true; if (options) { angular.extend(scope, options); } @@ -5205,6 +5618,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) var scope = $rootScope.$new(); scope.multiSelect = true; + scope.noMessages = true; if (options) { angular.extend(scope, options); } @@ -5426,9 +5840,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }) -.service('LocationParamsService', function ($rootScope, $routeParams, AppUsersManager, AppMessagesManager, AppStickersManager) { +.service('LocationParamsService', function ($rootScope, $routeParams, AppPeersManager, AppUsersManager, AppMessagesManager, PeersSelectService, AppStickersManager) { - var tgAddrRegEx = /^(web\+)?tg:(\/\/)?(.+)/; + var tgAddrRegExp = /^(web\+)?tg:(\/\/)?(.+)/; function checkLocationTgAddr () { var tgaddr = $routeParams.tgaddr; @@ -5436,20 +5850,36 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) try { tgaddr = decodeURIComponent(tgaddr); } catch (e) {}; - var matches = tgaddr.match(tgAddrRegEx); + var matches = tgaddr.match(tgAddrRegExp); if (matches) { handleTgProtoAddr(matches[3]); } } } - function handleTgProtoAddr (url) { + function handleTgProtoAddr (url, inner) { var matches; - if (matches = url.match(/^resolve\?domain=(.+)$/)) { + if (matches = url.match(/^resolve\?domain=(.+?)(?:&(start|startgroup)=(.+))?$/)) { AppUsersManager.resolveUsername(matches[1]).then(function (userID) { + + if (matches[2] == 'startgroup') { + PeersSelectService.selectPeer({ + confirm_type: 'INVITE_TO_GROUP', + noUsers: true + }).then(function (peerString) { + var peerID = AppPeersManager.getPeerID(peerString); + var chatID = peerID < 0 ? -peerID : 0; + AppMessagesManager.startBot(userID, chatID, matches[3]).then(function () { + $rootScope.$broadcast('history_focus', {peerString: peerString}); + }); + }); + return true; + } + $rootScope.$broadcast('history_focus', { - peerString: AppUsersManager.getUserString(userID) + peerString: AppUsersManager.getUserString(userID), + startParam: matches[3] }); }); return true; @@ -5465,6 +5895,22 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return true; } + if (inner && + (matches = url.match(/^bot_command\?command=(.+?)(?:&bot=(.+))?$/))) { + + var peerID = $rootScope.selectedPeerID; + var text = '/' + matches[1]; + if (peerID < 0 && matches[2]) { + text += '@' + matches[2]; + } + AppMessagesManager.sendText(peerID, text); + + $rootScope.$broadcast('history_focus', { + peerString: AppPeersManager.getPeerString(peerID) + }); + return true; + } + return false; } @@ -5491,9 +5937,9 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) !target.onclick && !target.onmousedown) { var href = $(target).attr('href') || target.href || ''; - var match = href.match(tgAddrRegEx); + var match = href.match(tgAddrRegExp); if (match) { - if (handleTgProtoAddr(match[3])) { + if (handleTgProtoAddr(match[3], true)) { return cancelEvent(event); } } diff --git a/app/less/app.less b/app/less/app.less index c2b8e838..0ed740af 100644 --- a/app/less/app.less +++ b/app/less/app.less @@ -858,7 +858,7 @@ a.tg_radio_on:hover i.icon-radio { vertical-align: top; margin-right: 18px; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -5px -10px; } .icon-tg-title { @@ -899,7 +899,7 @@ a.tg_radio_on:hover i.icon-radio { margin-left: 12px; margin-top: -1px; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -18px -50px; } @@ -1617,7 +1617,7 @@ div.im_message_video_thumb { height: 18px; margin: 12px 15px; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -14px -509px; .im_message_file_button_dl_doc & { @@ -1638,7 +1638,7 @@ div.im_message_video_thumb { height: 16px; margin: 13px 16px; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -13px -611px; } @@ -1659,8 +1659,9 @@ div.im_message_video_thumb { background-position: -2px -542px; } -.im_history_selectable { - a { +.im_history_select_active { + a, + .clickable { pointer-events: none; } } @@ -1912,6 +1913,22 @@ img.im_message_document_thumb { .im_service_message_wrap { text-align: center; } +.im_bot_intro_message_wrap { + max-width: 300px; + padding: 4px 10px; + margin: 10px auto; + color: #000; + line-height: 1.4; + text-align: left; + font-size: 13px; +} +.im_bot_intro_message_header { + font-weight: bold; + text-align: center; +} +.im_bot_intro_message { + margin-top: 10px; +} .im_service_message { display: inline-block; min-width: 10px; @@ -2040,10 +2057,69 @@ a.im_message_fwd_photo { } .im_message_mymention { background: #fff8cc; - /*border-bottom: 1px solid #ffe222;*/ - /*font-weight: bold;*/ } +.reply_markup_wrap { + margin: 15px -2px 0; +} +.reply_markup_row { + padding: 4px 0; + &:first-child { + padding-top: 0; + } + &:last-child { + padding-bottom: 0; + } + .reply_markup_scrollable_wrap.active-scrollbar & { + margin-right: 6px; + } +} +.reply_markup_button_wrap { + display: inline-block; + padding: 0 4px; +} +.reply_markup_button { + color: #3a6d99; + display: block; + width: 100%; + background: #f0f4f7; + height: 30px; + font-size: 13px; + margin: 0; + padding: 6px 6px; + + .reply_markup_h1 & { + height: 170px; + } + .reply_markup_h2 & { + height: 81px; + } + .reply_markup_h3 & { + height: 51px; + } + .reply_markup_h4 & { + height: 36px; + } +} +.reply_markup_button:hover { + color: #3a6d99; + background: #dfe8f0; +} +.reply_markup_button_w1 {width: 100%;} +.reply_markup_button_w2 {width: 50%;} +.reply_markup_button_w3 {width: 33.3333333%;} +.reply_markup_button_w4 {width: 25%;} +.reply_markup_button_w5 {width: 20%;} +.reply_markup_button_w6 {width: 16.6666666%;} +.reply_markup_button_w7 {width: 14.2857142%;} +.reply_markup_button_w8 {width: 12.5%;} +.reply_markup_button_w9 {width: 11.1111111%;} +.reply_markup_button_w10 {width: 10%;} +.reply_markup_button_w11 {width: 9.09090909%;} +.reply_markup_button_w12 {width: 8.33333333%;} + + + .im_history_not_selected, .im_history_empty { visibility: hidden; @@ -2206,7 +2282,7 @@ img.img_fullsize { vertical-align: top; opacity: 0.8; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -9px -335px; } @@ -2310,14 +2386,11 @@ img.img_fullsize { .composer_emoji_tooltip_tab_stickers {background-position: -9px -361px; } .composer_emoji_tooltip_tab_stickers.active {background-position: -9px -333px; } -.nano.composer_emoji_tooltip_content_wrap { +.composer_emoji_tooltip_scrollable_container { height: 174px; position: relative; } .composer_emoji_tooltip_content { - /*position: relative;*/ - /*overflow: hidden; - overflow-y: auto;*/ padding-right: 8px; outline: 0!important; } @@ -2397,15 +2470,33 @@ a.composer_emoji_btn { &.emoji-spritesheet-4 { background-size: 884px 182px; } } -.composer_dropdown { + +.composer_dropdown_wrap { + background: #FFF; display: none; - padding: 6px 0; + position: absolute; border: 0; .box-shadow(0px 1px 1px 0px rgba(60,75,87,0.27)); border-radius: 0; margin-top: -5px; + margin-left: -1px; +} +.composer_dropdown_scroller { +} + +.composer_dropdown { + position: static; + display: block; + float: none; + top: auto; + left: auto; + border: 0; + border-radius: 0; + padding: 0; + margin: 0; + z-index: auto; & > li > a { display: block; @@ -2457,6 +2548,7 @@ a.composer_emoji_btn { img& { width: 32px; height: 32px; + vertical-align: top; } span& { @@ -2474,6 +2566,36 @@ a.composer_emoji_btn { vertical-align: top; } +.composer_dropdown a.composer_command_option { + color: #808080; + line-height: 32px; + padding-right: 5px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.composer_dropdown .composer_command_value { + color: #52719a; + display: inline; +} +.composer_dropdown .composer_command_desc { + display: inline; + color: #808080; + padding-left: 7px; + font-weight: normal; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +a.composer_command_option:hover .composer_command_desc, +a.composer_command_option.composer_autocomplete_option_active .composer_command_desc { + color: #698192; +} +.composer_command_desc .emoji { + vertical-align: text-bottom; +} + + .composer_stickerset_title { display: block; // clear: both; @@ -2558,6 +2680,67 @@ a.composer_emoji_btn { } } +.composer_command_btn { + display: block; + position: absolute; + right: 37px; + top: 4px; + cursor: pointer; + padding: 0; + + width: 20px; + height: 20px; +} +.icon-slash { + display: inline-block; + width: 20px; + height: 20px; + vertical-align: top; + opacity: 0.8; + + .image-2x('../img/icons/General.png', 40px, 848px); + background-position: -10px -790px; + + .composer_command_btn.active & { + background-position: -10px -820px; + } + + .composer_command_btn:hover & { + opacity: 1.0; + } +} + +.composer_keyboard_btn { + display: block; + position: absolute; + right: 37px; + top: 4px; + cursor: pointer; + padding: 0; + + width: 20px; + height: 20px; +} +.icon-keyboard { + display: inline-block; + width: 20px; + height: 20px; + vertical-align: top; + opacity: 0.8; + + .image-2x('../img/icons/General.png', 40px, 848px); + background-position: -10px -730px; + + .composer_keyboard_btn.active & { + background-position: -10px -760px; + } + + .composer_keyboard_btn:hover & { + opacity: 1.0; + } +} + + .error_modal_window { .modal-dialog { max-width: 350px; @@ -2984,13 +3167,6 @@ a.contacts_modal_contact:hover .md_modal_list_peer_description, } } -.im_edit_panel_title { - text-align: center; - margin: 0; - font-size: 14px; - line-height: 34px; -} - .im_message_focus { .im_message_date, .im_message_document_size, @@ -3020,6 +3196,8 @@ a.peer_photo_init { color: #fff; text-align: center; text-transform: uppercase; + + .user-select(none); } h5 { diff --git a/app/less/desktop.less b/app/less/desktop.less index d00863ac..46aebdd1 100644 --- a/app/less/desktop.less +++ b/app/less/desktop.less @@ -205,7 +205,7 @@ display: inline-block; vertical-align: top; margin-top: 3px; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -10px -111px; } @@ -217,7 +217,7 @@ margin-top: 2px; display: inline-block; vertical-align: top; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -11px -135px; } @@ -228,7 +228,7 @@ margin-top: 1px; display: inline-block; vertical-align: top; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -10px -163px; } @@ -239,7 +239,7 @@ margin-top: 1px; display: inline-block; vertical-align: top; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -10px -637px; } @@ -250,7 +250,7 @@ display: inline-block; vertical-align: top; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -10px -193px; } } @@ -378,7 +378,7 @@ margin-right: 12px; vertical-align: top; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: 0 0; } @@ -482,7 +482,8 @@ } } -.composer_emoji_tooltip { +.composer_emoji_tooltip, +.composer_dropdown_wrap { z-index: 1001; .nano > .nano-pane { @@ -491,11 +492,18 @@ & > .nano-slider { background: #d1d1d1; + background : rgba(0,0,0,0.17); margin: 0 3px 0 4px; } } } +.composer_dropdown_wrap .nano > .nano-pane { + top: 3px; + bottom: 3px; + right: -1px; +} + .countries_modal_col { .nano { & > .nano-pane { @@ -694,6 +702,24 @@ a.footer_link.active:active { } } +.reply_markup_scrollable_container { + .nano > .nano-pane { + background: rgba(137, 160, 179, 0.1); + right: 2px; + width: 3px; + top: 0; + bottom: 0; + .rounded(1px); + + & > .nano-slider { + .rounded(1px); + background: #d1d1d1; + background: rgba(137, 160, 179, 0.5); + margin: 0; + } + } +} + .im_history { &_no_dialogs_wrap { margin: 122px 170px 60px; @@ -772,50 +798,13 @@ a.footer_link.active:active { opacity: 1; } -.icon-message-status { - pointer-events: none; - background: #4eabf1; - border: 0; - display: block; - width: 10px; - height: 10px; - border-radius: 7px; - position: absolute; - margin-left: -26px; - margin-top: 16px; - opacity: 0; - - .im_message_unread & { - opacity: 1.0; - } - .im_message_pending & { - opacity: 0.5; - } -} - -.im_message_error_btn { - display: none; - - .im_message_error & { - display: inline; - } - - .icon-message-status { - background: #da564d; - opacity: 0.85; - - &:hover { - opacity: 1; - } - } -} - /* Messages edit panel */ .im { &_edit_delete_btn, &_edit_forward_btn, - &_edit_reply_btn { + &_edit_reply_btn, + &_start_btn { border-radius: 2px; padding: 7px 17px; font-weight: bold; @@ -825,7 +814,7 @@ a.footer_link.active:active { } &_edit_panel_wrap { - padding: 0px 0 43px; + padding: 0px 0 41px; margin: 0 24px 0 12px; } @@ -849,6 +838,14 @@ a.footer_link.active:active { text-transform: uppercase; } + &_edit_start_actions { + text-align: center; + text-transform: uppercase; + } + &_start_btn { + padding: 7px 25px; + } + &_selected_count { color: #b9cfe3; } @@ -894,55 +891,114 @@ a.footer_link.active:active { .im_message_selected .im_message_audio_duration, .im_message_selected .im_message_audio_size, .im_message_selected .im_message_fwd_date, -.im_history_selectable .im_message_outer_wrap:hover .im_message_date, -.im_history_selectable .im_message_outer_wrap:hover .im_message_document_size, -.im_history_selectable .im_message_outer_wrap:hover .im_message_audio_duration, -.im_history_selectable .im_message_outer_wrap:hover .im_message_audio_size, -.im_history_selectable .im_message_outer_wrap:hover .im_message_fwd_date { +.im_history_select_active .im_message_outer_wrap:hover .im_message_date, +.im_history_select_active .im_message_outer_wrap:hover .im_message_document_size, +.im_history_select_active .im_message_outer_wrap:hover .im_message_audio_duration, +.im_history_select_active .im_message_outer_wrap:hover .im_message_audio_size, +.im_history_select_active .im_message_outer_wrap:hover .im_message_fwd_date { color: #899daf; } -.im_content_message_select_area { - display: none; - cursor: pointer; - position: absolute; - width: 99px; - height: 58px; - margin: -8px 0 0 -99px; - - .user-select(none); -} - .icon-select-tick { display: none; - width: 26px; - height: 26px; - margin: 16px 0 0 40px; - - .image-2x('../img/icons/IconsetW.png', 42px, 1171px); - background-position: -9px -516px; } @media (min-width: 1024px) { - .im_content_message_select_area { - display: block; - } .im_message_wrap { position: relative; } + .icon-select-tick { + .im_message_selected &, + .im_history_selectable .im_message_outer_wrap:hover & { + position: absolute; + width: 26px; + height: 26px; + margin: 9px 0 0 -59px; + display: block; + + .image-2x('../img/icons/IconsetW.png', 42px, 1171px); + background-position: -9px -481px; + opacity: 0.5; + } + .im_message_selected & { + opacity: 1 !important; + } + + .im_grouped_short &, + .im_grouped_short .im_message_outer_wrap:hover & { + margin-top: -2px; + } + .im_message_fwd &, + .im_message_outer_wrap:hover .im_message_fwd & { + margin-top: 10px; + } + .im_grouped_fwd &, + .im_grouped_fwd .im_message_outer_wrap:hover & { + margin-top: 7px; + } + .im_grouped &, + .im_grouped .im_message_outer_wrap:hover & { + margin-top: 7px; + } + .im_grouped_fwd_short &, + .im_grouped_fwd_short .im_message_outer_wrap:hover & { + margin-top: -5px; + } + } } -.icon-select-tick { - .im_message_selected &, - .im_history_selectable .im_message_outer_wrap:hover &, - .im_content_message_select_area:hover & { - display: inline-block; - background-position: -9px -481px; +.icon-message-status { + pointer-events: none; + background: #4eabf1; + border: 0; + display: block; + width: 10px; + height: 10px; + border-radius: 7px; + position: absolute; + margin-left: -26px; + margin-top: 16px; + opacity: 0; + + .im_message_unread & { + opacity: 1.0; + } + .im_message_pending & { opacity: 0.5; } - .im_message_selected & { - opacity: 1 !important; + .im_grouped_short & { + margin-top: 5px; + } + .im_message_fwd & { + margin-top: 16px; + } + .im_grouped_fwd & { + margin-top: 13px; + } + .im_grouped & { + margin-top: 13px; + } + .im_grouped_fwd_short & { + margin-top: 2px; + } +} + +.im_message_error_btn { + display: none; + + .im_message_error & { + display: inline; + } + + .icon-message-status { + background: #da564d; + opacity: 0.85; + pointer-events: auto; + + &:hover { + opacity: 1; + } } } @@ -1061,7 +1117,7 @@ a.footer_link.active:active { .im_send_panel_wrap { max-width: 554px; - padding-bottom: 23px; + padding-bottom: 21px; } .im_send_form { max-width: 382px; @@ -1123,11 +1179,15 @@ a.im_panel_peer_photo .peer_initials { } .im_send_field_wrap { - margin-bottom: 15px; + margin-bottom: 13px; position: relative; + padding-bottom: 2px; + overflow-x: hidden; } .composer_rich_textarea, .composer_textarea { + overflow: none; + overflow-y: scroll; border-radius: 0; border: 0; box-shadow: none; @@ -1145,6 +1205,10 @@ a.im_panel_peer_photo .peer_initials { outline: none; box-shadow: 0 2px 0 0 #77b7e4; } + + .im_send_field_wrap_2ndbtn & { + padding-right: 65px; + } } .icon-paperclip { @@ -1155,7 +1219,7 @@ a.im_panel_peer_photo .peer_initials { opacity: 0.8; margin: 0; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -11px -455px; } @@ -1204,7 +1268,7 @@ a.im_panel_peer_photo .peer_initials { vertical-align: top; opacity: 0.8; - .image-2x('../img/icons/General.png', 40px, 778px); + .image-2x('../img/icons/General.png', 40px, 848px); background-position: -10px -399px; } @@ -1227,7 +1291,7 @@ a.im_panel_peer_photo .peer_initials { &_form_wrap { a.im_panel_own_photo, a.im_panel_peer_photo { - margin-top: 47px; + margin-top: 41px; } } @@ -1730,19 +1794,30 @@ a.im_panel_peer_photo .peer_initials { max-width: 362px; display: inline-block; } -.im_message_selected .im_message_outer_wrap, -.im_message_focus .im_message_outer_wrap { +.im_message_selected .im_message_outer_wrap { background: #f2f6fa; } -.im_history_selectable { - .im_message_outer_wrap { - cursor: pointer; +.im_message_focus .im_message_outer_wrap { + background-color: rgba(242, 246, 250, 1.0); + animation-name: im_message_focus_fade; + animation-duration: 5s; +} - &:hover { - background: #f2f6fa; +@keyframes im_message_focus_fade { + from { + background-color: rgba(242, 246, 250, 1.0); + } + to { + background-color: rgba(242, 246, 250, 0); } - } +} + +.im_history_selectable .im_message_outer_wrap { + cursor: pointer; +} +.im_history_select_active .im_message_outer_wrap:hover { + background: #f2f6fa; } .im_message_wrap { @@ -1809,42 +1884,8 @@ a.im_panel_peer_photo .peer_initials { } } -.im_content_message_select_area { - .im_grouped_short &, - .im_grouped & { - height: 50px; - } - - .im_message_fwd & { - margin-top: -4px; - } - .im_grouped_fwd .im_message_fwd &, - .im_grouped_fwd_short .im_message_fwd & { - margin-top: -8px; - } - .im_history_appending & { - height: 52px; - } -} - -.icon-select-tick { - .im_message_fwd & { - margin-top: 12px; - } - .im_grouped_short & { - margin-top: 4px; - } - .im_grouped_fwd_short & { - margin-top: 2px; - } -} - -.im_grouped_short .icon-message-status, -.im_grouped_fwd_short .icon-message-status { - margin-top: 5px; -} .im_grouped_fwd .im_message_fwd_from, .im_grouped_fwd_short .im_message_fwd_from { display: none; @@ -1859,12 +1900,6 @@ a.im_panel_peer_photo .peer_initials { display: none; } } - - .im_grouped_fwd &, - .im_grouped_fwd_short & { - margin-top: 8px; - } - .im_grouped_fwd &, .im_grouped_fwd_short & { margin-top: 8px; } diff --git a/app/less/mobile.less b/app/less/mobile.less index caadc826..2ce1f3ac 100644 --- a/app/less/mobile.less +++ b/app/less/mobile.less @@ -519,7 +519,7 @@ html { border: 0; overflow: hidden; } -.im_history_selectable .im_message_outer_wrap:hover, +.im_history_select_active .im_message_outer_wrap:hover, .im_message_selected { background: #e1e9f0; } @@ -831,10 +831,10 @@ img.im_message_video_thumb, .im_message_focus .audio_player_duration, .im_message_focus .audio_player_size, .im_message_focus .im_message_fwd_date, -.im_history_selectable .im_message_outer_wrap:hover .im_message_document_size, -.im_history_selectable .im_message_outer_wrap:hover .audio_player_duration, -.im_history_selectable .im_message_outer_wrap:hover .audio_player_size, -.im_history_selectable .im_message_outer_wrap:hover .im_message_fwd_date { +.im_history_select_active .im_message_outer_wrap:hover .im_message_document_size, +.im_history_select_active .im_message_outer_wrap:hover .audio_player_duration, +.im_history_select_active .im_message_outer_wrap:hover .audio_player_size, +.im_history_select_active .im_message_outer_wrap:hover .im_message_fwd_date { color: #68839c; } @@ -1077,10 +1077,10 @@ a.im_dialog { .im_message_selected .audio_player_title, .im_message_selected .audio_player_duration, .im_message_selected .audio_player_size, -.im_history_selectable .im_message_selected:hover .im_message_document_size, -.im_history_selectable .im_message_selected:hover .audio_player_duration, -.im_history_selectable .im_message_selected:hover .audio_player_size, -.im_history_selectable .im_message_selected:hover .im_message_fwd_date { +.im_history_select_active .im_message_selected:hover .im_message_document_size, +.im_history_select_active .im_message_selected:hover .audio_player_duration, +.im_history_select_active .im_message_selected:hover .audio_player_size, +.im_history_select_active .im_message_selected:hover .im_message_fwd_date { color: #fff; } a.im_message_fwd_author { diff --git a/app/partials/desktop/audio_player.html b/app/partials/desktop/audio_player.html index 3c0125e3..626707b0 100644 --- a/app/partials/desktop/audio_player.html +++ b/app/partials/desktop/audio_player.html @@ -7,8 +7,12 @@
    - - + + + + + + diff --git a/app/partials/desktop/chat_modal.html b/app/partials/desktop/chat_modal.html index 6a823ecb..0eca05dc 100644 --- a/app/partials/desktop/chat_modal.html +++ b/app/partials/desktop/chat_modal.html @@ -100,7 +100,7 @@
    -
    +
    diff --git a/app/partials/desktop/document_modal.html b/app/partials/desktop/document_modal.html index 588743e3..d19b0827 100644 --- a/app/partials/desktop/document_modal.html +++ b/app/partials/desktop/document_modal.html @@ -16,12 +16,12 @@ -
    +
    -
    +
    diff --git a/app/partials/desktop/im.html b/app/partials/desktop/im.html index bac088d7..d31ea971 100644 --- a/app/partials/desktop/im.html +++ b/app/partials/desktop/im.html @@ -103,7 +103,7 @@
    -
    +
    @@ -140,10 +140,13 @@
    -
    +
    - -
    + +
    + +
    +
    @@ -151,7 +154,7 @@
    -
    +
    @@ -162,21 +165,23 @@ -
    +
    - -
    + +
    -
    +
    + +
    -
    +
    @@ -190,8 +195,12 @@
    +
    +
    +
    +
    diff --git a/app/partials/desktop/message.html b/app/partials/desktop/message.html index a8d7a521..5ef09e7e 100644 --- a/app/partials/desktop/message.html +++ b/app/partials/desktop/message.html @@ -3,8 +3,12 @@
    -
    -
    +
    +
    +
    +
    +
    +
    @@ -20,9 +24,7 @@
    -
    - -
    + diff --git a/app/partials/desktop/message_attach_document.html b/app/partials/desktop/message_attach_document.html index 5b1412c9..8c84ec3b 100644 --- a/app/partials/desktop/message_attach_document.html +++ b/app/partials/desktop/message_attach_document.html @@ -2,7 +2,7 @@
    -
    +
    -
    +
    -
    +
    diff --git a/app/partials/desktop/reply_markup.html b/app/partials/desktop/reply_markup.html new file mode 100644 index 00000000..d4ceebd1 --- /dev/null +++ b/app/partials/desktop/reply_markup.html @@ -0,0 +1,9 @@ +
    +
    +
    +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/app/partials/desktop/reply_message.html b/app/partials/desktop/reply_message.html index 4735a72f..2b578f7f 100644 --- a/app/partials/desktop/reply_message.html +++ b/app/partials/desktop/reply_message.html @@ -8,6 +8,7 @@ class="im_message_reply_thumb" my-load-thumb thumb="thumb" + watch="true" />
    diff --git a/app/partials/desktop/user_modal.html b/app/partials/desktop/user_modal.html index b7cec632..95bf5921 100644 --- a/app/partials/desktop/user_modal.html +++ b/app/partials/desktop/user_modal.html @@ -4,7 +4,7 @@
    - +
    @@ -36,6 +36,13 @@
    +
    +
    + +
    +
    +
    +
    @@ -62,7 +69,19 @@