From da10dce320434e48fd8cfed6b1f2baf88ad4e2ed Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Fri, 30 Jan 2015 18:58:01 +0300 Subject: [PATCH 1/6] WIP added new emoji tooltip class added new emoji panel class wip: textarea composer --- app/css/app.css | 243 +++++++----- app/css/desktop.css | 61 +-- app/img/icons/General.png | Bin 12521 -> 13342 bytes app/img/icons/General_1x.png | Bin 6007 -> 6344 bytes app/img/icons/IconsetSmiles.png | Bin 6975 -> 10026 bytes app/img/icons/IconsetSmiles_1x.png | Bin 3283 -> 5046 bytes app/index.html | 1 + app/js/app.js | 38 +- app/js/controllers.js | 4 +- app/js/directives.js | 12 +- app/js/lib/ng_utils.js | 109 ------ app/js/lib/utils.js | 200 +++++++++- app/js/message_composer.js | 396 ++++++++++++++++++++ app/js/services.js | 6 +- app/partials/desktop/emoji_btn_tooltip.html | 26 ++ app/partials/desktop/im.html | 11 +- app/webogram.appcache | 2 +- 17 files changed, 824 insertions(+), 285 deletions(-) create mode 100644 app/js/message_composer.js create mode 100644 app/partials/desktop/emoji_btn_tooltip.html diff --git a/app/css/app.css b/app/css/app.css index a65e8e92..b7a22ed3 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -771,7 +771,7 @@ a.tg_radio_on:hover i.icon-radio { display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -5px -10px; - background-size: 40px 678px; + background-size: 40px 778px; margin-right: 18px; } .icon-tg-title { @@ -809,7 +809,7 @@ a.tg_radio_on:hover i.icon-radio { display: inline-block; vertical-align: middle; background: url(../img/icons/General.png) no-repeat -18px -50px; - background-size: 40px 678px; + background-size: 40px 778px; margin-left: 12px; margin-top: -1px; } @@ -1453,7 +1453,7 @@ div.im_message_video_thumb { display: inline-block; line-height: 0; background: url(../img/icons/General.png) no-repeat -14px -509px; - background-size: 40px 678px; + background-size: 40px 778px; width: 12px; height: 18px; margin: 12px 15px; @@ -1476,7 +1476,7 @@ div.im_message_video_thumb { width: 14px; height: 16px; background: url(../img/icons/General.png) no-repeat -13px -611px; - background-size: 40px 678px;; + background-size: 40px 778px;; margin: 13px 16px; } .is_1x .im_message_file_button_dl_audio .im_message_file_button_icon { @@ -1775,42 +1775,6 @@ a.im_message_fwd_photo { line-height: 150%; } -span.emoji { - display: -moz-inline-box; - -moz-box-orient: vertical; - display: inline-block; - vertical-align: baseline; - *vertical-align: auto; - *zoom: 1; - *display: inline; - height: 18px; - width: 18px; - background-repeat: no-repeat; - text-indent: -9999px; -} - -/* widths and heights calculated according to spritesheet dimensions and icon size */ -.emoji-spritesheet-0 { - background-size: 486px 126px; - background-image: url('../img/emojisprite_0.png'); -} -.emoji-spritesheet-1 { - background-size: 522px 72px; - background-image: url('../img/emojisprite_1.png'); -} -.emoji-spritesheet-2 { - background-size: 594px 126px; - background-image: url('../img/emojisprite_2.png'); -} -.emoji-spritesheet-3 { - background-size: 612px 54px; - background-image: url('../img/emojisprite_3.png'); -} -.emoji-spritesheet-4 { - background-size: 612px 126px; - background-image: url('../img/emojisprite_4.png'); -} - .im_history_not_selected, .im_history_empty { visibility: hidden; @@ -1995,116 +1959,189 @@ img.img_fullsize { vertical-align: middle; margin: -3px 0 0 0; } -.emoji-menu { + + + +.composer_emoji_insert_btn { + display: block; + position: absolute; + right: 3px; + top: 2px; + cursor: pointer; + padding: 0; + + width: 22px; + height: 22px; + margin-top: 1px; +} +.icon-emoji { + display: inline-block; + width: 22px; + height: 22px; + vertical-align: top; + background: url(../img/icons/General.png) no-repeat -9px -335px; + background-size: 40px 778px; + opacity: 0.8; +} +.composer_emoji_tooltip { + display: none; position: absolute; z-index: 999; width: 220px; - margin-left: -107px; - margin-top: -252px; - overflow: hidden; + margin-left: -100px; + margin-top: -248px; border: 1px #dfdfdf solid; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; - overflow: hidden; -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); -} -.emoji-items-wrap1 { background: #FFF; padding: 5px 2px 5px 5px; } -.emoji-items-wrap1 .emoji-menu-tabs { +.icon-tooltip-tail { + background: #FFF; + width: 18px; + height: 18px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + display: inline-block; + -webkit-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); + border: 1px #dfdfdf solid; + border-width: 0 1px 1px 0; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + position: absolute; + bottom: -10px; + left: 50%; + margin-left: -9px; +} + +.composer_emoji_tooltip_tabs { width: 100%; margin-bottom: 8px; margin-top: 3px; } -.emoji-items-wrap1 .emoji-menu-tabs td { - text-align: center; - color: white; +.composer_emoji_tooltip_tab { line-height: 0; -} -.emoji-menu-tabs .emoji-menu-tab { + color: white; display: inline-block; width: 24px; height: 29px; background: url(../img/icons/IconsetSmiles.png) no-repeat; - background-size: 42px 350px; + background-size: 42px 470px; + cursor: pointer; + opacity: 0.7; + margin: 0 3px; } -.is_1x .emoji-menu-tabs .emoji-menu-tab { +.is_1x .composer_emoji_tooltip_tab { background-image: url(../img/icons/IconsetSmiles_1x.png); } +.composer_emoji_tooltip_tab.active { + opacity: 1; +} -.emoji-menu-tabs .icon-recent {background-position: -9px -306px; } -.emoji-menu-tabs .icon-recent-selected {background-position: -9px -277px; } +.composer_emoji_tooltip_tab_recent {background-position: -9px -306px; } +.composer_emoji_tooltip_tab_recent.active {background-position: -9px -277px; } -.emoji-menu-tabs .icon-smile {background-position: -9px -34px; } -.emoji-menu-tabs .icon-smile-selected {background-position: -9px -5px; } +.composer_emoji_tooltip_tab_smile {background-position: -9px -34px; } +.composer_emoji_tooltip_tab_smile.active {background-position: -9px -5px; } -.emoji-menu-tabs .icon-flower {background-position: -9px -145px; } -.emoji-menu-tabs .icon-flower-selected {background-position: -9px -118px; } +.composer_emoji_tooltip_tab_flower {background-position: -9px -145px; } +.composer_emoji_tooltip_tab_flower.active {background-position: -9px -118px; } -.emoji-menu-tabs .icon-bell {background-position: -9px -89px; } -.emoji-menu-tabs .icon-bell-selected {background-position: -9px -61px; } +.composer_emoji_tooltip_tab_bell {background-position: -9px -89px; } +.composer_emoji_tooltip_tab_bell.active {background-position: -9px -61px; } -.emoji-menu-tabs .icon-car {background-position: -9px -196px; } -.emoji-menu-tabs .icon-car-selected {background-position: -9px -170px; } +.composer_emoji_tooltip_tab_car {background-position: -9px -196px; } +.composer_emoji_tooltip_tab_car.active {background-position: -9px -170px; } -.emoji-menu-tabs .icon-grid {background-position: -9px -248px; } -.emoji-menu-tabs .icon-grid-selected {background-position: -9px -222px; } - -.emoji-menu-tabs .icon-recent, -.emoji-menu-tabs .icon-smile, -.emoji-menu-tabs .icon-flower, -.emoji-menu-tabs .icon-bell, -.emoji-menu-tabs .icon-car, -.emoji-menu-tabs .icon-grid { - opacity: 0.7; -} -.emoji-menu-tabs .icon-recent:hover, -.emoji-menu-tabs .icon-smile:hover, -.emoji-menu-tabs .icon-flower:hover, -.emoji-menu-tabs .icon-bell:hover, -.emoji-menu-tabs .icon-car:hover, -.emoji-menu-tabs .icon-grid:hover { - opacity: 1; -} +.composer_emoji_tooltip_tab_grid {background-position: -9px -248px; } +.composer_emoji_tooltip_tab_grid.active {background-position: -9px -222px; } +.composer_emoji_tooltip_tab_stickers {background-position: -9px -361px; } +.composer_emoji_tooltip_tab_stickers.active {background-position: -9px -333px; } -.emoji-menu .emoji-items-wrap { +.composer_emoji_tooltip_content { position: relative; height: 174px; + overflow: hidden; + overflow-y: auto; } -.emoji-menu .emoji-items { - padding-right: 8px; - outline: 0 !important; -} -.emoji-menu img { - width: 20px; - height: 20px; - vertical-align: middle; - border: 0 none; -} -.emoji-menu .emoji-items a { + + +a.composer_emoji_btn { margin: -1px 0 0 -1px; padding: 5px; display: block; float: left; border-radius: 2px; } -.emoji-menu .emoji-items a:hover { +a.composer_emoji_btn:hover { background-color: #edf2f5; } -.emoji-menu:after { - content: ' '; - display: block; - clear: left; + + + +.emoji { + display: -moz-inline-box; + -moz-box-orient: vertical; + display: inline-block; + vertical-align: baseline; + *vertical-align: auto; + *zoom: 1; + *display: inline; + height: 18px; + width: 18px; + background-repeat: no-repeat; + text-indent: -9999px; } -.emoji-menu a .label { - display: none; + +/* widths and heights calculated according to spritesheet dimensions and icon size */ +.emoji-spritesheet-0 { + background-size: 486px 126px; + background-image: url('../img/emojisprite_0.png'); +} +.emoji-spritesheet-1 { + background-size: 522px 72px; + background-image: url('../img/emojisprite_1.png'); +} +.emoji-spritesheet-2 { + background-size: 594px 126px; + background-image: url('../img/emojisprite_2.png'); +} +.emoji-spritesheet-3 { + background-size: 612px 54px; + background-image: url('../img/emojisprite_3.png'); } +.emoji-spritesheet-4 { + background-size: 612px 126px; + background-image: url('../img/emojisprite_4.png'); +} + + +.composer_emoji_btn .emoji { + width: 20px; + height: 20px; + vertical-align: middle; + border: 0 none; + display: inline-block; +} +.composer_emoji_btn .emoji-spritesheet-0 {background-size: 540px 140px;} +.composer_emoji_btn .emoji-spritesheet-1 {background-size: 580px 80px;} +.composer_emoji_btn .emoji-spritesheet-2 {background-size: 660px 140px;} +.composer_emoji_btn .emoji-spritesheet-3 {background-size: 680px 60px;} +.composer_emoji_btn .emoji-spritesheet-4 {background-size: 680px 140px;} + + .error_modal_window .modal-dialog { diff --git a/app/css/desktop.css b/app/css/desktop.css index aa88269e..5bbb607f 100644 --- a/app/css/desktop.css +++ b/app/css/desktop.css @@ -171,7 +171,7 @@ margin-right: 38px; display: inline-block; background: url(../img/icons/General.png) no-repeat -10px -111px; - background-size: 40px 678px; + background-size: 40px 778px; vertical-align: top; margin-top: 3px; } @@ -183,7 +183,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -11px -135px; - background-size: 40px 678px; + background-size: 40px 778px; } .icon-settings { width: 20px; @@ -193,7 +193,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -163px; - background-size: 40px 678px; + background-size: 40px 778px; } .icon-faq { width: 20px; @@ -203,7 +203,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -637px; - background-size: 40px 678px; + background-size: 40px 778px; } .icon-about { width: 21px; @@ -212,7 +212,7 @@ display: inline-block; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -193px; - background-size: 40px 678px; + background-size: 40px 778px; } .is_1x .icon-new-group, .is_1x .icon-contacts, @@ -315,7 +315,7 @@ .icon-filter-audio { display: inline-block; background: url(../img/icons/General.png) no-repeat 0 0; - background-size: 40px 678px; + background-size: 40px 778px; margin-right: 12px; vertical-align: top; } @@ -722,26 +722,21 @@ a.footer_link.active:active { background: inherit; } -.im_emoji_quick_select_area { +.composer_emoji_panel { display: block; height: 30px; overflow: hidden; max-width: 210px; } - -.im_emoji_quick_select_area a { +.composer_emoji_panel a { display: inline-block; padding: 5px; outline: 0; border-radius: 2px; } - -.im_emoji_quick_select_area a:hover { +/*.composer_emoji_panel a:hover { background-color: #edf2f5; -} -.im_emoji_quick_select_area a .label { - display: none; -} +}*/ .im_message_selected .im_message_date, .im_message_selected .im_message_document_size, @@ -940,7 +935,8 @@ a.im_panel_peer_photo .peer_initials { margin-left: 36px; } -.im_emoji_btn { +/*.composer_emoji_insert_btn { + display: block; position: absolute; right: 3px; top: 2px; @@ -950,28 +946,43 @@ a.im_panel_peer_photo .peer_initials { width: 22px; height: 22px; margin-top: 1px; -} -.icon-emoji { +}*/ +/*.icon-emoji { display: inline-block; width: 22px; height: 22px; vertical-align: top; background: url(../img/icons/General.png) no-repeat -9px -335px; - background-size: 40px 678px; + background-size: 40px 778px; opacity: 0.8; -} +}*/ .is_1x .icon-emoji { background-image: url(../img/icons/General_1x.png); } -.im_emoji_btn:hover .icon-emoji { +.composer_emoji_insert_btn:hover .icon-emoji { opacity: 1; } -.im_emoji_btn:active .icon-emoji, -.im_emoji_btn.on .icon-emoji { +.composer_emoji_insert_btn:active .icon-emoji, +.composer_emoji_insert_btn.on .icon-emoji { background-position: -9px -367px; opacity: 1; } + + + + + + + + + + + + + + + .im_send_field_wrap { margin-bottom: 15px; } @@ -1014,7 +1025,7 @@ a.im_panel_peer_photo .peer_initials { height: 17px; vertical-align: top; background: url(../img/icons/General.png) no-repeat -11px -455px; - background-size: 40px 678px; + background-size: 40px 778px; opacity: 0.8; margin: 0; } @@ -1050,7 +1061,7 @@ a.im_panel_peer_photo .peer_initials { height: 18px; vertical-align: top; background: url(../img/icons/General.png) no-repeat -10px -399px; - background-size: 40px 678px; + background-size: 40px 778px; opacity: 0.8; } .is_1x .icon-camera { diff --git a/app/img/icons/General.png b/app/img/icons/General.png index b6f3fdf6fc8b3962d4eeb1c98b1724fb984fade1..aa2e7ec894b5d2bb36930f0f0b66a64df986671a 100644 GIT binary patch literal 13342 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 Y7pBrSLGI(5e?Cx_*O04uZ1wE_14|54{r~^~ diff --git a/app/img/icons/General_1x.png b/app/img/icons/General_1x.png index 271503ca33cffcf47715e1d89f72e5999340436f..045dccad9adeb1204bf714bc55a8636a74d47fc7 100644 GIT binary patch delta 5724 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 LQmp_hTL=9gzd(Ar delta 5384 zcmZ`-bySpV&|eyX1rc0QTDrSok?!v9ZV-fJSC)`oghf(n>9~ZHbeDuEjg+KxOQ;{- z>pkE1{c+DT=RD`knVIK3Q@@#ai0_IU0m4Tw#>EBz05Xe9`?d5>(aoRni$3EM<$Wf` zFRIALrywXNBqt2!l^5bulmpB0iYYSC1$lUDXo$;u*#&qwc>1fzOEKJYxb0o+#sBEa z|Ceq`0Xpx$4}kwmh=I<}U)RA=-2T5Gkozy)6mASTDE_Nsb^w56PemTAAGENa^PqXU z@A2SvU3OQ0xd3gKUQiIPPm!ELAh=q80}%WAqZj z$K?%YjXICaM$nsSqzNN_A|4GH58)1t55gY3oKPKAeFPQnO846bA*UdOgzR>PtDL}q=3z}_M~t)UwC3|-5gbnlEJ#y$}@ zFkM2sc1nK)I0MxyopLpx<_z>SKLy%KL9; z31*)c{t^yxC<@6T;5xiAi{l~0GpaUM&G~rD6ks#T{B3CqsK413>pK4pSRVBG%(4VJ z9rX_0woZ1;U{Qk|P+oC~l`zdS?vBzNlDR?Hw=?if)0$r0DF6Y7Yi#- zt1`<$B{L@m=lE|b^`)biuLthBRnDL*Mn{|$n|lLZ-#IJ~s>ka!zB?{*2du1Ym77J& zlq_2{GW+4*T^Kf;o+X5tH0}bbPyPBIH(yI7jiK%6Hw51{IW#mGtA$kf17tq8@Cz|c zbm(5Dio9_~TFf_m_LDXRnH%f5fvm`PN8K_e8pRFxmt#}4p2eW!VMFF zh*=0mf!0#On5YHUc$nKRktu57$H4ky@e=9%86u~%(qXPn6{r1^FNad!o|9~qW*Q_J z?1^}M@@Z1U2{3N86A-g~zQ^zErAYUNmgTjG6rWr(pQU$L$m7*B%UIYGlKl!~W@Xd;RiLAP8_xDh#BDPPwz}=Dw$$BIVcE zep{B8L?5)|`v4^+(R@KSP3Pb3<=$QRrsd5X2~$ui-fcE!UjFz5HY?hP8n&lNJ($0< zc@QIr_G%&^Wq~jZ&jnSvO{X!3)FP#m3NFZB8b(y@U%0D2qAOxYOh8jFR-;xmbuzWm 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 diff --git a/app/img/icons/IconsetSmiles.png b/app/img/icons/IconsetSmiles.png index 4fb10645a37c32678ce1c3f17338d3b6bec94163..6618c24b81f9967b3c4ea5e2d5d67fa76a265bbc 100644 GIT binary patch literal 10026 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%0DWVU$y4Xs^xc?I=xXt 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 Ee-DyZp8x;= literal 6975 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 XQG`iqo+RlD7(h!y4^pmX_42;}Z4eef diff --git a/app/img/icons/IconsetSmiles_1x.png b/app/img/icons/IconsetSmiles_1x.png index 9679265dbb861609a159389cad337849012d1d1a..b244cb765c20173aaf5183dd366095ca7151974c 100644 GIT binary patch literal 5046 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 GiuxZ*;18Ps delta 3257 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 + diff --git a/app/js/app.js b/app/js/app.js index e8ec4a78..a80ee454 100644 --- a/app/js/app.js +++ b/app/js/app.js @@ -27,25 +27,25 @@ angular.module('myApp', [ ]). config(['$locationProvider', '$routeProvider', '$compileProvider', 'StorageProvider', function($locationProvider, $routeProvider, $compileProvider, StorageProvider) { - var icons = {}, reverseIcons = {}, i, j, hex, name, dataItem, row, column, totalColumns; - - for (j = 0; j < Config.EmojiCategories.length; j++) { - totalColumns = Config.EmojiCategorySpritesheetDimens[j][1]; - for (i = 0; i < Config.EmojiCategories[j].length; i++) { - dataItem = Config.Emoji[Config.EmojiCategories[j][i]]; - name = dataItem[1][0]; - row = Math.floor(i / totalColumns); - column = (i % totalColumns); - icons[':' + name + ':'] = [j, row, column, ':'+name+':']; - reverseIcons[name] = dataItem[0]; - } - } - - $.emojiarea.spritesheetPath = 'img/emojisprite_!.png'; - $.emojiarea.spritesheetDimens = Config.EmojiCategorySpritesheetDimens; - $.emojiarea.iconSize = 20; - $.emojiarea.icons = icons; - $.emojiarea.reverseIcons = reverseIcons; + // var icons = {}, reverseIcons = {}, i, j, hex, name, dataItem, row, column, totalColumns; + + // for (j = 0; j < Config.EmojiCategories.length; j++) { + // totalColumns = Config.EmojiCategorySpritesheetDimens[j][1]; + // for (i = 0; i < Config.EmojiCategories[j].length; i++) { + // dataItem = Config.Emoji[Config.EmojiCategories[j][i]]; + // name = dataItem[1][0]; + // row = Math.floor(i / totalColumns); + // column = (i % totalColumns); + // icons[':' + name + ':'] = [j, row, column, ':'+name+':']; + // reverseIcons[name] = dataItem[0]; + // } + // } + + // $.emojiarea.spritesheetPath = 'img/emojisprite_!.png'; + // $.emojiarea.spritesheetDimens = Config.EmojiCategorySpritesheetDimens; + // $.emojiarea.iconSize = 20; + // $.emojiarea.icons = icons; + // $.emojiarea.reverseIcons = reverseIcons; $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|file|blob|filesystem|chrome-extension|app):|data:image\//); $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|file|mailto|blob|filesystem|chrome-extension|app):|data:image\//); diff --git a/app/js/controllers.js b/app/js/controllers.js index 4c98edbf..cb8aeda4 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -2992,7 +2992,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) - .controller('CountrySelectModalController', function ($scope, $modalInstance, $rootScope, SearchIndexManager, _) { + .controller('CountrySelectModalController', function ($scope, $modalInstance, $rootScope, _) { $scope.search = {}; $scope.slice = {limit: 20, limitDelta: 20} @@ -3035,7 +3035,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) }) - .controller('PhonebookModalController', function ($scope, $modalInstance, $rootScope, AppUsersManager, PhonebookContactsService, SearchIndexManager, ErrorService) { + .controller('PhonebookModalController', function ($scope, $modalInstance, $rootScope, AppUsersManager, PhonebookContactsService, ErrorService) { $scope.search = {}; $scope.phonebook = []; diff --git a/app/js/directives.js b/app/js/directives.js index 6d919047..0c6f78d9 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1071,6 +1071,16 @@ angular.module('myApp.directives', ['myApp.filters']) }; function link ($scope, element, attrs) { + + var emojiButton = $('.composer_emoji_insert_btn', element)[0]; + new EmojiTooltip(emojiButton); + + var emojiPanel = $('.composer_emoji_panel', element)[0]; + new EmojiPanel(emojiPanel); + + return; + + var messageField = $('textarea', element)[0], fileSelects = $('input', element), dropbox = $('.im_send_dropbox_wrap', element)[0], @@ -2587,4 +2597,4 @@ angular.module('myApp.directives', ['myApp.filters']) } }; - }) + }) \ No newline at end of file diff --git a/app/js/lib/ng_utils.js b/app/js/lib/ng_utils.js index c7bb80e5..f26139ac 100644 --- a/app/js/lib/ng_utils.js +++ b/app/js/lib/ng_utils.js @@ -734,115 +734,6 @@ angular.module('izhukov.utils', []) }; }) -.service('SearchIndexManager', function () { - var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, - trimRe = /^\s+|\s$/g, - accentsReplace = { - a: /[åáâäà]/g, - e: /[éêëè]/g, - i: /[íîïì]/g, - o: /[óôöò]/g, - u: /[úûüù]/g, - c: /ç/g, - ss: /ß/g - } - - return { - createIndex: createIndex, - indexObject: indexObject, - cleanSearchText: cleanSearchText, - search: search - }; - - function createIndex () { - return { - shortIndexes: {}, - fullTexts: {} - } - } - - function cleanSearchText (text) { - text = text.replace(badCharsRe, ' ').replace(trimRe, '').toLowerCase(); - - for (var key in accentsReplace) { - if (accentsReplace.hasOwnProperty(key)) { - text = text.replace(accentsReplace[key], key); - } - } - - return text; - } - - function indexObject (id, searchText, searchIndex) { - if (searchIndex.fullTexts[id] !== undefined) { - return false; - } - - searchText = cleanSearchText(searchText); - - if (!searchText.length) { - return false; - } - - var shortIndexes = searchIndex.shortIndexes; - - searchIndex.fullTexts[id] = searchText; - - angular.forEach(searchText.split(' '), function(searchWord) { - var len = Math.min(searchWord.length, 3), - wordPart, i; - for (i = 1; i <= len; i++) { - wordPart = searchWord.substr(0, i); - if (shortIndexes[wordPart] === undefined) { - shortIndexes[wordPart] = [id]; - } else { - shortIndexes[wordPart].push(id); - } - } - }); - } - - function search (query, searchIndex) { - var shortIndexes = searchIndex.shortIndexes, - fullTexts = searchIndex.fullTexts; - - query = cleanSearchText(query); - - var queryWords = query.split(' '), - foundObjs = false, - newFoundObjs, i, j, searchText, found; - - for (i = 0; i < queryWords.length; i++) { - newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]; - if (!newFoundObjs) { - foundObjs = []; - break; - } - if (foundObjs === false || foundObjs.length > newFoundObjs.length) { - foundObjs = newFoundObjs; - } - } - - newFoundObjs = {}; - - for (j = 0; j < foundObjs.length; j++) { - found = true; - searchText = fullTexts[foundObjs[j]]; - for (i = 0; i < queryWords.length; i++) { - if (searchText.indexOf(queryWords[i]) == -1) { - found = false; - break; - } - } - if (found) { - newFoundObjs[foundObjs[j]] = true; - } - } - - return newFoundObjs; - } -}) - .service('ExternalResourcesManager', function ($q, $http) { var urlPromises = {}; diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index f7b2f77d..60cea630 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -58,9 +58,64 @@ function onCtrlEnter (textarea, cb) { }); } +function setFieldSelection(field, from, to) { + field = $(field)[0]; + try { + field.focus(); + if (from === undefined || from === false) { + from = field.value.length; + } + if (to === undefined || to === false) { + to = from; + } + if (field.createTextRange) { + var range = field.createTextRange(); + range.collapse(true); + range.moveEnd('character', to); + range.moveStart('character', from); + range.select(); + } + else if (field.setSelectionRange) { + field.setSelectionRange(from, to); + } + } catch(e) {} +} + +function getFieldSelection (field) { + if (field.selectionStart) { + return field.selectionStart; + } + else if (!document.selection) { + return 0; + } + + var c = "\001", + sel = document.selection.createRange(), + txt = sel.text, + dup = sel.duplicate(), + len = 0; + + try { + dup.moveToElementText(field); + } catch(e) { + return 0; + } + + sel.text = txt + c; + len = dup.text.indexOf(c); + sel.moveStart('character',-1); + sel.text = ''; + + // if (browser.msie && len == -1) { + // return field.value.length; + // } + return len; +} + + function onContentLoaded (cb) { setTimeout(cb, 0); -}; +} function tsNow (seconds) { var t = +new Date() + (window.tsOffset || 0); @@ -153,27 +208,140 @@ function calcImageInBox(imageW, imageH, boxW, boxH, noZooom) { } function versionCompare (ver1, ver2) { - if (typeof ver1 !== 'string') { - ver1 = ''; + if (typeof ver1 !== 'string') { + ver1 = ''; + } + if (typeof ver2 !== 'string') { + ver2 = ''; + } + ver1 = ver1.replace(/^\s+|\s+$/g, '').split('.'); + ver2 = ver2.replace(/^\s+|\s+$/g, '').split('.'); + + var a = Math.max(ver1.length, ver2.length), i; + + for (i = 0; i < a; i++) { + if (ver1[i] == ver2[i]) { + continue; + } + if (ver1[i] > ver2[i]) { + return 1; + } else { + return -1; + } + } + + return 0; +} + + +(function (global) { + + var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, + trimRe = /^\s+|\s$/g, + accentsReplace = { + a: /[åáâäà]/g, + e: /[éêëè]/g, + i: /[íîïì]/g, + o: /[óôöò]/g, + u: /[úûüù]/g, + c: /ç/g, + ss: /ß/g + }; + + function createIndex () { + return { + shortIndexes: {}, + fullTexts: {} + } + } + + function cleanSearchText (text) { + text = text.replace(badCharsRe, ' ').replace(trimRe, '').toLowerCase(); + + for (var key in accentsReplace) { + if (accentsReplace.hasOwnProperty(key)) { + text = text.replace(accentsReplace[key], key); + } + } + + return text; + } + + function indexObject (id, searchText, searchIndex) { + if (searchIndex.fullTexts[id] !== undefined) { + return false; + } + + searchText = cleanSearchText(searchText); + + if (!searchText.length) { + return false; } - if (typeof ver2 !== 'string') { - ver2 = ''; + + var shortIndexes = searchIndex.shortIndexes; + + searchIndex.fullTexts[id] = searchText; + + angular.forEach(searchText.split(' '), function(searchWord) { + var len = Math.min(searchWord.length, 3), + wordPart, i; + for (i = 1; i <= len; i++) { + wordPart = searchWord.substr(0, i); + if (shortIndexes[wordPart] === undefined) { + shortIndexes[wordPart] = [id]; + } else { + shortIndexes[wordPart].push(id); + } + } + }); + } + + function search (query, searchIndex) { + var shortIndexes = searchIndex.shortIndexes, + fullTexts = searchIndex.fullTexts; + + query = cleanSearchText(query); + + var queryWords = query.split(' '), + foundObjs = false, + newFoundObjs, i, j, searchText, found; + + for (i = 0; i < queryWords.length; i++) { + newFoundObjs = shortIndexes[queryWords[i].substr(0, 3)]; + if (!newFoundObjs) { + foundObjs = []; + break; + } + if (foundObjs === false || foundObjs.length > newFoundObjs.length) { + foundObjs = newFoundObjs; + } } - ver1 = ver1.replace(/^\s+|\s+$/g, '').split('.'); - ver2 = ver2.replace(/^\s+|\s+$/g, '').split('.'); - var a = Math.max(ver1.length, ver2.length), i; + newFoundObjs = {}; - for (i = 0; i < a; i++) { - if (ver1[i] == ver2[i]) { - continue; + for (j = 0; j < foundObjs.length; j++) { + found = true; + searchText = fullTexts[foundObjs[j]]; + for (i = 0; i < queryWords.length; i++) { + if (searchText.indexOf(queryWords[i]) == -1) { + found = false; + break; + } } - if (ver1[i] > ver2[i]) { - return 1; - } else { - return -1; + if (found) { + newFoundObjs[foundObjs[j]] = true; } } - return 0; + return newFoundObjs; } + + global.SearchIndexManager = { + createIndex: createIndex, + indexObject: indexObject, + cleanSearchText: cleanSearchText, + search: search + }; + +})(window); + diff --git a/app/js/message_composer.js b/app/js/message_composer.js new file mode 100644 index 00000000..1a5d21cd --- /dev/null +++ b/app/js/message_composer.js @@ -0,0 +1,396 @@ +/*! + * Webogram v0.3.9 - messaging web application for MTProto + * https://github.com/zhukov/webogram + * Copyright (C) 2014 Igor Zhukov + * https://github.com/zhukov/webogram/blob/master/LICENSE + */ + +'use strict'; + +/* EmojiHelper */ + +(function (global, emojis, categories, spritesheets) { + + + var emojis = {}; + var shortcuts = {}; + var spritesheetPositions = {}; + var index = false; + + var popular = 'joy,kissing_heart,heart,heart_eyes,blush,grin,+1,relaxed,pensive,smile,sob,kiss,unamused,flushed,stuck_out_tongue_winking_eye,see_no_evil,wink,smiley,cry,stuck_out_tongue_closed_eyes,scream,rage,smirk,disappointed,sweat_smile,kissing_closed_eyes,speak_no_evil,relieved,grinning,yum,laughing,ok_hand,neutral_face,confused'.split(','); + + var i, j, code, shortcut, emoji, row, column, totalColumns; + var len1, len2; + + for (i = 0, len1 = categories.length; i < len1; i++) { + totalColumns = spritesheets[i][1]; + for (j = 0, len2 = categories[i].length; j < len2; j++) { + code = categories[i][j]; + emoji = Config.Emoji[code]; + shortcut = emoji[1][0]; + emojis[code] = [emoji[0], shortcut]; + shortcuts[shortcut] = code; + spritesheetPositions[code] = [i, j, Math.floor(j / totalColumns), j % totalColumns]; + } + } + + function getPopularEmoji (callback) { + ConfigStorage.get('emojis_popular', function (popEmojis) { + var result = []; + if (popEmojis && popEmojis.length) { + for (var i = 0, len = popEmojis.length; i < len; i++) { + result.push({code: popEmojis[i][0], rate: popEmojis[i][1]}); + } + callback(result); + return; + }; + ConfigStorage.get('emojis_recent', function (recentEmojis) { + recentEmojis = recentEmojis || popular || []; + var shortcut, code; + for (var i = 0, len = recentEmojis.length; i < len; i++) { + shortcut = recentEmojis[i]; + if (Array.isArray(shortcut)) { + shortcut = shortcut[0]; + } + if (shortcut.charAt(0) == ':') { + shortcut = shortcut.substr(1, shortcut.length - 2); + } + if (code = shortcuts[shortcut]) { + result.push({code: code, rate: 1}); + } + } + callback(result); + }); + }); + } + + function pushPopularEmoji (code) { + getPopularEmoji(function (popularEmoji) { + var exists = false; + var count = popularEmoji.length; + var result = []; + for (var i = 0; i < count; i++) { + if (popularEmoji[i].code == code) { + exists = true; + popularEmoji[i].rate++; + } + result.push([popularEmoji[i].code, popularEmoji[i].rate]); + } + if (exists) { + result.sort(function (a, b) { + return b[1] - a[1]; + }); + } else { + if (result.length > 41) { + result = result.slice(0, 41); + } + result.push([code, 1]); + } + ConfigStorage.set({emojis_popular: result}); + }); + } + + function indexEmojis () { + if (index === false) { + index = SearchIndexManager.createIndex(); + var shortcut; + for (shortcut in shortcuts) { + if (shortcuts.hasOwnProperty(shortcut)) { + SearchIndexManager.indexObject(shortcuts[shortcut], shortcut, index); + } + } + } + } + + function searchEmojis (q) { + indexEmojis(); + return SearchIndexManager.search(q, index); + } + + global.EmojiHelper = { + emojis: emojis, + shortcuts: shortcuts, + spritesheetPositions: spritesheetPositions, + getPopularEmoji: getPopularEmoji, + pushPopularEmoji: pushPopularEmoji, + indexEmojis: indexEmojis, + searchEmojis: searchEmojis + }; + +})(window, Config.Emoji, Config.EmojiCategories, Config.EmojiCategorySpritesheetDimens); + + +function EmojiTooltip (btnEl, options) { + options = options || {}; + var self = this; + + this.btnEl = $(btnEl); + this.onEmojiSelected = options.onEmojiSelected; + + $(this.btnEl).on('mouseenter mouseleave', function (e) { + self.isOverBtn = e.type == 'mouseenter'; + self.createTooltip(); + + if (self.isOverBtn) { + self.onMouseEnter(true); + } else { + self.onMouseLeave(true); + } + }); +} + +EmojiTooltip.prototype.onMouseEnter = function (triggerShow) { + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + delete this.hideTimeout; + } + else if (triggerShow && !this.showTimeout) { + this.showTimeout = setTimeout(this.show.bind(this), 500); + } +}; + +EmojiTooltip.prototype.onMouseLeave = function (triggerUnshow) { + if (!this.hideTimeout) { + var self = this; + this.hideTimeout = setTimeout(function () { + self.hide(); + }, 500); + } + else if (triggerUnshow && this.showTimeout) { + clearTimeout(this.showTimeout); + delete this.showTimeout; + } +}; + + + +EmojiTooltip.prototype.createTooltip = function () { + if (this.tooltipEl) { + return false; + } + + var self = this; + this.tooltipEl = $('
').appendTo(document.body); + + this.tabsEl = $('.composer_emoji_tooltip_tabs', 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); + + angular.forEach(['recent', 'smile', 'flower', 'bell', 'car', 'grid', 'stickers'], function (tabName, tabIndex) { + $('') + .on('mousedown', function (e) { + self.selectTab(tabIndex); + return cancelEvent(e); + }) + .appendTo(self.tabsEl); + }); + + this.contentEl.on('mousedown', function (e) { + e = e.originalEvent || e; + var target = $(e.target), code; + if (target.hasClass('emoji')) { + target = $(target[0].parentNode); + } + if (code = target.attr('data-code')) { + if (self.onEmojiSelected) { + self.onEmojiSelected(code); + } + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + }); + + this.tooltipEl.on('mouseenter mouseleave', function (e) { + console.log(dT(), e.type); + if (e.type == 'mouseenter') { + self.onMouseEnter(); + } else { + self.onMouseLeave(); + } + }); + + this.selectTab(0); + + return true; +} + + +EmojiTooltip.prototype.selectTab = function (tab) { + if (this.tab === tab) { + return false; + } + $('.active', this.tabsEl).removeClass('active'); + this.tab = tab; + $(this.tabsEl[0].childNodes[tab]).addClass('active'); + + this.updateTabContents(); +}; + +EmojiTooltip.prototype.updateTabContents = function (tab) { + var html = []; + var self = this; + var iconSize = Config.Mobile ? 26 : 20; + + if (this.tab > 0) { + var categoryIndex = this.tab - 1; + var emoticonCodes = Config.EmojiCategories[categoryIndex]; + var totalColumns = Config.EmojiCategorySpritesheetDimens[categoryIndex][1]; + var count = emoticonCodes.length; + var emoticonCode, emoticonData, i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = emoticonCodes[i]; + emoticonData = Config.Emoji[emoticonCode]; + x = iconSize * (i % totalColumns); + y = iconSize * Math.floor(i / totalColumns); + html.push(''); + } + this.contentEl.html(html.join('')); + } + else { + EmojiHelper.getPopularEmoji(function (popularEmoji) { + var emoticonCode, emoticonData, spritesheet, pos, categoryIndex; + var count = popularEmoji.length; + var i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = popularEmoji[i].code; + if (emoticonData = Config.Emoji[emoticonCode]) { + spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]; + categoryIndex = spritesheet[0]; + pos = spritesheet[1]; + x = iconSize * spritesheet[3]; + y = iconSize * spritesheet[2]; + html.push(''); + } + } + self.contentEl.html(html.join('')); + }); + } +}; + +EmojiTooltip.prototype.updatePosition = function () { + var offset = this.btnEl.offset(); + this.tooltipEl.css({top: offset.top, left: offset.left}); +}; + +EmojiTooltip.prototype.show = function () { + this.updatePosition(); + this.tooltipEl.show(); + delete this.showTimeout; +}; + +EmojiTooltip.prototype.hide = function () { + this.tooltipEl.hide(); + delete this.hideTimeout; +}; + + + + +function EmojiPanel (containerEl, options) { + options = options || {}; + // var self = this; + + this.containerEl = $(containerEl); + this.onEmojiSelected = options.onEmojiSelected; + + this.containerEl.on('mousedown', function (e) { + e = e.originalEvent || e; + var target = $(e.target), code; + if (target.hasClass('emoji')) { + target = $(target[0].parentNode); + } + if (code = target.attr('data-code')) { + if (self.onEmojiSelected) { + self.onEmojiSelected(code); + } + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + }); + + this.update(); +} + +EmojiPanel.prototype.update = function () { + var html = []; + var self = this; + var iconSize = Config.Mobile ? 26 : 20; + + EmojiHelper.getPopularEmoji(function (popularEmoji) { + var emoticonCode, emoticonData, spritesheet, pos, categoryIndex; + var count = popularEmoji.length; + var i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = popularEmoji[i].code; + if (emoticonData = Config.Emoji[emoticonCode]) { + spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]; + categoryIndex = spritesheet[0]; + pos = spritesheet[1]; + x = iconSize * spritesheet[3]; + y = iconSize * spritesheet[2]; + html.push(''); + } + } + self.containerEl.html(html.join('')); + }); +} + + + + + +function MessageComposer (textarea, options) { + this.textareaEl = $(textarea); + + this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); + this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); + + this.isActive = false; +} + +MessageComposer.prototype.onKeyEvent = function (e) { + var self = this; + if (e.type == 'keyup') { + this.checkAutocomplete(); + } +} + +MessageComposer.prototype.checkAutocomplete = function (e) { + var pos = getFieldSelection(e.target); + var value = this.textareaEl[0].value.substr(0, pos); + var matches = value.match(/:([A-Za-z_]*)$/); + if (matches) { + if (matches[1]) { + var found = EmojiHelper.searchEmojis(matches[1]); + self.showEmojiSuggestions(found); + } else { + EmojiHelper.getPopularEmoji(function (found) { + self.showEmojiSuggestions(found); + }); + } + } + else { + self.hideSuggestions(); + } +} + +MessageComposer.prototype.onFocusBlur = function (e) { + this.isActive = e.type == 'focus'; + + if (!this.isActive) { + this.hideSuggestions(); + } +} + + +MessageComposer.prototype.showEmojiSuggestions = function (codes) { + this.autocompleteShown = true; +} + +MessageComposer.prototype.hideSuggestions = function () { + delete this.autocompleteShown; +} diff --git a/app/js/services.js b/app/js/services.js index 9229ec7d..1d7aa89d 100644 --- a/app/js/services.js +++ b/app/js/services.js @@ -11,7 +11,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) -.service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiFileManager, MtpApiManager, RichTextProcessor, SearchIndexManager, ErrorService, Storage, _) { +.service('AppUsersManager', function ($rootScope, $modal, $modalStack, $filter, $q, qSync, MtpApiFileManager, MtpApiManager, RichTextProcessor, ErrorService, Storage, _) { var users = {}, usernames = {}, cachedPhotoLocations = {}, @@ -507,7 +507,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }) -.service('AppChatsManager', function ($rootScope, $modal, _, MtpApiFileManager, MtpApiManager, AppUsersManager, RichTextProcessor, SearchIndexManager) { +.service('AppChatsManager', function ($rootScope, $modal, _, MtpApiFileManager, MtpApiManager, AppUsersManager, RichTextProcessor) { var chats = {}, cachedPhotoLocations = {}; @@ -687,7 +687,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } }) -.service('AppMessagesManager', function ($q, $rootScope, $location, $filter, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, SearchIndexManager, PeersSelectService, Storage, FileManager, TelegramMeWebService, StatusManager, _) { +.service('AppMessagesManager', function ($q, $rootScope, $location, $filter, ApiUpdatesManager, AppUsersManager, AppChatsManager, AppPeersManager, AppPhotosManager, AppVideoManager, AppDocsManager, AppAudioManager, MtpApiManager, MtpApiFileManager, RichTextProcessor, NotificationsManager, PeersSelectService, Storage, FileManager, TelegramMeWebService, StatusManager, _) { var messagesStorage = {}; var messagesForHistory = {}; diff --git a/app/partials/desktop/emoji_btn_tooltip.html b/app/partials/desktop/emoji_btn_tooltip.html new file mode 100644 index 00000000..51354a1b --- /dev/null +++ b/app/partials/desktop/emoji_btn_tooltip.html @@ -0,0 +1,26 @@ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + + +
\ No newline at end of file diff --git a/app/partials/desktop/im.html b/app/partials/desktop/im.html index 01e3cc84..c152e5fc 100644 --- a/app/partials/desktop/im.html +++ b/app/partials/desktop/im.html @@ -171,14 +171,13 @@ -
+
-
- -
+ +
- +
@@ -194,7 +193,7 @@
-
+
diff --git a/app/webogram.appcache b/app/webogram.appcache index a43a10bd..9802e602 100644 --- a/app/webogram.appcache +++ b/app/webogram.appcache @@ -1,6 +1,6 @@ CACHE MANIFEST -# 55 +# 57 NETWORK: * From 3a88c3d5157c2b0d33aadec81ba68c772efea731 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Mon, 2 Feb 2015 22:05:29 +0300 Subject: [PATCH 2/6] Added autocomplete --- app/css/app.css | 43 ++++++++-- app/js/directives.js | 16 +++- app/js/message_composer.js | 159 +++++++++++++++++++++++++++++++++---- 3 files changed, 194 insertions(+), 24 deletions(-) diff --git a/app/css/app.css b/app/css/app.css index b7a22ed3..a161fdad 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -2103,6 +2103,7 @@ a.composer_emoji_btn:hover { width: 18px; background-repeat: no-repeat; text-indent: -9999px; + border: 0 none; } /* widths and heights calculated according to spritesheet dimensions and icon size */ @@ -2128,19 +2129,47 @@ a.composer_emoji_btn:hover { } -.composer_emoji_btn .emoji { +.emoji-w20 { width: 20px; height: 20px; vertical-align: middle; - border: 0 none; display: inline-block; } -.composer_emoji_btn .emoji-spritesheet-0 {background-size: 540px 140px;} -.composer_emoji_btn .emoji-spritesheet-1 {background-size: 580px 80px;} -.composer_emoji_btn .emoji-spritesheet-2 {background-size: 660px 140px;} -.composer_emoji_btn .emoji-spritesheet-3 {background-size: 680px 60px;} -.composer_emoji_btn .emoji-spritesheet-4 {background-size: 680px 140px;} +.emoji-w20.emoji-spritesheet-0 {background-size: 540px 140px;} +.emoji-w20.emoji-spritesheet-1 {background-size: 580px 80px;} +.emoji-w20.emoji-spritesheet-2 {background-size: 660px 140px;} +.emoji-w20.emoji-spritesheet-3 {background-size: 680px 60px;} +.emoji-w20.emoji-spritesheet-4 {background-size: 680px 140px;} + +.composer_dropdown { + display: none; + /*max-width: 100%;*/ + border-radius: 2px; + padding: 6px 0; + border: 1px solid rgba(15, 60, 96, 0.2); + -webkit-box-shadow: 0px 1px 3px 0px rgba(60,75,87,0.27); + -moz-box-shadow: 0px 1px 3px 0px rgba(60,75,87,0.27); + box-shadow: 0px 1px 3px 0px rgba(60,75,87,0.27); +} +.composer_dropdown > li > a { + display: block; + font-size: 13px; + line-height: 15px; + padding: 4px 10px; + color: #52719a; +} +.composer_dropdown li a:hover, +.composer_dropdown li a.composer_emoji_option_active { + color: #52719a; + background: #f2f6fa; +} +.composer_emoji_shortcut { + display: inline-block; + vertical-align: top; + margin-left: 15px; + line-height: 20px; +} diff --git a/app/js/directives.js b/app/js/directives.js index 0c6f78d9..632f658d 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1073,10 +1073,22 @@ angular.module('myApp.directives', ['myApp.filters']) function link ($scope, element, attrs) { var emojiButton = $('.composer_emoji_insert_btn', element)[0]; - new EmojiTooltip(emojiButton); + new EmojiTooltip(emojiButton, { + onEmojiSelected: function (code) { + composer.onEmojiSelected(code); + } + }); var emojiPanel = $('.composer_emoji_panel', element)[0]; - new EmojiPanel(emojiPanel); + new EmojiPanel(emojiPanel, { + onEmojiSelected: function (code) { + composer.onEmojiSelected(code); + } + }); + + + var messageField = $('textarea', element)[0]; + var composer = new MessageComposer(messageField, {}); return; diff --git a/app/js/message_composer.js b/app/js/message_composer.js index 1a5d21cd..ece48b22 100644 --- a/app/js/message_composer.js +++ b/app/js/message_composer.js @@ -104,7 +104,15 @@ function searchEmojis (q) { indexEmojis(); - return SearchIndexManager.search(q, index); + var foundObject = SearchIndexManager.search(q, index); + var foundCodes = []; + var code; + for (code in foundObject) { + if (foundObject.hasOwnProperty(code)) { + foundCodes.push(code); + } + } + return foundCodes; } global.EmojiHelper = { @@ -244,7 +252,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { emoticonData = Config.Emoji[emoticonCode]; x = iconSize * (i % totalColumns); y = iconSize * Math.floor(i / totalColumns); - html.push(''); + html.push(''); } this.contentEl.html(html.join('')); } @@ -262,7 +270,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { pos = spritesheet[1]; x = iconSize * spritesheet[3]; y = iconSize * spritesheet[2]; - html.push(''); + html.push(''); } } self.contentEl.html(html.join('')); @@ -291,7 +299,7 @@ EmojiTooltip.prototype.hide = function () { function EmojiPanel (containerEl, options) { options = options || {}; - // var self = this; + var self = this; this.containerEl = $(containerEl); this.onEmojiSelected = options.onEmojiSelected; @@ -332,7 +340,7 @@ EmojiPanel.prototype.update = function () { pos = spritesheet[1]; x = iconSize * spritesheet[3]; y = iconSize * spritesheet[2]; - html.push(''); + html.push(''); } } self.containerEl.html(html.join('')); @@ -349,6 +357,24 @@ function MessageComposer (textarea, options) { this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); + this.autoCompleteEl = $('').appendTo(document.body); + + var self = this; + this.autoCompleteEl.on('mousedown', function (e) { + e = e.originalEvent || e; + var target = $(e.target), code; + if (target.hasClass('emoji') || target.hasClass('composer_emoji_shortcut')) { + target = $(target[0].parentNode); + } + if (code = target.attr('data-code')) { + if (self.onEmojiSelected) { + self.onEmojiSelected(code); + } + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + }); + this.isActive = false; } @@ -357,24 +383,68 @@ MessageComposer.prototype.onKeyEvent = function (e) { if (e.type == 'keyup') { this.checkAutocomplete(); } + if (e.type == 'keydown' && this.autocompleteShown) { + if (e.keyCode == 38 || e.keyCode == 40) { // UP / DOWN + var next = e.keyCode == 40; + var currentSelected = $(this.autoCompleteEl).find('.composer_emoji_option_active'); + + if (currentSelected.length) { + var currentSelectedWrap = currentSelected[0].parentNode; + var nextWrap = currentSelectedWrap[next ? 'nextSibling' : 'previousSibling']; + currentSelected.removeClass('composer_emoji_option_active'); + if (nextWrap) { + $(nextWrap).find('a').addClass('composer_emoji_option_active'); + return cancelEvent(e); + } + } + + var childNodes = this.autoCompleteEl[0].childNodes; + var nextWrap = childNodes[next ? 0 : childNodes.length - 1]; + $(nextWrap).find('a').addClass('composer_emoji_option_active'); + + return cancelEvent(e); + } + + if (e.keyCode == 13) { // ENTER + var currentSelected = $(this.autoCompleteEl).find('.composer_emoji_option_active') || + $(this.autoCompleteEl).childNodes[0].find('a'); + var code = currentSelected.attr('data-code'); + if (code) { + this.onEmojiSelected(code); + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + } + } } -MessageComposer.prototype.checkAutocomplete = function (e) { - var pos = getFieldSelection(e.target); +MessageComposer.prototype.checkAutocomplete = function () { + var textarea = this.textareaEl[0]; + var pos = getFieldSelection(textarea); var value = this.textareaEl[0].value.substr(0, pos); - var matches = value.match(/:([A-Za-z_]*)$/); + var matches = value.match(/:([A-Za-z_0-z\+-]*)$/); if (matches) { - if (matches[1]) { - var found = EmojiHelper.searchEmojis(matches[1]); - self.showEmojiSuggestions(found); + if (this.previousQuery == matches[0]) { + return; + } + this.previousQuery = matches[0]; + var query = SearchIndexManager.cleanSearchText(matches[1]); + if (query.length) { + var found = EmojiHelper.searchEmojis(query); + if (found.length) { + this.showEmojiSuggestions(found); + } else { + this.hideSuggestions(); + } } else { - EmojiHelper.getPopularEmoji(function (found) { - self.showEmojiSuggestions(found); - }); + EmojiHelper.getPopularEmoji((function (found) { + this.showEmojiSuggestions(found); + }).bind(this)); } } else { - self.hideSuggestions(); + delete this.previousQuery; + this.hideSuggestions(); } } @@ -383,14 +453,73 @@ MessageComposer.prototype.onFocusBlur = function (e) { if (!this.isActive) { this.hideSuggestions(); + } else { + setTimeout(this.checkAutocomplete.bind(this), 100); } } +MessageComposer.prototype.onEmojiSelected = function (code) { + console.log('emoji selected', code); + + var emoji = EmojiHelper.emojis[code]; + + var textarea = this.textareaEl[0]; + var fullValue = textarea.value; + var pos = this.isActive ? getFieldSelection(textarea) : fullValue.length; + var suffix = fullValue.substr(pos); + var prefix = fullValue.substr(0, pos); + var matches = prefix.match(/:([A-Za-z_0-z\+-]*)$/); + + if (matches && matches[0]) { + var newValue = prefix.substr(0, matches.index) + ':' + emoji[1] + ': ' + suffix; + var newPos = matches.index + emoji[1].length + 3; + } else { + var newValue = prefix + ':' + emoji[1] + ': ' + suffix; + var newPos = prefix.length + emoji[1].length + 3; + } + textarea.value = newValue; + setFieldSelection(textarea, newPos); + + this.hideSuggestions(); +} + MessageComposer.prototype.showEmojiSuggestions = function (codes) { + var html = []; + var iconSize = Config.Mobile ? 26 : 20; + + var emoticonCode, emoticonData, spritesheet, pos, categoryIndex; + var count = Math.min(5, codes.length); + var i, x, y; + + for (i = 0; i < count; i++) { + emoticonCode = codes[i]; + if (emoticonCode.code) { + emoticonCode = emoticonCode.code; + } + if (emoticonData = Config.Emoji[emoticonCode]) { + spritesheet = EmojiHelper.spritesheetPositions[emoticonCode]; + categoryIndex = spritesheet[0]; + pos = spritesheet[1]; + x = iconSize * spritesheet[3]; + y = iconSize * spritesheet[2]; + html.push('
  • :' + encodeEntities(emoticonData[1][0]) + ':
  • '); + } + } + + this.autoCompleteEl.html(html.join('')); + this.autoCompleteEl.show(); + this.updatePosition(); this.autocompleteShown = true; } +MessageComposer.prototype.updatePosition = function () { + var offset = this.textareaEl.offset(); + var height = this.autoCompleteEl.outerHeight(); + this.autoCompleteEl.css({top: offset.top - height, left: offset.left}); +} + MessageComposer.prototype.hideSuggestions = function () { + this.autoCompleteEl.hide(); delete this.autocompleteShown; } From 26557c1f359da4cc075f3e8586e69dfd06207c79 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Wed, 4 Feb 2015 19:21:01 +0300 Subject: [PATCH 3/6] Added stickers send --- app/css/app.css | 15 +++++ app/js/controllers.js | 28 ++++++++- app/js/directives.js | 12 +++- app/js/lib/config.js | 2 +- app/js/lib/schema.tl.txt | 16 ++--- app/js/message_composer.js | 34 ++++++++-- app/js/services.js | 123 ++++++++++++++++++++++++++++++++++++- 7 files changed, 213 insertions(+), 17 deletions(-) diff --git a/app/css/app.css b/app/css/app.css index a161fdad..9a07986a 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -2170,6 +2170,21 @@ a.composer_emoji_btn:hover { margin-left: 15px; line-height: 20px; } +.composer_sticker_btn { + width: 70px; + height: 70px; + display: block; + display: inline-block; + text-align: center; + padding: 3px; +} +.composer_sticker_btn:hover { + background: #f2f6fa; +} +.composer_sticker_image { + max-width: 64px; + max-height: 64px; +} diff --git a/app/js/controllers.js b/app/js/controllers.js index cb8aeda4..333ee3e7 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -316,7 +316,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) LayoutSwitchService.start(); }) - .controller('AppIMController', function ($scope, $location, $routeParams, $modal, $rootScope, $modalStack, MtpApiManager, AppUsersManager, AppChatsManager, AppPeersManager, ContactsSelectService, ChangelogNotifyService, ErrorService, AppRuntimeManager, HttpsMigrateService, LayoutSwitchService, LocationParamsService) { + .controller('AppIMController', function ($scope, $location, $routeParams, $modal, $rootScope, $modalStack, MtpApiManager, AppUsersManager, AppChatsManager, AppPeersManager, ContactsSelectService, ChangelogNotifyService, ErrorService, AppRuntimeManager, HttpsMigrateService, LayoutSwitchService, LocationParamsService, AppStickersManager) { $scope.$on('$routeUpdate', updateCurDialog); @@ -486,6 +486,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) HttpsMigrateService.start(); LayoutSwitchService.start(); LocationParamsService.start(); + AppStickersManager.start(); }) .controller('AppImDialogsController', function ($scope, $location, $q, $timeout, $routeParams, MtpApiManager, AppUsersManager, AppChatsManager, AppMessagesManager, AppPeersManager, PhonebookContactsService, ErrorService, AppRuntimeManager) { @@ -1429,7 +1430,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.$on('user_update', angular.noop); }) - .controller('AppImSendController', function ($scope, $timeout, MtpApiManager, Storage, AppPeersManager, AppMessagesManager, ApiUpdatesManager, MtpApiFileManager) { + .controller('AppImSendController', function ($scope, $timeout, MtpApiManager, Storage, AppPeersManager, AppDocsManager, AppMessagesManager, ApiUpdatesManager, MtpApiFileManager) { $scope.$watch('curDialog.peer', resetDraft); $scope.$on('user_update', angular.noop); @@ -1438,6 +1439,7 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.draftMessage = {text: '', send: sendMessage}; $scope.$watch('draftMessage.text', onMessageChange); $scope.$watch('draftMessage.files', onFilesSelected); + $scope.$watch('draftMessage.sticker', onStickerSelected); function sendMessage (e) { $scope.$broadcast('ui_message_before_send'); @@ -1530,6 +1532,28 @@ angular.module('myApp.controllers', ['myApp.i18n']) $scope.$broadcast('ui_message_send'); } } + + function onStickerSelected (newVal) { + if (!newVal) { + return; + } + + var doc = AppDocsManager.getDoc(newVal); + if (doc.id && doc.access_hash) { + console.log('sticker', doc); + var inputMedia = { + _: 'inputMediaDocument', + id: { + _: 'inputDocument', + id: doc.id, + access_hash: doc.access_hash + } + } + AppMessagesManager.sendOther($scope.curDialog.peerID, inputMedia); + $scope.$broadcast('ui_message_send'); + } + delete $scope.draftMessage.sticker; + } }) .controller('AppLangSelectController', function ($scope, _, Storage, ErrorService, AppRuntimeManager) { diff --git a/app/js/directives.js b/app/js/directives.js index 632f658d..57e2f207 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1061,7 +1061,7 @@ angular.module('myApp.directives', ['myApp.filters']) }) - .directive('mySendForm', function ($timeout, $modalStack, $http, $interpolate, Storage, ErrorService) { + .directive('mySendForm', function ($timeout, $modalStack, $http, $interpolate, Storage, AppStickersManager, ErrorService) { return { link: link, @@ -1074,8 +1074,18 @@ angular.module('myApp.directives', ['myApp.filters']) var emojiButton = $('.composer_emoji_insert_btn', element)[0]; new EmojiTooltip(emojiButton, { + getStickers: function (callback) { + AppStickersManager.getStickers().then(function () { + AppStickersManager.getStickersImages().then(function (stickersData) { + callback(stickersData); + }); + }); + }, onEmojiSelected: function (code) { composer.onEmojiSelected(code); + }, + onStickerSelected: function (docID) { + $scope.draftMessage.sticker = docID; } }); diff --git a/app/js/lib/config.js b/app/js/lib/config.js index 7e1e3a5a..f7035f65 100644 --- a/app/js/lib/config.js +++ b/app/js/lib/config.js @@ -85,7 +85,7 @@ Config.Schema.MTProto = {"constructors":[{"id":"481674261","predicate":"vector", -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":"767900285","predicate":"inputMediaUploadedPhoto","params":[{"name":"file","type":"InputFile"}],"type":"InputMedia"},{"id":"-1893027092","predicate":"inputMediaPhoto","params":[{"name":"id","type":"InputPhoto"}],"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":"322623222","predicate":"inputMediaUploadedVideo","params":[{"name":"file","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"mime_type","type":"string"}],"type":"InputMedia"},{"id":"-1726817601","predicate":"inputMediaUploadedThumbVideo","params":[{"name":"file","type":"InputFile"},{"name":"thumb","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"mime_type","type":"string"}],"type":"InputMedia"},{"id":"2130852582","predicate":"inputMediaVideo","params":[{"name":"id","type":"InputVideo"}],"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":"1879553105","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"},{"name":"inactive","type":"Bool"}],"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":"1661886910","predicate":"chatFull","params":[{"name":"id","type":"int"},{"name":"participants","type":"ChatParticipants"},{"name":"chat_photo","type":"Photo"},{"name":"notify_settings","type":"PeerNotifySettings"}],"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":"1450613171","predicate":"message","params":[{"name":"flags","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"name":"date","type":"int"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"}],"type":"Message"},{"id":"-1553471722","predicate":"messageForwarded","params":[{"name":"flags","type":"int"},{"name":"id","type":"int"},{"name":"fwd_from_id","type":"int"},{"name":"fwd_date","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"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":"-926655958","predicate":"messageMediaPhoto","params":[{"name":"photo","type":"Photo"}],"type":"MessageMedia"},{"id":"-1563278704","predicate":"messageMediaVideo","params":[{"name":"video","type":"Video"}],"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":"694364726","predicate":"messageMediaUnsupported","params":[{"name":"bytes","type":"bytes"}],"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":"-1422222932","predicate":"dialog","params":[{"name":"peer","type":"Peer"},{"name":"top_message","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":"582313809","predicate":"photo","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"caption","type":"string"},{"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":"948937617","predicate":"video","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"caption","type":"string"},{"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":"-486486981","predicate":"auth.checkedPhone","params":[{"name":"phone_registered","type":"Bool"},{"name":"phone_invited","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":"1089848634","predicate":"globalPrivacySettings","params":[{"name":"no_suggestions","type":"Bool"},{"name":"hide_contacts","type":"Bool"},{"name":"hide_located","type":"Bool"},{"name":"hide_last_visit","type":"Bool"}],"type":"GlobalPrivacySettings"},{"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":"322183672","predicate":"contacts.foreignLinkUnknown","params":[],"type":"contacts.ForeignLink"},{"id":"-1484775609","predicate":"contacts.foreignLinkRequested","params":[{"name":"has_phone","type":"Bool"}],"type":"contacts.ForeignLink"},{"id":"468356321","predicate":"contacts.foreignLinkMutual","params":[],"type":"contacts.ForeignLink"},{"id":"-768992160","predicate":"contacts.myLinkEmpty","params":[],"type":"contacts.MyLink"},{"id":"1818882030","predicate":"contacts.myLinkRequested","params":[{"name":"contact","type":"Bool"}],"type":"contacts.MyLink"},{"id":"-1035932711","predicate":"contacts.myLinkContact","params":[],"type":"contacts.MyLink"},{"id":"-322001931","predicate":"contacts.link","params":[{"name":"my_link","type":"contacts.MyLink"},{"name":"foreign_link","type":"contacts.ForeignLink"},{"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":"-7289833","predicate":"messages.message","params":[{"name":"message","type":"Message"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Message"},{"id":"-1768654661","predicate":"messages.statedMessages","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessages"},{"id":"-797251802","predicate":"messages.statedMessage","params":[{"name":"message","type":"Message"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessage"},{"id":"-772484260","predicate":"messages.sentMessage","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.SentMessage"},{"id":"1089011754","predicate":"messages.chat","params":[{"name":"chat","type":"Chat"},{"name":"users","type":"Vector"}],"type":"messages.Chat"},{"id":"-2125411368","predicate":"messages.chats","params":[{"name":"chats","type":"Vector"},{"name":"users","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":"-1210173710","predicate":"messages.affectedHistory","params":[{"name":"pts","type":"int"},{"name":"seq","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":"-1629621880","predicate":"inputMessagesFilterDocument","params":[],"type":"MessagesFilter"},{"id":"-808946398","predicate":"inputMessagesFilterAudio","params":[],"type":"MessagesFilter"},{"id":"20626867","predicate":"updateNewMessage","params":[{"name":"message","type":"Message"},{"name":"pts","type":"int"}],"type":"Update"},{"id":"1318109142","predicate":"updateMessageID","params":[{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"Update"},{"id":"-966484431","predicate":"updateReadMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"}],"type":"Update"},{"id":"-1456734682","predicate":"updateDeleteMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"}],"type":"Update"},{"id":"-782376883","predicate":"updateRestoreMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","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":"1369737882","predicate":"updateContactLink","params":[{"name":"user_id","type":"int"},{"name":"my_link","type":"contacts.MyLink"},{"name":"foreign_link","type":"contacts.ForeignLink"}],"type":"Update"},{"id":"1869154659","predicate":"updateActivation","params":[{"name":"user_id","type":"int"}],"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":"-738961532","predicate":"updateShortMessage","params":[{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"date","type":"int"},{"name":"seq","type":"int"}],"type":"Updates"},{"id":"724548942","predicate":"updateShortChatMessage","params":[{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"chat_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"date","type":"int"},{"name":"seq","type":"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":"777313652","predicate":"config","params":[{"name":"date","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"}],"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":"1047852486","predicate":"messages.statedMessagesLinks","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"links","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessages"},{"id":"-1448138623","predicate":"messages.statedMessageLink","params":[{"name":"message","type":"Message"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"links","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessage"},{"id":"-371504577","predicate":"messages.sentMessageLink","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"pts","type":"int"},{"name":"seq","type":"int"},{"name":"links","type":"Vector"}],"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":"-1845219337","predicate":"sendMessageUploadVideoAction","params":[],"type":"SendMessageAction"},{"id":"-718310409","predicate":"sendMessageRecordAudioAction","params":[],"type":"SendMessageAction"},{"id":"-424899985","predicate":"sendMessageUploadAudioAction","params":[],"type":"SendMessageAction"},{"id":"-1727382502","predicate":"sendMessageUploadPhotoAction","params":[],"type":"SendMessageAction"},{"id":"-1884362354","predicate":"sendMessageUploadDocumentAction","params":[],"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":"1467017129","predicate":"account.noPassword","params":[{"name":"new_salt","type":"bytes"}],"type":"account.Password"},{"id":"1939758962","predicate":"account.password","params":[{"name":"current_salt","type":"bytes"},{"name":"new_salt","type":"bytes"},{"name":"hint","type":"string"}],"type":"account.Password"},{"id":"1815593308","predicate":"documentAttributeImageSize","params":[{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"DocumentAttribute"},{"id":"297109817","predicate":"documentAttributeAnimated","params":[],"type":"DocumentAttribute"},{"id":"-83208409","predicate":"documentAttributeSticker","params":[],"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"}],"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":"-287800122","method":"messages.readHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"max_id","type":"int"},{"name":"offset","type":"int"},{"name":"read_contents","type":"Bool"}],"type":"messages.AffectedHistory"},{"id":"-185009311","method":"messages.deleteHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"351460618","method":"messages.deleteMessages","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"962567550","method":"messages.restoreMessages","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"682347368","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":"1289620139","method":"messages.sendMessage","params":[{"name":"peer","type":"InputPeer"},{"name":"message","type":"string"},{"name":"random_id","type":"long"}],"type":"messages.SentMessage"},{"id":"-1547149962","method":"messages.sendMedia","params":[{"name":"peer","type":"InputPeer"},{"name":"media","type":"InputMedia"},{"name":"random_id","type":"long"}],"type":"messages.StatedMessage"},{"id":"1363988751","method":"messages.forwardMessages","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"Vector"}],"type":"messages.StatedMessages"},{"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":"-1262720843","method":"messages.editChatTitle","params":[{"name":"chat_id","type":"int"},{"name":"title","type":"string"}],"type":"messages.StatedMessage"},{"id":"-662601187","method":"messages.editChatPhoto","params":[{"name":"chat_id","type":"int"},{"name":"photo","type":"InputChatPhoto"}],"type":"messages.StatedMessage"},{"id":"787082910","method":"messages.addChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"},{"name":"fwd_limit","type":"int"}],"type":"messages.StatedMessage"},{"id":"-1010447069","method":"messages.deleteChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"}],"type":"messages.StatedMessage"},{"id":"1100847854","method":"messages.createChat","params":[{"name":"users","type":"Vector"},{"name":"title","type":"string"}],"type":"messages.StatedMessage"},{"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":"66319602","method":"messages.forwardMessage","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"messages.StatedMessage"},{"id":"1102776690","method":"messages.sendBroadcast","params":[{"name":"contacts","type":"Vector"},{"name":"message","type":"string"},{"name":"media","type":"InputMedia"}],"type":"messages.StatedMessages"},{"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":"894131138","method":"messages.readMessageContents","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"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":"1418342645","method":"account.getPassword","params":[],"type":"account.Password"},{"id":"-584430193","method":"account.setPassword","params":[{"name":"current_password_hash","type":"bytes"},{"name":"new_salt","type":"bytes"},{"name":"new_password_hash","type":"bytes"},{"name":"hint","type":"string"}],"type":"Bool"},{"id":"174260510","method":"auth.checkPassword","params":[{"name":"password_hash","type":"bytes"}],"type":"auth.Authorization"},{"id":"-1373446075","method":"messages.getStickers","params":[{"name":"emoticon","type":"string"},{"name":"hash","type":"string"}],"type":"messages.Stickers"}]}; +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":"767900285","predicate":"inputMediaUploadedPhoto","params":[{"name":"file","type":"InputFile"}],"type":"InputMedia"},{"id":"-1893027092","predicate":"inputMediaPhoto","params":[{"name":"id","type":"InputPhoto"}],"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":"322623222","predicate":"inputMediaUploadedVideo","params":[{"name":"file","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"mime_type","type":"string"}],"type":"InputMedia"},{"id":"-1726817601","predicate":"inputMediaUploadedThumbVideo","params":[{"name":"file","type":"InputFile"},{"name":"thumb","type":"InputFile"},{"name":"duration","type":"int"},{"name":"w","type":"int"},{"name":"h","type":"int"},{"name":"mime_type","type":"string"}],"type":"InputMedia"},{"id":"2130852582","predicate":"inputMediaVideo","params":[{"name":"id","type":"InputVideo"}],"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":"1879553105","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"},{"name":"inactive","type":"Bool"}],"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":"1661886910","predicate":"chatFull","params":[{"name":"id","type":"int"},{"name":"participants","type":"ChatParticipants"},{"name":"chat_photo","type":"Photo"},{"name":"notify_settings","type":"PeerNotifySettings"}],"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":"1450613171","predicate":"message","params":[{"name":"flags","type":"int"},{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"name":"date","type":"int"},{"name":"message","type":"string"},{"name":"media","type":"MessageMedia"}],"type":"Message"},{"id":"-1553471722","predicate":"messageForwarded","params":[{"name":"flags","type":"int"},{"name":"id","type":"int"},{"name":"fwd_from_id","type":"int"},{"name":"fwd_date","type":"int"},{"name":"from_id","type":"int"},{"name":"to_id","type":"Peer"},{"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":"-926655958","predicate":"messageMediaPhoto","params":[{"name":"photo","type":"Photo"}],"type":"MessageMedia"},{"id":"-1563278704","predicate":"messageMediaVideo","params":[{"name":"video","type":"Video"}],"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":"694364726","predicate":"messageMediaUnsupported","params":[{"name":"bytes","type":"bytes"}],"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":"-1422222932","predicate":"dialog","params":[{"name":"peer","type":"Peer"},{"name":"top_message","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":"582313809","predicate":"photo","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"caption","type":"string"},{"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":"948937617","predicate":"video","params":[{"name":"id","type":"long"},{"name":"access_hash","type":"long"},{"name":"user_id","type":"int"},{"name":"date","type":"int"},{"name":"caption","type":"string"},{"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":"-486486981","predicate":"auth.checkedPhone","params":[{"name":"phone_registered","type":"Bool"},{"name":"phone_invited","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":"322183672","predicate":"contacts.foreignLinkUnknown","params":[],"type":"contacts.ForeignLink"},{"id":"-1484775609","predicate":"contacts.foreignLinkRequested","params":[{"name":"has_phone","type":"Bool"}],"type":"contacts.ForeignLink"},{"id":"468356321","predicate":"contacts.foreignLinkMutual","params":[],"type":"contacts.ForeignLink"},{"id":"-768992160","predicate":"contacts.myLinkEmpty","params":[],"type":"contacts.MyLink"},{"id":"1818882030","predicate":"contacts.myLinkRequested","params":[{"name":"contact","type":"Bool"}],"type":"contacts.MyLink"},{"id":"-1035932711","predicate":"contacts.myLinkContact","params":[],"type":"contacts.MyLink"},{"id":"-322001931","predicate":"contacts.link","params":[{"name":"my_link","type":"contacts.MyLink"},{"name":"foreign_link","type":"contacts.ForeignLink"},{"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":"-7289833","predicate":"messages.message","params":[{"name":"message","type":"Message"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"}],"type":"messages.Message"},{"id":"-1768654661","predicate":"messages.statedMessages","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessages"},{"id":"-797251802","predicate":"messages.statedMessage","params":[{"name":"message","type":"Message"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessage"},{"id":"-772484260","predicate":"messages.sentMessage","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.SentMessage"},{"id":"-2125411368","predicate":"messages.chats","params":[{"name":"chats","type":"Vector"},{"name":"users","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":"-1210173710","predicate":"messages.affectedHistory","params":[{"name":"pts","type":"int"},{"name":"seq","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":"20626867","predicate":"updateNewMessage","params":[{"name":"message","type":"Message"},{"name":"pts","type":"int"}],"type":"Update"},{"id":"1318109142","predicate":"updateMessageID","params":[{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"Update"},{"id":"-966484431","predicate":"updateReadMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","type":"int"}],"type":"Update"},{"id":"-1456734682","predicate":"updateDeleteMessages","params":[{"name":"messages","type":"Vector"},{"name":"pts","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":"1369737882","predicate":"updateContactLink","params":[{"name":"user_id","type":"int"},{"name":"my_link","type":"contacts.MyLink"},{"name":"foreign_link","type":"contacts.ForeignLink"}],"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":"-738961532","predicate":"updateShortMessage","params":[{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"date","type":"int"},{"name":"seq","type":"int"}],"type":"Updates"},{"id":"724548942","predicate":"updateShortChatMessage","params":[{"name":"id","type":"int"},{"name":"from_id","type":"int"},{"name":"chat_id","type":"int"},{"name":"message","type":"string"},{"name":"pts","type":"int"},{"name":"date","type":"int"},{"name":"seq","type":"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":"777313652","predicate":"config","params":[{"name":"date","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"}],"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":"1047852486","predicate":"messages.statedMessagesLinks","params":[{"name":"messages","type":"Vector"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"links","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessages"},{"id":"-1448138623","predicate":"messages.statedMessageLink","params":[{"name":"message","type":"Message"},{"name":"chats","type":"Vector"},{"name":"users","type":"Vector"},{"name":"links","type":"Vector"},{"name":"pts","type":"int"},{"name":"seq","type":"int"}],"type":"messages.StatedMessage"},{"id":"-371504577","predicate":"messages.sentMessageLink","params":[{"name":"id","type":"int"},{"name":"date","type":"int"},{"name":"pts","type":"int"},{"name":"seq","type":"int"},{"name":"links","type":"Vector"}],"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":"-1845219337","predicate":"sendMessageUploadVideoAction","params":[],"type":"SendMessageAction"},{"id":"-718310409","predicate":"sendMessageRecordAudioAction","params":[],"type":"SendMessageAction"},{"id":"-424899985","predicate":"sendMessageUploadAudioAction","params":[],"type":"SendMessageAction"},{"id":"-1727382502","predicate":"sendMessageUploadPhotoAction","params":[],"type":"SendMessageAction"},{"id":"-1884362354","predicate":"sendMessageUploadDocumentAction","params":[],"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":"1467017129","predicate":"account.noPassword","params":[{"name":"new_salt","type":"bytes"}],"type":"account.Password"},{"id":"1939758962","predicate":"account.password","params":[{"name":"current_salt","type":"bytes"},{"name":"new_salt","type":"bytes"},{"name":"hint","type":"string"}],"type":"account.Password"},{"id":"1815593308","predicate":"documentAttributeImageSize","params":[{"name":"w","type":"int"},{"name":"h","type":"int"}],"type":"DocumentAttribute"},{"id":"297109817","predicate":"documentAttributeAnimated","params":[],"type":"DocumentAttribute"},{"id":"-83208409","predicate":"documentAttributeSticker","params":[],"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":"-588304126","predicate":"messages.allStickers","params":[{"name":"hash","type":"string"},{"name":"packs","type":"Vector"},{"name":"documents","type":"Vector"}],"type":"messages.AllStickers"}],"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":"-287800122","method":"messages.readHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"max_id","type":"int"},{"name":"offset","type":"int"},{"name":"read_contents","type":"Bool"}],"type":"messages.AffectedHistory"},{"id":"-185009311","method":"messages.deleteHistory","params":[{"name":"peer","type":"InputPeer"},{"name":"offset","type":"int"}],"type":"messages.AffectedHistory"},{"id":"351460618","method":"messages.deleteMessages","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"id":"682347368","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":"1289620139","method":"messages.sendMessage","params":[{"name":"peer","type":"InputPeer"},{"name":"message","type":"string"},{"name":"random_id","type":"long"}],"type":"messages.SentMessage"},{"id":"-1547149962","method":"messages.sendMedia","params":[{"name":"peer","type":"InputPeer"},{"name":"media","type":"InputMedia"},{"name":"random_id","type":"long"}],"type":"messages.StatedMessage"},{"id":"1363988751","method":"messages.forwardMessages","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"Vector"}],"type":"messages.StatedMessages"},{"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":"-1262720843","method":"messages.editChatTitle","params":[{"name":"chat_id","type":"int"},{"name":"title","type":"string"}],"type":"messages.StatedMessage"},{"id":"-662601187","method":"messages.editChatPhoto","params":[{"name":"chat_id","type":"int"},{"name":"photo","type":"InputChatPhoto"}],"type":"messages.StatedMessage"},{"id":"787082910","method":"messages.addChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"},{"name":"fwd_limit","type":"int"}],"type":"messages.StatedMessage"},{"id":"-1010447069","method":"messages.deleteChatUser","params":[{"name":"chat_id","type":"int"},{"name":"user_id","type":"InputUser"}],"type":"messages.StatedMessage"},{"id":"1100847854","method":"messages.createChat","params":[{"name":"users","type":"Vector"},{"name":"title","type":"string"}],"type":"messages.StatedMessage"},{"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":"66319602","method":"messages.forwardMessage","params":[{"name":"peer","type":"InputPeer"},{"name":"id","type":"int"},{"name":"random_id","type":"long"}],"type":"messages.StatedMessage"},{"id":"1102776690","method":"messages.sendBroadcast","params":[{"name":"contacts","type":"Vector"},{"name":"message","type":"string"},{"name":"media","type":"InputMedia"}],"type":"messages.StatedMessages"},{"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":"894131138","method":"messages.readMessageContents","params":[{"name":"id","type":"Vector"}],"type":"Vector"},{"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":"1418342645","method":"account.getPassword","params":[],"type":"account.Password"},{"id":"-584430193","method":"account.setPassword","params":[{"name":"current_password_hash","type":"bytes"},{"name":"new_salt","type":"bytes"},{"name":"new_password_hash","type":"bytes"},{"name":"hint","type":"string"}],"type":"Bool"},{"id":"174260510","method":"auth.checkPassword","params":[{"name":"password_hash","type":"bytes"}],"type":"auth.Authorization"},{"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"}]}; Config.Schema.API.layer = 22; diff --git a/app/js/lib/schema.tl.txt b/app/js/lib/schema.tl.txt index 385b6c2c..08ee5c35 100644 --- a/app/js/lib/schema.tl.txt +++ b/app/js/lib/schema.tl.txt @@ -156,8 +156,6 @@ peerNotifyEventsAll#6d1ded88 = PeerNotifyEvents; peerNotifySettingsEmpty#70a68512 = PeerNotifySettings; peerNotifySettings#8d5e11ee mute_until:int sound:string show_previews:Bool events_mask:int = PeerNotifySettings; -globalPrivacySettings#40f5c53a no_suggestions:Bool hide_contacts:Bool hide_located:Bool hide_last_visit:Bool = GlobalPrivacySettings; - 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; @@ -209,8 +207,6 @@ messages.statedMessage#d07ae726 message:Message chats:Vector users:Vector< messages.sentMessage#d1f4d35c id:int date:int pts:int seq:int = messages.SentMessage; -messages.chat#40e9002a chat:Chat users:Vector = messages.Chat; - messages.chats#8150cbd8 chats:Vector users:Vector = messages.Chats; messages.chatFull#e5d7d19c full_chat:ChatFull chats:Vector users:Vector = messages.ChatFull; @@ -221,6 +217,7 @@ inputMessagesFilterEmpty#57e2f66c = MessagesFilter; inputMessagesFilterPhotos#9609a51c = MessagesFilter; inputMessagesFilterVideo#9fc00e65 = MessagesFilter; inputMessagesFilterPhotoVideo#56e9f0e4 = MessagesFilter; +inputMessagesFilterPhotoVideoDocuments#d95e73bb = MessagesFilter; inputMessagesFilterDocument#9eddf188 = MessagesFilter; inputMessagesFilterAudio#cfc87522 = MessagesFilter; @@ -228,7 +225,6 @@ updateNewMessage#13abdb3 message:Message pts:int = Update; updateMessageID#4e90bfd6 id:int random_id:long = Update; updateReadMessages#c6649e31 messages:Vector pts:int = Update; updateDeleteMessages#a92bfe26 messages:Vector pts:int = Update; -updateRestoreMessages#d15de04d messages:Vector pts:int = Update; updateUserTyping#5c486927 user_id:int action:SendMessageAction = Update; updateChatUserTyping#9a65ea1f chat_id:int user_id:int action:SendMessageAction = Update; updateChatParticipants#7761198 participants:ChatParticipants = Update; @@ -237,7 +233,6 @@ updateUserName#a7332b73 user_id:int first_name:string last_name:string username: updateUserPhoto#95313b0c user_id:int date:int photo:UserProfilePhoto previous:Bool = Update; updateContactRegistered#2575bbb9 user_id:int date:int = Update; updateContactLink#51a48a9a user_id:int my_link:contacts.MyLink foreign_link:contacts.ForeignLink = Update; -updateActivation#6f690963 user_id:int = Update; updateNewAuthorization#8f06529a auth_key_id:long date:int device:string location:string = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -438,6 +433,11 @@ documentAttributeFilename#15590068 file_name:string = DocumentAttribute; messages.stickersNotModified#f1749a22 = messages.Stickers; messages.stickers#8a8ecd32 hash:string stickers:Vector = messages.Stickers; +stickerPack#12b299d4 emoticon:string documents:Vector = StickerPack; + +messages.allStickersNotModified#e86602c3 = messages.AllStickers; +messages.allStickers#dcef3102 hash:string packs:Vector documents:Vector = messages.AllStickers; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -487,7 +487,6 @@ messages.search#7e9f2ab peer:InputPeer q:string filter:MessagesFilter min_date:i messages.readHistory#eed884c6 peer:InputPeer max_id:int offset:int read_contents:Bool = messages.AffectedHistory; messages.deleteHistory#f4f8fb61 peer:InputPeer offset:int = messages.AffectedHistory; messages.deleteMessages#14f2dd0a id:Vector = Vector; -messages.restoreMessages#395f9d7e id:Vector = Vector; messages.receivedMessages#28abcb68 max_id:int = Vector; messages.setTyping#a3825e50 peer:InputPeer action:SendMessageAction = Bool; messages.sendMessage#4cde0aab peer:InputPeer message:string random_id:long = messages.SentMessage; @@ -578,4 +577,5 @@ account.setPassword#dd2a4d8f current_password_hash:bytes new_salt:bytes new_pass auth.checkPassword#a63011e password_hash:bytes = auth.Authorization; -messages.getStickers#ae22e045 emoticon:string hash:string = messages.Stickers; \ No newline at end of file +messages.getStickers#ae22e045 emoticon:string hash:string = messages.Stickers; +messages.getAllStickers#aa3bc868 hash:string = messages.AllStickers; \ No newline at end of file diff --git a/app/js/message_composer.js b/app/js/message_composer.js index ece48b22..8ea739f3 100644 --- a/app/js/message_composer.js +++ b/app/js/message_composer.js @@ -134,6 +134,8 @@ function EmojiTooltip (btnEl, options) { this.btnEl = $(btnEl); this.onEmojiSelected = options.onEmojiSelected; + this.onStickerSelected = options.onStickerSelected; + this.getStickers = options.getStickers; $(this.btnEl).on('mouseenter mouseleave', function (e) { self.isOverBtn = e.type == 'mouseenter'; @@ -191,13 +193,21 @@ EmojiTooltip.prototype.createTooltip = function () { self.selectTab(tabIndex); return cancelEvent(e); }) + .on('mouseenter mouseleave', function (e) { + clearTimeout(self.selectTabTimeout); + if (e.type == 'mouseenter') { + self.selectTabTimeout = setTimeout(function () { + self.selectTab(tabIndex); + }, 300); + } + }) .appendTo(self.tabsEl); }); this.contentEl.on('mousedown', function (e) { e = e.originalEvent || e; - var target = $(e.target), code; - if (target.hasClass('emoji')) { + var target = $(e.target), code, sticker; + if (target.hasClass('emoji') || target.hasClass('composer_sticker_image')) { target = $(target[0].parentNode); } if (code = target.attr('data-code')) { @@ -206,11 +216,15 @@ EmojiTooltip.prototype.createTooltip = function () { } EmojiHelper.pushPopularEmoji(code); } + if (sticker = target.attr('data-sticker')) { + if (self.onStickerSelected) { + self.onStickerSelected(sticker); + } + } return cancelEvent(e); }); this.tooltipEl.on('mouseenter mouseleave', function (e) { - console.log(dT(), e.type); if (e.type == 'mouseenter') { self.onMouseEnter(); } else { @@ -240,7 +254,19 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { var self = this; var iconSize = Config.Mobile ? 26 : 20; - if (this.tab > 0) { + if (this.tab == 6) { // Stickers + var renderStickers = function (stickers) { + var sticker, i; + var count = stickers.length; + for (i = 0; i < count; i++) { + sticker = stickers[i]; + html.push(''); + } + self.contentEl.html(html.join('')); + }; + this.getStickers(renderStickers); + } + else if (this.tab > 0) { var categoryIndex = this.tab - 1; var emoticonCodes = Config.EmojiCategories[categoryIndex]; var totalColumns = Config.EmojiCategorySpritesheetDimens[categoryIndex][1]; diff --git a/app/js/services.js b/app/js/services.js index 1d7aa89d..90b32bd2 100644 --- a/app/js/services.js +++ b/app/js/services.js @@ -509,6 +509,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) .service('AppChatsManager', function ($rootScope, $modal, _, MtpApiFileManager, MtpApiManager, AppUsersManager, RichTextProcessor) { var chats = {}, + chatsFull = {}, cachedPhotoLocations = {}; function saveApiChats (apiChats) { @@ -1521,7 +1522,17 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) break; case 'inputMediaPhoto': - media = {photo: AppPhotosManager.getPhoto(inputMedia.id.id)}; + media = { + _: 'messageMediaPhoto', + photo: AppPhotosManager.getPhoto(inputMedia.id.id) + }; + break; + + case 'inputMediaDocument': + media = { + _: 'messageMediaDocument', + 'document': AppDocsManager.getDoc(inputMedia.id.id) + }; break; } @@ -2715,6 +2726,10 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }); }; + function getDoc (docID) { + return docs[docID] || {_: 'documentEmpty'}; + } + function wrapForHistory (docID) { if (docsForHistory[docID] !== undefined) { return docsForHistory[docID]; @@ -2872,6 +2887,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) return { saveDoc: saveDoc, + getDoc: getDoc, wrapForHistory: wrapForHistory, updateDocDownloaded: updateDocDownloaded, downloadDoc: downloadDoc, @@ -2985,6 +3001,111 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } }) +.service('AppStickersManager', function ($q, FileManager, MtpApiManager, MtpApiFileManager, AppDocsManager, Storage) { + + var stickersToEmoji = {}; + var currentStickers = []; + var applied = false; + var started = false; + + return { + start: start, + getStickerEmoji: getStickerEmoji, + getStickers: getStickers, + getStickersImages: getStickersImages + }; + + function start () { + if (!started) { + started = true; + setTimeout(getStickers, 1000); + setInterval(preloadStickers, 900000); + } + } + + function preloadStickers() { + getStickers().then(getStickersImages); + } + + function getStickerEmoji(docID) { + return stickersToEmoji[docID] || false; + } + + function processRawStickers(stickers) { + if (applied !== stickers.hash) { + applied = stickers.hash; + var i, j, len1, len2; + + len1 = stickers.documents.length; + for (i = 0; i < len1; i++) { + AppDocsManager.saveDoc(stickers.documents[i]); + } + + var pack, emoticon, docID; + var doneDocIDs = {}; + stickersToEmoji = {}; + currentStickers = []; + len1 = stickers.packs.length; + for (i = 0; i < len1; i++) { + pack = stickers.packs[i]; + emoticon = pack.emoticon; + len2 = pack.documents.length; + for (j = 0; j < len2; j++) { + docID = pack.documents[j]; + if (stickersToEmoji[docID] === undefined) { + stickersToEmoji[docID] = emoticon; + } + if (doneDocIDs[docID] === undefined) { + doneDocIDs[docID] = true; + currentStickers.push(docID); + } + } + } + } + return currentStickers; + } + + function getStickers () { + return Storage.get('all_stickers').then(function (stickers) { + var layer = Config.Schema.API.layer; + if (stickers.layer != layer) { + stickers = false; + } + if (stickers && stickers.date > tsNow(true)) { + return processRawStickers(stickers); + } + return MtpApiManager.invokeApi('messages.getAllStickers', { + hash: stickers && stickers.hash || '' + }).then(function (newStickers) { + if (newStickers._ == 'messages.allStickersNotModified') { + newStickers = stickers; + } + newStickers.date = tsNow(true) + 3600; + newStickers.layer = layer; + delete newStickers._; + Storage.set({all_stickers: newStickers}); + + return processRawStickers(newStickers); + }); + }) + } + + function getStickersImages () { + var promises = []; + angular.forEach(currentStickers, function (docID) { + var doc = AppDocsManager.getDoc(docID); + var promise = MtpApiFileManager.downloadSmallFile(doc.thumb.location).then(function (blob) { + return { + id: docID, + src: FileManager.getUrl(blob, 'image/webp') + }; + }); + promises.push(promise); + }); + return $q.all(promises); + } +}) + .service('ApiUpdatesManager', function ($rootScope, MtpNetworkerFactory, AppUsersManager, AppChatsManager, AppPeersManager, MtpApiManager) { var isSynchronizing = true, From e5994386961657f056cb3c945cd61662adb1d442 Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Wed, 4 Feb 2015 22:41:23 +0300 Subject: [PATCH 4/6] Improved composer: content editable Fixed stickers send delay --- app/js/directives.js | 8 +++++-- app/js/lib/utils.js | 47 +++++++++++++++++++++++++++++++++++++- app/js/message_composer.js | 35 ++++++++++++++++++++++++---- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/app/js/directives.js b/app/js/directives.js index 57e2f207..0824928b 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1082,10 +1082,14 @@ angular.module('myApp.directives', ['myApp.filters']) }); }, onEmojiSelected: function (code) { - composer.onEmojiSelected(code); + $scope.$apply(function () { + composer.onEmojiSelected(code); + }) }, onStickerSelected: function (docID) { - $scope.draftMessage.sticker = docID; + $scope.$apply(function () { + $scope.draftMessage.sticker = docID; + }); } }); diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index 60cea630..77a25605 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -103,7 +103,7 @@ function getFieldSelection (field) { sel.text = txt + c; len = dup.text.indexOf(c); - sel.moveStart('character',-1); + sel.moveStart('character', -1); sel.text = ''; // if (browser.msie && len == -1) { @@ -112,6 +112,51 @@ function getFieldSelection (field) { return len; } +function getFieldValue(field) { + if (!field) { + return ''; + } + if (field.tagName == 'INPUT' || field.tagName == 'TEXTAREA') { + return field.value; + } + var lines = []; + var line = []; + getFieldElementValue(field, lines, line); + if (line.length) { + lines.push(line.join('')); + } + return lines.join('\n'); +} + +function getFieldElementValue(node, lines, line) { + if (node.nodeType == 3) { // TEXT + line.push(node.nodeValue); + return; + } + if (node.nodeType != 1) { // NON-ELEMENT + return; + } + var isBlock = node.tagName == 'DIV' || node.tagName == 'P'; + var curChild; + if (isBlock && line.length || node.tagName == 'BR') { + lines.push(line.join('')); + line.splice(0, line.length); + } + else if (node.tagName == 'IMG') { + if (node.alt) { + line.push(node.alt); + } + } + var curChild = node.firstChild; + while (curChild) { + getFieldElementValue(curChild, lines, line); + curChild = curChild.nextSibling; + } + if (isBlock && line.length) { + lines.push(line.join('')); + line.splice(0, line.length); + } +} function onContentLoaded (cb) { setTimeout(cb, 0); diff --git a/app/js/message_composer.js b/app/js/message_composer.js index 8ea739f3..bd01a19d 100644 --- a/app/js/message_composer.js +++ b/app/js/message_composer.js @@ -380,8 +380,9 @@ EmojiPanel.prototype.update = function () { function MessageComposer (textarea, options) { this.textareaEl = $(textarea); - this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); - this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); + this.setUpInput(); + // this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); + // this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); this.autoCompleteEl = $('').appendTo(document.body); @@ -404,6 +405,29 @@ function MessageComposer (textarea, options) { this.isActive = false; } +MessageComposer.prototype.setUpInput = function () { + if ('contentEditable' in document.body) { + this.setUpContenteditable(); + } else { + this.setUpPlaintext(); + } +} + +MessageComposer.prototype.setUpContenteditable = function () { + this.textareaEl.hide(); + this.contentEditableEl = $('
    '); + + this.textareaEl[0].parentNode.insertBefore(this.contentEditableEl[0], this.textareaEl[0]); + + this.contentEditableEl.on('keyup keydown', this.onKeyEvent.bind(this)); + this.contentEditableEl.on('focus blur', this.onFocusBlur.bind(this)); +} + +MessageComposer.prototype.setUpPlaintext = function () { + this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); + this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); +} + MessageComposer.prototype.onKeyEvent = function (e) { var self = this; if (e.type == 'keyup') { @@ -445,9 +469,12 @@ MessageComposer.prototype.onKeyEvent = function (e) { } MessageComposer.prototype.checkAutocomplete = function () { - var textarea = this.textareaEl[0]; + var textarea = this.contentEditableEl ? this.contentEditableEl[0] : this.textareaEl; var pos = getFieldSelection(textarea); - var value = this.textareaEl[0].value.substr(0, pos); + var value = getFieldValue(textarea).substr(0, pos); + + console.log(pos, value); + var matches = value.match(/:([A-Za-z_0-z\+-]*)$/); if (matches) { if (this.previousQuery == matches[0]) { From 81712ce31b5406dbf621ad88c8f5f42e23beeadd Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Thu, 5 Feb 2015 22:25:18 +0300 Subject: [PATCH 5/6] Make it work --- app/css/app.css | 132 ++++++++----- app/css/desktop.css | 10 +- app/css/mobile.css | 46 +++-- app/index.html | 3 +- app/js/controllers.js | 12 +- app/js/directives.js | 237 +++++++--------------- app/js/lib/utils.js | 82 +++++++- app/js/message_composer.js | 371 +++++++++++++++++++++++++++++------ app/partials/desktop/im.html | 6 +- app/partials/mobile/im.html | 4 +- app/webogram.appcache | 2 +- 11 files changed, 584 insertions(+), 321 deletions(-) diff --git a/app/css/app.css b/app/css/app.css index 9a07986a..e21fdbea 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -1915,53 +1915,7 @@ img.img_fullsize { -/* Emoji area */ -.emoji-wysiwyg-editor:empty:before { - content: attr(placeholder); - color: #9aa2ab; -} -.emoji-wysiwyg-editor:active:before, -.emoji-wysiwyg-editor:focus:before { - content: none; -} - -.emoji-wysiwyg-editor { - box-sizing: content-box; - -moz-box-sizing: content-box; - font-size: 12px; - margin-bottom: 10px; - padding: 6px; - min-height: 38px; - height: auto; - width: auto; - max-height: 284px; - overflow: auto; - line-height: 17px; - - border: 1px solid #d2dbe3; - border-radius: 2px; - -webkit-box-shadow: none; - box-shadow: none; - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - - -webkit-user-select: text; - word-wrap: break-word; - - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} -.emoji-wysiwyg-editor img { - width: 20px; - height: 20px; - vertical-align: middle; - margin: -3px 0 0 0; -} - - - +/* Message composer */ .composer_emoji_insert_btn { display: block; position: absolute; @@ -2001,6 +1955,18 @@ img.img_fullsize { background: #FFF; padding: 5px 2px 5px 5px; } +.composer_emoji_tooltip_shown { + display: block; +} +.composer_emoji_tooltip_tail { + position: absolute; + bottom: -14px; + left: 50%; + margin-left: -13px; + overflow: hidden; + width: 26px; + height: 14px; +} .icon-tooltip-tail { background: #FFF; width: 18px; @@ -2019,10 +1985,10 @@ img.img_fullsize { -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; - position: absolute; - bottom: -10px; - left: 50%; - margin-left: -9px; + position: relative; + top: -8px; + left: 4px; + } .composer_emoji_tooltip_tabs { @@ -2089,8 +2055,6 @@ a.composer_emoji_btn:hover { background-color: #edf2f5; } - - .emoji { display: -moz-inline-box; -moz-box-orient: vertical; @@ -2128,7 +2092,6 @@ a.composer_emoji_btn:hover { background-image: url('../img/emojisprite_4.png'); } - .emoji-w20 { width: 20px; height: 20px; @@ -2141,6 +2104,18 @@ a.composer_emoji_btn:hover { .emoji-w20.emoji-spritesheet-3 {background-size: 680px 60px;} .emoji-w20.emoji-spritesheet-4 {background-size: 680px 140px;} +.emoji-w26 { + width: 26px; + height: 26px; + vertical-align: middle; + display: inline-block; +} +.emoji-w26.emoji-spritesheet-0 {background-size: 702px 182px;} +.emoji-w26.emoji-spritesheet-1 {background-size: 754px 104px;} +.emoji-w26.emoji-spritesheet-2 {background-size: 858px 182px;} +.emoji-w26.emoji-spritesheet-3 {background-size: 884px 78px;} +.emoji-w26.emoji-spritesheet-4 {background-size: 884px 182px;} + .composer_dropdown { display: none; /*max-width: 100%;*/ @@ -2186,6 +2161,55 @@ a.composer_emoji_btn:hover { max-height: 64px; } +.composer_rich_textarea { + box-sizing: content-box; + -moz-box-sizing: content-box; + font-size: 12px; + margin-bottom: 10px; + padding: 6px; + min-height: 38px; + height: auto; + width: auto; + max-height: 284px; + overflow: auto; + line-height: 17px; + + border: 1px solid #d2dbe3; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + + -webkit-user-select: text; + word-wrap: break-word; + + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.composer_rich_textarea:empty:before { + content: attr(placeholder); + color: #9aa2ab; +} +.composer_rich_textarea:active:before, +.composer_rich_textarea:focus:before { + content: none; +} +.composer_rich_textarea:empty:active:before, +.composer_rich_textarea:empty:focus:before { + content: attr(placeholder); + color: #9aa2ab; +} + +.composer_rich_textarea img { + width: 20px; + height: 20px; + vertical-align: middle; + margin: -3px 0 0 0; +} .error_modal_window .modal-dialog { diff --git a/app/css/desktop.css b/app/css/desktop.css index 5bbb607f..6a7d3d4d 100644 --- a/app/css/desktop.css +++ b/app/css/desktop.css @@ -963,7 +963,7 @@ a.im_panel_peer_photo .peer_initials { opacity: 1; } .composer_emoji_insert_btn:active .icon-emoji, -.composer_emoji_insert_btn.on .icon-emoji { +.composer_emoji_insert_btn.composer_emoji_insert_btn_on .icon-emoji { background-position: -9px -367px; opacity: 1; } @@ -986,8 +986,8 @@ a.im_panel_peer_photo .peer_initials { .im_send_field_wrap { margin-bottom: 15px; } -.emoji-wysiwyg-editor, -.form-control.im_message_field { +.composer_rich_textarea, +.composer_textarea { border-radius: 0; border: 0; box-shadow: none; @@ -999,8 +999,8 @@ a.im_panel_peer_photo .peer_initials { line-height: 20px; height: auto; } -.emoji-wysiwyg-editor:focus, -.form-control.im_message_field:focus { +.composer_rich_textarea:focus, +.composer_textarea:focus { border: 0; box-shadow: none; outline: none; diff --git a/app/css/mobile.css b/app/css/mobile.css index e02939ec..1e84e566 100644 --- a/app/css/mobile.css +++ b/app/css/mobile.css @@ -1105,7 +1105,7 @@ a.mobile_modal_action .tg_checkbox_label { display: block; } -.im_emoji_btn { +.composer_emoji_insert_btn { position: absolute; left: 0; top: 0; @@ -1127,10 +1127,10 @@ a.mobile_modal_action .tg_checkbox_label { .is_1x .icon-emoji { background-image: url(../img/icons/IconsetW_1x.png); } -.im_emoji_btn:active .icon-emoji, -.is_1x .im_emoji_btn:active .icon-emoji, -.im_emoji_btn.on .icon-emoji, -.is_1x .im_emoji_btn.on .icon-emoji { +.composer_emoji_insert_btn:active .icon-emoji, +.is_1x .composer_emoji_insert_btn:active .icon-emoji, +.composer_emoji_insert_btn.on .icon-emoji, +.is_1x .composer_emoji_insert_btn.on .icon-emoji { background-position: -10px -803px; } @@ -1141,21 +1141,21 @@ a.mobile_modal_action .tg_checkbox_label { .im_send_field_wrap .form-control { border-radius: 4px; } -.emoji-wysiwyg-editor { +.composer_rich_textarea { min-height: 18px; max-height: 136px; margin-bottom: 0; font-size: 15px; } -.emoji-wysiwyg-editor:empty { +.composer_rich_textarea:empty { background: #f1f1f1; border-color: #f1f1f1; } -.emoji-wysiwyg-editor:empty:before { +.composer_rich_textarea:empty:before { color: #999; } -.emoji-wysiwyg-editor:active, -.emoji-wysiwyg-editor:focus { +.composer_rich_textarea:active, +.composer_rich_textarea:focus { box-shadow: none; outline: 0; background: #FFF; @@ -1164,17 +1164,33 @@ a.mobile_modal_action .tg_checkbox_label { } -.emoji-menu { - margin-left: -20px; - margin-top: -202px; +.composer_emoji_tooltip { + margin-left: 10px; + margin-top: -175px; width: 262px; } -.emoji-menu .emoji-items-wrap { +.composer_emoji_tooltip .composer_emoji_tooltip_content { height: 106px; } -.emoji-menu .emoji-items a { +.composer_emoji_tooltip .composer_emoji_tooltip_content .composer_emoji_btn { padding: 5px; } +.icon-tooltip-tail { + display: none; +} +.composer_emoji_tooltip_tab { + margin: 0 5px; +} + +.composer_sticker_btn { + width: 80px; + height: 80px; + padding: 3px; +} +.composer_sticker_image { + max-width: 64px; + max-height: 64px; +} .contacts_modal_search { diff --git a/app/index.html b/app/index.html index e98f1f7c..1164326e 100644 --- a/app/index.html +++ b/app/index.html @@ -48,7 +48,6 @@ - @@ -83,8 +82,8 @@ PRODUCTION_ONLY_END--> - + diff --git a/app/js/controllers.js b/app/js/controllers.js index 333ee3e7..278efae4 100644 --- a/app/js/controllers.js +++ b/app/js/controllers.js @@ -1448,10 +1448,10 @@ angular.module('myApp.controllers', ['myApp.i18n']) var text = $scope.draftMessage.text; if (angular.isString(text) && text.length > 0) { - text = text.replace(/:([a-z0-9\-\+\*_]+?):/gi, function (all, name) { - var utfChar = $.emojiarea.reverseIcons[name]; - if (utfChar !== undefined) { - return utfChar; + text = text.replace(/:([a-z0-9\-\+\*_]+?):/gi, function (all, shortcut) { + var emojiCode = EmojiHelper.shortcuts[shortcut]; + if (emojiCode !== undefined) { + return EmojiHelper.emojis[emojiCode][0]; } return all; }); @@ -1506,10 +1506,10 @@ angular.module('myApp.controllers', ['myApp.i18n']) var backupDraftObj = {}; backupDraftObj['draft' + $scope.curDialog.peerID] = newVal; Storage.set(backupDraftObj); - // console.log('draft save', backupDraftObj); + // console.log(dT(), 'draft save', backupDraftObj); } else { Storage.remove('draft' + $scope.curDialog.peerID); - // console.log('draft delete', 'draft' + $scope.curDialog.peerID); + // console.log(dT(), 'draft delete', 'draft' + $scope.curDialog.peerID); } } diff --git a/app/js/directives.js b/app/js/directives.js index 0824928b..6899fc1d 100755 --- a/app/js/directives.js +++ b/app/js/directives.js @@ -1072,7 +1072,15 @@ angular.module('myApp.directives', ['myApp.filters']) function link ($scope, element, attrs) { + var messageField = $('textarea', element)[0]; var emojiButton = $('.composer_emoji_insert_btn', element)[0]; + var emojiPanel = $('.composer_emoji_panel', element)[0]; + var fileSelects = $('input', element); + var dropbox = $('.im_send_dropbox_wrap', element)[0]; + var messageFieldWrap = $('.im_send_field_wrap', element)[0]; + var dragStarted, dragTimeout; + var submitBtn = $('.im_submit', element)[0]; + new EmojiTooltip(emojiButton, { getStickers: function (callback) { AppStickersManager.getStickers().then(function () { @@ -1093,153 +1101,77 @@ angular.module('myApp.directives', ['myApp.filters']) } }); - var emojiPanel = $('.composer_emoji_panel', element)[0]; - new EmojiPanel(emojiPanel, { - onEmojiSelected: function (code) { - composer.onEmojiSelected(code); - } - }); - - - var messageField = $('textarea', element)[0]; - var composer = new MessageComposer(messageField, {}); - - return; - + var composerEmojiPanel; + if (emojiPanel) { + composerEmojiPanel = new EmojiPanel(emojiPanel, { + onEmojiSelected: function (code) { + composer.onEmojiSelected(code); + } + }); + } - var messageField = $('textarea', element)[0], - fileSelects = $('input', element), - dropbox = $('.im_send_dropbox_wrap', element)[0], - emojiButton = $('.im_emoji_btn', element)[0], - emojiQuickSelect = !Config.Mobile ? $('.im_emoji_quick_select_area', element)[0] : false, - editorElement = messageField, - dragStarted, dragTimeout, - emojiArea = $(messageField).emojiarea({button: emojiButton, norealTime: true, quickSelect: emojiQuickSelect}), - emojiMenu = $('.emoji-menu', element)[0], - submitBtn = $('.im_submit', element)[0], - richTextarea = $('.emoji-wysiwyg-editor', element)[0]; + var composer = new MessageComposer(messageField, { + onTyping: function () { + $scope.$emit('ui_typing'); + }, + getSendOnEnter: function () { + return sendOnEnter; + }, + onMessageSubmit: onMessageSubmit, + onFilesPaste: onFilesPaste + }); + var richTextarea = composer.richTextareaEl[0]; if (richTextarea) { - editorElement = richTextarea; - $(richTextarea).addClass('form-control'); - $(richTextarea).attr('placeholder', $interpolate($(messageField).attr('placeholder'))($scope)); - - var updatePromise; $(richTextarea) - .on('DOMNodeInserted', onPastedImageEvent) - .on('keyup', function (e) { - updateHeight(); - - if (!sendAwaiting) { - $scope.$apply(function () { - $scope.draftMessage.text = richTextarea.textContent; - }); - } - - $timeout.cancel(updatePromise); - updatePromise = $timeout(updateValue, 1000); - }); + .attr('placeholder', $interpolate($(messageField).attr('placeholder'))($scope)) + .on('keydown keyup', updateHeight); } - // Head is sometimes slower - $timeout(function () { - fileSelects - .on('change', function () { - var self = this; - $scope.$apply(function () { - $scope.draftMessage.files = Array.prototype.slice.call(self.files); - $scope.draftMessage.isMedia = $(self).hasClass('im_media_attach_input') || Config.Mobile; - setTimeout(function () { - try { - self.value = ''; - } catch (e) {}; - }, 1000); - }); - }); - }, 1000); - - var sendOnEnter = true, - updateSendSettings = function () { - Storage.get('send_ctrlenter').then(function (sendOnCtrl) { - sendOnEnter = !sendOnCtrl; - }); - }; + fileSelects.on('change', function () { + var self = this; + $scope.$apply(function () { + $scope.draftMessage.files = Array.prototype.slice.call(self.files); + $scope.draftMessage.isMedia = $(self).hasClass('im_media_attach_input') || Config.Mobile; + setTimeout(function () { + try { + self.value = ''; + } catch (e) {}; + }, 1000); + }); + }); + var sendOnEnter = true; + function updateSendSettings () { + Storage.get('send_ctrlenter').then(function (sendOnCtrl) { + sendOnEnter = !sendOnCtrl; + }); + }; $scope.$on('settings_changed', updateSendSettings); updateSendSettings(); - $(editorElement).on('keydown', function (e) { - if (richTextarea) { - updateHeight(); - } + $(submitBtn).on('mousedown touchstart', onMessageSubmit); - if (e.keyCode == 13) { - var submit = false; - if (sendOnEnter && !e.shiftKey) { - submit = true; - } else if (!sendOnEnter && (e.ctrlKey || e.metaKey)) { - submit = true; - } - - if (submit) { - $timeout.cancel(updatePromise); - updateValue(); - $scope.draftMessage.send(); - $(element).trigger('message_send'); - resetTyping(); - return cancelEvent(e); + function onMessageSubmit (e) { + $scope.$apply(function () { + updateValue(); + $scope.draftMessage.send(); + composer.resetTyping(); + if (composerEmojiPanel) { + composerEmojiPanel.update(); } - } - - }); - - $(submitBtn).on('mousedown touchstart', function (e) { - $timeout.cancel(updatePromise); - updateValue(); - $scope.draftMessage.send(); - $(element).trigger('message_send'); - resetTyping(); + }); return cancelEvent(e); - }); - - var lastTyping = 0, - lastLength; - $(editorElement).on('keyup', function (e) { - var now = tsNow(), - length = (editorElement[richTextarea ? 'textContent' : 'value']).length; - - - if (now - lastTyping > 5000 && length != lastLength) { - lastTyping = now; - lastLength = length; - $scope.$emit('ui_typing'); - } - }); - - function resetTyping () { - lastTyping = 0; - lastLength = 0; - }; - - function updateRichTextarea () { - if (richTextarea) { - $timeout.cancel(updatePromise); - var html = $('
    ').text($scope.draftMessage.text || '').html(); - html = html.replace(/\n/g, '
    '); - $(richTextarea).html(html); - lastLength = html.length; - updateHeight(); - } } function updateValue () { if (richTextarea) { - $(richTextarea).trigger('change'); + composer.onChange(); updateHeight(); } } - var height = richTextarea.offsetHeight; + var height = richTextarea && richTextarea.offsetHeight; function updateHeight () { var newHeight = richTextarea.offsetHeight; if (height != newHeight) { @@ -1250,7 +1182,7 @@ angular.module('myApp.directives', ['myApp.filters']) function onKeyDown(e) { if (e.keyCode == 9 && !e.shiftKey && !e.ctrlKey && !e.metaKey && !$modalStack.getTop()) { // TAB - editorElement.focus(); + composer.focus(); return cancelEvent(e); } } @@ -1265,13 +1197,18 @@ angular.module('myApp.directives', ['myApp.filters']) $scope.$on('ui_history_change', focusField); } - $scope.$on('ui_peer_change', resetTyping); - $scope.$on('ui_peer_draft', updateRichTextarea); + $scope.$on('ui_peer_change', composer.resetTyping.bind(composer)); + $scope.$on('ui_peer_draft', function () { + if (richTextarea) { + composer.setValue($scope.draftMessage.text || ''); + updateHeight(); + } + composer.focus(); + }); var sendAwaiting = false; $scope.$on('ui_message_before_send', function () { sendAwaiting = true; - $timeout.cancel(updatePromise); updateValue(); }); $scope.$on('ui_message_send', function () { @@ -1279,35 +1216,17 @@ angular.module('myApp.directives', ['myApp.filters']) focusField(); }); - function focusField () { onContentLoaded(function () { - editorElement.focus(); + composer.focus(); }); } - function onPastedImageEvent (e) { - var element = (e.originalEvent || e).target, - src = (element || {}).src || '', - remove = false; - - if (src.substr(0, 5) == 'data:') { - remove = true; - var blob = dataUrlToBlob(src); - ErrorService.confirm({type: 'FILE_CLIPBOARD_PASTE'}).then(function () { - $scope.draftMessage.files = [blob]; - $scope.draftMessage.isMedia = true; - }); - setZeroTimeout(function () { - element.parentNode.removeChild(element); - }) - } - else if (src && !src.match(/img\/blank\.gif/)) { - var replacementNode = document.createTextNode(' ' + src + ' '); - setTimeout(function () { - element.parentNode.replaceChild(replacementNode, element); - }, 100); - } + function onFilesPaste (blobs) { + ErrorService.confirm({type: 'FILE_CLIPBOARD_PASTE'}).then(function () { + $scope.draftMessage.files = blobs; + $scope.draftMessage.isMedia = true; + }); }; function onPasteEvent (e) { @@ -1348,7 +1267,7 @@ angular.module('myApp.directives', ['myApp.filters']) if (e.type == 'dragenter' || e.type == 'dragover') { if (dragStateChanged) { $(dropbox) - .css({height: editorElement.offsetHeight + 2, width: editorElement.offsetWidth}) + .css({height: messageFieldWrap.offsetHeight + 2, width: messageFieldWrap.offsetWidth}) .show(); } } else { @@ -1371,15 +1290,11 @@ angular.module('myApp.directives', ['myApp.filters']) $scope.$on('$destroy', function cleanup() { - $('body').off('dragenter dragleave dragover drop', onDragDropEvent); $(document).off('paste', onPasteEvent); $(document).off('keydown', onKeyDown); - $(submitBtn).off('mousedown') + $('body').off('dragenter dragleave dragover drop', onDragDropEvent); + $(submitBtn).off('mousedown touchstart'); fileSelects.off('change'); - if (richTextarea) { - $(richTextarea).off('DOMNodeInserted keyup', onPastedImageEvent); - } - $(editorElement).off('keydown'); }); if (!Config.Navigator.touch) { diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index 77a25605..dea19f5d 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -112,25 +112,63 @@ function getFieldSelection (field) { return len; } -function getFieldValue(field) { +function getRichValue(field) { if (!field) { return ''; } - if (field.tagName == 'INPUT' || field.tagName == 'TEXTAREA') { - return field.value; - } var lines = []; var line = []; - getFieldElementValue(field, lines, line); + + getRichElementValue(field, lines, line); if (line.length) { lines.push(line.join('')); } + return lines.join('\n'); } -function getFieldElementValue(node, lines, line) { +function getRichValueWithCaret(field) { + if (!field) { + return []; + } + var lines = []; + var line = []; + + var sel = window.getSelection ? window.getSelection() : false; + var selNode, selOffset; + if (sel && sel.rangeCount) { + var range = sel.getRangeAt(0); + if (range.startContainer && + range.startContainer == range.endContainer && + range.startOffset == range.endOffset) { + selNode = range.startContainer; + selOffset = range.startOffset; + } + } + + getRichElementValue(field, lines, line, selNode, selOffset); + + if (line.length) { + lines.push(line.join('')); + } + + var value = lines.join('\n'); + var caretPos = value.indexOf('\001'); + if (caretPos != -1) { + value = value.substr(0, caretPos) + value.substr(caretPos + 1); + } + + return [value, caretPos]; +} + +function getRichElementValue(node, lines, line, selNode, selOffset) { if (node.nodeType == 3) { // TEXT - line.push(node.nodeValue); + if (selNode === node) { + var value = node.nodeValue; + line.push(value.substr(0, selOffset) + '\001' + value.substr(selOffset)); + } else { + line.push(node.nodeValue); + } return; } if (node.nodeType != 1) { // NON-ELEMENT @@ -147,9 +185,12 @@ function getFieldElementValue(node, lines, line) { line.push(node.alt); } } + if (selNode === node) { + line.push('\001'); + } var curChild = node.firstChild; while (curChild) { - getFieldElementValue(curChild, lines, line); + getRichElementValue(curChild, lines, line, selNode, selOffset); curChild = curChild.nextSibling; } if (isBlock && line.length) { @@ -158,8 +199,31 @@ function getFieldElementValue(node, lines, line) { } } +function setRichFocus(field, selectNode) { + field.focus(); + if (window.getSelection && document.createRange) { + var range = document.createRange(); + if (selectNode) { + range.selectNode(selectNode); + } else { + range.selectNodeContents(field); + } + range.collapse(false); + + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + } + else if (document.body.createTextRange !== undefined) { + var textRange = document.body.createTextRange(); + textRange.moveToElementText(selectNode || field); + textRange.collapse(false); + textRange.select(); + } +} + function onContentLoaded (cb) { - setTimeout(cb, 0); + setZeroTimeout(cb); } function tsNow (seconds) { diff --git a/app/js/message_composer.js b/app/js/message_composer.js index bd01a19d..e1064baa 100644 --- a/app/js/message_composer.js +++ b/app/js/message_composer.js @@ -147,6 +147,17 @@ function EmojiTooltip (btnEl, options) { self.onMouseLeave(true); } }); + $(this.btnEl).on('mousedown', function (e) { + if (!self.shown) { + clearTimeout(self.showTimeout); + delete self.showTimeout; + self.show(); + } else { + clearTimeout(self.hideTimeout); + delete self.hideTimeout; + self.hide(); + } + }); } EmojiTooltip.prototype.onMouseEnter = function (triggerShow) { @@ -180,7 +191,7 @@ EmojiTooltip.prototype.createTooltip = function () { } var self = this; - this.tooltipEl = $('
    ').appendTo(document.body); + this.tooltipEl = $('
    ').appendTo(document.body); this.tabsEl = $('.composer_emoji_tooltip_tabs', this.tooltip); this.contentEl = $('.composer_emoji_tooltip_content', this.tooltip); @@ -278,7 +289,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { emoticonData = Config.Emoji[emoticonCode]; x = iconSize * (i % totalColumns); y = iconSize * Math.floor(i / totalColumns); - html.push(''); + html.push(''); } this.contentEl.html(html.join('')); } @@ -296,7 +307,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { pos = spritesheet[1]; x = iconSize * spritesheet[3]; y = iconSize * spritesheet[2]; - html.push(''); + html.push(''); } } self.contentEl.html(html.join('')); @@ -311,13 +322,17 @@ EmojiTooltip.prototype.updatePosition = function () { EmojiTooltip.prototype.show = function () { this.updatePosition(); - this.tooltipEl.show(); + this.tooltipEl.addClass('composer_emoji_tooltip_shown'); + this.btnEl.addClass('composer_emoji_insert_btn_on'); delete this.showTimeout; + this.shown = true; }; EmojiTooltip.prototype.hide = function () { - this.tooltipEl.hide(); + this.tooltipEl.removeClass('composer_emoji_tooltip_shown'); + this.btnEl.removeClass('composer_emoji_insert_btn_on'); delete this.hideTimeout; + delete this.shown; }; @@ -381,8 +396,6 @@ function MessageComposer (textarea, options) { this.textareaEl = $(textarea); this.setUpInput(); - // this.textareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); - // this.textareaEl.on('focus blur', this.onFocusBlur.bind(this)); this.autoCompleteEl = $('').appendTo(document.body); @@ -395,7 +408,7 @@ function MessageComposer (textarea, options) { } if (code = target.attr('data-code')) { if (self.onEmojiSelected) { - self.onEmojiSelected(code); + self.onEmojiSelected(code, true); } EmojiHelper.pushPopularEmoji(code); } @@ -403,24 +416,32 @@ function MessageComposer (textarea, options) { }); this.isActive = false; + + this.onTyping = options.onTyping; + this.onMessageSubmit = options.onMessageSubmit; + this.getSendOnEnter = options.getSendOnEnter; } MessageComposer.prototype.setUpInput = function () { if ('contentEditable' in document.body) { - this.setUpContenteditable(); + this.setUpRich(); } else { this.setUpPlaintext(); } } -MessageComposer.prototype.setUpContenteditable = function () { +MessageComposer.prototype.setUpRich = function () { this.textareaEl.hide(); - this.contentEditableEl = $('
    '); + this.richTextareaEl = $('
    '); - this.textareaEl[0].parentNode.insertBefore(this.contentEditableEl[0], this.textareaEl[0]); + this.textareaEl[0].parentNode.insertBefore(this.richTextareaEl[0], this.textareaEl[0]); - this.contentEditableEl.on('keyup keydown', this.onKeyEvent.bind(this)); - this.contentEditableEl.on('focus blur', this.onFocusBlur.bind(this)); + this.richTextareaEl.on('keyup keydown', this.onKeyEvent.bind(this)); + this.richTextareaEl.on('focus blur', this.onFocusBlur.bind(this)); + this.richTextareaEl.on('paste', this.onRichPaste.bind(this)); + this.richTextareaEl.on('DOMNodeInserted', this.onRichPasteNode.bind(this)); + + $(document.body).on('keydown', this.backupSelection.bind(this)); } MessageComposer.prototype.setUpPlaintext = function () { @@ -432,51 +453,145 @@ MessageComposer.prototype.onKeyEvent = function (e) { var self = this; if (e.type == 'keyup') { this.checkAutocomplete(); - } - if (e.type == 'keydown' && this.autocompleteShown) { - if (e.keyCode == 38 || e.keyCode == 40) { // UP / DOWN - var next = e.keyCode == 40; - var currentSelected = $(this.autoCompleteEl).find('.composer_emoji_option_active'); - - if (currentSelected.length) { - var currentSelectedWrap = currentSelected[0].parentNode; - var nextWrap = currentSelectedWrap[next ? 'nextSibling' : 'previousSibling']; - currentSelected.removeClass('composer_emoji_option_active'); - if (nextWrap) { - $(nextWrap).find('a').addClass('composer_emoji_option_active'); - return cancelEvent(e); + + if (this.onTyping) { + var now = tsNow(); + if (now - this.lastTyping > 5000) { + var length = (this.richTextareaEl ? this.richTextareaEl[0].textContent : this.textareaEl[0].value).length; + + if (length != this.lastLength) { + this.lastTyping = now; + this.lastLength = length; + this.onTyping(); } } + } + + if (this.richTextareaEl) { + clearTimeout(this.updateValueTO); + var now = tsNow(); + if (this.keyupStarted === undefined) { + this.keyupStarted = now; + } + if (now - this.keyupStarted > 10000) { + this.onChange(); + } + else { + this.updateValueTO = setTimeout(this.onChange.bind(this), 1000); + } + } + + } + if (e.type == 'keydown') { + if (this.autocompleteShown) { + if (e.keyCode == 38 || e.keyCode == 40) { // UP / DOWN + var next = e.keyCode == 40; + var currentSelected = $(this.autoCompleteEl).find('.composer_emoji_option_active'); + + if (currentSelected.length) { + var currentSelectedWrap = currentSelected[0].parentNode; + var nextWrap = currentSelectedWrap[next ? 'nextSibling' : 'previousSibling']; + currentSelected.removeClass('composer_emoji_option_active'); + if (nextWrap) { + $(nextWrap).find('a').addClass('composer_emoji_option_active'); + return cancelEvent(e); + } + } + + var childNodes = this.autoCompleteEl[0].childNodes; + var nextWrap = childNodes[next ? 0 : childNodes.length - 1]; + $(nextWrap).find('a').addClass('composer_emoji_option_active'); - var childNodes = this.autoCompleteEl[0].childNodes; - var nextWrap = childNodes[next ? 0 : childNodes.length - 1]; - $(nextWrap).find('a').addClass('composer_emoji_option_active'); + return cancelEvent(e); + } - return cancelEvent(e); + if (e.keyCode == 13) { // ENTER + var currentSelected = $(this.autoCompleteEl).find('.composer_emoji_option_active') || + $(this.autoCompleteEl).childNodes[0].find('a'); + var code = currentSelected.attr('data-code'); + if (code) { + this.onEmojiSelected(code, true); + EmojiHelper.pushPopularEmoji(code); + } + return cancelEvent(e); + } } - if (e.keyCode == 13) { // ENTER - var currentSelected = $(this.autoCompleteEl).find('.composer_emoji_option_active') || - $(this.autoCompleteEl).childNodes[0].find('a'); - var code = currentSelected.attr('data-code'); - if (code) { - this.onEmojiSelected(code); - EmojiHelper.pushPopularEmoji(code); + else if (e.keyCode == 13) { + var submit = false; + var sendOnEnter = true; + if (this.getSendOnEnter && !this.getSendOnEnter()) { + sendOnEnter = false; + } + if (sendOnEnter && !e.shiftKey) { + submit = true; + } else if (!sendOnEnter && (e.ctrlKey || e.metaKey)) { + submit = true; + } + + if (submit) { + this.onMessageSubmit(e); + return cancelEvent(e); } - return cancelEvent(e); } } } +MessageComposer.prototype.backupSelection = function () { + delete this.selection; + + if (!this.isActive) { + return; + } + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.getRangeAt && sel.rangeCount) { + this.selection = sel.getRangeAt(0); + } + } else if (document.selection && document.selection.createRange) { + this.selection = document.selection.createRange(); + } +} + +MessageComposer.prototype.restoreSelection = function () { + if (!this.selection) { + return false; + } + var result = false; + if (window.getSelection) { + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(this.selection); + result = true; + } + else if (document.selection && this.selection.select) { + this.selection.select(); + result = true; + } + delete this.selection; + + return result; +} + + + MessageComposer.prototype.checkAutocomplete = function () { - var textarea = this.contentEditableEl ? this.contentEditableEl[0] : this.textareaEl; - var pos = getFieldSelection(textarea); - var value = getFieldValue(textarea).substr(0, pos); + var pos, value; + if (this.richTextareaEl) { + var textarea = this.richTextareaEl[0]; + var valueCaret = getRichValueWithCaret(textarea); + var value = valueCaret[0]; + var pos = valueCaret[1] >= 0 ? valueCaret[1] : value.length; + } else { + var textarea = this.textareaEl[0]; + var pos = getFieldSelection(textarea); + var value = textarea.value; + } - console.log(pos, value); + value = value.substr(0, pos); var matches = value.match(/:([A-Za-z_0-z\+-]*)$/); - if (matches) { + if (matches/* && !this.richTextareaEl*/) { if (this.previousQuery == matches[0]) { return; } @@ -509,31 +624,157 @@ MessageComposer.prototype.onFocusBlur = function (e) { } else { setTimeout(this.checkAutocomplete.bind(this), 100); } + if (this.richTextareaEl) { + document.execCommand('enableObjectResizing', !this.isActive, !this.isActive); + } } -MessageComposer.prototype.onEmojiSelected = function (code) { - console.log('emoji selected', code); +MessageComposer.prototype.onRichPaste = function (e) { + var cData = (e.originalEvent || e).clipboardData, + items = cData && cData.items || [], + i; + for (i = 0; i < items.length; i++) { + if (items[i].kind == 'file') { + e.preventDefault(); + return true; + } + } - var emoji = EmojiHelper.emojis[code]; + var text = (e.originalEvent || e).clipboardData.getData('text/plain'); + setZeroTimeout(this.onChange.bind(this), 0); + if (text.length) { + document.execCommand('insertText', false, text); + return cancelEvent(e); + } + return true; +} - var textarea = this.textareaEl[0]; - var fullValue = textarea.value; - var pos = this.isActive ? getFieldSelection(textarea) : fullValue.length; - var suffix = fullValue.substr(pos); - var prefix = fullValue.substr(0, pos); - var matches = prefix.match(/:([A-Za-z_0-z\+-]*)$/); +MessageComposer.prototype.onRichPasteNode = function (e) { + var element = (e.originalEvent || e).target, + src = (element || {}).src || '', + remove = false; + + if (src.substr(0, 5) == 'data:') { + remove = true; + var blob = dataUrlToBlob(src); + this.onFilePaste(blob); + setZeroTimeout(function () { + element.parentNode.removeChild(element); + }) + } + else if (src && !src.match(/img\/blank\.gif/)) { + var replacementNode = document.createTextNode(' ' + src + ' '); + setTimeout(function () { + element.parentNode.replaceChild(replacementNode, element); + }, 100); + } +} - if (matches && matches[0]) { - var newValue = prefix.substr(0, matches.index) + ':' + emoji[1] + ': ' + suffix; - var newPos = matches.index + emoji[1].length + 3; - } else { - var newValue = prefix + ':' + emoji[1] + ': ' + suffix; - var newPos = prefix.length + emoji[1].length + 3; + + +MessageComposer.prototype.onEmojiSelected = function (code, autocomplete) { + if (this.richTextareaEl) { + var textarea = this.richTextareaEl[0]; + if (!this.isActive) { + if (!this.restoreSelection()) { + setRichFocus(textarea); + } + } + if (autocomplete) { + var valueCaret = getRichValueWithCaret(textarea); + var fullValue = valueCaret[0]; + var pos = valueCaret[1] >= 0 ? valueCaret[1] : fullValue.length; + var suffix = fullValue.substr(pos); + var prefix = fullValue.substr(0, pos); + var matches = prefix.match(/:([A-Za-z0-9\-\+\*_]*)$/); + var emoji = EmojiHelper.emojis[code]; + + var newValuePrefix; + if (matches && matches[0]) { + newValuePrefix = prefix.substr(0, matches.index) + ':' + emoji[1] + ':'; + } else { + newValuePrefix = prefix + ':' + emoji[1] + ':'; + } + textarea.value = newValue; + + this.selId = (this.selId || 0) + 1; + var html = this.getRichHtml(newValuePrefix) + ' ' + this.getRichHtml(suffix); + + this.richTextareaEl.html(html); + setRichFocus(textarea, $('#composer_sel' + this.selId)[0]); + } else { + document.execCommand('insertHTML', false, this.getEmojiHtml(code)); + } + } + else { + var textarea = this.textareaEl[0]; + var fullValue = textarea.value; + var pos = this.isActive ? getFieldSelection(textarea) : fullValue.length; + var suffix = fullValue.substr(pos); + var prefix = fullValue.substr(0, pos); + var matches = autocomplete && prefix.match(/:([A-Za-z0-9\-\+\*_]*)$/); + var emoji = EmojiHelper.emojis[code]; + + if (matches && matches[0]) { + var newValue = prefix.substr(0, matches.index) + ':' + emoji[1] + ': ' + suffix; + var newPos = matches.index + emoji[1].length + 3; + } else { + var newValue = prefix + ':' + emoji[1] + ': ' + suffix; + var newPos = prefix.length + emoji[1].length + 3; + } + textarea.value = newValue; + setFieldSelection(textarea, newPos); } - textarea.value = newValue; - setFieldSelection(textarea, newPos); this.hideSuggestions(); + this.onChange(); +} + +MessageComposer.prototype.onChange = function (e) { + if (this.richTextareaEl) { + delete this.keyupStarted; + this.textareaEl.val(getRichValue(this.richTextareaEl[0])).trigger('change'); + } +} + +MessageComposer.prototype.getEmojiHtml = function (code, emoji) { + emoji = emoji || EmojiHelper.emojis[code]; + var iconSize = 20; + var spritesheet = EmojiHelper.spritesheetPositions[code]; + var categoryIndex = spritesheet[0]; + var pos = spritesheet[1]; + var x = iconSize * spritesheet[3]; + var y = iconSize * spritesheet[2]; + + return ':' + encodeEntities(emoji[1]) + ':'; +} + +MessageComposer.prototype.setValue = function (text) { + if (this.richTextareaEl) { + this.richTextareaEl.html(this.getRichHtml(text)); + this.lastLength = text.length; + } else { + this.textareaEl.val(text); + } +} + +MessageComposer.prototype.getRichHtml = function (text) { + return $('
    ').text(text).html().replace(/:([A-Za-z0-9\-\+\*_]+?):/gi, (function (all, shortcut) { + var code = EmojiHelper.shortcuts[shortcut]; + if (code !== undefined) { + return this.getEmojiHtml(code); + } + return all; + }).bind(this)); +} + + +MessageComposer.prototype.focus = function () { + if (this.richTextareaEl) { + setRichFocus(this.richTextareaEl[0]); + } else { + setFieldSelection(this.textareaEl[0]); + } } @@ -567,7 +808,7 @@ MessageComposer.prototype.showEmojiSuggestions = function (codes) { } MessageComposer.prototype.updatePosition = function () { - var offset = this.textareaEl.offset(); + var offset = (this.richTextareaEl || this.textareaEl).offset(); var height = this.autoCompleteEl.outerHeight(); this.autoCompleteEl.css({top: offset.top - height, left: offset.left}); } @@ -576,3 +817,9 @@ MessageComposer.prototype.hideSuggestions = function () { this.autoCompleteEl.hide(); delete this.autocompleteShown; } + +MessageComposer.prototype.resetTyping = function () { + this.lastTyping = 0; + this.lastLength = 0; +} + diff --git a/app/partials/desktop/im.html b/app/partials/desktop/im.html index c152e5fc..bb632a7f 100644 --- a/app/partials/desktop/im.html +++ b/app/partials/desktop/im.html @@ -171,13 +171,13 @@ -
    +
    - +
    @@ -193,7 +193,7 @@
    -
    +
    diff --git a/app/partials/mobile/im.html b/app/partials/mobile/im.html index 5bd132b6..a67e8749 100644 --- a/app/partials/mobile/im.html +++ b/app/partials/mobile/im.html @@ -138,9 +138,7 @@
    -
    - -
    + diff --git a/app/webogram.appcache b/app/webogram.appcache index 9802e602..83172322 100644 --- a/app/webogram.appcache +++ b/app/webogram.appcache @@ -1,6 +1,6 @@ CACHE MANIFEST -# 57 +# 59 NETWORK: * From bb7b9342e299d711d7aa86f8212f43f8c4158d9c Mon Sep 17 00:00:00 2001 From: Igor Zhukov Date: Fri, 6 Feb 2015 00:05:32 +0300 Subject: [PATCH 6/6] Improved emoji suggestions Added scroller to composer emoji tooltip --- app/css/app.css | 18 +++++++---- app/css/desktop.css | 4 +-- app/js/lib/utils.js | 7 ----- app/js/message_composer.js | 64 ++++++++++++++++++++++++++++---------- 4 files changed, 61 insertions(+), 32 deletions(-) diff --git a/app/css/app.css b/app/css/app.css index 363fc95f..b8c8f2d0 100644 --- a/app/css/app.css +++ b/app/css/app.css @@ -2036,11 +2036,17 @@ img.img_fullsize { .composer_emoji_tooltip_tab_stickers {background-position: -9px -361px; } .composer_emoji_tooltip_tab_stickers.active {background-position: -9px -333px; } -.composer_emoji_tooltip_content { - position: relative; + +.nano.composer_emoji_tooltip_content_wrap { height: 174px; - overflow: hidden; - overflow-y: auto; + position: relative; +} +.composer_emoji_tooltip_content { + /*position: relative;*/ + /*overflow: hidden; + overflow-y: auto;*/ + padding-right: 8px; + outline: 0!important; } @@ -2146,8 +2152,8 @@ a.composer_emoji_btn:hover { line-height: 20px; } .composer_sticker_btn { - width: 70px; - height: 70px; + width: 67px; + height: 67px; display: block; display: inline-block; text-align: center; diff --git a/app/css/desktop.css b/app/css/desktop.css index af5534f8..ac190f4d 100644 --- a/app/css/desktop.css +++ b/app/css/desktop.css @@ -408,11 +408,11 @@ opacity : 0.99; } -.emoji-menu .nano > .nano-pane { +.composer_emoji_tooltip .nano > .nano-pane { background : rgba(255,255,255,0.0); right: -2px; } -.emoji-menu .nano > .nano-pane > .nano-slider { +.composer_emoji_tooltip .nano > .nano-pane > .nano-slider { background: #d1d1d1; margin: 0 3px 0 4px; } diff --git a/app/js/lib/utils.js b/app/js/lib/utils.js index 570a6b92..8d2f66a1 100644 --- a/app/js/lib/utils.js +++ b/app/js/lib/utils.js @@ -348,13 +348,6 @@ function versionCompare (ver1, ver2) { var badCharsRe = /[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<\s]+/g, trimRe = /^\s+|\s$/g; - return { - createIndex: createIndex, - indexObject: indexObject, - cleanSearchText: cleanSearchText, - search: search - }; - function createIndex () { return { shortIndexes: {}, diff --git a/app/js/message_composer.js b/app/js/message_composer.js index e1064baa..4929e64b 100644 --- a/app/js/message_composer.js +++ b/app/js/message_composer.js @@ -191,9 +191,10 @@ EmojiTooltip.prototype.createTooltip = function () { } var self = this; - this.tooltipEl = $('
    ').appendTo(document.body); + 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); @@ -215,6 +216,10 @@ EmojiTooltip.prototype.createTooltip = function () { .appendTo(self.tabsEl); }); + if (!Config.Mobile) { + this.contentWrapEl.nanoScroller({preventPageScrolling: true, tabIndex: -1}); + } + this.contentEl.on('mousedown', function (e) { e = e.originalEvent || e; var target = $(e.target), code, sticker; @@ -265,6 +270,16 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { var self = this; var iconSize = Config.Mobile ? 26 : 20; + var renderContent = function () { + self.contentEl.html(html.join('')); + + if (!Config.Mobile) { + setTimeout(function () { + self.contentWrapEl.nanoScroller(); + }, 100); + } + } + if (this.tab == 6) { // Stickers var renderStickers = function (stickers) { var sticker, i; @@ -273,7 +288,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { sticker = stickers[i]; html.push(''); } - self.contentEl.html(html.join('')); + renderContent(); }; this.getStickers(renderStickers); } @@ -291,7 +306,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { y = iconSize * Math.floor(i / totalColumns); html.push(''); } - this.contentEl.html(html.join('')); + renderContent(); } else { EmojiHelper.getPopularEmoji(function (popularEmoji) { @@ -310,7 +325,7 @@ EmojiTooltip.prototype.updateTabContents = function (tab) { html.push(''); } } - self.contentEl.html(html.join('')); + renderContent(); }); } }; @@ -590,25 +605,38 @@ MessageComposer.prototype.checkAutocomplete = function () { value = value.substr(0, pos); - var matches = value.match(/:([A-Za-z_0-z\+-]*)$/); - if (matches/* && !this.richTextareaEl*/) { + var matches = value.match(/(?:\s|^):([A-Za-z0-9\-\+\*_]*)$/); + if (matches) { if (this.previousQuery == matches[0]) { return; } this.previousQuery = matches[0]; var query = SearchIndexManager.cleanSearchText(matches[1]); - if (query.length) { - var found = EmojiHelper.searchEmojis(query); - if (found.length) { - this.showEmojiSuggestions(found); + EmojiHelper.getPopularEmoji((function (popular) { + if (query.length) { + var found = EmojiHelper.searchEmojis(query); + if (found.length) { + var popularFound = [], + code, pos; + for (var i = 0, len = popular.length; i < len; i++) { + code = popular[i].code; + pos = found.indexOf(code); + if (pos >= 0) { + popularFound.push(code); + found.splice(pos, 1); + if (!found.length) { + break; + } + } + } + this.showEmojiSuggestions(popularFound.concat(found)); + } else { + this.hideSuggestions(); + } } else { - this.hideSuggestions(); + this.showEmojiSuggestions(popular); } - } else { - EmojiHelper.getPopularEmoji((function (found) { - this.showEmojiSuggestions(found); - }).bind(this)); - } + }).bind(this)); } else { delete this.previousQuery; @@ -771,7 +799,9 @@ MessageComposer.prototype.getRichHtml = function (text) { MessageComposer.prototype.focus = function () { if (this.richTextareaEl) { - setRichFocus(this.richTextareaEl[0]); + setZeroTimeout((function () { + setRichFocus(this.richTextareaEl[0]); + }).bind(this)); } else { setFieldSelection(this.textareaEl[0]); }