From a1fb9f3f61030791a76ba20992f349ae7d739d00 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Thu, 13 Aug 2020 01:23:00 +0300 Subject: [PATCH 01/10] Cleanup --- Lock.json | 1 - LockWait.json | 1 - .../TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift | 2 +- voicebin.json | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 Lock.json delete mode 100644 LockWait.json delete mode 100644 voicebin.json diff --git a/Lock.json b/Lock.json deleted file mode 100644 index f56c2c101f..0000000000 --- a/Lock.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.9","fr":60,"ip":0,"op":30,"w":240,"h":360,"nm":"Lock2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[100]},{"t":25,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,0],[0,0],[0,-1.29],[0,0],[1.28,0],[0,0],[0,1.28],[0,0]],"o":[[0,0],[1.28,0],[0,0],[0,1.28],[0,0],[-1.29,0],[0,0],[0,-1.29]],"v":[[-4.995,-6.335],[5.005,-6.335],[7.335,-3.995],[7.335,4.005],[5.005,6.335],[-4.995,6.335],[-7.335,4.005],[-7.335,-3.995]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.968627510819,0.968627510819,0.968627510819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[0]},{"t":25,"s":[90]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[120]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[120]},{"t":25,"s":[120]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[150]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[200]},{"t":25,"s":[180]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[{"i":[[-1.66,0],[0,0],[0,-1.66],[0,0],[1.66,0],[0,0],[0,1.66],[0,0]],"o":[[0,0],[1.66,0],[0,0],[0,1.66],[0,0],[-1.66,0],[0,0],[0,-1.66]],"v":[[-5,-7],[5,-7],[8,-4],[8,4],[5,7],[-5,7],[-8,4],[-8,-4]],"c":true}]},{"t":25,"s":[{"i":[[-1.66,0],[0,0],[0,-1.66],[0,0],[1.66,0],[0,0],[0,1.66],[0,0]],"o":[[0,0],[1.66,0],[0,0],[0,1.66],[0,0],[-1.66,0],[0,0],[0,-1.66]],"v":[[-5,-8],[5,-8],[8,-5],[8,5],[5,8],[-5,8],[-8,5],[-8,-5]],"c":true}]}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.592000007629,0.592000007629,0.592000007629,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.592156862745,0.592156862745,0.592156862745,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[10]},{"t":15,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":0,"s":[30,-32,0],"to":[0,2.5,0],"ti":[0,-11.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[30,-17,0],"to":[0,11.667,0],"ti":[0,-9.167,0]},{"t":25,"s":[30,38,0]}],"ix":2},"a":{"a":0,"k":[30,36,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.76,0],[0,-2.76],[0,0]],"o":[[0,0],[0,-2.76],[2.76,0],[0,0],[0,0]],"v":[[-5,2],[-5,-1],[0,-6],[5,-1],[5,6]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.592000007629,0.592000007629,0.592000007629,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path 4","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":0,"s":[0,132,0],"to":[0,-19.667,0],"ti":[0,19.667,0]},{"t":15,"s":[0,14,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8,3],[0,-3],[8,3]],"c":false}]},{"t":12,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-0.753,3],[0,-3],[0.753,3]],"c":false}]}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.592000007629,0.592000007629,0.592000007629,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Path 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/LockWait.json b/LockWait.json deleted file mode 100644 index c46209d092..0000000000 --- a/LockWait.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.9","fr":60,"ip":0,"op":120,"w":240,"h":360,"nm":"Lock1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Path 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[120,282,0],"to":[0,-1.667,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[120,272,0],"to":[0,-0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[120,277,0],"to":[0,0,0],"ti":[0,-0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":75,"s":[120,272,0],"to":[0,0.833,0],"ti":[0,-1.667,0]},{"t":120,"s":[120,282,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-8,3],[0,-3],[8,3]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.592000007629,0.592000007629,0.592000007629,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Path 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,150,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.66,0],[0,0],[0,-1.66],[0,0],[1.66,0],[0,0],[0,1.66],[0,0]],"o":[[0,0],[1.66,0],[0,0],[0,1.66],[0,0],[-1.66,0],[0,0],[0,-1.66]],"v":[[-5,-7],[5,-7],[8,-4],[8,4],[5,7],[-5,7],[-8,4],[-8,-4]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.592000007629,0.592000007629,0.592000007629,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745098,0.96862745098,0.96862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":75,"s":[0]},{"t":120,"s":[10]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[150,118,0],"to":[0,1.667,0],"ti":[0,-0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[150,128,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[150,123,0],"to":[0,0,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":75,"s":[150,128,0],"to":[0,-0.833,0],"ti":[0,1.667,0]},{"t":120,"s":[150,118,0]}],"ix":2},"a":{"a":0,"k":[30,36,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.76,0],[0,-2.76],[0,0]],"o":[[0,0],[0,-2.76],[2.76,0],[0,0],[0,0]],"v":[[-5,2],[-5,-1],[0,-6],[5,-1],[5,6]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.592000007629,0.592000007629,0.592000007629,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift index 0f7c511dcf..3159e219c7 100644 --- a/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecordingPreviewInputPanelNode.swift @@ -101,7 +101,7 @@ final class ChatRecordingPreviewInputPanelNode: ChatInputPanelNode { super.init() self.addSubnode(self.deleteButton) - self.deleteButton.addSubnode(binNode) + self.deleteButton.addSubnode(self.binNode) self.addSubnode(self.waveformBackgroundNode) self.addSubnode(self.sendButton) self.addSubnode(self.waveformScubberNode) diff --git a/voicebin.json b/voicebin.json deleted file mode 100644 index baf0e38c66..0000000000 --- a/voicebin.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.5.9","fr":60,"ip":0,"op":78,"w":240,"h":240,"nm":"RedBin 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Cap1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[0]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[1]},"t":52,"s":[10]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[1],"y":[0]},"t":68,"s":[-5]},{"t":77,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":22,"s":[120,18,0],"to":[0,11.667,0],"ti":[0,-6.667,0]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[120,88,0],"to":[0,6.667,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":52,"s":[120,58,0],"to":[0,-0.833,0],"ti":[0,-1.667,0]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[120,83,0],"to":[0,1.667,0],"ti":[0,0.833,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":68,"s":[120,68,0],"to":[0,-0.833,0],"ti":[0,-1.667,0]},{"t":77,"s":[120,78,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.5,0],[8.5,0]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Cap1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[50]},{"t":32,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[50]},{"t":32,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":78,"st":-188,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Cap2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-12,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.83,0],[0,0],[0,-0.83],[0,0],[0,0]],"o":[[0,0],[0,-0.83],[0,0],[0.83,0],[0,0],[0,0],[0,0]],"v":[[-3.5,1.5],[-3.5,0],[-2,-1.5],[2,-1.5],[3.5,0],[3.5,1.5],[3.5,1.5]],"c":false},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Cap2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[50]},{"t":32,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[50]},{"t":32,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":78,"st":-188,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[139.5,129,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.25,-5.5],[-0.25,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.667,-3.833],[0.167,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.25,-5.5],[-0.25,5.5]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.25,-5.5],[-0.25,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.458,-5.083],[-0.042,5.5]],"c":false}]},{"t":68,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.25,-5.5],[-0.25,5.5]],"c":false}]}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Line3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"t":29,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":78,"st":-188,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Line2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,129,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-5.5],[0,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-3.833],[0,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-5.5],[0,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-5.5],[0,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-5.083],[0,5.5]],"c":false}]},{"t":68,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-5.5],[0,5.5]],"c":false}]}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Line2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"t":29,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Обрезать контуры 2","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":78,"st":-188,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Line1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100.5,129,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.25,-5.5],[0.25,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.667,-3.833],[-0.167,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.25,-5.5],[0.25,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.25,-5.5],[0.25,5.5]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.458,-5.083],[0.042,5.5]],"c":false}]},{"t":68,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.25,-5.5],[0.25,5.5]],"c":false}]}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.2,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Line1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"t":29,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":78,"st":-188,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Bin","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,120,0],"ix":2},"a":{"a":0,"k":[0,-9,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[{"i":[[0,0],[0,0],[-1.06,0],[0,0],[-0.06,1.05],[0,0]],"o":[[0,0],[0.06,1.05],[0,0],[1.06,0],[0,0],[0,0]],"v":[[-7,-8.5],[-6.11,6.62],[-4.11,8.5],[4.11,8.5],[6.11,6.62],[7,-8.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":42,"s":[{"i":[[0,0],[0,0],[-1.06,0],[0,0],[-0.06,1.05],[0,0]],"o":[[0,0],[0.06,1.05],[0,0],[1.06,0],[0,0],[0,0]],"v":[[-7.833,-6.833],[-6.943,6.62],[-4.943,8.5],[4.943,8.5],[6.943,6.62],[7.833,-6.833]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[0,0],[0,0],[-1.06,0],[0,0],[-0.06,1.05],[0,0]],"o":[[0,0],[0.06,1.05],[0,0],[1.06,0],[0,0],[0,0]],"v":[[-7,-8.5],[-6.11,6.62],[-4.11,8.5],[4.11,8.5],[6.11,6.62],[7,-8.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[0,0],[-1.06,0],[0,0],[-0.06,1.05],[0,0]],"o":[[0,0],[0.06,1.05],[0,0],[1.06,0],[0,0],[0,0]],"v":[[-7,-8.5],[-6.11,6.62],[-4.11,8.5],[4.11,8.5],[6.11,6.62],[7,-8.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62,"s":[{"i":[[0,0],[0,0],[-1.06,0],[0,0],[-0.06,1.05],[0,0]],"o":[[0,0],[0.06,1.05],[0,0],[1.06,0],[0,0],[0,0]],"v":[[-7.417,-7.667],[-6.527,6.62],[-4.527,8.5],[4.527,8.5],[6.527,6.62],[7.417,-7.667]],"c":true}]},{"t":68,"s":[{"i":[[0,0],[0,0],[-1.06,0],[0,0],[-0.06,1.05],[0,0]],"o":[[0,0],[0.06,1.05],[0,0],[1.06,0],[0,0],[0,0]],"v":[[-7,-8.5],[-6.11,6.62],[-4.11,8.5],[4.11,8.5],[6.11,6.62],[7,-8.5]],"c":true}]}],"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.231372563979,0.188235309077,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.33,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Обводка 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Bin","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[50]},{"t":42,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22,"s":[50]},{"t":42,"s":[100]}],"ix":2},"o":{"a":0,"k":137,"ix":3},"m":1,"ix":2,"nm":"Обрезать контуры 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":78,"st":-188,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"RecMask 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[120,120,0],"to":[0,-15,0],"ti":[0,13.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":15,"s":[120,30,0],"to":[0,-13.667,0],"ti":[0,-1.333,0]},{"t":24,"s":[120,38,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,84.375,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[8.5,-8],[8.5,8],[-8.5,8],[-8.5,-8]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.96862745098,0.96862745098,0.96862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Mask","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78,"st":-190,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Recording","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[120,120,0],"to":[0,-15,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":1,"y":0},"t":15,"s":[120,30,0],"to":[0,0,0],"ti":[0,-15,0]},{"t":30,"s":[120,120,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.76,0],[0,2.76],[2.76,0],[0,-2.76]],"o":[[2.76,0],[0,-2.76],[-2.76,0],[0,2.76]],"v":[[0,5],[5,0],[0,-5],[-5,0]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.231372997165,0.188234999776,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[600,600],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Преобразовать"}],"nm":"Recording","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":-180,"bm":0}],"markers":[]} \ No newline at end of file From 7e643321cfd167b1c5d1a3fa5938ca488406bd82 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sun, 16 Aug 2020 13:20:06 +0300 Subject: [PATCH 02/10] Slot machine animation --- Telegram/BUILD | 1 + .../Telegram-iOS/Resources/Slot_Back_Idle.tgs | Bin 0 -> 1945 bytes .../Telegram-iOS/Resources/Slot_Back_Win.tgs | Bin 0 -> 4227 bytes .../Resources/Slot_Front_Pull.tgs | Bin 0 -> 5484 bytes Telegram/Telegram-iOS/Resources/Slot_L_7.tgs | Bin 0 -> 6748 bytes .../Telegram-iOS/Resources/Slot_L_7_Win.tgs | Bin 0 -> 7283 bytes .../Telegram-iOS/Resources/Slot_L_Bar.tgs | Bin 0 -> 5587 bytes .../Telegram-iOS/Resources/Slot_L_Berries.tgs | Bin 0 -> 5633 bytes .../Telegram-iOS/Resources/Slot_L_Lemon.tgs | Bin 0 -> 8010 bytes .../Resources/Slot_L_Spinning.tgs | Bin 0 -> 9745 bytes Telegram/Telegram-iOS/Resources/Slot_M_7.tgs | Bin 0 -> 12288 bytes .../Telegram-iOS/Resources/Slot_M_7_Win.tgs | Bin 0 -> 12458 bytes .../Telegram-iOS/Resources/Slot_M_Bar.tgs | Bin 0 -> 10592 bytes .../Telegram-iOS/Resources/Slot_M_Berries.tgs | Bin 0 -> 10617 bytes .../Telegram-iOS/Resources/Slot_M_Lemon.tgs | Bin 0 -> 9395 bytes .../Resources/Slot_M_Spinning.tgs | Bin 0 -> 6191 bytes Telegram/Telegram-iOS/Resources/Slot_R_7.tgs | Bin 0 -> 13640 bytes .../Telegram-iOS/Resources/Slot_R_7_Win.tgs | Bin 0 -> 13841 bytes .../Telegram-iOS/Resources/Slot_R_Bar.tgs | Bin 0 -> 16852 bytes .../Telegram-iOS/Resources/Slot_R_Berries.tgs | Bin 0 -> 11375 bytes .../Telegram-iOS/Resources/Slot_R_Lemon.tgs | Bin 0 -> 13208 bytes .../Resources/Slot_R_Spinning.tgs | Bin 0 -> 9730 bytes .../Telegram-iOS/en.lproj/Localizable.strings | 2 + .../DeviceAccess/Sources/DeviceAccess.swift | 7 +- .../Sources/CallControllerNode.swift | 4 +- .../Sources/LegacyCallControllerButton.swift | 2 +- .../Sources/PresentationStrings.swift | 3055 +++++++++-------- .../Resources/PresentationStrings.mapping | Bin 154799 -> 154846 bytes .../ChatMessageAnimatedStickerItemNode.swift | 25 +- .../Sources/SlotMachineAnimationNode.swift | 241 ++ 30 files changed, 1800 insertions(+), 1537 deletions(-) create mode 100644 Telegram/Telegram-iOS/Resources/Slot_Back_Idle.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_Back_Win.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_Front_Pull.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_L_7.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_L_7_Win.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_L_Bar.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_L_Berries.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_L_Lemon.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_L_Spinning.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_M_7.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_M_7_Win.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_M_Bar.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_M_Berries.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_M_Lemon.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_M_Spinning.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_R_7.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_R_7_Win.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_R_Bar.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_R_Berries.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_R_Lemon.tgs create mode 100644 Telegram/Telegram-iOS/Resources/Slot_R_Spinning.tgs create mode 100644 submodules/TelegramUI/Sources/SlotMachineAnimationNode.swift diff --git a/Telegram/BUILD b/Telegram/BUILD index 26d56c83f1..4526e31da5 100644 --- a/Telegram/BUILD +++ b/Telegram/BUILD @@ -730,6 +730,7 @@ plist_fragment( onionhttp ucbrowser dolphin + instagram-stories LSRequiresIPhoneOS diff --git a/Telegram/Telegram-iOS/Resources/Slot_Back_Idle.tgs b/Telegram/Telegram-iOS/Resources/Slot_Back_Idle.tgs new file mode 100644 index 0000000000000000000000000000000000000000..5eaa214a3ad0d8c58a4646aa1173ffeaf53745f0 GIT binary patch literal 1945 zcmV;K2WI#miwFP!000021MOSgZ`(!;|5pmV?sPcvzVo<;^>x7ZRs@5$e6CJX*lvfS z=>I;FC&{uUyJ=%5ZtMmhH_i3_j{028KHklLef!Jw_WEY=*X_mhk_NcAxR9Qc`TTN0l=Z>DagT7c%$ab9LsL@n#RxDa)y9J`?79>hq=gz|BN@y{9qIqIPH%2B%GQ z%A9{y%lw{=yAXmb%9KTsVAZam8<<2$@SUL{ zm9+G54+F|4rqqy=_AV>1MqBj6?npJ5tgT5b{7-duHJQ#Yd5Q8CexEFE-T=*gbJ4O? zv)1{dk`DbxHT0lJgBs^e3d-mJIhdG&Pr!HC@O=&`M+N+<9#;B;F<<5L_GpPHQ<{dp z^YmZ2{Cy`pS>GRv*~9zG4J%ym+g$r#X7m#^)YbR`D8$n zh5tF5+|REbW_Q)s^M>?x_VDq8JWBI~!zbDoKEQ*v+4tblQcmbND0JZd(6OzpW7aO% zM@W`7Ivof`L%=cyn|xGtjygmn83)>#&?8{fCif+3nlmNer=+MYZ7Mwq zM9{&76%t9g>=enm(3b(AMfAs65}K(xLbI6ezFBQ|-#*WhV6%?KHaa_`Pl@%50}RgYY$I8$hZ$ugJo4VBVLHGz&H&6$Kr?N=Sf9w&mp#&w30l7LH-R!Gka_K z!IPHkL`!g!tInJw^VPw;$Y~Boq!Ib-2IxaO32RYD+93exvl`sZX%3ije&a)8aBRDM zq>Jnu7a59+OqaVUOTPL;KR6^~$~g}g`llkx(?Fm-E{29=F!qlOn{KVi-KRaZqxLif zF`sg_n33(Cm4n67is6jBOE4p|kSnoW8nt8;{3#r*6NtX;{EK_jMRor^Jwsr zfc-~+cvJ>$^jz$GP;Ex`;;dC#e&Us)F;Hw%?wTw9i>?#sJ_*w8?%sZBqXzSnk!k6`>xWLePMOJ0y#goE--gB#MRO zQfMcDqF~q9jMj$K#J(GEPk?$_h1!1oMz%@TGG0J?E9rTMWZN7W)ns*WJMkO8k$Yc7 z0>ZI+gxetTj8BCAxvRc@9OIgtGJcZ@BU6{3STaDNzqqdCR=@0GF zi4P{waK2AAaE$C6D{+mDDWpuD*ajQW#wH;J@=X(yEZ5oWg zSb`~=IB89gLS6U*McMnwljw@mpK{t0F#awI(Of4AQReJ>^Rgg#RooFIA%TAeL9NbePGv=-Yg#u@l^@2C<1d^W|2~b+Si25LTcLtOI<*nOrr}} z9A6|~nF$o5Lu+(x&c*0LNr|Cp9A=ZWH+dHYFv@JRvwKDTH|Bo**tQ4aFugzx@?N6? ztD{7WT}6x1^LXcPZ&?aJhAc;AO;r!fZZ^zijYD~^uhR3vE}ns1&?OwS|lzJw=}my zo*EmbJ7!+PPCv^B1Ox9j;Bp{E*S7W f7b{$n9kdv(Fmw(`_`uywvN=rrSRz&~+w(iuo literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_Back_Win.tgs b/Telegram/Telegram-iOS/Resources/Slot_Back_Win.tgs new file mode 100644 index 0000000000000000000000000000000000000000..9426a934ac41f95dc3efa177fcc95c9801019db9 GIT binary patch literal 4227 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_Front_Pull.tgs b/Telegram/Telegram-iOS/Resources/Slot_Front_Pull.tgs new file mode 100644 index 0000000000000000000000000000000000000000..478b690679a1a0e6d6a339a9cef85749bacb18d2 GIT binary patch literal 5484 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_L_7.tgs b/Telegram/Telegram-iOS/Resources/Slot_L_7.tgs new file mode 100644 index 0000000000000000000000000000000000000000..6efa982b701290e18a17d1a4394192c46fc8f827 GIT binary patch literal 6748 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_L_7_Win.tgs b/Telegram/Telegram-iOS/Resources/Slot_L_7_Win.tgs new file mode 100644 index 0000000000000000000000000000000000000000..eee9e6232802a3c72ab2fbdf495543a122f5f6c1 GIT binary patch literal 7283 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_L_Berries.tgs b/Telegram/Telegram-iOS/Resources/Slot_L_Berries.tgs new file mode 100644 index 0000000000000000000000000000000000000000..942ac87c984bbbf439cc8abb66d061a8ed816626 GIT binary patch literal 5633 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 bVsXb4!f8Gse0W0m*^mDRJxROlB+vi=EejsY literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_L_Lemon.tgs b/Telegram/Telegram-iOS/Resources/Slot_L_Lemon.tgs new file mode 100644 index 0000000000000000000000000000000000000000..77b514707609e50f6a470b51100e766b8e14abc3 GIT binary patch literal 8010 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_M_7.tgs b/Telegram/Telegram-iOS/Resources/Slot_M_7.tgs new file mode 100644 index 0000000000000000000000000000000000000000..a234c73ec14cab22d8be25f5c5e445221838f044 GIT binary patch literal 12288 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 Yo3_~oki^{X+tbImadV;H4K&pM0L-+jzyJUM literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_M_Berries.tgs b/Telegram/Telegram-iOS/Resources/Slot_M_Berries.tgs new file mode 100644 index 0000000000000000000000000000000000000000..cbfa50774b36fdd4ea2a38f09f12d263e1926959 GIT binary patch literal 10617 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 SAG1Y1Nh((`?+z;=A^ty|P+ocf literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_M_Spinning.tgs b/Telegram/Telegram-iOS/Resources/Slot_M_Spinning.tgs new file mode 100644 index 0000000000000000000000000000000000000000..b6549225f778c0bc7f253fc6d49d38fc782d1665 GIT binary patch literal 6191 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_R_7.tgs b/Telegram/Telegram-iOS/Resources/Slot_R_7.tgs new file mode 100644 index 0000000000000000000000000000000000000000..49f00f17cf87a53b82eef9a64c88ca66ae876fb2 GIT binary patch literal 13640 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 Qn=cff0Wn00V{owl2XzRk00000 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_R_7_Win.tgs b/Telegram/Telegram-iOS/Resources/Slot_R_7_Win.tgs new file mode 100644 index 0000000000000000000000000000000000000000..884a485834418417f846fe005d4bc92543a9de47 GIT binary patch literal 13841 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 LkzQ-BK|%fx@%i!W literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_R_Bar.tgs b/Telegram/Telegram-iOS/Resources/Slot_R_Bar.tgs new file mode 100644 index 0000000000000000000000000000000000000000..6204c6c4f108d72390c320d4f919fdb736900419 GIT binary patch literal 16852 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/Resources/Slot_R_Berries.tgs b/Telegram/Telegram-iOS/Resources/Slot_R_Berries.tgs new file mode 100644 index 0000000000000000000000000000000000000000..93264afa4eaa0b3bc2b69ca6003e0e87ba94515e GIT binary patch literal 11375 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%0DdrO#+5{poXIf>6GXkNS#XK79e7fPC5|ag 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 Q`h5S2KDgv-YXt}UKZwGwM`opTO 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 2a1989b53e..bb9f305431 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -5735,3 +5735,5 @@ Any member of this group will be able to see messages in the channel."; "Call.AudioRouteMute" = "Mute Yourself"; "AccessDenied.VideoCallCamera" = "Telegram needs access to your camera to make video calls.\n\nPlease go to Settings > Privacy > Camera and set Telegram to ON."; + +"Call.AccountIsLoggedOnCurrentDevice" = "Sorry, you can't call %@ because that account is logged in to Telegram on the device you're using for the call."; diff --git a/submodules/DeviceAccess/Sources/DeviceAccess.swift b/submodules/DeviceAccess/Sources/DeviceAccess.swift index 7c16e2247d..d598849965 100644 --- a/submodules/DeviceAccess/Sources/DeviceAccess.swift +++ b/submodules/DeviceAccess/Sources/DeviceAccess.swift @@ -277,7 +277,12 @@ public final class DeviceAccess { if status == PGCameraAuthorizationStatusRestricted { text = presentationData.strings.AccessDenied_CameraRestricted } else { - text = presentationData.strings.AccessDenied_Camera + switch cameraSubject { + case .video: + text = presentationData.strings.AccessDenied_Camera + case .videoCall: + text = presentationData.strings.AccessDenied_VideoCallCamera + } } completion(false) present(standardTextAlertController(theme: AlertControllerTheme(presentationData: presentationData), title: presentationData.strings.AccessDenied_Title, text: text, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_NotNow, action: {}), TextAlertAction(type: .genericAction, title: presentationData.strings.AccessDenied_Settings, action: { diff --git a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift index 5fbdcec3d6..766223f177 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift @@ -1523,9 +1523,9 @@ final class CallControllerNode: ViewControllerTracingNode, CallControllerNodePro } else if let _ = self.keyPreviewNode { self.backPressed() } else { - if let expandedVideoNode = self.expandedVideoNode, let minimizedVideoNode = self.minimizedVideoNode { + if self.hasVideoNodes { let point = recognizer.location(in: recognizer.view) - if minimizedVideoNode.frame.contains(point) { + if let expandedVideoNode = self.expandedVideoNode, let minimizedVideoNode = self.minimizedVideoNode, minimizedVideoNode.frame.contains(point) { if !self.areUserActionsDisabledNow() { let copyView = minimizedVideoNode.view.snapshotView(afterScreenUpdates: false) copyView?.frame = minimizedVideoNode.frame diff --git a/submodules/TelegramCallsUI/Sources/LegacyCallControllerButton.swift b/submodules/TelegramCallsUI/Sources/LegacyCallControllerButton.swift index 79c82f11bb..055bc7d333 100644 --- a/submodules/TelegramCallsUI/Sources/LegacyCallControllerButton.swift +++ b/submodules/TelegramCallsUI/Sources/LegacyCallControllerButton.swift @@ -45,7 +45,7 @@ private func generateEmptyButtonImage(icon: UIImage?, strokeColor: UIColor?, fil context.fill(imageRect) } else { context.setBlendMode(.normal) - context.draw(icon.cgImage!, in: imageRect) + context.draw(generateTintedImage(image: icon, color: .white)!.cgImage!, in: imageRect) } } }) diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index d9c947cbc1..f574819ef3 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -3525,1738 +3525,1738 @@ public final class PresentationStrings: Equatable { } public var Checkout_NewCard_SaveInfoHelp: String { return self._s[3144]! } public var Wallet_Month_ShortOctober: String { return self._s[3145]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[3146]! } - public var WallpaperColors_Title: String { return self._s[3147]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[3148]! } - public var VoiceOver_MessageContextForward: String { return self._s[3149]! } - public var GroupPermission_Duration: String { return self._s[3150]! } + public func Call_AccountIsLoggedOnCurrentDevice(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3146]!, self._r[3146]!, [_0]) + } + public var VoiceOver_Chat_YourMusic: String { return self._s[3147]! } + public var WallpaperColors_Title: String { return self._s[3148]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[3149]! } + public var VoiceOver_MessageContextForward: String { return self._s[3150]! } + public var GroupPermission_Duration: String { return self._s[3151]! } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3151]!, self._r[3151]!, [_0]) + return formatWithArgumentRanges(self._s[3152]!, self._r[3152]!, [_0]) } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[3152]! } - public var Username_Placeholder: String { return self._s[3153]! } - public var CallFeedback_WhatWentWrong: String { return self._s[3154]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[3155]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3156]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[3153]! } + public var Username_Placeholder: String { return self._s[3154]! } + public var CallFeedback_WhatWentWrong: String { return self._s[3155]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[3156]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[3157]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3159]!, self._r[3159]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3160]!, self._r[3160]!, [_1, _2]) } - public var Passport_PasswordDescription: String { return self._s[3160]! } - public var Channel_MessagePhotoUpdated: String { return self._s[3161]! } - public var MediaPicker_TapToUngroupDescription: String { return self._s[3162]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[3163]! } - public var AttachmentMenu_PhotoOrVideo: String { return self._s[3164]! } - public var Conversation_ContextMenuMore: String { return self._s[3165]! } - public var Privacy_PaymentsClearInfo: String { return self._s[3166]! } - public var CallSettings_TabIcon: String { return self._s[3167]! } - public var KeyCommand_Find: String { return self._s[3168]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[3169]! } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3170]! } - public var EditTheme_Edit_Preview_IncomingText: String { return self._s[3171]! } + public var Passport_PasswordDescription: String { return self._s[3161]! } + public var Channel_MessagePhotoUpdated: String { return self._s[3162]! } + public var MediaPicker_TapToUngroupDescription: String { return self._s[3163]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[3164]! } + public var AttachmentMenu_PhotoOrVideo: String { return self._s[3165]! } + public var Conversation_ContextMenuMore: String { return self._s[3166]! } + public var Privacy_PaymentsClearInfo: String { return self._s[3167]! } + public var CallSettings_TabIcon: String { return self._s[3168]! } + public var KeyCommand_Find: String { return self._s[3169]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[3170]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3171]! } + public var EditTheme_Edit_Preview_IncomingText: String { return self._s[3172]! } public func Conversation_NoticeInvitedByInChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3172]!, self._r[3172]!, [_0]) + return formatWithArgumentRanges(self._s[3173]!, self._r[3173]!, [_0]) } - public var Message_PinnedGame: String { return self._s[3173]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3174]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[3176]! } - public var Login_CallRequestState2: String { return self._s[3178]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3180]! } + public var Message_PinnedGame: String { return self._s[3174]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3175]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[3177]! } + public var Login_CallRequestState2: String { return self._s[3179]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3181]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3181]!, self._r[3181]!, [_0]) + return formatWithArgumentRanges(self._s[3182]!, self._r[3182]!, [_0]) } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_0]) + return formatWithArgumentRanges(self._s[3184]!, self._r[3184]!, [_0]) } - public var AuthSessions_AddDevice: String { return self._s[3184]! } - public var WallpaperPreview_Blurred: String { return self._s[3185]! } - public var Conversation_InstantPagePreview: String { return self._s[3186]! } - public var PeerInfo_ButtonUnmute: String { return self._s[3187]! } + public var AuthSessions_AddDevice: String { return self._s[3185]! } + public var WallpaperPreview_Blurred: String { return self._s[3186]! } + public var Conversation_InstantPagePreview: String { return self._s[3187]! } + public var PeerInfo_ButtonUnmute: String { return self._s[3188]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3188]!, self._r[3188]!, [_0]) + return formatWithArgumentRanges(self._s[3189]!, self._r[3189]!, [_0]) } - public var ChatList_PeerTypeChannel: String { return self._s[3189]! } - public var SecretTimer_VideoDescription: String { return self._s[3192]! } - public var WallpaperSearch_ColorRed: String { return self._s[3193]! } - public var GroupPermission_NoPinMessages: String { return self._s[3194]! } - public var Passport_Language_es: String { return self._s[3195]! } - public var Permissions_ContactsAllow_v0: String { return self._s[3197]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[3198]! } + public var ChatList_PeerTypeChannel: String { return self._s[3190]! } + public var SecretTimer_VideoDescription: String { return self._s[3193]! } + public var WallpaperSearch_ColorRed: String { return self._s[3194]! } + public var GroupPermission_NoPinMessages: String { return self._s[3195]! } + public var Passport_Language_es: String { return self._s[3196]! } + public var Permissions_ContactsAllow_v0: String { return self._s[3198]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[3199]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3199]!, self._r[3199]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3200]!, self._r[3200]!, [_1, _2]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[3200]! } - public var WebPreview_GettingLinkInfo: String { return self._s[3202]! } - public var Watch_UserInfo_Unmute: String { return self._s[3203]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3204]! } - public var AccessDenied_CameraRestricted: String { return self._s[3206]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[3201]! } + public var WebPreview_GettingLinkInfo: String { return self._s[3203]! } + public var Watch_UserInfo_Unmute: String { return self._s[3204]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3205]! } + public var AccessDenied_CameraRestricted: String { return self._s[3207]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, ["\(_0)"]) } - public var ChatList_ReadAll: String { return self._s[3209]! } - public var Settings_CopyUsername: String { return self._s[3210]! } - public var Contacts_SearchLabel: String { return self._s[3211]! } - public var Map_OpenInYandexNavigator: String { return self._s[3213]! } - public var PasscodeSettings_EncryptData: String { return self._s[3214]! } - public var Settings_Wallet: String { return self._s[3215]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[3216]! } - public var ChatList_PeerTypeBot: String { return self._s[3217]! } - public var WallpaperSearch_ColorPrefix: String { return self._s[3218]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[3219]! } - public var DialogList_AdNoticeAlert: String { return self._s[3220]! } - public var Wallet_Month_GenMay: String { return self._s[3222]! } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[3223]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[3224]! } - public var Localization_LanguageCustom: String { return self._s[3225]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3226]! } - public var CallFeedback_Title: String { return self._s[3227]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[3230]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[3231]! } - public var Wallet_Intro_CreateErrorTitle: String { return self._s[3232]! } - public var Conversation_InfoGroup: String { return self._s[3233]! } - public var Compose_NewMessage: String { return self._s[3234]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[3235]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[3236]! } - public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3237]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[3238]! } + public var ChatList_ReadAll: String { return self._s[3210]! } + public var Settings_CopyUsername: String { return self._s[3211]! } + public var Contacts_SearchLabel: String { return self._s[3212]! } + public var Map_OpenInYandexNavigator: String { return self._s[3214]! } + public var PasscodeSettings_EncryptData: String { return self._s[3215]! } + public var Settings_Wallet: String { return self._s[3216]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[3217]! } + public var ChatList_PeerTypeBot: String { return self._s[3218]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[3219]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[3220]! } + public var DialogList_AdNoticeAlert: String { return self._s[3221]! } + public var Wallet_Month_GenMay: String { return self._s[3223]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[3224]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[3225]! } + public var Localization_LanguageCustom: String { return self._s[3226]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3227]! } + public var CallFeedback_Title: String { return self._s[3228]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[3231]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[3232]! } + public var Wallet_Intro_CreateErrorTitle: String { return self._s[3233]! } + public var Conversation_InfoGroup: String { return self._s[3234]! } + public var Compose_NewMessage: String { return self._s[3235]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[3236]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[3237]! } + public var Wallet_SecureStorageReset_BiometryFaceId: String { return self._s[3238]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[3239]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3239]!, self._r[3239]!, [_0]) + return formatWithArgumentRanges(self._s[3240]!, self._r[3240]!, [_0]) } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[3240]! } - public var Login_CancelSignUpConfirmation: String { return self._s[3241]! } - public var ChangePhoneNumberCode_Help: String { return self._s[3242]! } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[3243]! } - public var ChatList_Context_RemoveFromFolder: String { return self._s[3244]! } - public var Channel_BlackList_Title: String { return self._s[3245]! } - public var UserInfo_PhoneCall: String { return self._s[3246]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3248]! } - public var Wallet_Month_ShortJanuary: String { return self._s[3249]! } - public var State_connecting: String { return self._s[3250]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3251]! } - public var Wallet_Month_GenMarch: String { return self._s[3252]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[3253]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[3254]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[3241]! } + public var Login_CancelSignUpConfirmation: String { return self._s[3242]! } + public var ChangePhoneNumberCode_Help: String { return self._s[3243]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[3244]! } + public var ChatList_Context_RemoveFromFolder: String { return self._s[3245]! } + public var Channel_BlackList_Title: String { return self._s[3246]! } + public var UserInfo_PhoneCall: String { return self._s[3247]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3249]! } + public var Wallet_Month_ShortJanuary: String { return self._s[3250]! } + public var State_connecting: String { return self._s[3251]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[3252]! } + public var Wallet_Month_GenMarch: String { return self._s[3253]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[3254]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[3255]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3255]!, self._r[3255]!, [_0]) - } - public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3256]!, self._r[3256]!, [_0]) } - public var Notifications_GroupNotifications: String { return self._s[3257]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3258]! } - public var Passport_Identity_EditPassport: String { return self._s[3259]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[3261]! } - public var Localization_EnglishLanguageName: String { return self._s[3262]! } - public var Share_AuthDescription: String { return self._s[3263]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3264]! } - public var Passport_Identity_Surname: String { return self._s[3265]! } - public var Compose_TokenListPlaceholder: String { return self._s[3266]! } - public var Wallet_AccessDenied_Camera: String { return self._s[3267]! } - public var Passport_Identity_OneOfTypePassport: String { return self._s[3268]! } - public var Settings_AboutEmpty: String { return self._s[3269]! } - public var Conversation_Unmute: String { return self._s[3270]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[3272]! } - public var Wallet_Sending_Text: String { return self._s[3273]! } - public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3274]!, self._r[3274]!, [_1]) + public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3257]!, self._r[3257]!, [_0]) } - public var Login_CodeSentCall: String { return self._s[3275]! } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3277]! } - public var ChatSettings_Appearance: String { return self._s[3278]! } - public var ClearCache_StorageUsage: String { return self._s[3279]! } - public var ChatListFolder_NameContacts: String { return self._s[3280]! } - public var Appearance_PickAccentColor: String { return self._s[3282]! } + public var Notifications_GroupNotifications: String { return self._s[3258]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3259]! } + public var Passport_Identity_EditPassport: String { return self._s[3260]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[3262]! } + public var Localization_EnglishLanguageName: String { return self._s[3263]! } + public var Share_AuthDescription: String { return self._s[3264]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3265]! } + public var Passport_Identity_Surname: String { return self._s[3266]! } + public var Compose_TokenListPlaceholder: String { return self._s[3267]! } + public var Wallet_AccessDenied_Camera: String { return self._s[3268]! } + public var Passport_Identity_OneOfTypePassport: String { return self._s[3269]! } + public var Settings_AboutEmpty: String { return self._s[3270]! } + public var Conversation_Unmute: String { return self._s[3271]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[3273]! } + public var Wallet_Sending_Text: String { return self._s[3274]! } + public func PUSH_CONTACT_JOINED(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_1]) + } + public var Login_CodeSentCall: String { return self._s[3276]! } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3278]! } + public var ChatSettings_Appearance: String { return self._s[3279]! } + public var ClearCache_StorageUsage: String { return self._s[3280]! } + public var ChatListFolder_NameContacts: String { return self._s[3281]! } + public var Appearance_PickAccentColor: String { return self._s[3283]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3283]!, self._r[3283]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_1, _2]) } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_1]) + return formatWithArgumentRanges(self._s[3285]!, self._r[3285]!, [_1]) } - public var Notification_CallMissed: String { return self._s[3285]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3286]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3287]! } - public var Wallet_Month_GenOctober: String { return self._s[3289]! } - public var ChatAdmins_AdminLabel: String { return self._s[3290]! } - public var KeyCommand_JumpToNextChat: String { return self._s[3291]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[3293]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3294]! } - public var Month_GenJune: String { return self._s[3295]! } - public var IntentsSettings_MainAccountInfo: String { return self._s[3296]! } - public var Watch_Location_Current: String { return self._s[3297]! } - public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3298]! } - public var Conversation_TitleMute: String { return self._s[3299]! } - public var Map_PlacesInThisArea: String { return self._s[3300]! } + public var Notification_CallMissed: String { return self._s[3286]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[3287]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[3288]! } + public var Wallet_Month_GenOctober: String { return self._s[3290]! } + public var ChatAdmins_AdminLabel: String { return self._s[3291]! } + public var KeyCommand_JumpToNextChat: String { return self._s[3292]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[3294]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[3295]! } + public var Month_GenJune: String { return self._s[3296]! } + public var IntentsSettings_MainAccountInfo: String { return self._s[3297]! } + public var Watch_Location_Current: String { return self._s[3298]! } + public var Wallet_Receive_CopyInvoiceUrl: String { return self._s[3299]! } + public var Conversation_TitleMute: String { return self._s[3300]! } + public var Map_PlacesInThisArea: String { return self._s[3301]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3301]!, self._r[3301]!, [_1]) + return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_1]) } - public var GroupInfo_DeleteAndExit: String { return self._s[3302]! } + public var GroupInfo_DeleteAndExit: String { return self._s[3303]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3303]!, self._r[3303]!, [_0]) + return formatWithArgumentRanges(self._s[3304]!, self._r[3304]!, [_0]) } - public var Call_ReportPlaceholder: String { return self._s[3304]! } - public var Chat_SlowmodeSendError: String { return self._s[3305]! } - public var MaskStickerSettings_Info: String { return self._s[3306]! } - public var EditTheme_Expand_TopInfo: String { return self._s[3307]! } + public var Call_ReportPlaceholder: String { return self._s[3305]! } + public var Chat_SlowmodeSendError: String { return self._s[3306]! } + public var MaskStickerSettings_Info: String { return self._s[3307]! } + public var EditTheme_Expand_TopInfo: String { return self._s[3308]! } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3308]!, self._r[3308]!, [_0]) + return formatWithArgumentRanges(self._s[3309]!, self._r[3309]!, [_0]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[3309]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[3311]! } - public var Contacts_ShareTelegram: String { return self._s[3312]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3313]! } - public var Map_AddressOnMap: String { return self._s[3314]! } - public var Channel_ErrorAccessDenied: String { return self._s[3315]! } - public var UserInfo_ScamBotWarning: String { return self._s[3317]! } - public var Stickers_GroupChooseStickerPack: String { return self._s[3318]! } - public var Call_ConnectionErrorTitle: String { return self._s[3319]! } - public var UserInfo_NotificationsEnable: String { return self._s[3320]! } - public var ArchivedChats_IntroText1: String { return self._s[3321]! } - public var Tour_Text4: String { return self._s[3324]! } - public var WallpaperSearch_Recent: String { return self._s[3325]! } - public var GroupInfo_ScamGroupWarning: String { return self._s[3326]! } - public var PeopleNearby_MakeVisibleTitle: String { return self._s[3327]! } - public var Profile_MessageLifetime2s: String { return self._s[3329]! } - public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3330]! } - public var Notification_MessageLifetime2s: String { return self._s[3331]! } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[3310]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[3312]! } + public var Contacts_ShareTelegram: String { return self._s[3313]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[3314]! } + public var Map_AddressOnMap: String { return self._s[3315]! } + public var Channel_ErrorAccessDenied: String { return self._s[3316]! } + public var UserInfo_ScamBotWarning: String { return self._s[3318]! } + public var Stickers_GroupChooseStickerPack: String { return self._s[3319]! } + public var Call_ConnectionErrorTitle: String { return self._s[3320]! } + public var UserInfo_NotificationsEnable: String { return self._s[3321]! } + public var ArchivedChats_IntroText1: String { return self._s[3322]! } + public var Tour_Text4: String { return self._s[3325]! } + public var WallpaperSearch_Recent: String { return self._s[3326]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[3327]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3328]! } + public var Profile_MessageLifetime2s: String { return self._s[3330]! } + public var Appearance_ThemePreview_ChatList_5_Text: String { return self._s[3331]! } + public var Notification_MessageLifetime2s: String { return self._s[3332]! } public func Time_PreciseDate_m10(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3332]!, self._r[3332]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3333]!, self._r[3333]!, [_1, _2, _3]) } - public var Cache_ClearCache: String { return self._s[3333]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3334]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3335]! } + public var Cache_ClearCache: String { return self._s[3334]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3335]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[3336]! } public func Channel_AdminLog_MessageChangedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3339]!, self._r[3339]!, [_0]) + return formatWithArgumentRanges(self._s[3340]!, self._r[3340]!, [_0]) } public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3341]!, self._r[3341]!, [_0]) + return formatWithArgumentRanges(self._s[3342]!, self._r[3342]!, [_0]) } - public var LocalGroup_Text: String { return self._s[3342]! } - public var PeerInfo_PaneMembers: String { return self._s[3343]! } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3344]! } - public var SocksProxySetup_TypeSocks: String { return self._s[3345]! } - public var ChatList_UnarchiveAction: String { return self._s[3346]! } - public var AutoNightTheme_Title: String { return self._s[3347]! } - public var InstantPage_FeedbackButton: String { return self._s[3348]! } - public var Passport_FieldAddress: String { return self._s[3349]! } + public var LocalGroup_Text: String { return self._s[3343]! } + public var PeerInfo_PaneMembers: String { return self._s[3344]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[3345]! } + public var SocksProxySetup_TypeSocks: String { return self._s[3346]! } + public var ChatList_UnarchiveAction: String { return self._s[3347]! } + public var AutoNightTheme_Title: String { return self._s[3348]! } + public var InstantPage_FeedbackButton: String { return self._s[3349]! } + public var Passport_FieldAddress: String { return self._s[3350]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3350]!, self._r[3350]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3351]!, self._r[3351]!, [_1, _2]) } - public var Month_ShortMarch: String { return self._s[3351]! } + public var Month_ShortMarch: String { return self._s[3352]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3352]!, self._r[3352]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_1, _2]) } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3353]! } - public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3354]! } - public var Passport_FloodError: String { return self._s[3355]! } - public var SecretGif_Title: String { return self._s[3356]! } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3357]! } - public var ChatList_Context_UnhideArchive: String { return self._s[3358]! } - public var Passport_Language_th: String { return self._s[3360]! } - public var Passport_Address_Address: String { return self._s[3361]! } - public var Login_InvalidLastNameError: String { return self._s[3362]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3363]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[3364]! } - public var ChatList_Context_Archive: String { return self._s[3365]! } - public var SettingsSearch_FAQ: String { return self._s[3366]! } - public var ShareMenu_Send: String { return self._s[3367]! } - public var ChatState_Connecting: String { return self._s[3368]! } - public var WallpaperSearch_ColorYellow: String { return self._s[3370]! } - public var Month_GenNovember: String { return self._s[3372]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3374]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[3354]! } + public var Conversation_ShareInlineBotLocationConfirmation: String { return self._s[3355]! } + public var Passport_FloodError: String { return self._s[3356]! } + public var SecretGif_Title: String { return self._s[3357]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[3358]! } + public var ChatList_Context_UnhideArchive: String { return self._s[3359]! } + public var Passport_Language_th: String { return self._s[3361]! } + public var Passport_Address_Address: String { return self._s[3362]! } + public var Login_InvalidLastNameError: String { return self._s[3363]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3364]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[3365]! } + public var ChatList_Context_Archive: String { return self._s[3366]! } + public var SettingsSearch_FAQ: String { return self._s[3367]! } + public var ShareMenu_Send: String { return self._s[3368]! } + public var ChatState_Connecting: String { return self._s[3369]! } + public var WallpaperSearch_ColorYellow: String { return self._s[3371]! } + public var Month_GenNovember: String { return self._s[3373]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3375]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3375]!, self._r[3375]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_1, _2]) } - public var ChatListFolder_CategoryChannels: String { return self._s[3376]! } - public var Conversation_SwipeToReplyHintText: String { return self._s[3377]! } - public var Checkout_Email: String { return self._s[3378]! } - public var NotificationsSound_Tritone: String { return self._s[3379]! } - public var Paint_Marker: String { return self._s[3381]! } - public var StickerPacksSettings_ManagingHelp: String { return self._s[3383]! } - public var Wallet_ContextMenuCopy: String { return self._s[3385]! } + public var ChatListFolder_CategoryChannels: String { return self._s[3377]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3378]! } + public var Checkout_Email: String { return self._s[3379]! } + public var NotificationsSound_Tritone: String { return self._s[3380]! } + public var Paint_Marker: String { return self._s[3382]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[3384]! } + public var Wallet_ContextMenuCopy: String { return self._s[3386]! } public func Wallet_Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3387]!, self._r[3387]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1, _2, _3]) } - public var Appearance_TextSize_Automatic: String { return self._s[3388]! } - public var Stickers_Installed: String { return self._s[3390]! } + public var Appearance_TextSize_Automatic: String { return self._s[3389]! } + public var Stickers_Installed: String { return self._s[3391]! } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3391]!, self._r[3391]!, [_1]) + return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_1]) } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3392]!, self._r[3392]!, [_0]) + return formatWithArgumentRanges(self._s[3393]!, self._r[3393]!, [_0]) } - public var ChangePhoneNumberNumber_Help: String { return self._s[3393]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[3394]! } public func Checkout_LiabilityAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_1, _1, _1, _2]) + return formatWithArgumentRanges(self._s[3395]!, self._r[3395]!, [_1, _1, _1, _2]) } - public var ChatList_UndoArchiveTitle: String { return self._s[3395]! } - public var Notification_Exceptions_Add: String { return self._s[3396]! } - public var DialogList_You: String { return self._s[3397]! } - public var ChatList_PsaLabel_covid: String { return self._s[3399]! } - public var MediaPicker_Send: String { return self._s[3401]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3402]! } - public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3403]! } - public var Call_AudioRouteSpeaker: String { return self._s[3404]! } - public var Watch_UserInfo_Title: String { return self._s[3405]! } - public var VoiceOver_Chat_PollFinalResults: String { return self._s[3406]! } - public var Appearance_AccentColor: String { return self._s[3408]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3396]! } + public var Notification_Exceptions_Add: String { return self._s[3397]! } + public var DialogList_You: String { return self._s[3398]! } + public var ChatList_PsaLabel_covid: String { return self._s[3400]! } + public var MediaPicker_Send: String { return self._s[3402]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3403]! } + public var Appearance_ThemePreview_ChatList_4_Text: String { return self._s[3404]! } + public var Call_AudioRouteSpeaker: String { return self._s[3405]! } + public var Watch_UserInfo_Title: String { return self._s[3406]! } + public var VoiceOver_Chat_PollFinalResults: String { return self._s[3407]! } + public var Appearance_AccentColor: String { return self._s[3409]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3409]!, self._r[3409]!, [_0]) + return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_0]) } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3410]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[3411]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3411]!, self._r[3411]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3412]!, self._r[3412]!, [_1, _2]) } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[3412]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[3413]! } - public var Notification_CallOutgoing: String { return self._s[3414]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3415]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3416]! } - public var Call_RecordingDisabledMessage: String { return self._s[3417]! } - public var Message_Game: String { return self._s[3418]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[3419]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3420]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3421]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3422]! } - public var Date_DialogDateFormat: String { return self._s[3424]! } - public var WallpaperColors_SetCustomColor: String { return self._s[3425]! } - public var Notifications_InAppNotifications: String { return self._s[3426]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[3413]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[3414]! } + public var Notification_CallOutgoing: String { return self._s[3415]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3416]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[3417]! } + public var Call_RecordingDisabledMessage: String { return self._s[3418]! } + public var Message_Game: String { return self._s[3419]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[3420]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3421]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[3422]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[3423]! } + public var Date_DialogDateFormat: String { return self._s[3425]! } + public var WallpaperColors_SetCustomColor: String { return self._s[3426]! } + public var Notifications_InAppNotifications: String { return self._s[3427]! } public func Channel_Management_RemovedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3427]!, self._r[3427]!, [_0]) + return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_0]) } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_1, _2]) } - public var NewContact_Title: String { return self._s[3429]! } + public var NewContact_Title: String { return self._s[3430]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3430]!, self._r[3430]!, [_0]) + return formatWithArgumentRanges(self._s[3431]!, self._r[3431]!, [_0]) } - public var Stats_GroupTopPoster_Promote: String { return self._s[3431]! } - public var Conversation_ViewContactDetails: String { return self._s[3432]! } + public var Stats_GroupTopPoster_Promote: String { return self._s[3432]! } + public var Conversation_ViewContactDetails: String { return self._s[3433]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3434]!, self._r[3434]!, [_1]) + return formatWithArgumentRanges(self._s[3435]!, self._r[3435]!, [_1]) } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3435]! } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3436]! } - public var PrivacySettings_Title: String { return self._s[3437]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3440]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[3441]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[3442]! } - public var Contacts_PhoneNumber: String { return self._s[3443]! } - public var PeerInfo_ButtonMute: String { return self._s[3444]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3446]! } - public var Map_ShowPlaces: String { return self._s[3447]! } - public var ChatAdmins_Title: String { return self._s[3448]! } - public var InstantPage_Reference: String { return self._s[3450]! } - public var Wallet_Info_Updating: String { return self._s[3451]! } - public var ReportGroupLocation_Text: String { return self._s[3452]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[3436]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3437]! } + public var PrivacySettings_Title: String { return self._s[3438]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[3441]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[3442]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[3443]! } + public var Contacts_PhoneNumber: String { return self._s[3444]! } + public var PeerInfo_ButtonMute: String { return self._s[3445]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[3447]! } + public var Map_ShowPlaces: String { return self._s[3448]! } + public var ChatAdmins_Title: String { return self._s[3449]! } + public var InstantPage_Reference: String { return self._s[3451]! } + public var Wallet_Info_Updating: String { return self._s[3452]! } + public var ReportGroupLocation_Text: String { return self._s[3453]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3453]!, self._r[3453]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3454]!, self._r[3454]!, [_1, _2]) } - public var Camera_FlashOff: String { return self._s[3454]! } - public var Watch_UserInfo_Block: String { return self._s[3455]! } - public var ChatSettings_Stickers: String { return self._s[3456]! } - public var ChatSettings_DownloadInBackground: String { return self._s[3457]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3458]! } + public var Camera_FlashOff: String { return self._s[3455]! } + public var Watch_UserInfo_Block: String { return self._s[3456]! } + public var ChatSettings_Stickers: String { return self._s[3457]! } + public var ChatSettings_DownloadInBackground: String { return self._s[3458]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3459]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3459]!, self._r[3459]!, [_0]) + return formatWithArgumentRanges(self._s[3460]!, self._r[3460]!, [_0]) } - public var Settings_ViewPhoto: String { return self._s[3460]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3461]! } - public var AutoDownloadSettings_Cellular: String { return self._s[3462]! } - public var Wallet_Created_ExportErrorTitle: String { return self._s[3463]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3464]! } - public var VoiceOver_MessageContextShare: String { return self._s[3465]! } + public var Settings_ViewPhoto: String { return self._s[3461]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3462]! } + public var AutoDownloadSettings_Cellular: String { return self._s[3463]! } + public var Wallet_Created_ExportErrorTitle: String { return self._s[3464]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[3465]! } + public var VoiceOver_MessageContextShare: String { return self._s[3466]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3467]!, self._r[3467]!, [_0]) + return formatWithArgumentRanges(self._s[3468]!, self._r[3468]!, [_0]) } - public var Privacy_DeleteDrafts: String { return self._s[3468]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3469]! } + public var Privacy_DeleteDrafts: String { return self._s[3469]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[3470]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3470]!, self._r[3470]!, [_0]) + return formatWithArgumentRanges(self._s[3471]!, self._r[3471]!, [_0]) } - public var DialogList_SavedMessagesHelp: String { return self._s[3471]! } - public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3472]! } - public var DialogList_SavedMessages: String { return self._s[3473]! } - public var GroupInfo_UpgradeButton: String { return self._s[3474]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3476]! } - public var DialogList_Pin: String { return self._s[3477]! } + public var DialogList_SavedMessagesHelp: String { return self._s[3472]! } + public var Wallet_SecureStorageNotAvailable_Title: String { return self._s[3473]! } + public var DialogList_SavedMessages: String { return self._s[3474]! } + public var GroupInfo_UpgradeButton: String { return self._s[3475]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[3477]! } + public var DialogList_Pin: String { return self._s[3478]! } public func ForwardedAuthors2(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3478]!, self._r[3478]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_0, _1]) } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3479]!, self._r[3479]!, [_0]) + return formatWithArgumentRanges(self._s[3480]!, self._r[3480]!, [_0]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3480]! } - public var UserInfo_NotificationsDisable: String { return self._s[3481]! } - public var Conversation_UnarchiveDone: String { return self._s[3482]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[3483]! } - public var Paint_Outlined: String { return self._s[3484]! } - public var Activity_PlayingGame: String { return self._s[3485]! } - public var SearchImages_NoImagesFound: String { return self._s[3486]! } - public var SocksProxySetup_ProxyType: String { return self._s[3487]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3489]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[3490]! } - public var Settings_AppLanguage: String { return self._s[3491]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[3492]! } - public var Common_ChoosePhoto: String { return self._s[3493]! } - public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3494]! } - public var CallFeedback_ReasonEcho: String { return self._s[3495]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3481]! } + public var UserInfo_NotificationsDisable: String { return self._s[3482]! } + public var Conversation_UnarchiveDone: String { return self._s[3483]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[3484]! } + public var Paint_Outlined: String { return self._s[3485]! } + public var Activity_PlayingGame: String { return self._s[3486]! } + public var SearchImages_NoImagesFound: String { return self._s[3487]! } + public var SocksProxySetup_ProxyType: String { return self._s[3488]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3490]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[3491]! } + public var Settings_AppLanguage: String { return self._s[3492]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[3493]! } + public var Common_ChoosePhoto: String { return self._s[3494]! } + public var AuthSessions_AddDevice_InvalidQRCode: String { return self._s[3495]! } + public var CallFeedback_ReasonEcho: String { return self._s[3496]! } public func PUSH_PINNED_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3496]!, self._r[3496]!, [_1]) + return formatWithArgumentRanges(self._s[3497]!, self._r[3497]!, [_1]) } - public var Privacy_Calls_AlwaysAllow: String { return self._s[3497]! } - public var PollResults_Collapse: String { return self._s[3498]! } - public var Activity_UploadingVideo: String { return self._s[3499]! } - public var Conversation_WalletRequiredNotNow: String { return self._s[3500]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3501]! } - public var NetworkUsageSettings_Wifi: String { return self._s[3502]! } - public var VoiceOver_Editing_ClearText: String { return self._s[3503]! } - public var PUSH_SENDER_YOU: String { return self._s[3504]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[3505]! } - public var Checkout_PayWithTouchId: String { return self._s[3506]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3507]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[3498]! } + public var PollResults_Collapse: String { return self._s[3499]! } + public var Activity_UploadingVideo: String { return self._s[3500]! } + public var Conversation_WalletRequiredNotNow: String { return self._s[3501]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3502]! } + public var NetworkUsageSettings_Wifi: String { return self._s[3503]! } + public var VoiceOver_Editing_ClearText: String { return self._s[3504]! } + public var PUSH_SENDER_YOU: String { return self._s[3505]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[3506]! } + public var Checkout_PayWithTouchId: String { return self._s[3507]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[3508]! } public func PUSH_LOCKED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3509]!, self._r[3509]!, [_1]) + return formatWithArgumentRanges(self._s[3510]!, self._r[3510]!, [_1]) } - public var Notifications_ExceptionsNone: String { return self._s[3510]! } + public var Notifications_ExceptionsNone: String { return self._s[3511]! } public func Message_ForwardedMessageShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3511]!, self._r[3511]!, [_0]) + return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_0]) } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3512]!, self._r[3512]!, [_1]) + return formatWithArgumentRanges(self._s[3513]!, self._r[3513]!, [_1]) } - public var AuthSessions_IncompleteAttempts: String { return self._s[3514]! } - public var Passport_Address_Region: String { return self._s[3517]! } - public var ChatList_DeleteChat: String { return self._s[3518]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[3519]! } - public var PhotoEditor_TiltShift: String { return self._s[3520]! } - public var Settings_FAQ_URL: String { return self._s[3521]! } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3522]! } - public var SharedMedia_TitleLink: String { return self._s[3525]! } - public var Settings_PrivacySettings: String { return self._s[3526]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[3527]! } - public var Passport_Language_sl: String { return self._s[3528]! } - public var Settings_SetProfilePhoto: String { return self._s[3529]! } - public var Channel_About_Help: String { return self._s[3530]! } - public var Contacts_PermissionsEnable: String { return self._s[3531]! } - public var Wallet_Sending_Title: String { return self._s[3532]! } - public var PeerInfo_PaneMedia: String { return self._s[3533]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3534]! } - public var AttachmentMenu_SendAsFiles: String { return self._s[3535]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3537]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3538]! } - public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3539]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3540]! } - public var OldChannels_Title: String { return self._s[3541]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[3542]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[3544]! } - public var Map_OpenInYandexMaps: String { return self._s[3546]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3547]! } - public var VoiceOver_MessageContextReply: String { return self._s[3548]! } - public var ChatListFolder_DiscardConfirmation: String { return self._s[3550]! } - public var PhotoEditor_SaturationTool: String { return self._s[3551]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3515]! } + public var Passport_Address_Region: String { return self._s[3518]! } + public var ChatList_DeleteChat: String { return self._s[3519]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[3520]! } + public var PhotoEditor_TiltShift: String { return self._s[3521]! } + public var Settings_FAQ_URL: String { return self._s[3522]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[3523]! } + public var SharedMedia_TitleLink: String { return self._s[3526]! } + public var Settings_PrivacySettings: String { return self._s[3527]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[3528]! } + public var Passport_Language_sl: String { return self._s[3529]! } + public var Settings_SetProfilePhoto: String { return self._s[3530]! } + public var Channel_About_Help: String { return self._s[3531]! } + public var Contacts_PermissionsEnable: String { return self._s[3532]! } + public var Wallet_Sending_Title: String { return self._s[3533]! } + public var PeerInfo_PaneMedia: String { return self._s[3534]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[3535]! } + public var AttachmentMenu_SendAsFiles: String { return self._s[3536]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3538]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3539]! } + public var AutoDownloadSettings_AutodownloadVideos: String { return self._s[3540]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[3541]! } + public var OldChannels_Title: String { return self._s[3542]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[3543]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[3545]! } + public var Map_OpenInYandexMaps: String { return self._s[3547]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[3548]! } + public var VoiceOver_MessageContextReply: String { return self._s[3549]! } + public var ChatListFolder_DiscardConfirmation: String { return self._s[3551]! } + public var PhotoEditor_SaturationTool: String { return self._s[3552]! } public func PUSH_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3552]!, self._r[3552]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3553]!, self._r[3553]!, [_1, _2]) } - public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3553]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3554]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3555]! } + public var PrivacyPhoneNumberSettings_CustomHelp: String { return self._s[3554]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[3555]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[3556]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3556]!, self._r[3556]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[3557]!, self._r[3557]!, [_1, "\(_2)"]) } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3557]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3559]! } - public var SettingsSearch_Synonyms_Wallet: String { return self._s[3560]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[3558]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3560]! } + public var SettingsSearch_Synonyms_Wallet: String { return self._s[3561]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3562]!, self._r[3562]!, [_1, _2]) } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3562]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3563]! } public func PUSH_CHAT_MESSAGE_GAME(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3563]!, self._r[3563]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3564]!, self._r[3564]!, [_1, _2, _3]) } - public var WallpaperPreview_PatternTitle: String { return self._s[3564]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[3565]! } - public var Passport_PassportInformation: String { return self._s[3568]! } - public var Theme_Unsupported: String { return self._s[3569]! } - public var WatchRemote_AlertTitle: String { return self._s[3570]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3571]! } - public var ConvertToSupergroup_HelpText: String { return self._s[3573]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3565]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[3566]! } + public var Passport_PassportInformation: String { return self._s[3569]! } + public var Theme_Unsupported: String { return self._s[3570]! } + public var WatchRemote_AlertTitle: String { return self._s[3571]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[3572]! } + public var ConvertToSupergroup_HelpText: String { return self._s[3574]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3574]!, self._r[3574]!, [_0]) + return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_0]) } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3575]!, self._r[3575]!, [_1]) + return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_1]) } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3576]! } - public var Wallet_Navigation_Done: String { return self._s[3578]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3579]! } - public var AccessDenied_CameraDisabled: String { return self._s[3580]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[3577]! } + public var Wallet_Navigation_Done: String { return self._s[3579]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3580]! } + public var AccessDenied_CameraDisabled: String { return self._s[3581]! } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0]) + return formatWithArgumentRanges(self._s[3582]!, self._r[3582]!, [_0]) } - public var ClearCache_Forever: String { return self._s[3582]! } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3583]! } - public var CreatePoll_Quiz: String { return self._s[3584]! } - public var PhotoEditor_ContrastTool: String { return self._s[3587]! } + public var ClearCache_Forever: String { return self._s[3583]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[3584]! } + public var CreatePoll_Quiz: String { return self._s[3585]! } + public var PhotoEditor_ContrastTool: String { return self._s[3588]! } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3588]!, self._r[3588]!, [_1]) + return formatWithArgumentRanges(self._s[3589]!, self._r[3589]!, [_1]) } - public var DialogList_Draft: String { return self._s[3589]! } - public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3590]! } + public var DialogList_Draft: String { return self._s[3590]! } + public var Wallet_Configuration_BlockchainIdInfo: String { return self._s[3591]! } public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3591]!, self._r[3591]!, [_0]) + return formatWithArgumentRanges(self._s[3592]!, self._r[3592]!, [_0]) } - public var ChatList_PsaAlert_covid: String { return self._s[3592]! } - public var Privacy_TopPeersDelete: String { return self._s[3594]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[3595]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3596]! } - public var WebSearch_RecentSectionClear: String { return self._s[3597]! } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[3598]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3600]! } - public var PeerInfo_ButtonMore: String { return self._s[3602]! } - public var Common_Done: String { return self._s[3603]! } - public var Shortcut_SwitchAccount: String { return self._s[3604]! } - public var AuthSessions_EmptyText: String { return self._s[3605]! } - public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3606]! } - public var Conversation_ShareBotContactConfirmation: String { return self._s[3607]! } - public var Tour_Title5: String { return self._s[3609]! } - public var Wallet_Settings_Title: String { return self._s[3610]! } + public var ChatList_PsaAlert_covid: String { return self._s[3593]! } + public var Privacy_TopPeersDelete: String { return self._s[3595]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[3596]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3597]! } + public var WebSearch_RecentSectionClear: String { return self._s[3598]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[3599]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3601]! } + public var PeerInfo_ButtonMore: String { return self._s[3603]! } + public var Common_Done: String { return self._s[3604]! } + public var Shortcut_SwitchAccount: String { return self._s[3605]! } + public var AuthSessions_EmptyText: String { return self._s[3606]! } + public var Wallet_Configuration_BlockchainNameChangedTitle: String { return self._s[3607]! } + public var Conversation_ShareBotContactConfirmation: String { return self._s[3608]! } + public var Tour_Title5: String { return self._s[3610]! } + public var Wallet_Settings_Title: String { return self._s[3611]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3611]!, self._r[3611]!, [_0]) + return formatWithArgumentRanges(self._s[3612]!, self._r[3612]!, [_0]) } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3612]! } - public var Conversation_LinkDialogSave: String { return self._s[3613]! } - public var GroupInfo_ActionRestrict: String { return self._s[3614]! } - public var Checkout_Title: String { return self._s[3616]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3618]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[3620]! } - public var Notification_RenamedGroup: String { return self._s[3621]! } - public var PeopleNearby_Groups: String { return self._s[3622]! } - public var Checkout_PayWithFaceId: String { return self._s[3623]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3624]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3626]! } - public var Checkout_WebConfirmation_Title: String { return self._s[3627]! } - public var Notifications_MessageNotificationsAlert: String { return self._s[3628]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[3613]! } + public var Conversation_LinkDialogSave: String { return self._s[3614]! } + public var GroupInfo_ActionRestrict: String { return self._s[3615]! } + public var Checkout_Title: String { return self._s[3617]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[3619]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[3621]! } + public var Notification_RenamedGroup: String { return self._s[3622]! } + public var PeopleNearby_Groups: String { return self._s[3623]! } + public var Checkout_PayWithFaceId: String { return self._s[3624]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3625]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[3627]! } + public var Checkout_WebConfirmation_Title: String { return self._s[3628]! } + public var Notifications_MessageNotificationsAlert: String { return self._s[3629]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3629]!, self._r[3629]!, [_0]) + return formatWithArgumentRanges(self._s[3630]!, self._r[3630]!, [_0]) } - public var Stats_GroupGrowthTitle: String { return self._s[3630]! } - public var Profile_AddToExisting: String { return self._s[3632]! } + public var Stats_GroupGrowthTitle: String { return self._s[3631]! } + public var Profile_AddToExisting: String { return self._s[3633]! } public func Profile_CreateEncryptedChatOutdatedError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3633]!, self._r[3633]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3634]!, self._r[3634]!, [_0, _1]) } - public var Cache_Files: String { return self._s[3635]! } - public var Permissions_PrivacyPolicy: String { return self._s[3637]! } - public var SocksProxySetup_ConnectAndSave: String { return self._s[3638]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3639]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[3641]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3643]! } - public var Calls_NoCallsPlaceholder: String { return self._s[3644]! } + public var Cache_Files: String { return self._s[3636]! } + public var Permissions_PrivacyPolicy: String { return self._s[3638]! } + public var SocksProxySetup_ConnectAndSave: String { return self._s[3639]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[3640]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[3642]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3644]! } + public var Calls_NoCallsPlaceholder: String { return self._s[3645]! } public func Wallet_Receive_ShareInvoiceUrlInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3645]!, self._r[3645]!, [_0]) + return formatWithArgumentRanges(self._s[3646]!, self._r[3646]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3646]! } - public var VoiceOver_AttachMedia: String { return self._s[3649]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3650]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[3647]! } + public var VoiceOver_AttachMedia: String { return self._s[3650]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[3651]! } public func PUSH_CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3651]!, self._r[3651]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3652]!, self._r[3652]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3652]! } - public var Conversation_SetReminder_Title: String { return self._s[3653]! } - public var Passport_FieldAddressHelp: String { return self._s[3654]! } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3655]! } - public var PUSH_REMINDER_TITLE: String { return self._s[3656]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[3653]! } + public var Conversation_SetReminder_Title: String { return self._s[3654]! } + public var Passport_FieldAddressHelp: String { return self._s[3655]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3656]! } + public var PUSH_REMINDER_TITLE: String { return self._s[3657]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3657]!, self._r[3657]!, [_0]) + return formatWithArgumentRanges(self._s[3658]!, self._r[3658]!, [_0]) } - public var Channel_AdminLog_EmptyTitle: String { return self._s[3658]! } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[3659]! } - public var Login_UnknownError: String { return self._s[3660]! } - public var Group_UpgradeNoticeText2: String { return self._s[3663]! } - public var Watch_Compose_AddContact: String { return self._s[3664]! } - public var ClearCache_StorageServiceFiles: String { return self._s[3665]! } - public var Web_Error: String { return self._s[3666]! } - public var Paint_Neon: String { return self._s[3667]! } - public var Gif_Search: String { return self._s[3668]! } - public var Profile_MessageLifetime1h: String { return self._s[3669]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3670]! } - public var Channel_Username_CheckingUsername: String { return self._s[3671]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[3672]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[3673]! } - public var Channel_AboutItem: String { return self._s[3674]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3677]! } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[3678]! } - public var GroupInfo_SharedMedia: String { return self._s[3679]! } + public var Channel_AdminLog_EmptyTitle: String { return self._s[3659]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[3660]! } + public var Login_UnknownError: String { return self._s[3661]! } + public var Group_UpgradeNoticeText2: String { return self._s[3664]! } + public var Watch_Compose_AddContact: String { return self._s[3665]! } + public var ClearCache_StorageServiceFiles: String { return self._s[3666]! } + public var Web_Error: String { return self._s[3667]! } + public var Paint_Neon: String { return self._s[3668]! } + public var Gif_Search: String { return self._s[3669]! } + public var Profile_MessageLifetime1h: String { return self._s[3670]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[3671]! } + public var Channel_Username_CheckingUsername: String { return self._s[3672]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[3673]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[3674]! } + public var Channel_AboutItem: String { return self._s[3675]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[3678]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[3679]! } + public var GroupInfo_SharedMedia: String { return self._s[3680]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3680]!, self._r[3680]!, [_1]) + return formatWithArgumentRanges(self._s[3681]!, self._r[3681]!, [_1]) } - public var Call_PhoneCallInProgressMessage: String { return self._s[3681]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3682]! } public func PUSH_CHANNEL_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3682]!, self._r[3682]!, [_1]) + return formatWithArgumentRanges(self._s[3683]!, self._r[3683]!, [_1]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3683]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3684]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3685]! } - public var CreatePoll_AddOption: String { return self._s[3686]! } - public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3687]! } - public var Group_UpgradeNoticeHeader: String { return self._s[3688]! } - public var Channel_Management_AddModerator: String { return self._s[3689]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[3690]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[3691]! } - public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3692]! } - public var Theme_Colors_Background: String { return self._s[3693]! } - public var NotificationsSound_Hello: String { return self._s[3696]! } - public var SocksProxySetup_SavedProxies: String { return self._s[3698]! } - public var Channel_Stickers_Placeholder: String { return self._s[3700]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3684]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[3685]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3686]! } + public var CreatePoll_AddOption: String { return self._s[3687]! } + public var GroupInfo_Permissions_SearchPlaceholder: String { return self._s[3688]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3689]! } + public var Channel_Management_AddModerator: String { return self._s[3690]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[3691]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[3692]! } + public var Wallet_Info_RefreshErrorNetworkText: String { return self._s[3693]! } + public var Theme_Colors_Background: String { return self._s[3694]! } + public var NotificationsSound_Hello: String { return self._s[3697]! } + public var SocksProxySetup_SavedProxies: String { return self._s[3699]! } + public var Channel_Stickers_Placeholder: String { return self._s[3701]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3701]!, self._r[3701]!, [_0]) + return formatWithArgumentRanges(self._s[3702]!, self._r[3702]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3702]! } - public var Channel_Management_AddModeratorHelp: String { return self._s[3703]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3704]! } - public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3705]! } - public var AutoDownloadSettings_Channels: String { return self._s[3706]! } - public var Passport_Language_mn: String { return self._s[3707]! } - public var Settings_ChatFolders: String { return self._s[3708]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3703]! } + public var Channel_Management_AddModeratorHelp: String { return self._s[3704]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3705]! } + public var ChangePhoneNumberCode_RequestingACall: String { return self._s[3706]! } + public var AutoDownloadSettings_Channels: String { return self._s[3707]! } + public var Passport_Language_mn: String { return self._s[3708]! } + public var Settings_ChatFolders: String { return self._s[3709]! } public func ChatList_AddedToFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3709]!, self._r[3709]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3710]!, self._r[3710]!, [_1, _2]) } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[3712]! } - public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3713]! } - public var Passport_Language_ja: String { return self._s[3715]! } - public var Settings_About_Title: String { return self._s[3716]! } - public var Settings_NotificationsAndSounds: String { return self._s[3717]! } - public var ChannelInfo_DeleteGroup: String { return self._s[3718]! } - public var Settings_BlockedUsers: String { return self._s[3719]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[3713]! } + public var GroupInfo_Permissions_SlowmodeValue_Off: String { return self._s[3714]! } + public var Passport_Language_ja: String { return self._s[3716]! } + public var Settings_About_Title: String { return self._s[3717]! } + public var Settings_NotificationsAndSounds: String { return self._s[3718]! } + public var ChannelInfo_DeleteGroup: String { return self._s[3719]! } + public var Settings_BlockedUsers: String { return self._s[3720]! } public func Time_MonthOfYear_m4(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3720]!, self._r[3720]!, [_0]) + return formatWithArgumentRanges(self._s[3721]!, self._r[3721]!, [_0]) } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3721]! } - public var Wallet_Weekday_Today: String { return self._s[3722]! } - public var ChatListFolderSettings_AddRecommended: String { return self._s[3723]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3724]! } - public var Widget_ApplicationLocked: String { return self._s[3725]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3726]! } - public var Channel_Username_Title: String { return self._s[3727]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[3722]! } + public var Wallet_Weekday_Today: String { return self._s[3723]! } + public var ChatListFolderSettings_AddRecommended: String { return self._s[3724]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3725]! } + public var Widget_ApplicationLocked: String { return self._s[3726]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3727]! } + public var Channel_Username_Title: String { return self._s[3728]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3728]!, self._r[3728]!, [_0]) + return formatWithArgumentRanges(self._s[3729]!, self._r[3729]!, [_0]) } - public var AttachmentMenu_File: String { return self._s[3730]! } - public var AppleWatch_Title: String { return self._s[3731]! } - public var Activity_RecordingVideoMessage: String { return self._s[3732]! } + public var AttachmentMenu_File: String { return self._s[3731]! } + public var AppleWatch_Title: String { return self._s[3732]! } + public var Activity_RecordingVideoMessage: String { return self._s[3733]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3733]!, self._r[3733]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3734]!, self._r[3734]!, [_1, _2]) } - public var Theme_Colors_Messages: String { return self._s[3734]! } - public var Weekday_Saturday: String { return self._s[3735]! } - public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3736]! } - public var Conversation_Timer_Send: String { return self._s[3737]! } - public var Settings_CancelUpload: String { return self._s[3738]! } - public var Profile_CreateEncryptedChatError: String { return self._s[3739]! } - public var Common_Next: String { return self._s[3741]! } - public var Channel_Stickers_YourStickers: String { return self._s[3743]! } - public var Message_Theme: String { return self._s[3744]! } - public var Call_AudioRouteHeadphones: String { return self._s[3745]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3747]! } - public var Watch_Contacts_NoResults: String { return self._s[3749]! } - public var PhotoEditor_TintTool: String { return self._s[3752]! } - public var LoginPassword_ResetAccount: String { return self._s[3754]! } - public var Settings_SavedMessages: String { return self._s[3755]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3756]! } - public var Bot_GenericSupportStatus: String { return self._s[3757]! } - public var StickerPack_Add: String { return self._s[3758]! } - public var Checkout_TotalAmount: String { return self._s[3759]! } - public var Your_cards_number_is_invalid: String { return self._s[3760]! } - public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3761]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[3762]! } + public var Theme_Colors_Messages: String { return self._s[3735]! } + public var Weekday_Saturday: String { return self._s[3736]! } + public var WallpaperPreview_SwipeColorsTopText: String { return self._s[3737]! } + public var Conversation_Timer_Send: String { return self._s[3738]! } + public var Settings_CancelUpload: String { return self._s[3739]! } + public var Profile_CreateEncryptedChatError: String { return self._s[3740]! } + public var Common_Next: String { return self._s[3742]! } + public var Channel_Stickers_YourStickers: String { return self._s[3744]! } + public var Message_Theme: String { return self._s[3745]! } + public var Call_AudioRouteHeadphones: String { return self._s[3746]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3748]! } + public var Watch_Contacts_NoResults: String { return self._s[3750]! } + public var PhotoEditor_TintTool: String { return self._s[3753]! } + public var LoginPassword_ResetAccount: String { return self._s[3755]! } + public var Settings_SavedMessages: String { return self._s[3756]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[3757]! } + public var Bot_GenericSupportStatus: String { return self._s[3758]! } + public var StickerPack_Add: String { return self._s[3759]! } + public var Checkout_TotalAmount: String { return self._s[3760]! } + public var Your_cards_number_is_invalid: String { return self._s[3761]! } + public var SettingsSearch_Synonyms_Appearance_AutoNightTheme: String { return self._s[3762]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[3763]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3763]!, self._r[3763]!, [_0]) + return formatWithArgumentRanges(self._s[3764]!, self._r[3764]!, [_0]) } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3764]!, self._r[3764]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3765]!, self._r[3765]!, [_1, _2]) } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3765]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[3766]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3767]!, self._r[3767]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3768]!, self._r[3768]!, [_1, _2]) } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3768]!, self._r[3768]!, [_0]) + return formatWithArgumentRanges(self._s[3769]!, self._r[3769]!, [_0]) } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3769]! } - public var StickerPack_Share: String { return self._s[3770]! } - public var Passport_DeleteAddress: String { return self._s[3771]! } - public var Settings_Passport: String { return self._s[3772]! } - public var SharedMedia_EmptyFilesText: String { return self._s[3773]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[3774]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3775]! } - public var Contacts_PermissionsText: String { return self._s[3776]! } - public var Group_Setup_HistoryVisible: String { return self._s[3777]! } - public var Wallet_Month_ShortDecember: String { return self._s[3779]! } - public var PrivacySettings_AutoArchiveTitle: String { return self._s[3781]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3782]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[3783]! } - public var SocksProxySetup_Title: String { return self._s[3784]! } - public var Notification_Mute1h: String { return self._s[3785]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3770]! } + public var StickerPack_Share: String { return self._s[3771]! } + public var Passport_DeleteAddress: String { return self._s[3772]! } + public var Settings_Passport: String { return self._s[3773]! } + public var SharedMedia_EmptyFilesText: String { return self._s[3774]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[3775]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[3776]! } + public var Contacts_PermissionsText: String { return self._s[3777]! } + public var Group_Setup_HistoryVisible: String { return self._s[3778]! } + public var Wallet_Month_ShortDecember: String { return self._s[3780]! } + public var PrivacySettings_AutoArchiveTitle: String { return self._s[3782]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3783]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[3784]! } + public var SocksProxySetup_Title: String { return self._s[3785]! } + public var Notification_Mute1h: String { return self._s[3786]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3786]!, self._r[3786]!, [_0]) + return formatWithArgumentRanges(self._s[3787]!, self._r[3787]!, [_0]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3787]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOff: String { return self._s[3788]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3788]!, self._r[3788]!, [_1]) + return formatWithArgumentRanges(self._s[3789]!, self._r[3789]!, [_1]) } - public var FastTwoStepSetup_PasswordSection: String { return self._s[3789]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3792]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3794]! } - public var DialogList_NoMessagesText: String { return self._s[3795]! } - public var Privacy_ContactsResetConfirmation: String { return self._s[3796]! } - public var Privacy_Calls_P2PHelp: String { return self._s[3797]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3799]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[3800]! } - public var Common_TakePhotoOrVideo: String { return self._s[3801]! } - public var Wallet_Words_Text: String { return self._s[3802]! } - public var Call_StatusBusy: String { return self._s[3803]! } - public var Conversation_PinnedMessage: String { return self._s[3804]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3805]! } - public var ChatList_EmptyChatListNewMessage: String { return self._s[3806]! } - public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3807]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3808]! } - public var Undo_ChatCleared: String { return self._s[3809]! } - public var CreatePoll_Explanation: String { return self._s[3810]! } - public var AppleWatch_ReplyPresets: String { return self._s[3811]! } - public var Passport_DiscardMessageDescription: String { return self._s[3813]! } - public var Login_NetworkError: String { return self._s[3814]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[3790]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[3793]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[3795]! } + public var DialogList_NoMessagesText: String { return self._s[3796]! } + public var Privacy_ContactsResetConfirmation: String { return self._s[3797]! } + public var Privacy_Calls_P2PHelp: String { return self._s[3798]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[3800]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[3801]! } + public var Common_TakePhotoOrVideo: String { return self._s[3802]! } + public var Wallet_Words_Text: String { return self._s[3803]! } + public var Call_StatusBusy: String { return self._s[3804]! } + public var Conversation_PinnedMessage: String { return self._s[3805]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[3806]! } + public var ChatList_EmptyChatListNewMessage: String { return self._s[3807]! } + public var Wallet_Configuration_BlockchainNameChangedProceed: String { return self._s[3808]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[3809]! } + public var Undo_ChatCleared: String { return self._s[3810]! } + public var CreatePoll_Explanation: String { return self._s[3811]! } + public var AppleWatch_ReplyPresets: String { return self._s[3812]! } + public var Passport_DiscardMessageDescription: String { return self._s[3814]! } + public var Login_NetworkError: String { return self._s[3815]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3815]!, self._r[3815]!, [_0]) - } - public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3816]!, self._r[3816]!, [_0]) } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3817]! } - public var Wallet_WordCheck_ViewWords: String { return self._s[3819]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3820]! } + public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3817]!, self._r[3817]!, [_0]) + } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3818]! } + public var Wallet_WordCheck_ViewWords: String { return self._s[3820]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[3821]! } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3822]!, self._r[3822]!, [_0]) + return formatWithArgumentRanges(self._s[3823]!, self._r[3823]!, [_0]) } - public var Call_ConnectionErrorMessage: String { return self._s[3823]! } - public var VoiceOver_Chat_Music: String { return self._s[3824]! } - public var ChatListFolder_CategoryContacts: String { return self._s[3825]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3826]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[3828]! } - public var ConversationMedia_Title: String { return self._s[3829]! } - public var EncryptionKey_Title: String { return self._s[3831]! } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3832]! } - public var Notification_Exceptions_AddException: String { return self._s[3833]! } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3834]! } - public var Profile_MessageLifetime1m: String { return self._s[3835]! } + public var Call_ConnectionErrorMessage: String { return self._s[3824]! } + public var VoiceOver_Chat_Music: String { return self._s[3825]! } + public var ChatListFolder_CategoryContacts: String { return self._s[3826]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsSound: String { return self._s[3827]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[3829]! } + public var ConversationMedia_Title: String { return self._s[3830]! } + public var EncryptionKey_Title: String { return self._s[3832]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[3833]! } + public var Notification_Exceptions_AddException: String { return self._s[3834]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[3835]! } + public var Profile_MessageLifetime1m: String { return self._s[3836]! } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3836]!, self._r[3836]!, [_1]) + return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_1]) } - public var Month_GenMay: String { return self._s[3837]! } + public var Month_GenMay: String { return self._s[3838]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3838]!, self._r[3838]!, [_0]) + return formatWithArgumentRanges(self._s[3839]!, self._r[3839]!, [_0]) } - public var PeopleNearby_Users: String { return self._s[3839]! } - public var Wallet_Send_AddressInfo: String { return self._s[3840]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3841]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[3842]! } + public var PeopleNearby_Users: String { return self._s[3840]! } + public var Wallet_Send_AddressInfo: String { return self._s[3841]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[3842]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[3843]! } public func Wallet_Updated_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3844]!, self._r[3844]!, [_0]) + return formatWithArgumentRanges(self._s[3845]!, self._r[3845]!, [_0]) } - public var Stats_LoadingTitle: String { return self._s[3845]! } - public var Conversation_EmptyPlaceholder: String { return self._s[3846]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[3847]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[3848]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3849]! } - public var Camera_TapAndHoldForVideo: String { return self._s[3850]! } - public var Channel_JoinChannel: String { return self._s[3853]! } - public var Appearance_Animations: String { return self._s[3856]! } + public var Stats_LoadingTitle: String { return self._s[3846]! } + public var Conversation_EmptyPlaceholder: String { return self._s[3847]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[3848]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[3849]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[3850]! } + public var Camera_TapAndHoldForVideo: String { return self._s[3851]! } + public var Channel_JoinChannel: String { return self._s[3854]! } + public var Appearance_Animations: String { return self._s[3857]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3857]!, self._r[3857]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3858]!, self._r[3858]!, [_1, _2]) } - public var Stickers_GroupStickers: String { return self._s[3859]! } - public var Appearance_ShareTheme: String { return self._s[3860]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3861]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[3865]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[3866]! } - public var Passport_Address_Street: String { return self._s[3867]! } - public var Conversation_AddContact: String { return self._s[3868]! } - public var Login_PhonePlaceholder: String { return self._s[3869]! } - public var Channel_Members_InviteLink: String { return self._s[3871]! } - public var Bot_Stop: String { return self._s[3872]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3874]! } - public var Notification_PassportValueAddress: String { return self._s[3875]! } - public var Month_ShortJuly: String { return self._s[3876]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3877]! } - public var Channel_AdminLog_BanSendMedia: String { return self._s[3878]! } - public var Passport_Identity_ReverseSide: String { return self._s[3879]! } - public var Watch_Stickers_Recents: String { return self._s[3883]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3885]! } - public var Map_SendThisLocation: String { return self._s[3886]! } + public var Stickers_GroupStickers: String { return self._s[3860]! } + public var Appearance_ShareTheme: String { return self._s[3861]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[3862]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[3866]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[3867]! } + public var Passport_Address_Street: String { return self._s[3868]! } + public var Conversation_AddContact: String { return self._s[3869]! } + public var Login_PhonePlaceholder: String { return self._s[3870]! } + public var Channel_Members_InviteLink: String { return self._s[3872]! } + public var Bot_Stop: String { return self._s[3873]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[3875]! } + public var Notification_PassportValueAddress: String { return self._s[3876]! } + public var Month_ShortJuly: String { return self._s[3877]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[3878]! } + public var Channel_AdminLog_BanSendMedia: String { return self._s[3879]! } + public var Passport_Identity_ReverseSide: String { return self._s[3880]! } + public var Watch_Stickers_Recents: String { return self._s[3884]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[3886]! } + public var Map_SendThisLocation: String { return self._s[3887]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3887]!, self._r[3887]!, [_0]) - } - public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3888]!, self._r[3888]!, [_0]) } - public var ConvertToSupergroup_Note: String { return self._s[3889]! } - public var Wallet_Intro_NotNow: String { return self._s[3890]! } - public var Stats_GroupMembers: String { return self._s[3891]! } + public func InviteText_SingleContact(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3889]!, self._r[3889]!, [_0]) + } + public var ConvertToSupergroup_Note: String { return self._s[3890]! } + public var Wallet_Intro_NotNow: String { return self._s[3891]! } + public var Stats_GroupMembers: String { return self._s[3892]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3892]!, self._r[3892]!, [_0]) + return formatWithArgumentRanges(self._s[3893]!, self._r[3893]!, [_0]) } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3893]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[3894]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3894]!, self._r[3894]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3895]!, self._r[3895]!, [_0, _1]) } - public var Login_CallRequestState3: String { return self._s[3896]! } - public var Wallpaper_SearchShort: String { return self._s[3897]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3899]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3900]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[3901]! } + public var Login_CallRequestState3: String { return self._s[3897]! } + public var Wallpaper_SearchShort: String { return self._s[3898]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[3900]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[3901]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[3902]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3902]!, self._r[3902]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_1, _2]) } - public var Channel_AdminLogFilter_Title: String { return self._s[3903]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3905]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3908]! } + public var Channel_AdminLogFilter_Title: String { return self._s[3904]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[3906]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3909]! } public func FileSize_B(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3909]!, self._r[3909]!, [_0]) + return formatWithArgumentRanges(self._s[3910]!, self._r[3910]!, [_0]) } - public var Passport_CorrectErrors: String { return self._s[3910]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3911]! } + public var Passport_CorrectErrors: String { return self._s[3911]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[3912]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3912]!, self._r[3912]!, [_0]) + return formatWithArgumentRanges(self._s[3913]!, self._r[3913]!, [_0]) } - public var Map_SendMyCurrentLocation: String { return self._s[3913]! } - public var Channel_DiscussionGroup: String { return self._s[3915]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3916]! } + public var Map_SendMyCurrentLocation: String { return self._s[3914]! } + public var Channel_DiscussionGroup: String { return self._s[3916]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3917]! } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3917]!, self._r[3917]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3918]!, self._r[3918]!, [_1, _2]) } - public var SharedMedia_SearchNoResults: String { return self._s[3918]! } - public var Permissions_NotificationsText_v0: String { return self._s[3919]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3920]! } - public var Appearance_AppIcon: String { return self._s[3921]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3922]! } - public var LoginPassword_FloodError: String { return self._s[3923]! } - public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3925]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[3926]! } + public var SharedMedia_SearchNoResults: String { return self._s[3919]! } + public var Permissions_NotificationsText_v0: String { return self._s[3920]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[3921]! } + public var Appearance_AppIcon: String { return self._s[3922]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[3923]! } + public var LoginPassword_FloodError: String { return self._s[3924]! } + public var Wallet_Send_OwnAddressAlertProceed: String { return self._s[3926]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[3927]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3927]!, self._r[3927]!, [_0]) + return formatWithArgumentRanges(self._s[3928]!, self._r[3928]!, [_0]) } - public var Passport_Language_bn: String { return self._s[3928]! } + public var Passport_Language_bn: String { return self._s[3929]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3929]!, self._r[3929]!, [_0]) + return formatWithArgumentRanges(self._s[3930]!, self._r[3930]!, [_0]) } - public var ChatList_Context_Pin: String { return self._s[3930]! } + public var ChatList_Context_Pin: String { return self._s[3931]! } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3931]!, self._r[3931]!, [_0]) - } - public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3932]!, self._r[3932]!, [_0]) } - public var Wallet_Navigation_Close: String { return self._s[3933]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3937]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3939]! } - public var Wallet_Month_GenDecember: String { return self._s[3940]! } - public var Contacts_PermissionsAllow: String { return self._s[3941]! } - public var ReportPeer_ReasonCopyright: String { return self._s[3942]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3943]! } - public var WallpaperPreview_Pattern: String { return self._s[3944]! } - public var Paint_Duplicate: String { return self._s[3945]! } - public var Passport_Address_Country: String { return self._s[3946]! } - public var Notification_RenamedChannel: String { return self._s[3948]! } - public var DialogList_UnknownPinLimitError: String { return self._s[3949]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3950]! } - public var ChatList_Context_Unmute: String { return self._s[3951]! } - public var KeyCommand_SearchInChat: String { return self._s[3952]! } - public var Group_MessagePhotoUpdated: String { return self._s[3953]! } - public var Channel_BanUser_PermissionSendMedia: String { return self._s[3954]! } - public var Conversation_ContextMenuBan: String { return self._s[3955]! } - public var TwoStepAuth_EmailSent: String { return self._s[3956]! } - public var Settings_SetProfilePhotoOrVideo: String { return self._s[3957]! } - public var MessagePoll_NoVotes: String { return self._s[3958]! } - public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3959]! } - public var Passport_Language_is: String { return self._s[3961]! } - public var PeopleNearby_UsersEmpty: String { return self._s[3963]! } - public var Tour_Text5: String { return self._s[3964]! } + public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3933]!, self._r[3933]!, [_0]) + } + public var Wallet_Navigation_Close: String { return self._s[3934]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3938]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3940]! } + public var Wallet_Month_GenDecember: String { return self._s[3941]! } + public var Contacts_PermissionsAllow: String { return self._s[3942]! } + public var ReportPeer_ReasonCopyright: String { return self._s[3943]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[3944]! } + public var WallpaperPreview_Pattern: String { return self._s[3945]! } + public var Paint_Duplicate: String { return self._s[3946]! } + public var Passport_Address_Country: String { return self._s[3947]! } + public var Notification_RenamedChannel: String { return self._s[3949]! } + public var DialogList_UnknownPinLimitError: String { return self._s[3950]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3951]! } + public var ChatList_Context_Unmute: String { return self._s[3952]! } + public var KeyCommand_SearchInChat: String { return self._s[3953]! } + public var Group_MessagePhotoUpdated: String { return self._s[3954]! } + public var Channel_BanUser_PermissionSendMedia: String { return self._s[3955]! } + public var Conversation_ContextMenuBan: String { return self._s[3956]! } + public var TwoStepAuth_EmailSent: String { return self._s[3957]! } + public var Settings_SetProfilePhotoOrVideo: String { return self._s[3958]! } + public var MessagePoll_NoVotes: String { return self._s[3959]! } + public var Wallet_Send_ErrorNotEnoughFundsTitle: String { return self._s[3960]! } + public var Passport_Language_is: String { return self._s[3962]! } + public var PeopleNearby_UsersEmpty: String { return self._s[3964]! } + public var Tour_Text5: String { return self._s[3965]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3967]!, self._r[3967]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3968]!, self._r[3968]!, [_1, _2]) } - public var Undo_SecretChatDeleted: String { return self._s[3968]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[3969]! } + public var Undo_SecretChatDeleted: String { return self._s[3969]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[3970]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3970]!, self._r[3970]!, [_0]) + return formatWithArgumentRanges(self._s[3971]!, self._r[3971]!, [_0]) } - public var Forward_ErrorDisabledForChat: String { return self._s[3971]! } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3973]! } - public var Paint_Edit: String { return self._s[3975]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[3977]! } - public var Undo_DeletedGroup: String { return self._s[3979]! } - public var LoginPassword_ForgotPassword: String { return self._s[3980]! } - public var Wallet_WordImport_IncorrectTitle: String { return self._s[3981]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[3982]! } + public var Forward_ErrorDisabledForChat: String { return self._s[3972]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3974]! } + public var Paint_Edit: String { return self._s[3976]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[3978]! } + public var Undo_DeletedGroup: String { return self._s[3980]! } + public var LoginPassword_ForgotPassword: String { return self._s[3981]! } + public var Wallet_WordImport_IncorrectTitle: String { return self._s[3982]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[3983]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3983]!, self._r[3983]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3984]!, self._r[3984]!, [_0, _1]) } - public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3984]! } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3985]! } - public var Conversation_ContextMenuMention: String { return self._s[3986]! } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3987]! } - public var Conversation_PinMessageAlertGroup: String { return self._s[3988]! } - public var Passport_Language_uz: String { return self._s[3989]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3990]! } - public var Channel_MessageVideoUpdated: String { return self._s[3992]! } - public var Map_StopLiveLocation: String { return self._s[3993]! } - public var VoiceOver_MessageContextSend: String { return self._s[3995]! } - public var PasscodeSettings_Help: String { return self._s[3996]! } - public var NotificationsSound_Input: String { return self._s[3997]! } - public var ProfilePhoto_MainVideo: String { return self._s[3999]! } - public var Share_Title: String { return self._s[4001]! } - public var LogoutOptions_Title: String { return self._s[4002]! } - public var Wallet_Send_AddressText: String { return self._s[4003]! } - public var Login_TermsOfServiceAgree: String { return self._s[4004]! } - public var Compose_NewEncryptedChatTitle: String { return self._s[4005]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[4006]! } - public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[4007]! } - public var EnterPasscode_EnterTitle: String { return self._s[4008]! } + public var AppWallet_TransactionInfo_FeeInfoURL: String { return self._s[3985]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[3986]! } + public var Conversation_ContextMenuMention: String { return self._s[3987]! } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3988]! } + public var Conversation_PinMessageAlertGroup: String { return self._s[3989]! } + public var Passport_Language_uz: String { return self._s[3990]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[3991]! } + public var Channel_MessageVideoUpdated: String { return self._s[3993]! } + public var Map_StopLiveLocation: String { return self._s[3994]! } + public var VoiceOver_MessageContextSend: String { return self._s[3996]! } + public var PasscodeSettings_Help: String { return self._s[3997]! } + public var NotificationsSound_Input: String { return self._s[3998]! } + public var ProfilePhoto_MainVideo: String { return self._s[4000]! } + public var Share_Title: String { return self._s[4002]! } + public var LogoutOptions_Title: String { return self._s[4003]! } + public var Wallet_Send_AddressText: String { return self._s[4004]! } + public var Login_TermsOfServiceAgree: String { return self._s[4005]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[4006]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[4007]! } + public var Channel_EditAdmin_PermissionEditMessages: String { return self._s[4008]! } + public var EnterPasscode_EnterTitle: String { return self._s[4009]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4009]!, self._r[4009]!, [_0]) + return formatWithArgumentRanges(self._s[4010]!, self._r[4010]!, [_0]) } - public var Settings_CopyPhoneNumber: String { return self._s[4010]! } - public var Conversation_AddToContacts: String { return self._s[4011]! } + public var Settings_CopyPhoneNumber: String { return self._s[4011]! } + public var Conversation_AddToContacts: String { return self._s[4012]! } public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4012]!, self._r[4012]!, [_0]) + return formatWithArgumentRanges(self._s[4013]!, self._r[4013]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[4013]! } + public var NotificationsSound_Keys: String { return self._s[4014]! } public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4014]!, self._r[4014]!, [_0]) + return formatWithArgumentRanges(self._s[4015]!, self._r[4015]!, [_0]) } - public var Notification_MessageLifetime1w: String { return self._s[4015]! } - public var Message_Video: String { return self._s[4016]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[4017]! } + public var Notification_MessageLifetime1w: String { return self._s[4016]! } + public var Message_Video: String { return self._s[4017]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[4018]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4018]!, self._r[4018]!, [_1]) + return formatWithArgumentRanges(self._s[4019]!, self._r[4019]!, [_1]) } - public var Wallet_Receive_AmountInfo: String { return self._s[4021]! } - public var Stats_Overview: String { return self._s[4022]! } + public var Wallet_Receive_AmountInfo: String { return self._s[4022]! } + public var Stats_Overview: String { return self._s[4023]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4023]!, self._r[4023]!, [_0]) - } - public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4024]!, self._r[4024]!, [_0]) } - public var ChatListFolder_ExcludeChatsTitle: String { return self._s[4025]! } - public var Passport_Language_mk: String { return self._s[4026]! } - public var ChatListFolder_CategoryNonContacts: String { return self._s[4027]! } - public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4028]!, self._r[4028]!, [_1, _2, _3]) + public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4025]!, self._r[4025]!, [_0]) } - public var CreatePoll_CancelConfirmation: String { return self._s[4029]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[4030]! } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[4032]! } - public var PrivacyPolicy_Decline: String { return self._s[4033]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[4034]! } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[4035]! } - public var AuthSessions_AddDeviceIntro_Action: String { return self._s[4036]! } - public var Permissions_SiriAllow_v0: String { return self._s[4038]! } - public var Wallet_Month_ShortAugust: String { return self._s[4039]! } - public var Appearance_ThemeCarouselNight: String { return self._s[4040]! } + public var ChatListFolder_ExcludeChatsTitle: String { return self._s[4026]! } + public var Passport_Language_mk: String { return self._s[4027]! } + public var ChatListFolder_CategoryNonContacts: String { return self._s[4028]! } + public func Wallet_Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4029]!, self._r[4029]!, [_1, _2, _3]) + } + public var CreatePoll_CancelConfirmation: String { return self._s[4030]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[4031]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[4033]! } + public var PrivacyPolicy_Decline: String { return self._s[4034]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[4035]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[4036]! } + public var AuthSessions_AddDeviceIntro_Action: String { return self._s[4037]! } + public var Permissions_SiriAllow_v0: String { return self._s[4039]! } + public var Wallet_Month_ShortAugust: String { return self._s[4040]! } + public var Appearance_ThemeCarouselNight: String { return self._s[4041]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4041]!, self._r[4041]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4042]!, self._r[4042]!, [_1, "\(_2)"]) } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4042]!, self._r[4042]!, [_0]) + return formatWithArgumentRanges(self._s[4043]!, self._r[4043]!, [_0]) } - public var Paint_Regular: String { return self._s[4043]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[4044]! } - public var SocksProxySetup_ShareLink: String { return self._s[4045]! } - public var Wallet_Qr_Title: String { return self._s[4046]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[4047]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[4049]! } - public var Wallet_Settings_Configuration: String { return self._s[4050]! } - public var GroupInfo_InviteByLink: String { return self._s[4051]! } - public var MessageTimer_Custom: String { return self._s[4052]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[4053]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[4054]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[4056]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[4057]! } - public var VoiceOver_Chat_Selected: String { return self._s[4058]! } - public var Paint_Pen: String { return self._s[4059]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4060]! } - public var Channel_Username_InvalidTaken: String { return self._s[4061]! } - public var Conversation_ClousStorageInfo_Description3: String { return self._s[4062]! } - public var Wallet_WordCheck_TryAgain: String { return self._s[4063]! } - public var Wallet_Info_TransactionPendingHeader: String { return self._s[4064]! } - public var Settings_ChatBackground: String { return self._s[4065]! } - public var Channel_Subscribers_Title: String { return self._s[4066]! } - public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[4067]! } - public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[4068]! } - public var Watch_ConnectionDescription: String { return self._s[4069]! } - public var OldChannels_NoticeText: String { return self._s[4072]! } - public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[4073]! } - public var IntentsSettings_SuggestBy: String { return self._s[4075]! } - public var Theme_ThemeChangedText: String { return self._s[4076]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[4077]! } - public var Wallpaper_ResetWallpapers: String { return self._s[4078]! } - public var Wallet_Send_TransactionInProgress: String { return self._s[4079]! } - public var Conversation_SendDice: String { return self._s[4080]! } - public var EditProfile_Title: String { return self._s[4081]! } - public var NotificationsSound_Bamboo: String { return self._s[4083]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[4085]! } - public var Login_SmsRequestState2: String { return self._s[4086]! } - public var Passport_Language_ar: String { return self._s[4087]! } + public var Paint_Regular: String { return self._s[4044]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[4045]! } + public var SocksProxySetup_ShareLink: String { return self._s[4046]! } + public var Wallet_Qr_Title: String { return self._s[4047]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[4048]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[4050]! } + public var Wallet_Settings_Configuration: String { return self._s[4051]! } + public var GroupInfo_InviteByLink: String { return self._s[4052]! } + public var MessageTimer_Custom: String { return self._s[4053]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[4054]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[4055]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[4057]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[4058]! } + public var VoiceOver_Chat_Selected: String { return self._s[4059]! } + public var Paint_Pen: String { return self._s[4060]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4061]! } + public var Channel_Username_InvalidTaken: String { return self._s[4062]! } + public var Conversation_ClousStorageInfo_Description3: String { return self._s[4063]! } + public var Wallet_WordCheck_TryAgain: String { return self._s[4064]! } + public var Wallet_Info_TransactionPendingHeader: String { return self._s[4065]! } + public var Settings_ChatBackground: String { return self._s[4066]! } + public var Channel_Subscribers_Title: String { return self._s[4067]! } + public var Wallet_Receive_InvoiceUrlHeader: String { return self._s[4068]! } + public var ApplyLanguage_ChangeLanguageTitle: String { return self._s[4069]! } + public var Watch_ConnectionDescription: String { return self._s[4070]! } + public var OldChannels_NoticeText: String { return self._s[4073]! } + public var Wallet_Configuration_ApplyErrorTitle: String { return self._s[4074]! } + public var IntentsSettings_SuggestBy: String { return self._s[4076]! } + public var Theme_ThemeChangedText: String { return self._s[4077]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[4078]! } + public var Wallpaper_ResetWallpapers: String { return self._s[4079]! } + public var Wallet_Send_TransactionInProgress: String { return self._s[4080]! } + public var Conversation_SendDice: String { return self._s[4081]! } + public var EditProfile_Title: String { return self._s[4082]! } + public var NotificationsSound_Bamboo: String { return self._s[4084]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[4086]! } + public var Login_SmsRequestState2: String { return self._s[4087]! } + public var Passport_Language_ar: String { return self._s[4088]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4088]!, self._r[4088]!, [_0]) + return formatWithArgumentRanges(self._s[4089]!, self._r[4089]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4089]! } - public var Wallet_Created_Text: String { return self._s[4090]! } - public var Conversation_MessageDialogEdit: String { return self._s[4092]! } - public var Wallet_Created_Proceed: String { return self._s[4093]! } - public var Wallet_Words_Done: String { return self._s[4094]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[4095]! } - public var ChatListFolder_NameChannels: String { return self._s[4096]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4090]! } + public var Wallet_Created_Text: String { return self._s[4091]! } + public var Conversation_MessageDialogEdit: String { return self._s[4093]! } + public var Wallet_Created_Proceed: String { return self._s[4094]! } + public var Wallet_Words_Done: String { return self._s[4095]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[4096]! } + public var ChatListFolder_NameChannels: String { return self._s[4097]! } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4097]!, self._r[4097]!, [_1]) + return formatWithArgumentRanges(self._s[4098]!, self._r[4098]!, [_1]) } - public var Common_Close: String { return self._s[4099]! } - public var GroupInfo_PublicLink: String { return self._s[4100]! } - public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[4101]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4102]! } - public var Conversation_ContextMenuOpenChannel: String { return self._s[4106]! } + public var Common_Close: String { return self._s[4100]! } + public var GroupInfo_PublicLink: String { return self._s[4101]! } + public var Channel_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[4102]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4103]! } + public var Conversation_ContextMenuOpenChannel: String { return self._s[4107]! } public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4107]!, self._r[4107]!, [_0]) + return formatWithArgumentRanges(self._s[4108]!, self._r[4108]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[4108]! } + public var UserInfo_About_Placeholder: String { return self._s[4109]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4109]!, self._r[4109]!, [_0]) + return formatWithArgumentRanges(self._s[4110]!, self._r[4110]!, [_0]) } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[4110]! } - public var Channel_Info_Banned: String { return self._s[4112]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[4111]! } + public var Channel_Info_Banned: String { return self._s[4113]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4113]!, self._r[4113]!, [_0]) + return formatWithArgumentRanges(self._s[4114]!, self._r[4114]!, [_0]) } - public var Appearance_Other: String { return self._s[4114]! } - public var Passport_Language_my: String { return self._s[4115]! } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[4116]! } + public var Appearance_Other: String { return self._s[4115]! } + public var Passport_Language_my: String { return self._s[4116]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[4117]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4117]!, self._r[4117]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4118]!, self._r[4118]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[4118]! } - public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[4119]! } - public var Preview_CopyAddress: String { return self._s[4120]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[4119]! } + public var IntentsSettings_SuggestedAndSpotlightChatsInfo: String { return self._s[4120]! } + public var Preview_CopyAddress: String { return self._s[4121]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4121]!, self._r[4121]!, [_0]) + return formatWithArgumentRanges(self._s[4122]!, self._r[4122]!, [_0]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[4122]! } - public var UserInfo_BotSettings: String { return self._s[4123]! } - public var LiveLocation_MenuStopAll: String { return self._s[4125]! } - public var Passport_PasswordCreate: String { return self._s[4126]! } - public var StickerSettings_MaskContextInfo: String { return self._s[4127]! } - public var Message_PinnedLocationMessage: String { return self._s[4128]! } - public var Map_Satellite: String { return self._s[4129]! } - public var Watch_Message_Unsupported: String { return self._s[4130]! } - public var Username_TooManyPublicUsernamesError: String { return self._s[4131]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[4132]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[4123]! } + public var UserInfo_BotSettings: String { return self._s[4124]! } + public var LiveLocation_MenuStopAll: String { return self._s[4126]! } + public var Passport_PasswordCreate: String { return self._s[4127]! } + public var StickerSettings_MaskContextInfo: String { return self._s[4128]! } + public var Message_PinnedLocationMessage: String { return self._s[4129]! } + public var Map_Satellite: String { return self._s[4130]! } + public var Watch_Message_Unsupported: String { return self._s[4131]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[4132]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[4133]! } public func Notification_PinnedTextMessage(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4133]!, self._r[4133]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4134]!, self._r[4134]!, [_0, _1]) } public func Conversation_OpenBotLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4134]!, self._r[4134]!, [_0]) + return formatWithArgumentRanges(self._s[4135]!, self._r[4135]!, [_0]) } - public var Wallet_WordImport_Continue: String { return self._s[4135]! } + public var Wallet_WordImport_Continue: String { return self._s[4136]! } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4136]!, self._r[4136]!, [_0]) + return formatWithArgumentRanges(self._s[4137]!, self._r[4137]!, [_0]) } - public var Notifications_ChannelNotificationsHelp: String { return self._s[4137]! } - public var Privacy_Calls_P2PContacts: String { return self._s[4138]! } - public var NotificationsSound_None: String { return self._s[4139]! } - public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[4140]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[4142]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[4143]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[4138]! } + public var Privacy_Calls_P2PContacts: String { return self._s[4139]! } + public var NotificationsSound_None: String { return self._s[4140]! } + public var Wallet_TransactionInfo_StorageFeeHeader: String { return self._s[4141]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[4143]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[4144]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4144]!, self._r[4144]!, [_1]) + return formatWithArgumentRanges(self._s[4145]!, self._r[4145]!, [_1]) } - public var Cache_Indexing: String { return self._s[4145]! } - public var DialogList_RecentTitlePeople: String { return self._s[4147]! } - public var DialogList_EncryptionRejected: String { return self._s[4148]! } - public var GroupInfo_Administrators: String { return self._s[4149]! } - public var Passport_ScanPassportHelp: String { return self._s[4150]! } - public var Application_Name: String { return self._s[4151]! } - public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[4152]! } - public var Conversation_Timer_Title: String { return self._s[4153]! } - public var ChatList_PeerTypeGroup: String { return self._s[4154]! } - public var PeopleNearby_MakeVisible: String { return self._s[4156]! } - public var Appearance_ThemeCarouselDay: String { return self._s[4157]! } - public var Stats_GrowthTitle: String { return self._s[4158]! } - public var Passport_Identity_TranslationHelp: String { return self._s[4159]! } + public var Cache_Indexing: String { return self._s[4146]! } + public var DialogList_RecentTitlePeople: String { return self._s[4148]! } + public var DialogList_EncryptionRejected: String { return self._s[4149]! } + public var GroupInfo_Administrators: String { return self._s[4150]! } + public var Passport_ScanPassportHelp: String { return self._s[4151]! } + public var Application_Name: String { return self._s[4152]! } + public var Channel_AdminLogFilter_ChannelEventsInfo: String { return self._s[4153]! } + public var Conversation_Timer_Title: String { return self._s[4154]! } + public var ChatList_PeerTypeGroup: String { return self._s[4155]! } + public var PeopleNearby_MakeVisible: String { return self._s[4157]! } + public var Appearance_ThemeCarouselDay: String { return self._s[4158]! } + public var Stats_GrowthTitle: String { return self._s[4159]! } + public var Passport_Identity_TranslationHelp: String { return self._s[4160]! } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4160]!, self._r[4160]!, [_0]) - } - public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4161]!, self._r[4161]!, [_0]) } - public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4162]!, self._r[4162]!, [_0]) } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[4163]! } - public var Privacy_ChatsTitle: String { return self._s[4164]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[4165]! } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[4166]! } - public var Watch_Suggestion_HoldOn: String { return self._s[4167]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[4168]! } - public var WebBrowser_Title: String { return self._s[4169]! } - public var Group_LinkedChannel: String { return self._s[4170]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[4171]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[4172]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[4173]! } - public var Appearance_TextSize_UseSystem: String { return self._s[4174]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[4175]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[4177]! } - public var Channel_Setup_TypePublic: String { return self._s[4179]! } + public func DialogList_EncryptedChatStartedOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4163]!, self._r[4163]!, [_0]) + } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[4164]! } + public var Privacy_ChatsTitle: String { return self._s[4165]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[4166]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[4167]! } + public var Watch_Suggestion_HoldOn: String { return self._s[4168]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[4169]! } + public var WebBrowser_Title: String { return self._s[4170]! } + public var Group_LinkedChannel: String { return self._s[4171]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[4172]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[4173]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[4174]! } + public var Appearance_TextSize_UseSystem: String { return self._s[4175]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[4176]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[4178]! } + public var Channel_Setup_TypePublic: String { return self._s[4180]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4180]!, self._r[4180]!, [_0]) + return formatWithArgumentRanges(self._s[4181]!, self._r[4181]!, [_0]) } - public var Channel_TypeSetup_Title: String { return self._s[4182]! } - public var MessagePoll_ViewResults: String { return self._s[4183]! } - public var Map_OpenInMaps: String { return self._s[4185]! } + public var Channel_TypeSetup_Title: String { return self._s[4183]! } + public var MessagePoll_ViewResults: String { return self._s[4184]! } + public var Map_OpenInMaps: String { return self._s[4186]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4186]!, self._r[4186]!, [_1]) + return formatWithArgumentRanges(self._s[4187]!, self._r[4187]!, [_1]) } - public var NotificationsSound_Tremolo: String { return self._s[4188]! } + public var NotificationsSound_Tremolo: String { return self._s[4189]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4189]!, self._r[4189]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4190]!, self._r[4190]!, [_1, _2, _3]) } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[4190]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[4191]! } - public var Passport_PasswordHelp: String { return self._s[4193]! } - public var Login_CodeExpiredError: String { return self._s[4194]! } - public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[4195]! } - public var Conversation_TitleUnmute: String { return self._s[4196]! } - public var Passport_Identity_ScansHelp: String { return self._s[4197]! } - public var Passport_Language_lo: String { return self._s[4198]! } - public var Camera_FlashAuto: String { return self._s[4199]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[4200]! } - public var Common_Cancel: String { return self._s[4201]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[4202]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[4203]! } - public var Appearance_TintAllColors: String { return self._s[4204]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[4191]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[4192]! } + public var Passport_PasswordHelp: String { return self._s[4194]! } + public var Login_CodeExpiredError: String { return self._s[4195]! } + public var Channel_EditAdmin_PermissionChangeInfo: String { return self._s[4196]! } + public var Conversation_TitleUnmute: String { return self._s[4197]! } + public var Passport_Identity_ScansHelp: String { return self._s[4198]! } + public var Passport_Language_lo: String { return self._s[4199]! } + public var Camera_FlashAuto: String { return self._s[4200]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[4201]! } + public var Common_Cancel: String { return self._s[4202]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[4203]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[4204]! } + public var Appearance_TintAllColors: String { return self._s[4205]! } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4205]!, self._r[4205]!, [_1]) + return formatWithArgumentRanges(self._s[4206]!, self._r[4206]!, [_1]) } - public var Conversation_ReportSpamConfirmation: String { return self._s[4206]! } - public var ChatSettings_Title: String { return self._s[4208]! } - public var Passport_PasswordReset: String { return self._s[4209]! } - public var SocksProxySetup_TypeNone: String { return self._s[4210]! } - public var EditTheme_Title: String { return self._s[4213]! } - public var PhoneNumberHelp_Help: String { return self._s[4214]! } - public var Checkout_EnterPassword: String { return self._s[4215]! } - public var Activity_UploadingDocument: String { return self._s[4217]! } - public var Share_AuthTitle: String { return self._s[4218]! } - public var State_Connecting: String { return self._s[4219]! } - public var Profile_MessageLifetime1w: String { return self._s[4220]! } - public var Conversation_ContextMenuReport: String { return self._s[4221]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[4222]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[4223]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[4207]! } + public var ChatSettings_Title: String { return self._s[4209]! } + public var Passport_PasswordReset: String { return self._s[4210]! } + public var SocksProxySetup_TypeNone: String { return self._s[4211]! } + public var EditTheme_Title: String { return self._s[4214]! } + public var PhoneNumberHelp_Help: String { return self._s[4215]! } + public var Checkout_EnterPassword: String { return self._s[4216]! } + public var Activity_UploadingDocument: String { return self._s[4218]! } + public var Share_AuthTitle: String { return self._s[4219]! } + public var State_Connecting: String { return self._s[4220]! } + public var Profile_MessageLifetime1w: String { return self._s[4221]! } + public var Conversation_ContextMenuReport: String { return self._s[4222]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[4223]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[4224]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4224]!, self._r[4224]!, [_0]) + return formatWithArgumentRanges(self._s[4225]!, self._r[4225]!, [_0]) } - public var AuthSessions_Terminate: String { return self._s[4225]! } - public var Wallet_WordImport_CanNotRemember: String { return self._s[4226]! } - public var PeerInfo_PaneAudio: String { return self._s[4227]! } + public var AuthSessions_Terminate: String { return self._s[4226]! } + public var Wallet_WordImport_CanNotRemember: String { return self._s[4227]! } + public var PeerInfo_PaneAudio: String { return self._s[4228]! } public func Message_ForwardedPsa_covid(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4228]!, self._r[4228]!, [_0]) + return formatWithArgumentRanges(self._s[4229]!, self._r[4229]!, [_0]) } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[4230]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[4231]! } - public var PhotoEditor_Set: String { return self._s[4232]! } - public var EmptyGroupInfo_Title: String { return self._s[4233]! } - public var Login_PadPhoneHelp: String { return self._s[4235]! } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[4237]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[4239]! } - public var NotificationsSound_Complete: String { return self._s[4240]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4241]! } - public var Group_Info_AdminLog: String { return self._s[4242]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[4243]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[4231]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[4232]! } + public var PhotoEditor_Set: String { return self._s[4233]! } + public var EmptyGroupInfo_Title: String { return self._s[4234]! } + public var Login_PadPhoneHelp: String { return self._s[4236]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[4238]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[4240]! } + public var NotificationsSound_Complete: String { return self._s[4241]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4242]! } + public var Group_Info_AdminLog: String { return self._s[4243]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[4244]! } public func Wallet_Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4244]!, self._r[4244]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4245]!, self._r[4245]!, [_1, _2, _3]) } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[4245]! } - public var Group_Location_CreateInThisPlace: String { return self._s[4247]! } - public var Conversation_Admin: String { return self._s[4248]! } - public var Conversation_GifTooltip: String { return self._s[4249]! } - public var Passport_NotLoggedInMessage: String { return self._s[4250]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[4246]! } + public var Group_Location_CreateInThisPlace: String { return self._s[4248]! } + public var Conversation_Admin: String { return self._s[4249]! } + public var Conversation_GifTooltip: String { return self._s[4250]! } + public var Passport_NotLoggedInMessage: String { return self._s[4251]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4252]!, self._r[4252]!, [_0]) + return formatWithArgumentRanges(self._s[4253]!, self._r[4253]!, [_0]) } - public var Profile_MessageLifetimeForever: String { return self._s[4253]! } - public var SharedMedia_EmptyTitle: String { return self._s[4255]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[4257]! } - public var Username_Help: String { return self._s[4258]! } - public var DialogList_LanguageTooltip: String { return self._s[4260]! } - public var Map_LoadError: String { return self._s[4261]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[4262]! } - public var Channel_AdminLog_AddMembers: String { return self._s[4263]! } - public var ArchivedChats_IntroTitle2: String { return self._s[4264]! } - public var Notification_Exceptions_NewException: String { return self._s[4265]! } - public var TwoStepAuth_EmailTitle: String { return self._s[4266]! } - public var WatchRemote_AlertText: String { return self._s[4267]! } + public var Profile_MessageLifetimeForever: String { return self._s[4254]! } + public var SharedMedia_EmptyTitle: String { return self._s[4256]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[4258]! } + public var Username_Help: String { return self._s[4259]! } + public var DialogList_LanguageTooltip: String { return self._s[4261]! } + public var Map_LoadError: String { return self._s[4262]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[4263]! } + public var Channel_AdminLog_AddMembers: String { return self._s[4264]! } + public var ArchivedChats_IntroTitle2: String { return self._s[4265]! } + public var Notification_Exceptions_NewException: String { return self._s[4266]! } + public var TwoStepAuth_EmailTitle: String { return self._s[4267]! } + public var WatchRemote_AlertText: String { return self._s[4268]! } public func Wallet_Send_ConfirmationText(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4268]!, self._r[4268]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4269]!, self._r[4269]!, [_1, _2, _3]) } - public var ChatSettings_ConnectionType_Title: String { return self._s[4272]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[4273]! } public func PUSH_PINNED_QUIZ(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4273]!, self._r[4273]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4274]!, self._r[4274]!, [_1, _2]) } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4274]!, self._r[4274]!, [_0]) + return formatWithArgumentRanges(self._s[4275]!, self._r[4275]!, [_0]) } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[4275]! } - public var WebBrowser_DefaultBrowser: String { return self._s[4276]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[4277]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[4276]! } + public var WebBrowser_DefaultBrowser: String { return self._s[4277]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[4278]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4278]!, self._r[4278]!, [_0]) + return formatWithArgumentRanges(self._s[4279]!, self._r[4279]!, [_0]) } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4279]!, self._r[4279]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4280]!, self._r[4280]!, [_1, _2, _3]) } - public var Group_AdminLog_EmptyText: String { return self._s[4280]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[4281]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[4283]! } - public var Wallet_Created_ExportErrorText: String { return self._s[4284]! } - public var ChatList_UndoArchiveText1: String { return self._s[4285]! } - public var ChatListFolder_IncludedSectionHeader: String { return self._s[4286]! } - public var AccessDenied_VideoMicrophone: String { return self._s[4287]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4288]! } - public var Stats_GroupTopInviter_History: String { return self._s[4289]! } - public var Cache_ClearNone: String { return self._s[4290]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[4291]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[4292]! } + public var Group_AdminLog_EmptyText: String { return self._s[4281]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[4282]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[4284]! } + public var Wallet_Created_ExportErrorText: String { return self._s[4285]! } + public var ChatList_UndoArchiveText1: String { return self._s[4286]! } + public var ChatListFolder_IncludedSectionHeader: String { return self._s[4287]! } + public var AccessDenied_VideoMicrophone: String { return self._s[4288]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4289]! } + public var Stats_GroupTopInviter_History: String { return self._s[4290]! } + public var Cache_ClearNone: String { return self._s[4291]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[4292]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[4293]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4293]!, self._r[4293]!, [_0]) + return formatWithArgumentRanges(self._s[4294]!, self._r[4294]!, [_0]) } - public var Passport_Identity_Country: String { return self._s[4294]! } + public var Passport_Identity_Country: String { return self._s[4295]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4295]!, self._r[4295]!, [_0]) - } - public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4296]!, self._r[4296]!, [_0]) } - public var Exceptions_AddToExceptions: String { return self._s[4297]! } - public var AccessDenied_Settings: String { return self._s[4298]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[4299]! } - public var Month_ShortMay: String { return self._s[4301]! } - public var Compose_NewGroup: String { return self._s[4303]! } - public var Group_Setup_TypePrivate: String { return self._s[4305]! } - public var Login_PadPhoneHelpTitle: String { return self._s[4307]! } - public var Appearance_ThemeDayClassic: String { return self._s[4308]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[4309]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[4310]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[4311]! } - public var Conversation_typing: String { return self._s[4313]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[4314]! } - public var Paint_Masks: String { return self._s[4315]! } - public var Contacts_DeselectAll: String { return self._s[4316]! } - public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4317]!, self._r[4317]!, [_0]) + public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4297]!, self._r[4297]!, [_0]) } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[4318]! } - public var Stats_GroupMembersTitle: String { return self._s[4319]! } - public var Username_InvalidTaken: String { return self._s[4320]! } - public var Call_StatusNoAnswer: String { return self._s[4321]! } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[4322]! } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4323]! } - public var Passport_Identity_Selfie: String { return self._s[4324]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[4325]! } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[4326]! } - public var Conversation_ClearSecretHistory: String { return self._s[4327]! } - public var PeopleNearby_Description: String { return self._s[4329]! } - public var NetworkUsageSettings_Title: String { return self._s[4330]! } - public var Your_cards_security_code_is_invalid: String { return self._s[4332]! } - public var Stats_EnabledNotifications: String { return self._s[4333]! } + public var Exceptions_AddToExceptions: String { return self._s[4298]! } + public var AccessDenied_Settings: String { return self._s[4299]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[4300]! } + public var Month_ShortMay: String { return self._s[4302]! } + public var Compose_NewGroup: String { return self._s[4304]! } + public var Group_Setup_TypePrivate: String { return self._s[4306]! } + public var Login_PadPhoneHelpTitle: String { return self._s[4308]! } + public var Appearance_ThemeDayClassic: String { return self._s[4309]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[4310]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[4311]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[4312]! } + public var Conversation_typing: String { return self._s[4314]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[4315]! } + public var Paint_Masks: String { return self._s[4316]! } + public var Contacts_DeselectAll: String { return self._s[4317]! } + public func Wallet_Updated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4318]!, self._r[4318]!, [_0]) + } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[4319]! } + public var Stats_GroupMembersTitle: String { return self._s[4320]! } + public var Username_InvalidTaken: String { return self._s[4321]! } + public var Call_StatusNoAnswer: String { return self._s[4322]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[4323]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4324]! } + public var Passport_Identity_Selfie: String { return self._s[4325]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[4326]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[4327]! } + public var Conversation_ClearSecretHistory: String { return self._s[4328]! } + public var PeopleNearby_Description: String { return self._s[4330]! } + public var NetworkUsageSettings_Title: String { return self._s[4331]! } + public var Your_cards_security_code_is_invalid: String { return self._s[4333]! } + public var Stats_EnabledNotifications: String { return self._s[4334]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4336]!, self._r[4336]!, [_0]) + return formatWithArgumentRanges(self._s[4337]!, self._r[4337]!, [_0]) } public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4337]!, self._r[4337]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4338]!, self._r[4338]!, [_1, _2]) } - public var SaveIncomingPhotosSettings_From: String { return self._s[4339]! } - public var VoiceOver_Navigation_Search: String { return self._s[4340]! } - public var Map_LiveLocationTitle: String { return self._s[4341]! } - public var Login_InfoAvatarAdd: String { return self._s[4342]! } - public var Passport_Identity_FilesView: String { return self._s[4343]! } - public var ChatListFolderSettings_Title: String { return self._s[4344]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[4345]! } - public var Privacy_Calls_NeverAllow: String { return self._s[4346]! } - public var VoiceOver_Chat_File: String { return self._s[4347]! } - public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4348]! } + public var SaveIncomingPhotosSettings_From: String { return self._s[4340]! } + public var VoiceOver_Navigation_Search: String { return self._s[4341]! } + public var Map_LiveLocationTitle: String { return self._s[4342]! } + public var Login_InfoAvatarAdd: String { return self._s[4343]! } + public var Passport_Identity_FilesView: String { return self._s[4344]! } + public var ChatListFolderSettings_Title: String { return self._s[4345]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[4346]! } + public var Privacy_Calls_NeverAllow: String { return self._s[4347]! } + public var VoiceOver_Chat_File: String { return self._s[4348]! } + public var Wallet_Settings_DeleteWalletInfo: String { return self._s[4349]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4349]!, self._r[4349]!, [_0]) + return formatWithArgumentRanges(self._s[4350]!, self._r[4350]!, [_0]) } - public var ChatList_EmptyChatList: String { return self._s[4351]! } - public var ContactInfo_PhoneNumberHidden: String { return self._s[4352]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[4353]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4354]! } + public var ChatList_EmptyChatList: String { return self._s[4352]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[4353]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[4354]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[4355]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4355]!, self._r[4355]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4356]!, self._r[4356]!, [_1, _2, _3]) } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4356]! } - public var Wallet_Intro_CreateErrorText: String { return self._s[4357]! } - public var Tour_Title2: String { return self._s[4358]! } - public var Wallet_Sent_ViewWallet: String { return self._s[4359]! } - public var Stats_GroupMessagesTitle: String { return self._s[4360]! } - public var Conversation_FileOpenIn: String { return self._s[4361]! } - public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4362]! } - public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4363]! } - public var Wallpaper_Set: String { return self._s[4364]! } - public var Passport_Identity_Translations: String { return self._s[4367]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[4357]! } + public var Wallet_Intro_CreateErrorText: String { return self._s[4358]! } + public var Tour_Title2: String { return self._s[4359]! } + public var Wallet_Sent_ViewWallet: String { return self._s[4360]! } + public var Stats_GroupMessagesTitle: String { return self._s[4361]! } + public var Conversation_FileOpenIn: String { return self._s[4362]! } + public var Checkout_ErrorPrecheckoutFailed: String { return self._s[4363]! } + public var Wallet_Send_ErrorInvalidAddress: String { return self._s[4364]! } + public var Wallpaper_Set: String { return self._s[4365]! } + public var Passport_Identity_Translations: String { return self._s[4368]! } public func Channel_AdminLog_MessageChangedChannelAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4368]!, self._r[4368]!, [_0]) + return formatWithArgumentRanges(self._s[4369]!, self._r[4369]!, [_0]) } - public var Channel_LeaveChannel: String { return self._s[4370]! } + public var Channel_LeaveChannel: String { return self._s[4371]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4371]!, self._r[4371]!, [_1]) + return formatWithArgumentRanges(self._s[4372]!, self._r[4372]!, [_1]) } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4373]! } - public var PhotoEditor_HighlightsTint: String { return self._s[4374]! } - public var MessagePoll_LabelPoll: String { return self._s[4375]! } - public var Passport_Email_Delete: String { return self._s[4376]! } - public var Conversation_Mute: String { return self._s[4378]! } - public var Channel_AddBotAsAdmin: String { return self._s[4379]! } - public var Channel_AdminLog_CanSendMessages: String { return self._s[4381]! } - public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4382]! } - public var ChatSettings_IntentsSettings: String { return self._s[4384]! } - public var Channel_Management_LabelOwner: String { return self._s[4385]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[4374]! } + public var PhotoEditor_HighlightsTint: String { return self._s[4375]! } + public var MessagePoll_LabelPoll: String { return self._s[4376]! } + public var Passport_Email_Delete: String { return self._s[4377]! } + public var Conversation_Mute: String { return self._s[4379]! } + public var Channel_AddBotAsAdmin: String { return self._s[4380]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[4382]! } + public var Wallet_Configuration_BlockchainNameChangedText: String { return self._s[4383]! } + public var ChatSettings_IntentsSettings: String { return self._s[4385]! } + public var Channel_Management_LabelOwner: String { return self._s[4386]! } public func Notification_PassportValuesSentMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4386]!, self._r[4386]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4387]!, self._r[4387]!, [_1, _2]) } - public var Calls_CallTabDescription: String { return self._s[4387]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[4388]! } - public var Common_No: String { return self._s[4389]! } - public var Weekday_Sunday: String { return self._s[4390]! } - public var Notification_Reply: String { return self._s[4391]! } - public var Conversation_ViewMessage: String { return self._s[4392]! } + public var Calls_CallTabDescription: String { return self._s[4388]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[4389]! } + public var Common_No: String { return self._s[4390]! } + public var Weekday_Sunday: String { return self._s[4391]! } + public var Notification_Reply: String { return self._s[4392]! } + public var Conversation_ViewMessage: String { return self._s[4393]! } public func Checkout_SavePasswordTimeoutAndFaceId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4393]!, self._r[4393]!, [_0]) - } - public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4394]!, self._r[4394]!, [_0]) } + public func Map_LiveLocationPrivateDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4395]!, self._r[4395]!, [_0]) + } public func Wallet_Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4395]!, self._r[4395]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4396]!, self._r[4396]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4396]! } - public var Wallet_Send_Title: String { return self._s[4397]! } - public var Message_PinnedDocumentMessage: String { return self._s[4398]! } - public var Wallet_Info_RefreshErrorText: String { return self._s[4399]! } - public var DialogList_TabTitle: String { return self._s[4401]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[4402]! } - public var Passport_FieldEmail: String { return self._s[4403]! } - public var Conversation_UnpinMessageAlert: String { return self._s[4404]! } - public var Passport_Address_TypeBankStatement: String { return self._s[4405]! } - public var Wallet_SecureStorageReset_Title: String { return self._s[4406]! } - public var Passport_Identity_ExpiryDate: String { return self._s[4407]! } - public var Privacy_Calls_P2P: String { return self._s[4408]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4397]! } + public var Wallet_Send_Title: String { return self._s[4398]! } + public var Message_PinnedDocumentMessage: String { return self._s[4399]! } + public var Wallet_Info_RefreshErrorText: String { return self._s[4400]! } + public var DialogList_TabTitle: String { return self._s[4402]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[4403]! } + public var Passport_FieldEmail: String { return self._s[4404]! } + public var Conversation_UnpinMessageAlert: String { return self._s[4405]! } + public var Passport_Address_TypeBankStatement: String { return self._s[4406]! } + public var Wallet_SecureStorageReset_Title: String { return self._s[4407]! } + public var Passport_Identity_ExpiryDate: String { return self._s[4408]! } + public var Privacy_Calls_P2P: String { return self._s[4409]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4410]!, self._r[4410]!, [_0]) + return formatWithArgumentRanges(self._s[4411]!, self._r[4411]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[4411]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[4412]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4412]!, self._r[4412]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4413]!, self._r[4413]!, [_1, _2]) } - public var Stickers_ClearRecent: String { return self._s[4413]! } - public var EnterPasscode_ChangeTitle: String { return self._s[4414]! } - public var TwoFactorSetup_Email_Title: String { return self._s[4415]! } - public var Passport_InfoText: String { return self._s[4416]! } - public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4417]! } + public var Stickers_ClearRecent: String { return self._s[4414]! } + public var EnterPasscode_ChangeTitle: String { return self._s[4415]! } + public var TwoFactorSetup_Email_Title: String { return self._s[4416]! } + public var Passport_InfoText: String { return self._s[4417]! } + public var Checkout_NewCard_SaveInfoEnableHelp: String { return self._s[4418]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4418]!, self._r[4418]!, [_0]) + return formatWithArgumentRanges(self._s[4419]!, self._r[4419]!, [_0]) } public func Time_PreciseDate_m3(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4419]!, self._r[4419]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4420]!, self._r[4420]!, [_1, _2, _3]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4420]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[4421]! } - public var VoiceOver_Navigation_Compose: String { return self._s[4422]! } - public var Passport_Identity_EditDriversLicense: String { return self._s[4423]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[4425]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4426]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4421]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[4422]! } + public var VoiceOver_Navigation_Compose: String { return self._s[4423]! } + public var Passport_Identity_EditDriversLicense: String { return self._s[4424]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[4426]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[4427]! } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4427]!, self._r[4427]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4428]!, self._r[4428]!, [_1, _2]) } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4430]! } - public var ChatSettings_OpenLinksIn: String { return self._s[4431]! } - public var Map_HomeAndWorkTitle: String { return self._s[4432]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[4431]! } + public var ChatSettings_OpenLinksIn: String { return self._s[4432]! } + public var Map_HomeAndWorkTitle: String { return self._s[4433]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4434]!, self._r[4434]!, [_0]) + return formatWithArgumentRanges(self._s[4435]!, self._r[4435]!, [_0]) } - public var DialogList_Unread: String { return self._s[4435]! } + public var DialogList_Unread: String { return self._s[4436]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4436]!, self._r[4436]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4437]!, self._r[4437]!, [_1, _2]) } - public var User_DeletedAccount: String { return self._s[4437]! } - public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[4438]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4439]! } + public var User_DeletedAccount: String { return self._s[4438]! } + public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[4439]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[4440]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4440]!, self._r[4440]!, [_0]) + return formatWithArgumentRanges(self._s[4441]!, self._r[4441]!, [_0]) } - public var UserInfo_NotificationsDefault: String { return self._s[4441]! } - public var SharedMedia_CategoryMedia: String { return self._s[4442]! } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4443]! } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4444]! } - public var Watch_ChatList_Compose: String { return self._s[4445]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4446]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[4447]! } - public var Watch_Microphone_Access: String { return self._s[4448]! } - public var Cache_MaximumCacheSize: String { return self._s[4449]! } - public var Group_Setup_HistoryHeader: String { return self._s[4450]! } - public var Map_SetThisLocation: String { return self._s[4451]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4452]! } - public var Activity_UploadingPhoto: String { return self._s[4453]! } - public var Conversation_Edit: String { return self._s[4455]! } - public var Group_ErrorSendRestrictedMedia: String { return self._s[4456]! } - public var Login_TermsOfServiceDecline: String { return self._s[4457]! } - public var Message_PinnedContactMessage: String { return self._s[4458]! } + public var UserInfo_NotificationsDefault: String { return self._s[4442]! } + public var SharedMedia_CategoryMedia: String { return self._s[4443]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4444]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[4445]! } + public var Watch_ChatList_Compose: String { return self._s[4446]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[4447]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[4448]! } + public var Watch_Microphone_Access: String { return self._s[4449]! } + public var Cache_MaximumCacheSize: String { return self._s[4450]! } + public var Group_Setup_HistoryHeader: String { return self._s[4451]! } + public var Map_SetThisLocation: String { return self._s[4452]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[4453]! } + public var Activity_UploadingPhoto: String { return self._s[4454]! } + public var Conversation_Edit: String { return self._s[4456]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[4457]! } + public var Login_TermsOfServiceDecline: String { return self._s[4458]! } + public var Message_PinnedContactMessage: String { return self._s[4459]! } public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4459]!, self._r[4459]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4460]!, self._r[4460]!, [_1, _2]) } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4460]!, self._r[4460]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[4461]!, self._r[4461]!, [_1, _2, _3, _4, _5]) } - public var Appearance_LargeEmoji: String { return self._s[4461]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4463]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4464]! } + public var Appearance_LargeEmoji: String { return self._s[4462]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4464]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[4465]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4465]!, self._r[4465]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4466]!, self._r[4466]!, [_1, _2]) } - public var Passport_Phone_EnterOtherNumber: String { return self._s[4466]! } - public var Message_PinnedPhotoMessage: String { return self._s[4467]! } - public var Passport_FieldPhone: String { return self._s[4468]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4469]! } - public var Stats_NotificationsTitle: String { return self._s[4470]! } - public var ChatSettings_AutoPlayGifs: String { return self._s[4471]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[4473]! } - public var Conversation_Call: String { return self._s[4474]! } - public var Common_TakePhoto: String { return self._s[4476]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4477]! } - public var Wallet_Receive_CommentHeader: String { return self._s[4478]! } - public var Channel_NotificationLoading: String { return self._s[4479]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[4467]! } + public var Message_PinnedPhotoMessage: String { return self._s[4468]! } + public var Passport_FieldPhone: String { return self._s[4469]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[4470]! } + public var Stats_NotificationsTitle: String { return self._s[4471]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[4472]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[4474]! } + public var Conversation_Call: String { return self._s[4475]! } + public var Common_TakePhoto: String { return self._s[4477]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4478]! } + public var Wallet_Receive_CommentHeader: String { return self._s[4479]! } + public var Channel_NotificationLoading: String { return self._s[4480]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4480]!, self._r[4480]!, [_0]) - } - public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4481]!, self._r[4481]!, [_0]) } + public func ScheduledMessages_ScheduledDate(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4482]!, self._r[4482]!, [_0]) + } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4482]!, self._r[4482]!, [_1]) + return formatWithArgumentRanges(self._s[4483]!, self._r[4483]!, [_1]) } - public var Permissions_SiriTitle_v0: String { return self._s[4483]! } + public var Permissions_SiriTitle_v0: String { return self._s[4484]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4484]!, self._r[4484]!, [_0]) - } - public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4485]!, self._r[4485]!, [_0]) } - public var Channel_MessagePhotoRemoved: String { return self._s[4486]! } - public var Wallet_Info_ReceiveGrams: String { return self._s[4487]! } - public var ClearCache_FreeSpace: String { return self._s[4488]! } - public var Appearance_BubbleCorners_Apply: String { return self._s[4489]! } - public var Common_edit: String { return self._s[4490]! } - public var PrivacySettings_AuthSessions: String { return self._s[4491]! } + public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4486]!, self._r[4486]!, [_0]) + } + public var Channel_MessagePhotoRemoved: String { return self._s[4487]! } + public var Wallet_Info_ReceiveGrams: String { return self._s[4488]! } + public var ClearCache_FreeSpace: String { return self._s[4489]! } + public var Appearance_BubbleCorners_Apply: String { return self._s[4490]! } + public var Common_edit: String { return self._s[4491]! } + public var PrivacySettings_AuthSessions: String { return self._s[4492]! } public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4492]!, self._r[4492]!, [_1]) + return formatWithArgumentRanges(self._s[4493]!, self._r[4493]!, [_1]) } - public var Month_ShortJune: String { return self._s[4493]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4494]! } - public var Call_ReportSend: String { return self._s[4495]! } - public var Watch_LastSeen_JustNow: String { return self._s[4496]! } - public var Notifications_MessageNotifications: String { return self._s[4497]! } - public var WallpaperSearch_ColorGreen: String { return self._s[4498]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4500]! } - public var Group_Status: String { return self._s[4501]! } + public var Month_ShortJune: String { return self._s[4494]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Placeholder: String { return self._s[4495]! } + public var Call_ReportSend: String { return self._s[4496]! } + public var Watch_LastSeen_JustNow: String { return self._s[4497]! } + public var Notifications_MessageNotifications: String { return self._s[4498]! } + public var WallpaperSearch_ColorGreen: String { return self._s[4499]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4501]! } + public var Group_Status: String { return self._s[4502]! } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4502]!, self._r[4502]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4503]!, self._r[4503]!, [_0, _1]) } - public var TextFormat_AddLinkTitle: String { return self._s[4503]! } - public var ShareMenu_ShareTo: String { return self._s[4504]! } - public var Conversation_Moderate_Ban: String { return self._s[4505]! } + public var TextFormat_AddLinkTitle: String { return self._s[4504]! } + public var ShareMenu_ShareTo: String { return self._s[4505]! } + public var Conversation_Moderate_Ban: String { return self._s[4506]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4506]!, self._r[4506]!, [_0]) + return formatWithArgumentRanges(self._s[4507]!, self._r[4507]!, [_0]) } - public var SharedMedia_ViewInChat: String { return self._s[4507]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4508]! } + public var SharedMedia_ViewInChat: String { return self._s[4508]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4509]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4509]!, self._r[4509]!, [_1]) + return formatWithArgumentRanges(self._s[4510]!, self._r[4510]!, [_1]) } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4510]!, self._r[4510]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4511]!, self._r[4511]!, [_1, _2]) } public func Map_AccurateTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4512]!, self._r[4512]!, [_0]) + return formatWithArgumentRanges(self._s[4513]!, self._r[4513]!, [_0]) } - public var Map_OpenInHereMaps: String { return self._s[4513]! } - public var Appearance_ReduceMotion: String { return self._s[4514]! } + public var Map_OpenInHereMaps: String { return self._s[4514]! } + public var Appearance_ReduceMotion: String { return self._s[4515]! } public func PUSH_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4515]!, self._r[4515]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4516]!, self._r[4516]!, [_1, _2]) } - public var Channel_Setup_TypePublicHelp: String { return self._s[4516]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[4517]! } - public var PhotoEditor_Skip: String { return self._s[4518]! } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public var Channel_Setup_TypePublicHelp: String { return self._s[4517]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[4518]! } + public var PhotoEditor_Skip: String { return self._s[4519]! } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func OldChannels_InactiveYear(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_SelectedMessages(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Hours(_ value: Int32) -> String { + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func Call_Seconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func Watch_UserInfo_Mute(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { + public func MuteFor_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func Passport_Scans(_ value: Int32) -> String { + public func ForwardedAudios(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Minutes(_ value: Int32) -> String { + public func SharedMedia_Video(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + public func Invitation_Members(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, _1, _2) + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func PollResults_ShowMore(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_MessageViews(_ value: Int32) -> String { + public func OldChannels_InactiveWeek(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + public func Map_ETAMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideoMessages(_ value: Int32) -> String { + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_StatusOnline(_ value: Int32) -> String { + public func ForwardedStickers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedFiles(_ value: Int32) -> String { + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func Notifications_Exceptions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func SharedMedia_Photo(_ value: Int32) -> String { + public func AttachmentMenu_SendGif(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortHours(_ value: Int32) -> String { + public func SharedMedia_Generic(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) } - public func MessageTimer_Weeks(_ value: Int32) -> String { + public func Conversation_StatusMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Seconds(_ value: Int32) -> String { + public func MuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_MessageForwards(_ value: Int32) -> String { + public func Call_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { + public func Call_ShortMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ value: Int32) -> String { + public func SharedMedia_Photo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedLocations(_ value: Int32) -> String { + public func Stats_MessageViews(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + public func QuickSend_Photos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { + public func Contacts_ImportersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) } - public func InstantPage_Views(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func Stats_MessageForwards(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) @@ -5266,346 +5266,350 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_InviteContacts(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _1, _2) } - public func ForwardedPolls(_ value: Int32) -> String { + public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_MessageVideos(_ value: Int32) -> String { + public func SharedMedia_File(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func MuteExpires_Days(_ value: Int32) -> String { + public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_SharePhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func Stats_GroupTopAdminBans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) } public func UserCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func Call_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) } - public func Theme_UsersCount(_ value: Int32) -> String { + public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessagePhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Media_ShareItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) } public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Generic(_ value: Int32) -> String { + public func Passport_Scans(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessagePoll_VotedCount(_ value: Int32) -> String { + public func ChatList_DeletedChats(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_Leave(_ value: Int32) -> String { + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedPolls(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Seconds(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } public func ForwardedMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_StickerCount(_ value: Int32) -> String { + public func AttachmentMenu_SendItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessagePhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveMonth(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopPosterChars(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_InviteContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) } public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) } public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedGifs(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InstantPage_Views(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminBans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { + public func ChatList_MessageVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) @@ -5615,82 +5619,81 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_SelectedChats(_ value: Int32) -> String { + public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAudios(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) } - public func Invitation_Members(_ value: Int32) -> String { + public func OldChannels_GroupFormat(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_GroupFormat(_ value: Int32) -> String { + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_GroupTopPosterChars(_ value: Int32) -> String { + public func Conversation_StatusOnline(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + public func MessageTimer_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, stringValue) } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { + public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Hours(_ value: Int32) -> String { + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) } - public func QuickSend_Photos(_ value: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveYear(_ value: Int32) -> String { + public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeletedChats(_ value: Int32) -> String { + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func OldChannels_Leave(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, _1, _2) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index 1e3047abeaff10f2f23b67ac6462bf1364fa2d0e..c48a93109ff917439e47863de6a2606aeeff9d9e 100644 GIT binary patch delta 16308 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 HA&37DTF0$~ diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index a475c1be81..d248495c13 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -228,15 +228,20 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } if let telegramDice = self.telegramDice { - let animationNode = ManagedDiceAnimationNode(context: item.context, emoji: telegramDice.emoji.strippedEmoji) - if !item.message.effectivelyIncoming(item.context.account.peerId) { - animationNode.success = { [weak self] in - if let strongSelf = self, let item = strongSelf.item { - item.controllerInteraction.animateDiceSuccess() + if telegramDice.emoji == "🎲" { + let animationNode = SlotMachineAnimationNode(context: item.context) + self.animationNode = animationNode + } else { + let animationNode = ManagedDiceAnimationNode(context: item.context, emoji: telegramDice.emoji.strippedEmoji) + if !item.message.effectivelyIncoming(item.context.account.peerId) { + animationNode.success = { [weak self] in + if let strongSelf = self, let item = strongSelf.item { + item.controllerInteraction.animateDiceSuccess() + } } } + self.animationNode = animationNode } - self.animationNode = animationNode } else { let animationNode: AnimatedStickerNode if let (node, parentNode, listNode, greetingCompletion) = item.controllerInteraction.greetingStickerNode(), let greetingStickerNode = node as? AnimatedStickerNode { @@ -290,7 +295,13 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { self.setupNode(item: item) - if let telegramDice = self.telegramDice, let diceNode = self.animationNode as? ManagedDiceAnimationNode { + if let telegramDice = self.telegramDice, let diceNode = self.animationNode as? SlotMachineAnimationNode { + if let value = telegramDice.value { + diceNode.setState(value == 0 ? .rolling : .value(value, true)) + } else { + diceNode.setState(.rolling) + } + } else if let telegramDice = self.telegramDice, let diceNode = self.animationNode as? ManagedDiceAnimationNode { if let value = telegramDice.value { diceNode.setState(value == 0 ? .rolling : .value(value, true)) } else { diff --git a/submodules/TelegramUI/Sources/SlotMachineAnimationNode.swift b/submodules/TelegramUI/Sources/SlotMachineAnimationNode.swift new file mode 100644 index 0000000000..179c62f895 --- /dev/null +++ b/submodules/TelegramUI/Sources/SlotMachineAnimationNode.swift @@ -0,0 +1,241 @@ +import Foundation +import Display +import AsyncDisplayKit +import Postbox +import SyncCore +import TelegramCore +import SwiftSignalKit +import AccountContext +import StickerResources +import ManagedAnimationNode + +enum ReelValue { + case rolling + case bar + case berries + case lemon + case seven + case sevenWin +} + +private func leftReelAnimationItem(value: ReelValue, immediate: Bool = false) -> ManagedAnimationItem { + let frames: ManagedAnimationFrameRange? = immediate ? .still(.end) : nil + switch value { + case .rolling: + return ManagedAnimationItem(source: .local("Slot_L_Spinning"), loop: true) + case .bar: + return ManagedAnimationItem(source: .local("Slot_L_Bar"), frames: frames, loop: false) + case .berries: + return ManagedAnimationItem(source: .local("Slot_L_Berries"), frames: frames, loop: false) + case .lemon: + return ManagedAnimationItem(source: .local("Slot_L_Lemon"), frames: frames, loop: false) + case .seven: + return ManagedAnimationItem(source: .local("Slot_L_7"), frames: frames, loop: false) + case .sevenWin: + return ManagedAnimationItem(source: .local("Slot_L_7_Win"), frames: frames, loop: false) + } +} + +private func centerReelAnimationItem(value: ReelValue, immediate: Bool = false) -> ManagedAnimationItem { + let frames: ManagedAnimationFrameRange? = immediate ? .still(.end) : nil + switch value { + case .rolling: + return ManagedAnimationItem(source: .local("Slot_M_Spinning"), frames: frames, loop: true) + case .bar: + return ManagedAnimationItem(source: .local("Slot_M_Bar"), frames: frames, loop: false) + case .berries: + return ManagedAnimationItem(source: .local("Slot_M_Berries"), frames: frames, loop: false) + case .lemon: + return ManagedAnimationItem(source: .local("Slot_M_Lemon"), frames: frames, loop: false) + case .seven: + return ManagedAnimationItem(source: .local("Slot_M_7"), frames: frames, loop: false) + case .sevenWin: + return ManagedAnimationItem(source: .local("Slot_M_7_Win"), frames: frames, loop: false) + } +} + +private func rightReelAnimationItem(value: ReelValue, immediate: Bool = false) -> ManagedAnimationItem { + let frames: ManagedAnimationFrameRange? = immediate ? .still(.end) : nil + switch value { + case .rolling: + return ManagedAnimationItem(source: .local("Slot_R_Spinning"), frames: frames, loop: true) + case .bar: + return ManagedAnimationItem(source: .local("Slot_R_Bar"), frames: frames, loop: false) + case .berries: + return ManagedAnimationItem(source: .local("Slot_R_Berries"), frames: frames, loop: false) + case .lemon: + return ManagedAnimationItem(source: .local("Slot_R_Lemon"), frames: frames, loop: false) + case .seven: + return ManagedAnimationItem(source: .local("Slot_R_7"), frames: frames, loop: false) + case .sevenWin: + return ManagedAnimationItem(source: .local("Slot_R_7_Win"), frames: frames, loop: false) + } +} + +final class SlotMachineAnimationNode: ASDisplayNode, GenericAnimatedStickerNode { + private let context: AccountContext + + private let backNode: ManagedAnimationNode + private let leftReelNode: ManagedAnimationNode + private let centerReelNode: ManagedAnimationNode + private let rightReelNode: ManagedAnimationNode + private let frontNode: ManagedAnimationNode + + private var diceState: ManagedDiceAnimationState? = nil + private let disposables = DisposableSet() + + init(context: AccountContext) { + self.context = context + + let size = CGSize(width: 184.0, height: 184.0) + self.backNode = ManagedAnimationNode(size: size) + self.leftReelNode = ManagedAnimationNode(size: size) + self.centerReelNode = ManagedAnimationNode(size: size) + self.rightReelNode = ManagedAnimationNode(size: size) + self.frontNode = ManagedAnimationNode(size: size) + + super.init() + + self.addSubnode(self.backNode) + self.addSubnode(self.leftReelNode) + self.addSubnode(self.centerReelNode) + self.addSubnode(self.rightReelNode) + self.addSubnode(self.frontNode) + } + + deinit { + self.disposables.dispose() + } + + override func layout() { + super.layout() + + self.backNode.frame = self.bounds + self.leftReelNode.frame = self.bounds + self.centerReelNode.frame = self.bounds + self.rightReelNode.frame = self.bounds + self.frontNode.frame = self.bounds + } + + func setState(_ diceState: ManagedDiceAnimationState) { + let previousState = self.diceState + self.diceState = diceState + + if let previousState = previousState { + switch previousState { + case .rolling: + switch diceState { + case let .value(value, _): + let l: ReelValue + let c: ReelValue + let r: ReelValue + switch value { + case 1: + l = .seven + c = .berries + r = .bar + case 2: + l = .berries + c = .berries + r = .bar + case 3: + l = .seven + c = .berries + r = .seven + case 4: + l = .bar + c = .lemon + r = .seven + case 5: + l = .berries + c = .berries + r = .berries + case 6: + l = .sevenWin + c = .sevenWin + r = .sevenWin + default: + l = .sevenWin + c = .sevenWin + r = .sevenWin + } + if value == 6 { + Queue.mainQueue().after(1.5) { + self.backNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Back_Win"), loop: false)) + } + } else { + self.backNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Back_Idle"), loop: false)) + } + self.leftReelNode.trackTo(item: leftReelAnimationItem(value: l)) + self.centerReelNode.trackTo(item: centerReelAnimationItem(value: c)) + self.rightReelNode.trackTo(item: rightReelAnimationItem(value: r)) + self.frontNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Front_Pull"), frames: .still(.end), loop: false)) + case .rolling: + break + } + case .value: + switch diceState { + case .rolling: + self.backNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Back_Idle"), loop: false)) + self.leftReelNode.trackTo(item: leftReelAnimationItem(value: .rolling)) + self.centerReelNode.trackTo(item: centerReelAnimationItem(value: .rolling)) + self.rightReelNode.trackTo(item: rightReelAnimationItem(value: .rolling)) + self.frontNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Front_Pull"), loop: false)) + case .value: + break + } + } + } else { + switch diceState { + case let .value(value, immediate): + self.backNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Back_Idle"), loop: false)) + + let l: ReelValue + let c: ReelValue + let r: ReelValue + switch value { + case 1: + l = .seven + c = .berries + r = .bar + case 2: + l = .berries + c = .berries + r = .bar + case 3: + l = .seven + c = .berries + r = .seven + case 4: + l = .bar + c = .lemon + r = .seven + case 5: + l = .berries + c = .berries + r = .berries + case 6: + l = .sevenWin + c = .sevenWin + r = .sevenWin + default: + l = .sevenWin + c = .sevenWin + r = .sevenWin + } + self.leftReelNode.trackTo(item: leftReelAnimationItem(value: l, immediate: immediate)) + self.centerReelNode.trackTo(item: centerReelAnimationItem(value: c, immediate: immediate)) + self.rightReelNode.trackTo(item: rightReelAnimationItem(value: r, immediate: immediate)) + + let frames: ManagedAnimationFrameRange? = immediate ? .still(.end) : nil + self.frontNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Front_Pull"), frames: frames, loop: false)) + case .rolling: + self.backNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Back_Idle"), loop: false)) + self.leftReelNode.trackTo(item: leftReelAnimationItem(value: .rolling)) + self.centerReelNode.trackTo(item: centerReelAnimationItem(value: .rolling)) + self.rightReelNode.trackTo(item: rightReelAnimationItem(value: .rolling)) + self.frontNode.trackTo(item: ManagedAnimationItem(source: .local("Slot_Front_Pull"), loop: false)) + } + } + } +} From 425a95514cfff639d4984498739d76c2bf4e2116 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 19 Aug 2020 19:12:38 +0300 Subject: [PATCH 03/10] Various fixes --- Telegram/NotificationService/Serialization.m | 2 +- Telegram/Telegram-iOS/Info.plist | 1 + Telegram/Telegram-iOS/InfoBazel.plist | 1 + submodules/AnimatedStickerNode/BUCK | 1 + submodules/AnimatedStickerNode/BUILD | 1 + .../Sources/AnimatedStickerNode.swift | 47 +- .../Sources/FitzModifier.swift | 76 ++ submodules/CountrySelectionUI/BUCK | 1 + submodules/CountrySelectionUI/BUILD | 1 + ...onSequenceCountrySelectionController.swift | 43 +- submodules/Display/Source/Font.swift | 10 + .../TGMediaPickerGalleryVideoItemView.m | 4 +- .../ChannelOwnershipTransferController.swift | 31 +- .../Sources/PhoneInputNode.swift | 53 +- .../Sources/ShareController.swift | 155 +++ .../Sources/ReplyMarkupMessageAttribute.swift | 7 +- .../Sources/AnimatedStickerUtils.swift | 74 +- submodules/TelegramApi/Sources/Api0.swift | 21 +- submodules/TelegramApi/Sources/Api1.swift | 158 ++- submodules/TelegramApi/Sources/Api2.swift | 202 +++ submodules/TelegramApi/Sources/Api3.swift | 203 +-- .../Sources/CallControllerNode.swift | 4 + .../Sources/AccountViewTracker.swift | 19 +- .../Sources/ChannelOwnershipTransfer.swift | 2 +- .../TelegramCore/Sources/Countries.swift | 72 ++ .../Sources/ReplyMarkupMessageAttribute.swift | 4 +- .../RequestMessageActionCallback.swift | 156 ++- .../TelegramCore/Sources/Serialization.swift | 2 +- .../Sources/StoreMessage_Telegram.swift | 20 +- .../Sources/UpdateMessageService.swift | 4 +- .../Sources/PresentationStrings.swift | 1126 ++++++++--------- .../Resources/PresentationStrings.mapping | Bin 154846 -> 154846 bytes ...rizationSequencePhoneEntryController.swift | 2 + ...tionSequencePhoneEntryControllerNode.swift | 14 +- .../Sources/ChatButtonKeyboardInputNode.swift | 6 +- .../TelegramUI/Sources/ChatController.swift | 111 +- .../Sources/ChatControllerInteraction.swift | 6 +- .../ChatMessageAnimatedStickerItemNode.swift | 39 +- .../Sources/ChatMessageBubbleItemNode.swift | 5 + .../ChatMessageDateAndStatusNode.swift | 1 + .../ChatMessageGameBubbleContentNode.swift | 2 +- .../Sources/ChatMessageItemView.swift | 6 +- .../ChatRecentActionsControllerNode.swift | 2 +- .../Sources/DrawingStickersScreen.swift | 2 +- .../TelegramUI/Sources/HeartbeatHaptic.swift | 11 +- .../Sources/OverlayPlayerControllerNode.swift | 2 +- .../Sources/OwnershipTransferController.swift | 128 ++ .../TelegramUI/Sources/PeachHaptic.swift | 73 ++ .../Sources/PeerInfo/PeerInfoScreen.swift | 2 +- .../PeerMediaCollectionController.swift | 2 +- .../Sources/SharedAccountContext.swift | 2 +- .../Sources/TelegramRootController.swift | 150 +++ submodules/TgVoipWebrtc/tgcalls | 2 +- third-party/webrtc/webrtc-ios | 2 +- 54 files changed, 2129 insertions(+), 942 deletions(-) create mode 100644 submodules/AnimatedStickerNode/Sources/FitzModifier.swift create mode 100644 submodules/TelegramCore/Sources/Countries.swift create mode 100644 submodules/TelegramUI/Sources/OwnershipTransferController.swift create mode 100644 submodules/TelegramUI/Sources/PeachHaptic.swift diff --git a/Telegram/NotificationService/Serialization.m b/Telegram/NotificationService/Serialization.m index 3d92dca7b9..ddfa890a93 100644 --- a/Telegram/NotificationService/Serialization.m +++ b/Telegram/NotificationService/Serialization.m @@ -3,7 +3,7 @@ @implementation Serialization - (NSUInteger)currentLayer { - return 117; + return 118; } - (id _Nullable)parseMessage:(NSData * _Nullable)data { diff --git a/Telegram/Telegram-iOS/Info.plist b/Telegram/Telegram-iOS/Info.plist index f66daefe49..a34aee90c5 100644 --- a/Telegram/Telegram-iOS/Info.plist +++ b/Telegram/Telegram-iOS/Info.plist @@ -264,6 +264,7 @@ onionhttp ucbrowser dolphin + instagram-stories LSRequiresIPhoneOS diff --git a/Telegram/Telegram-iOS/InfoBazel.plist b/Telegram/Telegram-iOS/InfoBazel.plist index e7ca119cd8..ae1b92de45 100644 --- a/Telegram/Telegram-iOS/InfoBazel.plist +++ b/Telegram/Telegram-iOS/InfoBazel.plist @@ -98,6 +98,7 @@ onionhttp ucbrowser dolphin + instagram-stories LSRequiresIPhoneOS diff --git a/submodules/AnimatedStickerNode/BUCK b/submodules/AnimatedStickerNode/BUCK index bdc95d5051..1e6a948afa 100644 --- a/submodules/AnimatedStickerNode/BUCK +++ b/submodules/AnimatedStickerNode/BUCK @@ -12,6 +12,7 @@ static_library( "//submodules/YuvConversion:YuvConversion", "//submodules/GZip:GZip", "//submodules/rlottie:RLottieBinding", + "//submodules/MediaResources:MediaResources", ], frameworks = [ "$SDKROOT/System/Library/Frameworks/Foundation.framework", diff --git a/submodules/AnimatedStickerNode/BUILD b/submodules/AnimatedStickerNode/BUILD index bf1ba42bdd..655f34543c 100644 --- a/submodules/AnimatedStickerNode/BUILD +++ b/submodules/AnimatedStickerNode/BUILD @@ -13,6 +13,7 @@ swift_library( "//submodules/YuvConversion:YuvConversion", "//submodules/GZip:GZip", "//submodules/rlottie:RLottieBinding", + "//submodules/MediaResources:MediaResources", ], visibility = [ "//visibility:public", diff --git a/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift b/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift index ebbf1292e8..b8f4989a31 100644 --- a/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift +++ b/submodules/AnimatedStickerNode/Sources/AnimatedStickerNode.swift @@ -6,6 +6,7 @@ import AsyncDisplayKit import RLottieBinding import GZip import YuvConversion +import MediaResources private let sharedQueue = Queue() private let sharedStoreQueue = Queue.concurrentDefaultQueue() @@ -438,7 +439,7 @@ private final class AnimatedStickerDirectFrameSourceCache { private var scratchBuffer: Data private var decodeBuffer: Data - init?(queue: Queue, pathPrefix: String, width: Int, height: Int, frameCount: Int) { + init?(queue: Queue, pathPrefix: String, width: Int, height: Int, frameCount: Int, fitzModifier: EmojiFitzModifier?) { self.queue = queue self.storeQueue = sharedStoreQueue @@ -446,7 +447,13 @@ private final class AnimatedStickerDirectFrameSourceCache { self.width = width self.height = height - let path = "\(pathPrefix)_\(width):\(height).stickerframecache" + let suffix : String + if let fitzModifier = fitzModifier { + suffix = "_fitz\(fitzModifier.rawValue)" + } else { + suffix = "" + } + let path = "\(pathPrefix)_\(width):\(height)\(suffix).stickerframecache" var file = ManagedFileImpl(queue: queue, path: path, mode: .readwrite) if let file = file { self.file = file @@ -594,7 +601,7 @@ private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource return self.currentFrame % self.frameCount } - init?(queue: Queue, data: Data, width: Int, height: Int, cachePathPrefix: String?) { + init?(queue: Queue, data: Data, width: Int, height: Int, cachePathPrefix: String?, fitzModifier: EmojiFitzModifier?) { self.queue = queue self.data = data self.width = width @@ -602,7 +609,9 @@ private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource self.bytesPerRow = (4 * Int(width) + 15) & (~15) self.currentFrame = 0 let rawData = TGGUnzipData(data, 8 * 1024 * 1024) ?? data - guard let animation = LottieInstance(data: rawData, cacheKey: "") else { + let decompressedData = transformedWithFitzModifier(data: rawData, fitzModifier: fitzModifier) + + guard let animation = LottieInstance(data: decompressedData, cacheKey: "") else { return nil } self.animation = animation @@ -611,7 +620,7 @@ private final class AnimatedStickerDirectFrameSource: AnimatedStickerFrameSource self.frameRate = Int(animation.frameRate) self.cache = cachePathPrefix.flatMap { cachePathPrefix in - AnimatedStickerDirectFrameSourceCache(queue: queue, pathPrefix: cachePathPrefix, width: width, height: height, frameCount: frameCount) + AnimatedStickerDirectFrameSourceCache(queue: queue, pathPrefix: cachePathPrefix, width: width, height: height, frameCount: frameCount, fitzModifier: fitzModifier) } } @@ -698,11 +707,15 @@ public struct AnimatedStickerStatus: Equatable { } public protocol AnimatedStickerNodeSource { + var fitzModifier: EmojiFitzModifier? { get } + func cachedDataPath(width: Int, height: Int) -> Signal<(String, Bool), NoError> func directDataPath() -> Signal } public final class AnimatedStickerNodeLocalFileSource: AnimatedStickerNodeSource { + public var fitzModifier: EmojiFitzModifier? = nil + public let path: String public init(path: String) { @@ -733,8 +746,8 @@ public final class AnimatedStickerNode: ASDisplayNode { private let timer = Atomic(value: nil) private let frameSource = Atomic?>(value: nil) - private var directData: (Data, String, Int, Int, String?)? - private var cachedData: (Data, Bool)? + private var directData: (Data, String, Int, Int, String?, EmojiFitzModifier?)? + private var cachedData: (Data, Bool, EmojiFitzModifier?)? private var renderer: (AnimationRenderer & ASDisplayNode)? @@ -809,7 +822,7 @@ public final class AnimatedStickerNode: ASDisplayNode { return } if let directData = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { - strongSelf.directData = (directData, path, width, height, cachePathPrefix) + strongSelf.directData = (directData, path, width, height, cachePathPrefix, source.fitzModifier) } if case let .still(position) = playbackMode { strongSelf.seekTo(position) @@ -830,9 +843,9 @@ public final class AnimatedStickerNode: ASDisplayNode { return } if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) { - if let (_, currentComplete) = strongSelf.cachedData { + if let (_, currentComplete, _) = strongSelf.cachedData { if !currentComplete { - strongSelf.cachedData = (data, complete) + strongSelf.cachedData = (data, complete, source.fitzModifier) strongSelf.frameSource.with { frameSource in frameSource?.with { frameSource in if let frameSource = frameSource.value as? AnimatedStickerCachedFrameSource { @@ -842,7 +855,7 @@ public final class AnimatedStickerNode: ASDisplayNode { } } } else { - strongSelf.cachedData = (data, complete) + strongSelf.cachedData = (data, complete, source.fitzModifier) if strongSelf.isPlaying { strongSelf.play() } else if strongSelf.canDisplayFirstFrame { @@ -892,8 +905,8 @@ public final class AnimatedStickerNode: ASDisplayNode { if maybeFrameSource == nil { let notifyUpdated: (() -> Void)? = nil if let directData = directData { - maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3, cachePathPrefix: directData.4) - } else if let (cachedData, cachedDataComplete) = cachedData { + maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3, cachePathPrefix: directData.4, fitzModifier: directData.5) + } else if let (cachedData, cachedDataComplete, _) = cachedData { if #available(iOS 9.0, *) { maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData, complete: cachedDataComplete, notifyUpdated: { notifyUpdated?() @@ -964,8 +977,8 @@ public final class AnimatedStickerNode: ASDisplayNode { var maybeFrameSource: AnimatedStickerFrameSource? let notifyUpdated: (() -> Void)? = nil if let directData = directData { - maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3, cachePathPrefix: directData.4) - } else if let (cachedData, cachedDataComplete) = cachedData { + maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3, cachePathPrefix: directData.4, fitzModifier: directData.5) + } else if let (cachedData, cachedDataComplete, _) = cachedData { if #available(iOS 9.0, *) { maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData, complete: cachedDataComplete, notifyUpdated: { notifyUpdated?() @@ -1054,11 +1067,11 @@ public final class AnimatedStickerNode: ASDisplayNode { } else { var maybeFrameSource: AnimatedStickerFrameSource? if let directData = directData { - maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3, cachePathPrefix: directData.4) + maybeFrameSource = AnimatedStickerDirectFrameSource(queue: queue, data: directData.0, width: directData.2, height: directData.3, cachePathPrefix: directData.4, fitzModifier: directData.5) if case .end = position { maybeFrameSource?.skipToEnd() } - } else if let (cachedData, cachedDataComplete) = cachedData { + } else if let (cachedData, cachedDataComplete, _) = cachedData { if #available(iOS 9.0, *) { maybeFrameSource = AnimatedStickerCachedFrameSource(queue: queue, data: cachedData, complete: cachedDataComplete, notifyUpdated: {}) } diff --git a/submodules/AnimatedStickerNode/Sources/FitzModifier.swift b/submodules/AnimatedStickerNode/Sources/FitzModifier.swift new file mode 100644 index 0000000000..b033905a2c --- /dev/null +++ b/submodules/AnimatedStickerNode/Sources/FitzModifier.swift @@ -0,0 +1,76 @@ +import Foundation +import UIKit +import MediaResources + +let colorKeyRegex = try? NSRegularExpression(pattern: "\"k\":\\[[\\d\\.]+\\,[\\d\\.]+\\,[\\d\\.]+\\,[\\d\\.]+\\]") + +public func transformedWithFitzModifier(data: Data, fitzModifier: EmojiFitzModifier?) -> Data { + if let fitzModifier = fitzModifier, var string = String(data: data, encoding: .utf8) { + let colors: [UIColor] = [0xf77e41, 0xffb139, 0xffd140, 0xffdf79].map { UIColor(rgb: $0) } + let replacementColors: [UIColor] + switch fitzModifier { + case .type12: + replacementColors = [0xca907a, 0xedc5a5, 0xf7e3c3, 0xfbefd6].map { UIColor(rgb: $0) } + case .type3: + replacementColors = [0xaa7c60, 0xc8a987, 0xddc89f, 0xe6d6b2].map { UIColor(rgb: $0) } + case .type4: + replacementColors = [0x8c6148, 0xad8562, 0xc49e76, 0xd4b188].map { UIColor(rgb: $0) } + case .type5: + replacementColors = [0x6e3c2c, 0x925a34, 0xa16e46, 0xac7a52].map { UIColor(rgb: $0) } + case .type6: + replacementColors = [0x291c12, 0x472a22, 0x573b30, 0x68493c].map { UIColor(rgb: $0) } + } + + func colorToString(_ color: UIColor) -> String { + var r: CGFloat = 0.0 + var g: CGFloat = 0.0 + var b: CGFloat = 0.0 + if color.getRed(&r, green: &g, blue: &b, alpha: nil) { + return "\"k\":[\(r),\(g),\(b),1]" + } + return "" + } + + func match(_ a: Double, _ b: Double, eps: Double) -> Bool { + return abs(a - b) < eps + } + + var replacements: [(NSTextCheckingResult, String)] = [] + + if let colorKeyRegex = colorKeyRegex { + let results = colorKeyRegex.matches(in: string, range: NSRange(string.startIndex..., in: string)) + for result in results.reversed() { + if let range = Range(result.range, in: string) { + let substring = String(string[range]) + let color = substring[substring.index(string.startIndex, offsetBy: "\"k\":[".count) ..< substring.index(before: substring.endIndex)] + let components = color.split(separator: ",") + if components.count == 4, let r = Double(components[0]), let g = Double(components[1]), let b = Double(components[2]), let a = Double(components[3]) { + if match(a, 1.0, eps: 0.01) { + for i in 0 ..< colors.count { + let color = colors[i] + var cr: CGFloat = 0.0 + var cg: CGFloat = 0.0 + var cb: CGFloat = 0.0 + if color.getRed(&cr, green: &cg, blue: &cb, alpha: nil) { + if match(r, Double(cr), eps: 0.01) && match(g, Double(cg), eps: 0.01) && match(b, Double(cb), eps: 0.01) { + replacements.append((result, colorToString(replacementColors[i]))) + } + } + } + } + } + } + } + } + + for (result, text) in replacements { + if let range = Range(result.range, in: string) { + string = string.replacingCharacters(in: range, with: text) + } + } + + return string.data(using: .utf8) ?? data + } else { + return data + } +} diff --git a/submodules/CountrySelectionUI/BUCK b/submodules/CountrySelectionUI/BUCK index d42c4ed704..03763af9f3 100644 --- a/submodules/CountrySelectionUI/BUCK +++ b/submodules/CountrySelectionUI/BUCK @@ -9,6 +9,7 @@ static_library( "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit#shared", "//submodules/AsyncDisplayKit:AsyncDisplayKit#shared", "//submodules/Display:Display#shared", + "//submodules/TelegramCore:TelegramCore#shared", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/TelegramStringFormatting:TelegramStringFormatting", "//submodules/SearchBarNode:SearchBarNode", diff --git a/submodules/CountrySelectionUI/BUILD b/submodules/CountrySelectionUI/BUILD index 7fcc859b8b..368cd0b914 100644 --- a/submodules/CountrySelectionUI/BUILD +++ b/submodules/CountrySelectionUI/BUILD @@ -10,6 +10,7 @@ swift_library( "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/AsyncDisplayKit:AsyncDisplayKit", "//submodules/Display:Display", + "//submodules/TelegramCore:TelegramCore", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/TelegramStringFormatting:TelegramStringFormatting", "//submodules/SearchBarNode:SearchBarNode", diff --git a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift index 13e2fdbe3c..eadca6c645 100644 --- a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift +++ b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift @@ -2,12 +2,14 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import SwiftSignalKit import TelegramPresentationData import TelegramStringFormatting import SearchBarNode import AppBundle +import TelegramCore -private func loadCountryCodes() -> [(String, Int)] { +private func loadCountryCodes() -> [Country] { guard let filePath = getAppBundle().path(forResource: "PhoneCountries", ofType: "txt") else { return [] } @@ -21,10 +23,12 @@ private func loadCountryCodes() -> [(String, Int)] { let delimiter = ";" let endOfLine = "\n" - var result: [(String, Int)] = [] + var result: [Country] = [] var currentLocation = data.startIndex + let locale = Locale(identifier: "en-US") + while true { guard let codeRange = data.range(of: delimiter, options: [], range: currentLocation ..< data.endIndex) else { break @@ -40,8 +44,9 @@ private func loadCountryCodes() -> [(String, Int)] { let maybeNameRange = data.range(of: endOfLine, options: [], range: idRange.upperBound ..< data.endIndex) + let countryName = locale.localizedString(forIdentifier: countryId) ?? "" if let countryCodeInt = Int(countryCode) { - result.append((countryId, countryCodeInt)) + result.append(Country(code: countryId, defaultName: countryName, name: countryName, countryCodes: [Country.CountryCode(code: countryCode, prefixes: [], patterns: [])])) } if let maybeNameRange = maybeNameRange { @@ -54,7 +59,14 @@ private func loadCountryCodes() -> [(String, Int)] { return result } -private let countryCodes: [(String, Int)] = loadCountryCodes() +private var countryCodes: [Country] = loadCountryCodes() + +public func loadServerCountryCodes(network: Network) { + let _ = (getCountriesList(network: network, langCode: "") + |> deliverOnMainQueue).start(next: { countries in + countryCodes = countries + }) +} private final class AuthorizationSequenceCountrySelectionNavigationContentNode: NavigationBarContentNode { private let theme: PresentationTheme @@ -117,8 +129,8 @@ private final class AuthorizationSequenceCountrySelectionNavigationContentNode: public final class AuthorizationSequenceCountrySelectionController: ViewController { public static func lookupCountryNameById(_ id: String, strings: PresentationStrings) -> String? { - for (itemId, _) in countryCodes { - if id == itemId { + for country in countryCodes { + if id == country.code { let locale = localeWithStrings(strings) if let countryName = locale.localizedString(forRegionCode: id) { return countryName @@ -131,9 +143,22 @@ public final class AuthorizationSequenceCountrySelectionController: ViewControll } public static func lookupCountryIdByCode(_ code: Int) -> String? { - for (itemId, itemCode) in countryCodes { - if itemCode == code { - return itemId + for country in countryCodes { + for countryCode in country.countryCodes { + if countryCode.code == "\(code)" { + return country.code + } + } + } + return nil + } + + public static func lookupPatternByCode(_ code: Int) -> String? { + for country in countryCodes { + for countryCode in country.countryCodes { + if countryCode.code == "\(code)" { + return countryCode.patterns.first + } } } return nil diff --git a/submodules/Display/Source/Font.swift b/submodules/Display/Source/Font.swift index 0a9779afb6..674197bfea 100644 --- a/submodules/Display/Source/Font.swift +++ b/submodules/Display/Source/Font.swift @@ -22,6 +22,7 @@ public struct Font { public static let bold = Traits(rawValue: 1 << 0) public static let italic = Traits(rawValue: 1 << 1) + public static let monospacedNumbers = Traits(rawValue: 1 << 2) } public enum Weight { @@ -43,6 +44,15 @@ public struct Font { symbolicTraits.insert(.traitItalic) } var updatedDescriptor: UIFontDescriptor? = descriptor.withSymbolicTraits(symbolicTraits) + if traits.contains(.monospacedNumbers) { + updatedDescriptor = descriptor.addingAttributes([ + UIFontDescriptor.AttributeName.featureSettings: [ + [UIFontDescriptor.FeatureKey.featureIdentifier: + kNumberSpacingType, + UIFontDescriptor.FeatureKey.typeIdentifier: + kMonospacedNumbersSelector] + ]]) + } switch design { case .serif: updatedDescriptor = updatedDescriptor?.withDesign(.serif) diff --git a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryVideoItemView.m b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryVideoItemView.m index 84c7f381d7..208a6df4a3 100644 --- a/submodules/LegacyComponents/Sources/TGMediaPickerGalleryVideoItemView.m +++ b/submodules/LegacyComponents/Sources/TGMediaPickerGalleryVideoItemView.m @@ -1461,13 +1461,13 @@ NSMutableArray *actions = [[NSMutableArray alloc] init]; NSString *text = [self itemIsLivePhoto] ? TGLocalized(@"MediaPicker.LivePhotoDescription") : TGLocalized(@"MediaPicker.VideoMuteDescription"); [actions addObject:@{@"title":text}]; - _tooltipContainerView.menuView.forceArrowOnTop = true; + _tooltipContainerView.menuView.forceArrowOnTop = false; _tooltipContainerView.menuView.multiline = true; [_tooltipContainerView.menuView setButtonsAndActions:actions watcherHandle:nil]; _tooltipContainerView.menuView.buttonHighlightDisabled = true; [_tooltipContainerView.menuView sizeToFit]; - CGRect iconViewFrame = CGRectMake(12, 188 + _safeAreaInset.top, 40, 40); + CGRect iconViewFrame = CGRectMake(12, self.frame.size.height - 192.0 - _safeAreaInset.bottom, 40, 40); [_tooltipContainerView showMenuFromRect:iconViewFrame animated:false]; } diff --git a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift index b8ff2dde96..2dc4cd0c0f 100644 --- a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift @@ -173,12 +173,12 @@ private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UI } } -private final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { +public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { private let strings: PresentationStrings private let titleNode: ASTextNode private let textNode: ASTextNode - let inputFieldNode: ChannelOwnershipTransferPasswordFieldNode + fileprivate let inputFieldNode: ChannelOwnershipTransferPasswordFieldNode private let actionNodesSeparator: ASDisplayNode private let actionNodes: [TextAlertContentActionNode] @@ -190,18 +190,25 @@ private final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { private let hapticFeedback = HapticFeedback() - var complete: (() -> Void)? { + public var complete: (() -> Void)? { didSet { self.inputFieldNode.complete = self.complete } } - override var dismissOnOutsideTap: Bool { + public var theme: PresentationTheme { + didSet { + self.inputFieldNode.updateTheme(self.theme) + } + } + + public override var dismissOnOutsideTap: Bool { return self.isUserInteractionEnabled } - init(theme: AlertControllerTheme, ptheme: PresentationTheme, strings: PresentationStrings, actions: [TextAlertAction]) { + public init(theme: AlertControllerTheme, ptheme: PresentationTheme, strings: PresentationStrings, actions: [TextAlertAction]) { self.strings = strings + self.theme = ptheme self.titleNode = ASTextNode() self.titleNode.maximumNumberOfLines = 2 @@ -258,19 +265,19 @@ private final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { self.disposable.dispose() } - func dismissInput() { + public func dismissInput() { self.inputFieldNode.deactivateInput() } - var password: String { + public var password: String { return self.inputFieldNode.password } - func updateIsChecking(_ checking: Bool) { + public func updateIsChecking(_ checking: Bool) { self.inputFieldNode.updateIsChecking(checking) } - override func updateTheme(_ theme: AlertControllerTheme) { + public override func updateTheme(_ theme: AlertControllerTheme) { self.titleNode.attributedText = NSAttributedString(string: self.strings.Channel_OwnershipTransfer_EnterPassword, font: Font.bold(17.0), textColor: theme.primaryColor, paragraphAlignment: .center) self.textNode.attributedText = NSAttributedString(string: self.strings.Channel_OwnershipTransfer_EnterPasswordText, font: Font.regular(13.0), textColor: theme.primaryColor, paragraphAlignment: .center) @@ -281,13 +288,13 @@ private final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { for separatorNode in self.actionVerticalSeparators { separatorNode.backgroundColor = theme.separatorColor } - + if let size = self.validLayout { _ = self.updateLayout(size: size, transition: .immediate) } } - override func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) -> CGSize { + public override func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) -> CGSize { var size = size size.width = min(size.width, 270.0) let measureSize = CGSize(width: size.width - 16.0 * 2.0, height: CGFloat.greatestFiniteMagnitude) @@ -400,7 +407,7 @@ private final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { return resultSize } - func animateError() { + public func animateError() { self.inputFieldNode.updateIsInvalid() self.inputFieldNode.layer.addShakeAnimation() self.hapticFeedback.error() diff --git a/submodules/PhoneInputNode/Sources/PhoneInputNode.swift b/submodules/PhoneInputNode/Sources/PhoneInputNode.swift index 47bdad1865..f68af967e8 100644 --- a/submodules/PhoneInputNode/Sources/PhoneInputNode.swift +++ b/submodules/PhoneInputNode/Sources/PhoneInputNode.swift @@ -76,9 +76,24 @@ private func cleanSuffix(_ text: String) -> String { return result } +extension String { + func applyPatternOnNumbers(pattern: String, replacementCharacter: Character) -> String { + var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression) + for index in 0 ..< pattern.count { + guard index < pureNumber.count else { return pureNumber } + let stringIndex = String.Index(encodedOffset: index) + let patternCharacter = pattern[stringIndex] + guard patternCharacter != replacementCharacter else { continue } + pureNumber.insert(patternCharacter, at: stringIndex) + } + return pureNumber + } +} + public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { public let countryCodeField: TextFieldNode public let numberField: TextFieldNode + public let placeholderNode: ImmediateTextNode public var previousCountryCodeText = "+" public var previousNumberText = "" @@ -151,13 +166,33 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { private let phoneFormatter = InteractivePhoneFormatter() + public var mask: NSAttributedString? { + didSet { + self.updatePlaceholder() + } + } + + private func updatePlaceholder() { + if let mask = self.mask { + let mutableMask = NSMutableAttributedString(attributedString: mask) + mutableMask.replaceCharacters(in: NSRange(location: 0, length: mask.string.count), with: mask.string.replacingOccurrences(of: "X", with: "-")) + mutableMask.addAttribute(.foregroundColor, value: UIColor.clear, range: NSRange(location: 0, length: min(self.numberField.textField.text?.count ?? 0, mask.string.count))) + self.placeholderNode.attributedText = mutableMask + } else { + self.placeholderNode.attributedText = NSAttributedString(string: "") + } + let _ = self.placeholderNode.updateLayout(CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude)) + } + private let fontSize: CGFloat public init(fontSize: CGFloat = 20.0) { self.fontSize = fontSize + let font = Font.with(size: fontSize, design: .regular, traits: [.monospacedNumbers]) + self.countryCodeField = TextFieldNode() - self.countryCodeField.textField.font = Font.regular(fontSize) + self.countryCodeField.textField.font = font self.countryCodeField.textField.textAlignment = .center self.countryCodeField.textField.returnKeyType = .next if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { @@ -167,18 +202,21 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { self.countryCodeField.textField.keyboardType = .numberPad } + self.placeholderNode = ImmediateTextNode() + self.numberField = TextFieldNode() - self.numberField.textField.font = Font.regular(fontSize) + self.numberField.textField.font = font if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { self.numberField.textField.keyboardType = .asciiCapableNumberPad self.numberField.textField.textContentType = .telephoneNumber } else { self.numberField.textField.keyboardType = .numberPad } - + self.numberField.textField.defaultTextAttributes = [NSAttributedString.Key.font: font, NSAttributedString.Key.kern: 2.0] super.init() self.addSubnode(self.countryCodeField) + self.addSubnode(self.placeholderNode) self.addSubnode(self.numberField) self.numberField.textField.didDeleteBackwardWhileEmpty = { [weak self] in @@ -223,8 +261,9 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { private func updateNumber(_ inputText: String, tryRestoringInputPosition: Bool = true, forceNotifyCountryCodeUpdated: Bool = false) { let (regionPrefix, text) = self.phoneFormatter.updateText(inputText) + var realRegionPrefix: String - let numberText: String + var numberText: String if let regionPrefix = regionPrefix, !regionPrefix.isEmpty, regionPrefix != "+" { realRegionPrefix = cleanSuffix(regionPrefix) if !realRegionPrefix.hasPrefix("+") { @@ -239,6 +278,10 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { numberText = "" } + if let mask = self.mask { + numberText = numberText.applyPatternOnNumbers(pattern: mask.string, replacementCharacter: "X") + } + var focusOnNumber = false if realRegionPrefix != self.countryCodeField.textField.text { self.countryCodeField.textField.text = realRegionPrefix @@ -296,5 +339,7 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { if focusOnNumber && !self.numberField.textField.isFirstResponder { self.numberField.textField.becomeFirstResponder() } + + self.updatePlaceholder() } } diff --git a/submodules/ShareController/Sources/ShareController.swift b/submodules/ShareController/Sources/ShareController.swift index c87d6f1d32..f9ceae7bb1 100644 --- a/submodules/ShareController/Sources/ShareController.swift +++ b/submodules/ShareController/Sources/ShareController.swift @@ -593,6 +593,27 @@ public final class ShareController: ViewController { } self.controllerNode.shareExternal = { [weak self] in if let strongSelf = self { + if case let .messages(messages) = strongSelf.subject, let message = messages.first, let peer = message.peers[message.id.peerId] { + let renderer = MessageStoryRenderer(context: strongSelf.currentContext, messages: messages) + + let layout = ContainerViewLayout(size: CGSize(width: 414.0, height: 896.0), metrics: LayoutMetrics(widthClass: .compact, heightClass: .compact), deviceMetrics: .iPhoneX, intrinsicInsets: UIEdgeInsets(), safeInsets: UIEdgeInsets(), statusBarHeight: 0.0, inputHeight: nil, inputHeightIsInteractivellyChanging: false, inVoiceOver: false) + renderer.update(layout: layout) { image in + if let data = image?.pngData() { + let pasteboardItems: [[String: Any]] = [["com.instagram.sharedSticker.backgroundImage": data, + "com.instagram.sharedSticker.contentURL": "https://t.me/\(peer.addressName ?? "")/\(message.id.id)"]] + if #available(iOS 10.0, *) { + UIPasteboard.general.setItems(pasteboardItems, options: [.expirationDate: Date().addingTimeInterval(5 * 60)]) + } else { +// UIPasteboard.general.setItems(pasteboardItems) + } + strongSelf.sharedContext.applicationBindings.openUrl("instagram-stories://share") + } + } + + return .complete() + } + + var collectableItems: [CollectableExternalShareItem] = [] switch strongSelf.subject { case let .url(text): @@ -865,3 +886,137 @@ public final class ShareController: ViewController { })) } } + + +class MessageStoryRenderer { + private let context: AccountContext + private let presentationData: PresentationData + private let messages: [Message] + + let containerNode: ASDisplayNode + private let instantChatBackgroundNode: WallpaperBackgroundNode + private let messagesContainerNode: ASDisplayNode + private var dateHeaderNode: ListViewItemHeaderNode? + private var messageNodes: [ListViewItemNode]? + private let addressNode: ImmediateTextNode + + init(context: AccountContext, messages: [Message]) { + self.context = context + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.messages = messages + + self.containerNode = ASDisplayNode() + + self.instantChatBackgroundNode = WallpaperBackgroundNode() + self.instantChatBackgroundNode.displaysAsynchronously = false + self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: presentationData.theme, wallpaper: .builtin(WallpaperSettings()), mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) + + self.messagesContainerNode = ASDisplayNode() + self.messagesContainerNode.clipsToBounds = true + self.messagesContainerNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0) + + let message = messages.first! + let addressName = message.peers[message.id.peerId]?.addressName ?? "" + + self.addressNode = ImmediateTextNode() + self.addressNode.displaysAsynchronously = false + self.addressNode.attributedText = NSAttributedString(string: "t.me/\(addressName)/\(message.id.id)", font: Font.medium(14.0), textColor: UIColor(rgb: 0xa8b7c4)) +// self.addressNode.textShadowColor = .black + + self.containerNode.addSubnode(self.instantChatBackgroundNode) + self.containerNode.addSubnode(self.messagesContainerNode) + self.containerNode.addSubnode(self.addressNode) + } + + func update(layout: ContainerViewLayout, completion: @escaping (UIImage?) -> Void) { + self.updateMessagesLayout(layout: layout) + + Queue.mainQueue().after(0.01) { + UIGraphicsBeginImageContextWithOptions(layout.size, false, 3.0) + self.containerNode.view.drawHierarchy(in: CGRect(origin: CGPoint(), size: layout.size), afterScreenUpdates: true) + let img = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + completion(img) + } + } + + private func updateMessagesLayout(layout: ContainerViewLayout) { + let size = layout.size + self.containerNode.frame = CGRect(origin: CGPoint(), size: layout.size) + self.instantChatBackgroundNode.frame = CGRect(origin: CGPoint(), size: layout.size) + self.instantChatBackgroundNode.updateLayout(size: size, transition: .immediate) + self.messagesContainerNode.frame = CGRect(origin: CGPoint(), size: layout.size) + + let addressLayout = self.addressNode.updateLayout(size) + + let theme = self.presentationData.theme.withUpdated(preview: true) + let headerItem = self.context.sharedContext.makeChatMessageDateHeaderItem(context: self.context, timestamp: self.messages.first?.timestamp ?? 0, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder) + + var items: [ListViewItem] = [] + let sampleMessages: [Message] = self.messages + + items = sampleMessages.reversed().map { message in + self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.theme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil) + } + + let inset: CGFloat = 16.0 + let width = layout.size.width - inset * 2.0 + let params = ListViewItemLayoutParams(width: width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, availableHeight: layout.size.height) + if let messageNodes = self.messageNodes { + for i in 0 ..< items.count { + let itemNode = messageNodes[i] + items[i].updateNode(async: { $0() }, node: { + return itemNode + }, params: params, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], animation: .None, completion: { (layout, apply) in + let nodeFrame = CGRect(origin: CGPoint(x: 0.0, y: floor((size.height - layout.size.height) / 2.0)), size: CGSize(width: width, height: layout.size.height)) + + itemNode.contentSize = layout.contentSize + itemNode.insets = layout.insets + itemNode.frame = nodeFrame + itemNode.isUserInteractionEnabled = false + + apply(ListViewItemApply(isOnScreen: true)) + }) + } + } else { + var messageNodes: [ListViewItemNode] = [] + for i in 0 ..< items.count { + var itemNode: ListViewItemNode? + items[i].nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: true, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], completion: { node, apply in + itemNode = node + apply().1(ListViewItemApply(isOnScreen: true)) + }) + itemNode!.subnodeTransform = CATransform3DMakeScale(-1.0, 1.0, 1.0) + itemNode!.isUserInteractionEnabled = false + messageNodes.append(itemNode!) + self.messagesContainerNode.addSubnode(itemNode!) + } + self.messageNodes = messageNodes + } + + var bottomOffset: CGFloat = 0.0 + if let messageNodes = self.messageNodes { + for itemNode in messageNodes { + itemNode.frame = CGRect(origin: CGPoint(x: inset, y: floor((size.height - itemNode.frame.height) / 2.0)), size: itemNode.frame.size) + bottomOffset += itemNode.frame.maxY + itemNode.updateFrame(itemNode.frame, within: layout.size) + } + } + + self.addressNode.frame = CGRect(origin: CGPoint(x: inset + 16.0, y: bottomOffset + 3.0), size: CGSize(width: addressLayout.width, height: addressLayout.height + 3.0)) + + let dateHeaderNode: ListViewItemHeaderNode + if let currentDateHeaderNode = self.dateHeaderNode { + dateHeaderNode = currentDateHeaderNode + headerItem.updateNode(dateHeaderNode, previous: nil, next: headerItem) + } else { + dateHeaderNode = headerItem.node() + dateHeaderNode.subnodeTransform = CATransform3DMakeScale(-1.0, 1.0, 1.0) + self.messagesContainerNode.addSubnode(dateHeaderNode) + self.dateHeaderNode = dateHeaderNode + } + + dateHeaderNode.frame = CGRect(origin: CGPoint(x: 0.0, y: bottomOffset), size: CGSize(width: layout.size.width, height: headerItem.height)) + dateHeaderNode.updateLayout(size: self.containerNode.frame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) + } +} diff --git a/submodules/SyncCore/Sources/ReplyMarkupMessageAttribute.swift b/submodules/SyncCore/Sources/ReplyMarkupMessageAttribute.swift index c72fdced40..d1eb42c27c 100644 --- a/submodules/SyncCore/Sources/ReplyMarkupMessageAttribute.swift +++ b/submodules/SyncCore/Sources/ReplyMarkupMessageAttribute.swift @@ -3,7 +3,7 @@ import Postbox public enum ReplyMarkupButtonAction: PostboxCoding, Equatable { case text case url(String) - case callback(MemoryBuffer) + case callback(requiresPassword: Bool, data: MemoryBuffer) case requestPhone case requestMap case switchInline(samePeer: Bool, query: String) @@ -19,7 +19,7 @@ public enum ReplyMarkupButtonAction: PostboxCoding, Equatable { case 1: self = .url(decoder.decodeStringForKey("u", orElse: "")) case 2: - self = .callback(decoder.decodeBytesForKey("d") ?? MemoryBuffer()) + self = .callback(requiresPassword: decoder.decodeInt32ForKey("p", orElse: 0) != 0, data: decoder.decodeBytesForKey("d") ?? MemoryBuffer()) case 3: self = .requestPhone case 4: @@ -46,8 +46,9 @@ public enum ReplyMarkupButtonAction: PostboxCoding, Equatable { case let .url(url): encoder.encodeInt32(1, forKey: "v") encoder.encodeString(url, forKey: "u") - case let .callback(data): + case let .callback(requiresPassword, data): encoder.encodeInt32(2, forKey: "v") + encoder.encodeInt32(requiresPassword ? 1 : 0, forKey: "p") encoder.encodeBytes(data, forKey: "d") case .requestPhone: encoder.encodeInt32(3, forKey: "v") diff --git a/submodules/TelegramAnimatedStickerNode/Sources/AnimatedStickerUtils.swift b/submodules/TelegramAnimatedStickerNode/Sources/AnimatedStickerUtils.swift index 206574e171..d39c63244e 100644 --- a/submodules/TelegramAnimatedStickerNode/Sources/AnimatedStickerUtils.swift +++ b/submodules/TelegramAnimatedStickerNode/Sources/AnimatedStickerUtils.swift @@ -12,79 +12,7 @@ import MediaResources import MobileCoreServices import MediaResources import YuvConversion - -let colorKeyRegex = try? NSRegularExpression(pattern: "\"k\":\\[[\\d\\.]+\\,[\\d\\.]+\\,[\\d\\.]+\\,[\\d\\.]+\\]") - -private func transformedWithFitzModifier(data: Data, fitzModifier: EmojiFitzModifier?) -> Data { - if let fitzModifier = fitzModifier, var string = String(data: data, encoding: .utf8) { - var colors: [UIColor] = [0xf77e41, 0xffb139, 0xffd140, 0xffdf79].map { UIColor(rgb: $0) } - let replacementColors: [UIColor] - switch fitzModifier { - case .type12: - replacementColors = [0xca907a, 0xedc5a5, 0xf7e3c3, 0xfbefd6].map { UIColor(rgb: $0) } - case .type3: - replacementColors = [0xaa7c60, 0xc8a987, 0xddc89f, 0xe6d6b2].map { UIColor(rgb: $0) } - case .type4: - replacementColors = [0x8c6148, 0xad8562, 0xc49e76, 0xd4b188].map { UIColor(rgb: $0) } - case .type5: - replacementColors = [0x6e3c2c, 0x925a34, 0xa16e46, 0xac7a52].map { UIColor(rgb: $0) } - case .type6: - replacementColors = [0x291c12, 0x472a22, 0x573b30, 0x68493c].map { UIColor(rgb: $0) } - } - - func colorToString(_ color: UIColor) -> String { - var r: CGFloat = 0.0 - var g: CGFloat = 0.0 - var b: CGFloat = 0.0 - if color.getRed(&r, green: &g, blue: &b, alpha: nil) { - return "\"k\":[\(r),\(g),\(b),1]" - } - return "" - } - - func match(_ a: Double, _ b: Double, eps: Double) -> Bool { - return abs(a - b) < eps - } - - var replacements: [(NSTextCheckingResult, String)] = [] - - if let colorKeyRegex = colorKeyRegex { - let results = colorKeyRegex.matches(in: string, range: NSRange(string.startIndex..., in: string)) - for result in results.reversed() { - if let range = Range(result.range, in: string) { - let substring = String(string[range]) - let color = substring[substring.index(string.startIndex, offsetBy: "\"k\":[".count) ..< substring.index(before: substring.endIndex)] - let components = color.split(separator: ",") - if components.count == 4, let r = Double(components[0]), let g = Double(components[1]), let b = Double(components[2]), let a = Double(components[3]) { - if match(a, 1.0, eps: 0.01) { - for i in 0 ..< colors.count { - let color = colors[i] - var cr: CGFloat = 0.0 - var cg: CGFloat = 0.0 - var cb: CGFloat = 0.0 - if color.getRed(&cr, green: &cg, blue: &cb, alpha: nil) { - if match(r, Double(cr), eps: 0.01) && match(g, Double(cg), eps: 0.01) && match(b, Double(cb), eps: 0.01) { - replacements.append((result, colorToString(replacementColors[i]))) - } - } - } - } - } - } - } - } - - for (result, text) in replacements { - if let range = Range(result.range, in: string) { - string = string.replacingCharacters(in: range, with: text) - } - } - - return string.data(using: .utf8) ?? data - } else { - return data - } -} +import AnimatedStickerNode public func fetchCompressedLottieFirstFrameAJpeg(data: Data, size: CGSize, fitzModifier: EmojiFitzModifier? = nil, cacheKey: String) -> Signal { return Signal({ subscriber in diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index f36922f701..7eb6f16d2b 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -255,6 +255,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[889491791] = { return Api.Update.parse_updateDialogFilters($0) } dict[643940105] = { return Api.Update.parse_updatePhoneCallSignalingData($0) } dict[1708307556] = { return Api.Update.parse_updateChannelParticipant($0) } + dict[1854571743] = { return Api.Update.parse_updateChannelMessageForwards($0) } dict[136574537] = { return Api.messages.VotesList.parse_votesList($0) } dict[1558266229] = { return Api.PopularContact.parse_popularContact($0) } dict[-373643672] = { return Api.FolderPeer.parse_folderPeer($0) } @@ -273,7 +274,6 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-994444869] = { return Api.Error.parse_error($0) } dict[-1560655744] = { return Api.KeyboardButton.parse_keyboardButton($0) } dict[629866245] = { return Api.KeyboardButton.parse_keyboardButtonUrl($0) } - dict[1748655686] = { return Api.KeyboardButton.parse_keyboardButtonCallback($0) } dict[-1318425559] = { return Api.KeyboardButton.parse_keyboardButtonRequestPhone($0) } dict[-59151553] = { return Api.KeyboardButton.parse_keyboardButtonRequestGeoLocation($0) } dict[90744648] = { return Api.KeyboardButton.parse_keyboardButtonSwitchInline($0) } @@ -282,6 +282,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[280464681] = { return Api.KeyboardButton.parse_keyboardButtonUrlAuth($0) } dict[-802258988] = { return Api.KeyboardButton.parse_inputKeyboardButtonUrlAuth($0) } dict[-1144565411] = { return Api.KeyboardButton.parse_keyboardButtonRequestPoll($0) } + dict[901503851] = { return Api.KeyboardButton.parse_keyboardButtonCallback($0) } dict[-748155807] = { return Api.ContactStatus.parse_contactStatus($0) } dict[1679398724] = { return Api.SecureFile.parse_secureFileEmpty($0) } dict[-534283678] = { return Api.SecureFile.parse_secureFile($0) } @@ -387,6 +388,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1694474197] = { return Api.messages.Chats.parse_chats($0) } dict[-1663561404] = { return Api.messages.Chats.parse_chatsSlice($0) } dict[482797855] = { return Api.InputSingleMedia.parse_inputSingleMedia($0) } + dict[1831138451] = { return Api.MessageViews.parse_messageViews($0) } dict[218751099] = { return Api.InputPrivacyRule.parse_inputPrivacyValueAllowContacts($0) } dict[407582158] = { return Api.InputPrivacyRule.parse_inputPrivacyValueAllowAll($0) } dict[320652927] = { return Api.InputPrivacyRule.parse_inputPrivacyValueAllowUsers($0) } @@ -447,6 +449,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-524237339] = { return Api.PageTableRow.parse_pageTableRow($0) } dict[-40996577] = { return Api.DraftMessage.parse_draftMessage($0) } dict[453805082] = { return Api.DraftMessage.parse_draftMessageEmpty($0) } + dict[-77073091] = { return Api.help.Country.parse_country($0) } dict[418631927] = { return Api.StatsGroupTopPoster.parse_statsGroupTopPoster($0) } dict[-2128640689] = { return Api.account.SentEmailCode.parse_sentEmailCode($0) } dict[-1038136962] = { return Api.EncryptedFile.parse_encryptedFileEmpty($0) } @@ -519,6 +522,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-914167110] = { return Api.CdnPublicKey.parse_cdnPublicKey($0) } dict[53231223] = { return Api.InputGame.parse_inputGameID($0) } dict[-1020139510] = { return Api.InputGame.parse_inputGameShortName($0) } + dict[1107543535] = { return Api.help.CountryCode.parse_countryCode($0) } dict[-1502174430] = { return Api.InputMessage.parse_inputMessageID($0) } dict[-1160215659] = { return Api.InputMessage.parse_inputMessageReplyTo($0) } dict[-2037963464] = { return Api.InputMessage.parse_inputMessagePinned($0) } @@ -598,7 +602,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-1820043071] = { return Api.User.parse_user($0) } dict[-2082087340] = { return Api.Message.parse_messageEmpty($0) } dict[-1642487306] = { return Api.Message.parse_messageService($0) } - dict[1160515173] = { return Api.Message.parse_message($0) } + dict[-181507201] = { return Api.Message.parse_message($0) } dict[831924812] = { return Api.StatsGroupTopInviter.parse_statsGroupTopInviter($0) } dict[186120336] = { return Api.messages.RecentStickers.parse_recentStickersNotModified($0) } dict[586395571] = { return Api.messages.RecentStickers.parse_recentStickers($0) } @@ -683,6 +687,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[364538944] = { return Api.messages.Dialogs.parse_dialogs($0) } dict[1910543603] = { return Api.messages.Dialogs.parse_dialogsSlice($0) } dict[-253500010] = { return Api.messages.Dialogs.parse_dialogsNotModified($0) } + dict[-1986399595] = { return Api.stats.MessageStats.parse_messageStats($0) } dict[-709641735] = { return Api.EmojiKeyword.parse_emojiKeyword($0) } dict[594408994] = { return Api.EmojiKeyword.parse_emojiKeywordDeleted($0) } dict[-290921362] = { return Api.upload.CdnFile.parse_cdnFileReuploadNeeded($0) } @@ -789,6 +794,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1041346555] = { return Api.updates.ChannelDifference.parse_channelDifferenceEmpty($0) } dict[543450958] = { return Api.updates.ChannelDifference.parse_channelDifference($0) } dict[-1531132162] = { return Api.updates.ChannelDifference.parse_channelDifferenceTooLong($0) } + dict[-1815339214] = { return Api.help.CountriesList.parse_countriesListNotModified($0) } + dict[-2016381538] = { return Api.help.CountriesList.parse_countriesList($0) } dict[-309659827] = { return Api.channels.AdminLogResults.parse_adminLogResults($0) } dict[-264117680] = { return Api.ChatOnlines.parse_chatOnlines($0) } dict[488313413] = { return Api.InputAppEvent.parse_inputAppEvent($0) } @@ -1106,6 +1113,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.InputSingleMedia: _1.serialize(buffer, boxed) + case let _1 as Api.MessageViews: + _1.serialize(buffer, boxed) case let _1 as Api.InputPrivacyRule: _1.serialize(buffer, boxed) case let _1 as Api.messages.DhConfig: @@ -1148,6 +1157,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.DraftMessage: _1.serialize(buffer, boxed) + case let _1 as Api.help.Country: + _1.serialize(buffer, boxed) case let _1 as Api.StatsGroupTopPoster: _1.serialize(buffer, boxed) case let _1 as Api.account.SentEmailCode: @@ -1226,6 +1237,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.InputGame: _1.serialize(buffer, boxed) + case let _1 as Api.help.CountryCode: + _1.serialize(buffer, boxed) case let _1 as Api.InputMessage: _1.serialize(buffer, boxed) case let _1 as Api.PhoneCallProtocol: @@ -1366,6 +1379,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.messages.Dialogs: _1.serialize(buffer, boxed) + case let _1 as Api.stats.MessageStats: + _1.serialize(buffer, boxed) case let _1 as Api.EmojiKeyword: _1.serialize(buffer, boxed) case let _1 as Api.upload.CdnFile: @@ -1442,6 +1457,8 @@ public struct Api { _1.serialize(buffer, boxed) case let _1 as Api.updates.ChannelDifference: _1.serialize(buffer, boxed) + case let _1 as Api.help.CountriesList: + _1.serialize(buffer, boxed) case let _1 as Api.channels.AdminLogResults: _1.serialize(buffer, boxed) case let _1 as Api.ChatOnlines: diff --git a/submodules/TelegramApi/Sources/Api1.swift b/submodules/TelegramApi/Sources/Api1.swift index 025d00a4aa..5a30fc3b91 100644 --- a/submodules/TelegramApi/Sources/Api1.swift +++ b/submodules/TelegramApi/Sources/Api1.swift @@ -6038,6 +6038,7 @@ public extension Api { case updateDialogFilters case updatePhoneCallSignalingData(phoneCallId: Int64, data: Buffer) case updateChannelParticipant(flags: Int32, channelId: Int32, date: Int32, userId: Int32, prevParticipant: Api.ChannelParticipant?, newParticipant: Api.ChannelParticipant?, qts: Int32) + case updateChannelMessageForwards(channelId: Int32, id: Int32, forwards: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -6730,6 +6731,14 @@ public extension Api { if Int(flags) & Int(1 << 1) != 0 {newParticipant!.serialize(buffer, true)} serializeInt32(qts, buffer: buffer, boxed: false) break + case .updateChannelMessageForwards(let channelId, let id, let forwards): + if boxed { + buffer.appendInt32(1854571743) + } + serializeInt32(channelId, buffer: buffer, boxed: false) + serializeInt32(id, buffer: buffer, boxed: false) + serializeInt32(forwards, buffer: buffer, boxed: false) + break } } @@ -6899,6 +6908,8 @@ public extension Api { return ("updatePhoneCallSignalingData", [("phoneCallId", phoneCallId), ("data", data)]) case .updateChannelParticipant(let flags, let channelId, let date, let userId, let prevParticipant, let newParticipant, let qts): return ("updateChannelParticipant", [("flags", flags), ("channelId", channelId), ("date", date), ("userId", userId), ("prevParticipant", prevParticipant), ("newParticipant", newParticipant), ("qts", qts)]) + case .updateChannelMessageForwards(let channelId, let id, let forwards): + return ("updateChannelMessageForwards", [("channelId", channelId), ("id", id), ("forwards", forwards)]) } } @@ -8277,6 +8288,23 @@ public extension Api { return nil } } + public static func parse_updateChannelMessageForwards(_ reader: BufferReader) -> Update? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + var _3: Int32? + _3 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.Update.updateChannelMessageForwards(channelId: _1!, id: _2!, forwards: _3!) + } + else { + return nil + } + } } public enum PopularContact: TypeConstructorDescription { @@ -8732,7 +8760,6 @@ public extension Api { public enum KeyboardButton: TypeConstructorDescription { case keyboardButton(text: String) case keyboardButtonUrl(text: String, url: String) - case keyboardButtonCallback(text: String, data: Buffer) case keyboardButtonRequestPhone(text: String) case keyboardButtonRequestGeoLocation(text: String) case keyboardButtonSwitchInline(flags: Int32, text: String, query: String) @@ -8741,6 +8768,7 @@ public extension Api { case keyboardButtonUrlAuth(flags: Int32, text: String, fwdText: String?, url: String, buttonId: Int32) case inputKeyboardButtonUrlAuth(flags: Int32, text: String, fwdText: String?, url: String, bot: Api.InputUser) case keyboardButtonRequestPoll(flags: Int32, quiz: Api.Bool?, text: String) + case keyboardButtonCallback(flags: Int32, text: String, data: Buffer) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -8757,13 +8785,6 @@ public extension Api { serializeString(text, buffer: buffer, boxed: false) serializeString(url, buffer: buffer, boxed: false) break - case .keyboardButtonCallback(let text, let data): - if boxed { - buffer.appendInt32(1748655686) - } - serializeString(text, buffer: buffer, boxed: false) - serializeBytes(data, buffer: buffer, boxed: false) - break case .keyboardButtonRequestPhone(let text): if boxed { buffer.appendInt32(-1318425559) @@ -8824,6 +8845,14 @@ public extension Api { if Int(flags) & Int(1 << 0) != 0 {quiz!.serialize(buffer, true)} serializeString(text, buffer: buffer, boxed: false) break + case .keyboardButtonCallback(let flags, let text, let data): + if boxed { + buffer.appendInt32(901503851) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(text, buffer: buffer, boxed: false) + serializeBytes(data, buffer: buffer, boxed: false) + break } } @@ -8833,8 +8862,6 @@ public extension Api { return ("keyboardButton", [("text", text)]) case .keyboardButtonUrl(let text, let url): return ("keyboardButtonUrl", [("text", text), ("url", url)]) - case .keyboardButtonCallback(let text, let data): - return ("keyboardButtonCallback", [("text", text), ("data", data)]) case .keyboardButtonRequestPhone(let text): return ("keyboardButtonRequestPhone", [("text", text)]) case .keyboardButtonRequestGeoLocation(let text): @@ -8851,6 +8878,8 @@ public extension Api { return ("inputKeyboardButtonUrlAuth", [("flags", flags), ("text", text), ("fwdText", fwdText), ("url", url), ("bot", bot)]) case .keyboardButtonRequestPoll(let flags, let quiz, let text): return ("keyboardButtonRequestPoll", [("flags", flags), ("quiz", quiz), ("text", text)]) + case .keyboardButtonCallback(let flags, let text, let data): + return ("keyboardButtonCallback", [("flags", flags), ("text", text), ("data", data)]) } } @@ -8879,20 +8908,6 @@ public extension Api { return nil } } - public static func parse_keyboardButtonCallback(_ reader: BufferReader) -> KeyboardButton? { - var _1: String? - _1 = parseString(reader) - var _2: Buffer? - _2 = parseBytes(reader) - let _c1 = _1 != nil - let _c2 = _2 != nil - if _c1 && _c2 { - return Api.KeyboardButton.keyboardButtonCallback(text: _1!, data: _2!) - } - else { - return nil - } - } public static func parse_keyboardButtonRequestPhone(_ reader: BufferReader) -> KeyboardButton? { var _1: String? _1 = parseString(reader) @@ -9021,6 +9036,23 @@ public extension Api { return nil } } + public static func parse_keyboardButtonCallback(_ reader: BufferReader) -> KeyboardButton? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + _2 = parseString(reader) + var _3: Buffer? + _3 = parseBytes(reader) + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.KeyboardButton.keyboardButtonCallback(flags: _1!, text: _2!, data: _3!) + } + else { + return nil + } + } } public enum ContactStatus: TypeConstructorDescription { @@ -11718,6 +11750,44 @@ public extension Api { } } + } + public enum MessageViews: TypeConstructorDescription { + case messageViews(views: Int32, forwards: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .messageViews(let views, let forwards): + if boxed { + buffer.appendInt32(1831138451) + } + serializeInt32(views, buffer: buffer, boxed: false) + serializeInt32(forwards, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .messageViews(let views, let forwards): + return ("messageViews", [("views", views), ("forwards", forwards)]) + } + } + + public static func parse_messageViews(_ reader: BufferReader) -> MessageViews? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.MessageViews.messageViews(views: _1!, forwards: _2!) + } + else { + return nil + } + } + } public enum InputPrivacyRule: TypeConstructorDescription { case inputPrivacyValueAllowContacts @@ -17092,7 +17162,7 @@ public extension Api { public enum Message: TypeConstructorDescription { case messageEmpty(id: Int32) case messageService(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, replyToMsgId: Int32?, date: Int32, action: Api.MessageAction) - case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, restrictionReason: [Api.RestrictionReason]?) + case message(flags: Int32, id: Int32, fromId: Int32?, toId: Api.Peer, fwdFrom: Api.MessageFwdHeader?, viaBotId: Int32?, replyToMsgId: Int32?, date: Int32, message: String, media: Api.MessageMedia?, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, views: Int32?, forwards: Int32?, editDate: Int32?, postAuthor: String?, groupedId: Int64?, restrictionReason: [Api.RestrictionReason]?) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { @@ -17114,9 +17184,9 @@ public extension Api { serializeInt32(date, buffer: buffer, boxed: false) action.serialize(buffer, true) break - case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let restrictionReason): + case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let forwards, let editDate, let postAuthor, let groupedId, let restrictionReason): if boxed { - buffer.appendInt32(1160515173) + buffer.appendInt32(-181507201) } serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(id, buffer: buffer, boxed: false) @@ -17135,6 +17205,7 @@ public extension Api { item.serialize(buffer, true) }} if Int(flags) & Int(1 << 10) != 0 {serializeInt32(views!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 10) != 0 {serializeInt32(forwards!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 15) != 0 {serializeInt32(editDate!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 16) != 0 {serializeString(postAuthor!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 17) != 0 {serializeInt64(groupedId!, buffer: buffer, boxed: false)} @@ -17153,8 +17224,8 @@ public extension Api { return ("messageEmpty", [("id", id)]) case .messageService(let flags, let id, let fromId, let toId, let replyToMsgId, let date, let action): return ("messageService", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("replyToMsgId", replyToMsgId), ("date", date), ("action", action)]) - case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let editDate, let postAuthor, let groupedId, let restrictionReason): - return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("restrictionReason", restrictionReason)]) + case .message(let flags, let id, let fromId, let toId, let fwdFrom, let viaBotId, let replyToMsgId, let date, let message, let media, let replyMarkup, let entities, let views, let forwards, let editDate, let postAuthor, let groupedId, let restrictionReason): + return ("message", [("flags", flags), ("id", id), ("fromId", fromId), ("toId", toId), ("fwdFrom", fwdFrom), ("viaBotId", viaBotId), ("replyToMsgId", replyToMsgId), ("date", date), ("message", message), ("media", media), ("replyMarkup", replyMarkup), ("entities", entities), ("views", views), ("forwards", forwards), ("editDate", editDate), ("postAuthor", postAuthor), ("groupedId", groupedId), ("restrictionReason", restrictionReason)]) } } @@ -17240,14 +17311,16 @@ public extension Api { var _13: Int32? if Int(_1!) & Int(1 << 10) != 0 {_13 = reader.readInt32() } var _14: Int32? - if Int(_1!) & Int(1 << 15) != 0 {_14 = reader.readInt32() } - var _15: String? - if Int(_1!) & Int(1 << 16) != 0 {_15 = parseString(reader) } - var _16: Int64? - if Int(_1!) & Int(1 << 17) != 0 {_16 = reader.readInt64() } - var _17: [Api.RestrictionReason]? + if Int(_1!) & Int(1 << 10) != 0 {_14 = reader.readInt32() } + var _15: Int32? + if Int(_1!) & Int(1 << 15) != 0 {_15 = reader.readInt32() } + var _16: String? + if Int(_1!) & Int(1 << 16) != 0 {_16 = parseString(reader) } + var _17: Int64? + if Int(_1!) & Int(1 << 17) != 0 {_17 = reader.readInt64() } + var _18: [Api.RestrictionReason]? if Int(_1!) & Int(1 << 22) != 0 {if let _ = reader.readInt32() { - _17 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) + _18 = Api.parseVector(reader, elementSignature: 0, elementType: Api.RestrictionReason.self) } } let _c1 = _1 != nil let _c2 = _2 != nil @@ -17262,12 +17335,13 @@ public extension Api { let _c11 = (Int(_1!) & Int(1 << 6) == 0) || _11 != nil let _c12 = (Int(_1!) & Int(1 << 7) == 0) || _12 != nil let _c13 = (Int(_1!) & Int(1 << 10) == 0) || _13 != nil - let _c14 = (Int(_1!) & Int(1 << 15) == 0) || _14 != nil - let _c15 = (Int(_1!) & Int(1 << 16) == 0) || _15 != nil - let _c16 = (Int(_1!) & Int(1 << 17) == 0) || _16 != nil - let _c17 = (Int(_1!) & Int(1 << 22) == 0) || _17 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 { - return Api.Message.message(flags: _1!, id: _2!, fromId: _3, toId: _4!, fwdFrom: _5, viaBotId: _6, replyToMsgId: _7, date: _8!, message: _9!, media: _10, replyMarkup: _11, entities: _12, views: _13, editDate: _14, postAuthor: _15, groupedId: _16, restrictionReason: _17) + let _c14 = (Int(_1!) & Int(1 << 10) == 0) || _14 != nil + let _c15 = (Int(_1!) & Int(1 << 15) == 0) || _15 != nil + let _c16 = (Int(_1!) & Int(1 << 16) == 0) || _16 != nil + let _c17 = (Int(_1!) & Int(1 << 17) == 0) || _17 != nil + let _c18 = (Int(_1!) & Int(1 << 22) == 0) || _18 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 && _c16 && _c17 && _c18 { + return Api.Message.message(flags: _1!, id: _2!, fromId: _3, toId: _4!, fwdFrom: _5, viaBotId: _6, replyToMsgId: _7, date: _8!, message: _9!, media: _10, replyMarkup: _11, entities: _12, views: _13, forwards: _14, editDate: _15, postAuthor: _16, groupedId: _17, restrictionReason: _18) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift index c24dccef69..16c442f2ff 100644 --- a/submodules/TelegramApi/Sources/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -810,6 +810,42 @@ public struct stats { } } + public enum MessageStats: TypeConstructorDescription { + case messageStats(viewsGraph: Api.StatsGraph) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .messageStats(let viewsGraph): + if boxed { + buffer.appendInt32(-1986399595) + } + viewsGraph.serialize(buffer, true) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .messageStats(let viewsGraph): + return ("messageStats", [("viewsGraph", viewsGraph)]) + } + } + + public static func parse_messageStats(_ reader: BufferReader) -> MessageStats? { + var _1: Api.StatsGraph? + if let signature = reader.readInt32() { + _1 = Api.parse(reader, signature: signature) as? Api.StatsGraph + } + let _c1 = _1 != nil + if _c1 { + return Api.stats.MessageStats.messageStats(viewsGraph: _1!) + } + else { + return nil + } + } + + } } } public extension Api { @@ -1965,6 +2001,58 @@ public struct help { } } + } + public enum Country: TypeConstructorDescription { + case country(iso2: String, defaultName: String, name: String, countryCodes: [Api.help.CountryCode]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .country(let iso2, let defaultName, let name, let countryCodes): + if boxed { + buffer.appendInt32(-77073091) + } + serializeString(iso2, buffer: buffer, boxed: false) + serializeString(defaultName, buffer: buffer, boxed: false) + serializeString(name, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(countryCodes.count)) + for item in countryCodes { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .country(let iso2, let defaultName, let name, let countryCodes): + return ("country", [("iso2", iso2), ("defaultName", defaultName), ("name", name), ("countryCodes", countryCodes)]) + } + } + + public static func parse_country(_ reader: BufferReader) -> Country? { + var _1: String? + _1 = parseString(reader) + var _2: String? + _2 = parseString(reader) + var _3: String? + _3 = parseString(reader) + var _4: [Api.help.CountryCode]? + if let _ = reader.readInt32() { + _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.help.CountryCode.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.help.Country.country(iso2: _1!, defaultName: _2!, name: _3!, countryCodes: _4!) + } + else { + return nil + } + } + } public enum PromoData: TypeConstructorDescription { case promoDataEmpty(expires: Int32) @@ -2117,6 +2205,64 @@ public struct help { } } + } + public enum CountryCode: TypeConstructorDescription { + case countryCode(flags: Int32, countryCode: String, prefixes: [String]?, patterns: [String]?) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .countryCode(let flags, let countryCode, let prefixes, let patterns): + if boxed { + buffer.appendInt32(1107543535) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeString(countryCode, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(prefixes!.count)) + for item in prefixes! { + serializeString(item, buffer: buffer, boxed: false) + }} + if Int(flags) & Int(1 << 1) != 0 {buffer.appendInt32(481674261) + buffer.appendInt32(Int32(patterns!.count)) + for item in patterns! { + serializeString(item, buffer: buffer, boxed: false) + }} + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .countryCode(let flags, let countryCode, let prefixes, let patterns): + return ("countryCode", [("flags", flags), ("countryCode", countryCode), ("prefixes", prefixes), ("patterns", patterns)]) + } + } + + public static func parse_countryCode(_ reader: BufferReader) -> CountryCode? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + _2 = parseString(reader) + var _3: [String]? + if Int(_1!) & Int(1 << 0) != 0 {if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: -1255641564, elementType: String.self) + } } + var _4: [String]? + if Int(_1!) & Int(1 << 1) != 0 {if let _ = reader.readInt32() { + _4 = Api.parseVector(reader, elementSignature: -1255641564, elementType: String.self) + } } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil + let _c4 = (Int(_1!) & Int(1 << 1) == 0) || _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.help.CountryCode.countryCode(flags: _1!, countryCode: _2!, prefixes: _3, patterns: _4) + } + else { + return nil + } + } + } public enum Support: TypeConstructorDescription { case support(phoneNumber: String, user: Api.User) @@ -2316,5 +2462,61 @@ public struct help { } } + public enum CountriesList: TypeConstructorDescription { + case countriesListNotModified + case countriesList(countries: [Api.help.Country], hash: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .countriesListNotModified: + if boxed { + buffer.appendInt32(-1815339214) + } + + break + case .countriesList(let countries, let hash): + if boxed { + buffer.appendInt32(-2016381538) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(countries.count)) + for item in countries { + item.serialize(buffer, true) + } + serializeInt32(hash, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .countriesListNotModified: + return ("countriesListNotModified", []) + case .countriesList(let countries, let hash): + return ("countriesList", [("countries", countries), ("hash", hash)]) + } + } + + public static func parse_countriesListNotModified(_ reader: BufferReader) -> CountriesList? { + return Api.help.CountriesList.countriesListNotModified + } + public static func parse_countriesList(_ reader: BufferReader) -> CountriesList? { + var _1: [Api.help.Country]? + if let _ = reader.readInt32() { + _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.help.Country.self) + } + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.help.CountriesList.countriesList(countries: _1!, hash: _2!) + } + else { + return nil + } + } + + } } } diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index c79744cf01..f2e20a21b1 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2243,26 +2243,6 @@ public extension Api { }) } - public static func getMessagesViews(peer: Api.InputPeer, id: [Int32], increment: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Int32]>) { - let buffer = Buffer() - buffer.appendInt32(-993483427) - peer.serialize(buffer, true) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(id.count)) - for item in id { - serializeInt32(item, buffer: buffer, boxed: false) - } - increment.serialize(buffer, true) - return (FunctionDescription(name: "messages.getMessagesViews", parameters: [("peer", peer), ("id", id), ("increment", increment)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Int32]? in - let reader = BufferReader(buffer) - var result: [Int32]? - if let _ = reader.readInt32() { - result = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self) - } - return result - }) - } - public static func editChatAdmin(chatId: Int32, userId: Api.InputUser, isAdmin: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-1444503762) @@ -2429,23 +2409,6 @@ public extension Api { }) } - public static func getBotCallbackAnswer(flags: Int32, peer: Api.InputPeer, msgId: Int32, data: Buffer?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-2130010132) - serializeInt32(flags, buffer: buffer, boxed: false) - peer.serialize(buffer, true) - serializeInt32(msgId, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeBytes(data!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "messages.getBotCallbackAnswer", parameters: [("flags", flags), ("peer", peer), ("msgId", msgId), ("data", data)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.BotCallbackAnswer? in - let reader = BufferReader(buffer) - var result: Api.messages.BotCallbackAnswer? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.messages.BotCallbackAnswer - } - return result - }) - } - public static func setBotCallbackAnswer(flags: Int32, queryId: Int64, message: String?, url: String?, cacheTime: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(-712043766) @@ -3718,6 +3681,44 @@ public extension Api { return result }) } + + public static func getBotCallbackAnswer(flags: Int32, peer: Api.InputPeer, msgId: Int32, data: Buffer?, password: Api.InputCheckPasswordSRP?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1824339449) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt32(msgId, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeBytes(data!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 2) != 0 {password!.serialize(buffer, true)} + return (FunctionDescription(name: "messages.getBotCallbackAnswer", parameters: [("flags", flags), ("peer", peer), ("msgId", msgId), ("data", data), ("password", password)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.BotCallbackAnswer? in + let reader = BufferReader(buffer) + var result: Api.messages.BotCallbackAnswer? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.BotCallbackAnswer + } + return result + }) + } + + public static func getMessagesViews(peer: Api.InputPeer, id: [Int32], increment: Api.Bool) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<[Api.MessageViews]>) { + let buffer = Buffer() + buffer.appendInt32(-39035462) + peer.serialize(buffer, true) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(id.count)) + for item in id { + serializeInt32(item, buffer: buffer, boxed: false) + } + increment.serialize(buffer, true) + return (FunctionDescription(name: "messages.getMessagesViews", parameters: [("peer", peer), ("id", id), ("increment", increment)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> [Api.MessageViews]? in + let reader = BufferReader(buffer) + var result: [Api.MessageViews]? + if let _ = reader.readInt32() { + result = Api.parseVector(reader, elementSignature: 0, elementType: Api.MessageViews.self) + } + return result + }) + } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -4450,6 +4451,41 @@ public extension Api { return result }) } + + public static func getMessagePublicForwards(channel: Api.InputChannel, msgId: Int32, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1445996571) + channel.serialize(buffer, true) + serializeInt32(msgId, buffer: buffer, boxed: false) + serializeInt32(offsetRate, buffer: buffer, boxed: false) + offsetPeer.serialize(buffer, true) + serializeInt32(offsetId, buffer: buffer, boxed: false) + serializeInt32(limit, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stats.getMessagePublicForwards", parameters: [("channel", channel), ("msgId", msgId), ("offsetRate", offsetRate), ("offsetPeer", offsetPeer), ("offsetId", offsetId), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in + let reader = BufferReader(buffer) + var result: Api.messages.Messages? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.Messages + } + return result + }) + } + + public static func getMessageStats(flags: Int32, channel: Api.InputChannel, msgId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1226791947) + serializeInt32(flags, buffer: buffer, boxed: false) + channel.serialize(buffer, true) + serializeInt32(msgId, buffer: buffer, boxed: false) + return (FunctionDescription(name: "stats.getMessageStats", parameters: [("flags", flags), ("channel", channel), ("msgId", msgId)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.stats.MessageStats? in + let reader = BufferReader(buffer) + var result: Api.stats.MessageStats? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.stats.MessageStats + } + return result + }) + } } public struct auth { public static func checkPhone(phoneNumber: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -5369,34 +5405,6 @@ public extension Api { }) } - public static func getPromoData() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1063816159) - - return (FunctionDescription(name: "help.getPromoData", parameters: []), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.PromoData? in - let reader = BufferReader(buffer) - var result: Api.help.PromoData? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.help.PromoData - } - return result - }) - } - - public static func hidePromoData(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(505748629) - peer.serialize(buffer, true) - return (FunctionDescription(name: "help.hidePromoData", parameters: [("peer", peer)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in - let reader = BufferReader(buffer) - var result: Api.Bool? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.Bool - } - return result - }) - } - public static func editUserInfo(userId: Api.InputUser, message: String, entities: [Api.MessageEntity]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1723407216) @@ -5431,6 +5439,34 @@ public extension Api { }) } + public static func getPromoData() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-1063816159) + + return (FunctionDescription(name: "help.getPromoData", parameters: []), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.PromoData? in + let reader = BufferReader(buffer) + var result: Api.help.PromoData? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.help.PromoData + } + return result + }) + } + + public static func hidePromoData(peer: Api.InputPeer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(505748629) + peer.serialize(buffer, true) + return (FunctionDescription(name: "help.hidePromoData", parameters: [("peer", peer)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in + let reader = BufferReader(buffer) + var result: Api.Bool? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.Bool + } + return result + }) + } + public static func dismissSuggestion(suggestion: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(125807007) @@ -5444,6 +5480,21 @@ public extension Api { return result }) } + + public static func getCountriesList(langCode: String, hash: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1935116200) + serializeString(langCode, buffer: buffer, boxed: false) + serializeInt32(hash, buffer: buffer, boxed: false) + return (FunctionDescription(name: "help.getCountriesList", parameters: [("langCode", langCode), ("hash", hash)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.help.CountriesList? in + let reader = BufferReader(buffer) + var result: Api.help.CountriesList? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.help.CountriesList + } + return result + }) + } } public struct updates { public static func getState() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { @@ -6802,11 +6853,14 @@ public extension Api { }) } - public static func updateProfilePhoto(id: Api.InputPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func uploadProfilePhoto(flags: Int32, file: Api.InputFile?, video: Api.InputFile?, videoStartTs: Double?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(1926525996) - id.serialize(buffer, true) - return (FunctionDescription(name: "photos.updateProfilePhoto", parameters: [("id", id)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.photos.Photo? in + buffer.appendInt32(-1980559511) + serializeInt32(flags, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {file!.serialize(buffer, true)} + if Int(flags) & Int(1 << 1) != 0 {video!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {serializeDouble(videoStartTs!, buffer: buffer, boxed: false)} + return (FunctionDescription(name: "photos.uploadProfilePhoto", parameters: [("flags", flags), ("file", file), ("video", video), ("videoStartTs", videoStartTs)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.photos.Photo? in let reader = BufferReader(buffer) var result: Api.photos.Photo? if let signature = reader.readInt32() { @@ -6816,14 +6870,11 @@ public extension Api { }) } - public static func uploadProfilePhoto(flags: Int32, file: Api.InputFile?, video: Api.InputFile?, videoStartTs: Double?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func updateProfilePhoto(id: Api.InputPhoto) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(-1980559511) - serializeInt32(flags, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {file!.serialize(buffer, true)} - if Int(flags) & Int(1 << 1) != 0 {video!.serialize(buffer, true)} - if Int(flags) & Int(1 << 2) != 0 {serializeDouble(videoStartTs!, buffer: buffer, boxed: false)} - return (FunctionDescription(name: "photos.uploadProfilePhoto", parameters: [("flags", flags), ("file", file), ("video", video), ("videoStartTs", videoStartTs)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.photos.Photo? in + buffer.appendInt32(1926525996) + id.serialize(buffer, true) + return (FunctionDescription(name: "photos.updateProfilePhoto", parameters: [("id", id)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.photos.Photo? in let reader = BufferReader(buffer) var result: Api.photos.Photo? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift index 1d41983b99..7936699d85 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift @@ -1272,6 +1272,10 @@ final class CallControllerNode: ViewControllerTracingNode, CallControllerNodePro func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { self.validLayout = (layout, navigationBarHeight) + if !self.hasVideoNodes { + self.isUIHidden = false + } + var isUIHidden = self.isUIHidden switch self.callState?.state { case .terminated, .terminating: diff --git a/submodules/TelegramCore/Sources/AccountViewTracker.swift b/submodules/TelegramCore/Sources/AccountViewTracker.swift index c439133ebb..9f166ff156 100644 --- a/submodules/TelegramCore/Sources/AccountViewTracker.swift +++ b/submodules/TelegramCore/Sources/AccountViewTracker.swift @@ -591,7 +591,7 @@ public final class AccountViewTracker { if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) { return account.network.request(Api.functions.messages.getMessagesViews(peer: inputPeer, id: messageIds.map { $0.id }, increment: .boolTrue)) |> map(Optional.init) - |> `catch` { _ -> Signal<[Int32]?, NoError> in + |> `catch` { _ -> Signal<[Api.MessageViews]?, NoError> in return .single(nil) } |> mapToSignal { viewCounts -> Signal in @@ -599,20 +599,7 @@ public final class AccountViewTracker { return account.postbox.transaction { transaction -> Void in for i in 0 ..< messageIds.count { if i < viewCounts.count { - let views = viewCounts[i] - do { - transaction.updateMessage(messageIds[i], update: { currentMessage in - let storeForwardInfo = currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init) - var attributes = currentMessage.attributes - loop: for j in 0 ..< attributes.count { - if let attribute = attributes[j] as? ViewCountMessageAttribute { - attributes[j] = ViewCountMessageAttribute(count: max(attribute.count, Int(views))) - } - } - return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) - }) - } - /*if case let .messageViews(views, forwards) = viewCounts[i] { + if case let .messageViews(views, forwards) = viewCounts[i] { transaction.updateMessage(messageIds[i], update: { currentMessage in let storeForwardInfo = currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init) var attributes = currentMessage.attributes @@ -626,7 +613,7 @@ public final class AccountViewTracker { } return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media)) }) - }*/ + } } } } diff --git a/submodules/TelegramCore/Sources/ChannelOwnershipTransfer.swift b/submodules/TelegramCore/Sources/ChannelOwnershipTransfer.swift index b66c178ffb..023130be15 100644 --- a/submodules/TelegramCore/Sources/ChannelOwnershipTransfer.swift +++ b/submodules/TelegramCore/Sources/ChannelOwnershipTransfer.swift @@ -67,7 +67,7 @@ public func checkOwnershipTranfserAvailability(postbox: Postbox, network: Networ } |> mapToSignal { updates -> Signal in accountStateManager.addUpdates(updates) - return.complete() + return .complete() } } } diff --git a/submodules/TelegramCore/Sources/Countries.swift b/submodules/TelegramCore/Sources/Countries.swift new file mode 100644 index 0000000000..9d1349f6fb --- /dev/null +++ b/submodules/TelegramCore/Sources/Countries.swift @@ -0,0 +1,72 @@ +import Foundation +import Postbox +import SwiftSignalKit +import TelegramApi + +import SyncCore + +public struct Country { + public struct CountryCode { + public let code: String + public let prefixes: [String] + public let patterns: [String] + + public init(code: String, prefixes: [String], patterns: [String]) { + self.code = code + self.prefixes = prefixes + self.patterns = patterns + } + } + + public let code: String + public let defaultName: String + public let name: String + public let countryCodes: [CountryCode] + + public init(code: String, defaultName: String, name: String, countryCodes: [CountryCode]) { + self.code = code + self.defaultName = defaultName + self.name = name + self.countryCodes = countryCodes + } +} + +public func getCountriesList(network: Network, langCode: String) -> Signal<[Country], NoError> { + return network.request(Api.functions.help.getCountriesList(langCode: langCode, hash: 0)) + |> map(Optional.init) + |> `catch` { _ -> Signal in + return .single(nil) + } + |> map { result in + if let result = result { + switch result { + case let .countriesList(apiCountries, hash): + return apiCountries.map { Country(apiCountry: $0) } + case .countriesListNotModified: + return [] + } + } else { + return [] + } + } +} + +extension Country.CountryCode { + init(apiCountryCode: Api.help.CountryCode) { + switch apiCountryCode { + case let .countryCode(_, countryCode, apiPrefixes, apiPatterns): + let prefixes: [String] = apiPrefixes.flatMap { $0 } ?? [] + let patterns: [String] = apiPatterns.flatMap { $0 } ?? [] + self.init(code: countryCode, prefixes: prefixes, patterns: patterns) + } + } +} + +extension Country { + init(apiCountry: Api.help.Country) { + switch apiCountry { + case let .country(iso2, defaultName, name, countryCodes): + self.init(code: iso2, defaultName: defaultName, name: name, countryCodes: countryCodes.map { Country.CountryCode(apiCountryCode: $0) }) + } + } +} diff --git a/submodules/TelegramCore/Sources/ReplyMarkupMessageAttribute.swift b/submodules/TelegramCore/Sources/ReplyMarkupMessageAttribute.swift index 587ee1be42..3f42956000 100644 --- a/submodules/TelegramCore/Sources/ReplyMarkupMessageAttribute.swift +++ b/submodules/TelegramCore/Sources/ReplyMarkupMessageAttribute.swift @@ -9,11 +9,11 @@ extension ReplyMarkupButton { switch apiButton { case let .keyboardButton(text): self.init(title: text, titleWhenForwarded: nil, action: .text) - case let .keyboardButtonCallback(text, data): + case let .keyboardButtonCallback(flags, text, data): let memory = malloc(data.size)! memcpy(memory, data.data, data.size) let dataBuffer = MemoryBuffer(memory: memory, capacity: data.size, length: data.size, freeWhenDone: true) - self.init(title: text, titleWhenForwarded: nil, action: .callback(dataBuffer)) + self.init(title: text, titleWhenForwarded: nil, action: .callback(requiresPassword: (flags & (1 << 0)) != 0, data: dataBuffer)) case let .keyboardButtonRequestGeoLocation(text): self.init(title: text, titleWhenForwarded: nil, action: .requestMap) case let .keyboardButtonRequestPhone(text): diff --git a/submodules/TelegramCore/Sources/RequestMessageActionCallback.swift b/submodules/TelegramCore/Sources/RequestMessageActionCallback.swift index 7631d4bee6..5aa33db84d 100644 --- a/submodules/TelegramCore/Sources/RequestMessageActionCallback.swift +++ b/submodules/TelegramCore/Sources/RequestMessageActionCallback.swift @@ -3,8 +3,6 @@ import Postbox import SwiftSignalKit import TelegramApi import MtProtoKit - - import SyncCore public enum MessageActionCallbackResult { @@ -14,8 +12,69 @@ public enum MessageActionCallbackResult { case url(String) } -public func requestMessageActionCallback(account: Account, messageId: MessageId, isGame:Bool, data: MemoryBuffer?) -> Signal { +public enum MessageActionCallbackError { + case generic + case twoStepAuthMissing + case twoStepAuthTooFresh(Int32) + case authSessionTooFresh(Int32) + case limitExceeded + case requestPassword + case invalidPassword + case restricted + case userBlocked +} + +public func requestMessageActionCallbackPasswordCheck(account: Account, messageId: MessageId, isGame: Bool, data: MemoryBuffer?) -> Signal { return account.postbox.loadedPeerWithId(messageId.peerId) + |> castError(MessageActionCallbackError.self) + |> take(1) + |> mapToSignal { peer in + if let inputPeer = apiInputPeer(peer) { + var flags: Int32 = 0 + var dataBuffer: Buffer? + if let data = data { + flags |= Int32(1 << 0) + dataBuffer = Buffer(data: data.makeData()) + } + if isGame { + flags |= Int32(1 << 1) + } + + return account.network.request(Api.functions.messages.getBotCallbackAnswer(flags: flags, peer: inputPeer, msgId: messageId.id, data: dataBuffer, password: .inputCheckPasswordEmpty)) + |> mapError { error -> MessageActionCallbackError in + if error.errorDescription == "PASSWORD_HASH_INVALID" { + return .requestPassword + } else if error.errorDescription == "PASSWORD_MISSING" { + return .twoStepAuthMissing + } else if error.errorDescription.hasPrefix("PASSWORD_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "PASSWORD_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .twoStepAuthTooFresh(value) + } + } else if error.errorDescription.hasPrefix("SESSION_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "SESSION_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .authSessionTooFresh(value) + } + } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { + return .restricted + } else if error.errorDescription == "USER_BLOCKED" { + return .userBlocked + } + return .generic + } + |> mapToSignal { _ -> Signal in + return .complete() + } + } else { + return .fail(.generic) + } + } +} + +public func requestMessageActionCallback(account: Account, messageId: MessageId, isGame :Bool, password: String?, data: MemoryBuffer?) -> Signal { + return account.postbox.loadedPeerWithId(messageId.peerId) + |> castError(MessageActionCallbackError.self) |> take(1) |> mapToSignal { peer in if let inputPeer = apiInputPeer(peer) { @@ -28,28 +87,79 @@ public func requestMessageActionCallback(account: Account, messageId: MessageId, if isGame { flags |= Int32(1 << 1) } - return account.network.request(Api.functions.messages.getBotCallbackAnswer(flags: flags, peer: inputPeer, msgId: messageId.id, data: dataBuffer)) - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) - } - |> map { result -> MessageActionCallbackResult in - guard let result = result else { - return .none + + let checkPassword: Signal + if let password = password, !password.isEmpty { + flags |= Int32(1 << 2) + + checkPassword = twoStepAuthData(account.network) + |> mapError { error -> MessageActionCallbackError in + if error.errorDescription.hasPrefix("FLOOD_WAIT") { + return .limitExceeded + } else { + return .generic + } } - switch result { - case let .botCallbackAnswer(flags, message, url, cacheTime): - if let message = message { - if (flags & (1 << 1)) != 0 { - return .alert(message) - } else { - return .toast(message) - } - } else if let url = url { - return .url(url) - } else { - return .none + |> mapToSignal { authData -> Signal in + if let currentPasswordDerivation = authData.currentPasswordDerivation, let srpSessionData = authData.srpSessionData { + guard let kdfResult = passwordKDF(encryptionProvider: account.network.encryptionProvider, password: password, derivation: currentPasswordDerivation, srpSessionData: srpSessionData) else { + return .fail(.generic) } + return .single(.inputCheckPasswordSRP(srpId: kdfResult.id, A: Buffer(data: kdfResult.A), M1: Buffer(data: kdfResult.M1))) + } else { + return .fail(.twoStepAuthMissing) + } + } + } else { + checkPassword = .single(nil) + } + + return checkPassword + |> mapToSignal { password -> Signal in + return account.network.request(Api.functions.messages.getBotCallbackAnswer(flags: flags, peer: inputPeer, msgId: messageId.id, data: dataBuffer, password: password)) + |> map(Optional.init) + |> mapError { error -> MessageActionCallbackError in + if error.errorDescription.hasPrefix("FLOOD_WAIT") { + return .limitExceeded + } else if error.errorDescription == "PASSWORD_HASH_INVALID" { + return .invalidPassword + } else if error.errorDescription == "PASSWORD_MISSING" { + return .twoStepAuthMissing + } else if error.errorDescription.hasPrefix("PASSWORD_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "PASSWORD_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .twoStepAuthTooFresh(value) + } + } else if error.errorDescription.hasPrefix("SESSION_TOO_FRESH_") { + let timeout = String(error.errorDescription[error.errorDescription.index(error.errorDescription.startIndex, offsetBy: "SESSION_TOO_FRESH_".count)...]) + if let value = Int32(timeout) { + return .authSessionTooFresh(value) + } + } else if error.errorDescription == "USER_PRIVACY_RESTRICTED" { + return .restricted + } else if error.errorDescription == "USER_BLOCKED" { + return .userBlocked + } + return .generic + } + |> map { result -> MessageActionCallbackResult in + guard let result = result else { + return .none + } + switch result { + case let .botCallbackAnswer(flags, message, url, cacheTime): + if let message = message { + if (flags & (1 << 1)) != 0 { + return .alert(message) + } else { + return .toast(message) + } + } else if let url = url { + return .url(url) + } else { + return .none + } + } } } } else { diff --git a/submodules/TelegramCore/Sources/Serialization.swift b/submodules/TelegramCore/Sources/Serialization.swift index eee8616a22..9d7dec93c3 100644 --- a/submodules/TelegramCore/Sources/Serialization.swift +++ b/submodules/TelegramCore/Sources/Serialization.swift @@ -210,7 +210,7 @@ public class BoxedMessage: NSObject { public class Serialization: NSObject, MTSerialization { public func currentLayer() -> UInt { - return 117 + return 118 } public func parseMessage(_ data: Data!) -> Any! { diff --git a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift index aa1ec9bd2e..fd4d4f3d25 100644 --- a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift @@ -136,7 +136,7 @@ func apiMessagePeerId(_ messsage: Api.Message) -> PeerId? { func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] { switch message { - case let .message(flags, _, fromId, toId, fwdHeader, viaBotId, _, _, _, media, _, entities, _, _, _, _, _): + case let .message(flags, _, fromId, toId, fwdHeader, viaBotId, _, _, _, media, _, entities, _, _, _, _, _, _): let peerId: PeerId switch toId { case let .peerUser(userId): @@ -240,7 +240,7 @@ func apiMessagePeerIds(_ message: Api.Message) -> [PeerId] { func apiMessageAssociatedMessageIds(_ message: Api.Message) -> [MessageId]? { switch message { - case let .message(flags, _, fromId, toId, _, _, replyToMsgId, _, _, _, _, _, _, _, _, _, _): + case let .message(flags, _, fromId, toId, _, _, replyToMsgId, _, _, _, _, _, _, _, _, _, _, _): if let replyToMsgId = replyToMsgId { let peerId: PeerId switch toId { @@ -398,7 +398,7 @@ func messageTextEntitiesFromApiEntities(_ entities: [Api.MessageEntity]) -> [Mes extension StoreMessage { convenience init?(apiMessage: Api.Message, namespace: MessageId.Namespace = Namespaces.Message.Cloud) { switch apiMessage { - case let .message(flags, id, fromId, toId, fwdFrom, viaBotId, replyToMsgId, date, message, media, replyMarkup, entities, views, editDate, postAuthor, groupingId, restrictionReason): + case let .message(flags, id, fromId, toId, fwdFrom, viaBotId, replyToMsgId, date, message, media, replyMarkup, entities, views, forwards, editDate, postAuthor, groupingId, restrictionReason): let peerId: PeerId var authorId: PeerId? switch toId { @@ -517,14 +517,16 @@ extension StoreMessage { attributes.append(ReplyMessageAttribute(messageId: MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: replyToMsgId))) } - if let views = views, namespace != Namespaces.Message.ScheduledCloud { - attributes.append(ViewCountMessageAttribute(count: Int(views))) + if namespace != Namespaces.Message.ScheduledCloud { + if let views = views { + attributes.append(ViewCountMessageAttribute(count: Int(views))) + } + + if let forwards = forwards { + attributes.append(ForwardCountMessageAttribute(count: Int(forwards))) + } } - /*if let forwards = forwards, namespace != Namespaces.Message.ScheduledCloud { - attributes.append(ForwardCountMessageAttribute(count: Int(forwards))) - }*/ - if let editDate = editDate { attributes.append(EditedMessageAttribute(date: editDate, isHidden: (flags & (1 << 21)) != 0)) } diff --git a/submodules/TelegramCore/Sources/UpdateMessageService.swift b/submodules/TelegramCore/Sources/UpdateMessageService.swift index 34cd793682..7ca077332f 100644 --- a/submodules/TelegramCore/Sources/UpdateMessageService.swift +++ b/submodules/TelegramCore/Sources/UpdateMessageService.swift @@ -58,7 +58,7 @@ class UpdateMessageService: NSObject, MTMessageService { self.putNext(groups) } case let .updateShortChatMessage(flags, id, fromId, chatId, message, pts, ptsCount, date, fwdFrom, viaBotId, replyToMsgId, entities): - let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: fromId, toId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) + let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: fromId, toId: Api.Peer.peerChat(chatId: chatId), fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount) let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil) if groups.count != 0 { @@ -75,7 +75,7 @@ class UpdateMessageService: NSObject, MTMessageService { generatedToId = Api.Peer.peerUser(userId: self.peerId.id) } - let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, toId: generatedToId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) + let generatedMessage = Api.Message.message(flags: flags, id: id, fromId: generatedFromId, toId: generatedToId, fwdFrom: fwdFrom, viaBotId: viaBotId, replyToMsgId: replyToMsgId, date: date, message: message, media: Api.MessageMedia.messageMediaEmpty, replyMarkup: nil, entities: entities, views: nil, forwards: nil, editDate: nil, postAuthor: nil, groupedId: nil, restrictionReason: nil) let update = Api.Update.updateNewMessage(message: generatedMessage, pts: pts, ptsCount: ptsCount) let groups = groupUpdates([update], users: [], chats: [], date: date, seqRange: nil) if groups.count != 0 { diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index f574819ef3..dd235e125f 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -5004,337 +5004,338 @@ public final class PresentationStrings: Equatable { public var Channel_Setup_TypePublicHelp: String { return self._s[4517]! } public var Passport_Identity_EditInternalPassport: String { return self._s[4518]! } public var PhotoEditor_Skip: String { return self._s[4519]! } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { + public func ForwardedGifs(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, _1, _2) + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveYear(_ value: Int32) -> String { + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareItem(_ value: Int32) -> String { + public func MessageTimer_Years(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func Call_Seconds(_ value: Int32) -> String { + public func Notification_GameScoreExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func StickerPack_AddStickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { + public func OldChannels_Leave(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, _1, _2) + public func OldChannels_InactiveMonth(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteFor_Hours(_ value: Int32) -> String { + public func Stats_GroupTopPosterChars(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedAudios(_ value: Int32) -> String { + public func Contacts_InviteContacts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, _1, _2) } - public func SharedMedia_Video(_ value: Int32) -> String { + public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func MessageTimer_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedStickers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func Notifications_Exceptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_ShortMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_MessageViews(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func QuickSend_Photos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_ImportersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, _0, _1) - } - public func StickerPack_StickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_MessageForwards(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Notification_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, _1, _2) } public func Call_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } public func Wallet_Updated_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallet_Updated_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) } public func Passport_Scans(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeletedChats(_ value: Int32) -> String { + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) } - public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_ShortDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func UserCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _0, _1) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusSubscribers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteText_ContactsCountText(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedLocations(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func QuickSend_Photos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { + public func Contacts_ImportersCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) @@ -5344,356 +5345,355 @@ public final class PresentationStrings: Equatable { let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func ForwardedVideos(_ value: Int32) -> String { + public func OldChannels_InactiveYear(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_SharePhoto(_ value: Int32) -> String { + public func ChatList_DeletedChats(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessagePhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterChars(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_SelectedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Contacts_InviteContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Link(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) } public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Map_ETAHours(_ value: Int32) -> String { + public func StickerPack_AddMaskCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InstantPage_Views(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminBans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) } public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func Invitation_Members(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_MessageVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_GroupFormat(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notification_GameScoreExtended(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusOnline(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) } public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_ShareItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InstantPage_Views(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminBans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageViews(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Media_SharePhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ChatList_MessagePhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageForwards(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedAudios(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Video(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedPhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MuteFor_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_GroupFormat(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PollResults_ShowMore(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) + } + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + public func Conversation_SelectedMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Months(_ value: Int32) -> String { + public func ChatList_MessageVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortDays(_ value: Int32) -> String { + public func MuteFor_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, _1, _2) } - public func OldChannels_Leave(_ value: Int32) -> String { + public func ForwardedStickers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, _1, _2) + public func Map_ETAHours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index c48a93109ff917439e47863de6a2606aeeff9d9e..eb8d162e64163e6b7775f4fd4cd09e2b1314579d 100644 GIT binary patch delta 2111 zcmZWqOK=or5Z=FG10j$Q^4Q&ElWd+m)In4bP|%RK*~#u^cG)Bwg(34phV0HP^G|rF z5Q2!J_^Pe4PnL343Jz8&a`5WOf}2%ZJj#QXWm$N)#QrCfNZ`;l^?&{N`|tj`=l1pT z+t9?H|x?^x-z&tE~fX>pjRZ&Idg+tsCJ@%~St{^l* zqH-bhBRp*uxT9#(w&QAi%C-!#6936Ugaz^D2sA-i06)3JYVe~RRI^q1(=fEL)i^f^ z;b6Ipgw-PuTBF*QJH1ApO9wkbWj)inBP#HlVTi@n5*i}uArpPd70Qrx+;sWkab4-| z$~IPsUrazdtHS0iC9SM}?Cu^`O4rQzX zPmjY^)`;N=*wPjyCt0ya9Q_N)wFz%bLVIH~*=!(LmX;U31+Sza6pWFwt916aNNIgn zMVZ%)R{U!OT38!y%s^AHoeX05cLo~Q^qq9MMUCtTl=MGqp)-K3!%!3K&-Q9vxOWUX z*+$e85GmOggP?7~U6arh-c0^gBug~dZyMYdTkt^+n%NV0CjsH+C&{3iWLcWM`YG`g zfo<~k=nkGgteJ&ko-2gaki>OC{NR@I|EsqWEGdu?-0|M>H15ellx@RMigI~|RFx#E zUR3(h-M-(m0ZjhFYVl|a*0bmE+bp!jwv&~-L#6)poh+IT7mL^IAUK9|IfztgOF2F7 zf%Ah9U2PchcCi!xjYE5I7b!Zt2dpLI#R~4m(<9Ise1VilIDBx zS{lOJ_L5f8PUVKF(>Ul3_iFc&kEdqIN287?$!XiQ#ml%(_N`m?poQ(jd!x|O-b2O> zB*g9Gl$Gw9wxwvU?#>E-0(&^fvx8VFZbancL z8ziKTghtDao5EFkIkA`<@+^k%0WqTU71B$VYc3_rouocBqjVdFs*4$~LBphL#Q71Z z!^sIKkH+aN3F}SdLbiUMY5;G2Pi?xNgUaX#nMhVWRGT4}7ZL>3V=4~y4YX~NbXxYL zelyQS3h$0Xn2q8U`O)O~M%uHS&xkbHOBOB>YjF-U1ctmm1^4Ne*pHvl(}Gz-oAB}& zM0O@^;Zk+S2$8#`hsIg)SJyb5A6pE*ZUQf+p^N44YLePMiO13qVz1)vQQ8)-;h8Lb z4qzos6g!CX2|DTcdm5UW4^d26c-cqd<-*qV8z-jZeraI_Zcjl=l#|)A@#~&7Oj{f# zI3~xwqOYKvd9M{m@K_SUbJL`fwDSmOEEG6yS~DhLvN{Wolgrts!BGP1NtT%7vDD8> z%#cP-(!=2fxWyfFD(^e`rjl?9)iwj=PzaP-f33xjQ&1O_d%!|nrEb|+9HpTul4I1X z{HkuFU|QlB&c|Uhb7*l#E0TkWbV3tk6Y{7Kl+1AP^DG6J#nBvWV#o0-iUTJW_Unf# z?bnl^rl6jkk`eIWRTf;Kz3yp8M-!QmUhNGECtE8Q0zFibNxdnrAW7sUZng)-pS zvqdr}=FJBvTdKF{MhjeZX2@YEQz?|+M2A6wfVN6-5~ z)6=}b6>rmc&3l`0Ip^N}L)KwiN$L*GoLST@*R!|~z{}OF4sU2s&fdWvGSD&iE_uk- zElsfBiiI70ku>rTzW8Qu9NzQ6WJVi2p!R86_duWaK7o=OOBC?OU0fp2E8D`x^&)&g RSPMx~FI|XLp*0Sb{{he6O_l%v delta 1997 zcmZuy&2v*#6wf_0Z6j@IOPV%mnxsw3m+(YXzz>kphBlIyq_KRX+S*#9_GX! za}e}2IvkD`vJtgZk`z8?=moRMfh&92Ml7YE75_*EZed=U>s9RowhpJyU`P*b(K1Oji>T^^d-Rf~2 z%8e?$6wrfL@3CH|pFTUQf8KI8Dt+|n!P|N81jn@F0s0f9C`Glx3oO;?mg)idT6l*#4XN^l<@$%FTN(l9N$$~Hne$rMYqOiAXZsh;3jjW3x` z6WUHTu}I`7TrWt;qG1{4cESXMBZh9NbF?U0UZ9LtY1u)p4PcUbc^-rD_5`%C zXYhBD73_3i@;;T$m4bHXvlO*Wkms8g^9G-`wmVevzijjNsff48W)ZuXM03SJEhzvIcc5 z4yVC~;lt436cQY(bxJCciH|DdqRa5;SIpU`MCp(x>R~fwzD95eCnliR6*+BDb$Q`1 z{*xuXV)$JaHu+=#yECEiKbyWL*aaWBSE}^=1 zb`x=19r>fY!;fCj#siYE)6krym%uCjcfsbNW&02iPvTDdn>fS z9v`*QX{Txu7Obv>+<0dO+Q4$)m-kqo-Jke(9$cO$l(IS*PTBm1bDYncOSFRsit47N z>Q<7bjAW0Q(*$;7oE{nHK~*=;pg#fI*ja4N&@_KjB?~S)8^#3GRQ}o*oy!$=# zwXW*)97PWb=>+Xp3C`PoH!eq5Q%h7orBM?t+lPy{WXR5PMf{T`N(EA(uJe*9*>xdi z%c}JbuA71_@U8sP{cuWmma2LDO29*Cy}9`mwVans=A*uOtLQ x?^Cd7{(7plV43D=(foj5kNvvg!z47Y4{=$%hach17`=y=sj&yx$5>22_+O35Chh afterDisposed { - Queue.mainQueue().async { - if let strongSelf = self { - strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { - return $0.updatedTitlePanelContext { - if let index = $0.firstIndex(where: { - switch $0 { - case .requestInProgress: - return true - default: - return false - } - }) { - var updatedContexts = $0 - updatedContexts.remove(at: index) - return updatedContexts - } - return $0 - } + let proceedWithResult: (MessageActionCallbackResult) -> Void = { [weak self] result in + guard let strongSelf = self else { + return + } + + switch result { + case .none: + break + case let .alert(text): + strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) + case let .toast(text): + let message: Signal = .single(text) + let noMessage: Signal = .single(nil) + let delayedNoMessage: Signal = noMessage |> delay(1.0, queue: Queue.mainQueue()) + strongSelf.botCallbackAlertMessage.set(message |> then(delayedNoMessage)) + case let .url(url): + if isGame { + strongSelf.chatDisplayNode.dismissInput() + strongSelf.effectiveNavigationController?.pushViewController(GameController(context: strongSelf.context, url: url, message: message)) + } else { + strongSelf.openUrl(url, concealed: false) + } + } + } + + let account = strongSelf.context.account + if requiresPassword { + strongSelf.messageActionCallbackDisposable.set((requestMessageActionCallbackPasswordCheck(account: account, messageId: messageId, isGame: isGame, data: data) + |> deliverOnMainQueue).start(error: { error in + let controller = ownershipTransferController(context: context, initialError: error, present: { c, a in + strongSelf.present(c, in: .window(.root), with: a) + }, commit: { password in + return requestMessageActionCallback(account: account, messageId: messageId, isGame: isGame, password: password, data: data) + }, completion: { result in + proceedWithResult(result) }) + strongSelf.present(controller, in: .window(.root)) + })) + } else { + strongSelf.messageActionCallbackDisposable.set(((requestMessageActionCallback(account: account, messageId: messageId, isGame: isGame, password: nil, data: data) + |> afterDisposed { + Queue.mainQueue().async { + if let strongSelf = self { + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { + return $0.updatedTitlePanelContext { + if let index = $0.firstIndex(where: { + switch $0 { + case .requestInProgress: + return true + default: + return false + } + }) { + var updatedContexts = $0 + updatedContexts.remove(at: index) + return updatedContexts + } + return $0 + } + }) + } } - } - }) - |> deliverOnMainQueue).start(next: { result in - if let strongSelf = self { - switch result { - case .none: - break - case let .alert(text): - strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: text, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root)) - case let .toast(text): - let message: Signal = .single(text) - let noMessage: Signal = .single(nil) - let delayedNoMessage: Signal = noMessage |> delay(1.0, queue: Queue.mainQueue()) - strongSelf.botCallbackAlertMessage.set(message |> then(delayedNoMessage)) - case let .url(url): - if isGame { - strongSelf.chatDisplayNode.dismissInput() - strongSelf.effectiveNavigationController?.pushViewController(GameController(context: strongSelf.context, url: url, message: message)) - } else { - strongSelf.openUrl(url, concealed: false) - } - } - } - })) + }) + |> deliverOnMainQueue).start(next: { result in + proceedWithResult(result) + })) + } } } }, requestMessageActionUrlAuth: { [weak self] defaultUrl, messageId, buttonId in diff --git a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift index 1885abd5ba..1aaaad688d 100644 --- a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift @@ -71,7 +71,7 @@ public final class ChatControllerInteraction { let sendSticker: (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool let sendGif: (FileMediaReference, ASDisplayNode, CGRect) -> Bool let sendBotContextResultAsGif: (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool - let requestMessageActionCallback: (MessageId, MemoryBuffer?, Bool) -> Void + let requestMessageActionCallback: (MessageId, MemoryBuffer?, Bool, Bool) -> Void let requestMessageActionUrlAuth: (String, MessageId, Int32) -> Void let activateSwitchInline: (PeerId?, String) -> Void let openUrl: (String, Bool, Bool?, Message?) -> Void @@ -138,7 +138,7 @@ public final class ChatControllerInteraction { var searchTextHighightState: (String, [MessageIndex])? var seenOneTimeAnimatedMedia = Set() - init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void, openMessageContextActions: @escaping (Message, ASDisplayNode, CGRect, ContextGesture?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, tapMessage: ((Message) -> Void)?, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, sendBotContextResultAsGif: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?, Message?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openTheme: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId, Bool) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> ChatControllerInteractionSwipeAction, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOptions: @escaping (MessageId, [Data]) -> Void, requestOpenMessagePollResults: @escaping (MessageId, MediaId) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, NSAttributedString, TextSelectionAction) -> Void, updateMessageLike: @escaping (MessageId, Bool) -> Void, openMessageReactions: @escaping (MessageId) -> Void, displaySwipeToReplyHint: @escaping () -> Void, dismissReplyMarkupMessage: @escaping (Message) -> Void, openMessagePollResults: @escaping (MessageId, Data) -> Void, openPollCreation: @escaping (Bool?) -> Void, displayPollSolution: @escaping (TelegramMediaPollResults.Solution, ASDisplayNode) -> Void, displayPsa: @escaping (String, ASDisplayNode) -> Void, displayDiceTooltip: @escaping (TelegramMediaDice) -> Void, animateDiceSuccess: @escaping () -> Void, greetingStickerNode: @escaping () -> (ASDisplayNode, ASDisplayNode, ASDisplayNode, () -> Void)?, openPeerContextMenu: @escaping (Peer, ASDisplayNode, CGRect, ContextGesture?) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { + init(openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeerMention: @escaping (String) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void, openMessageContextActions: @escaping (Message, ASDisplayNode, CGRect, ContextGesture?) -> Void, navigateToMessage: @escaping (MessageId, MessageId) -> Void, tapMessage: ((Message) -> Void)?, clickThroughMessage: @escaping () -> Void, toggleMessagesSelection: @escaping ([MessageId], Bool) -> Void, sendCurrentMessage: @escaping (Bool) -> Void, sendMessage: @escaping (String) -> Void, sendSticker: @escaping (FileMediaReference, Bool, ASDisplayNode, CGRect) -> Bool, sendGif: @escaping (FileMediaReference, ASDisplayNode, CGRect) -> Bool, sendBotContextResultAsGif: @escaping (ChatContextResultCollection, ChatContextResult, ASDisplayNode, CGRect) -> Bool, requestMessageActionCallback: @escaping (MessageId, MemoryBuffer?, Bool, Bool) -> Void, requestMessageActionUrlAuth: @escaping (String, MessageId, Int32) -> Void, activateSwitchInline: @escaping (PeerId?, String) -> Void, openUrl: @escaping (String, Bool, Bool?, Message?) -> Void, shareCurrentLocation: @escaping () -> Void, shareAccountContact: @escaping () -> Void, sendBotCommand: @escaping (MessageId?, String) -> Void, openInstantPage: @escaping (Message, ChatMessageItemAssociatedData?) -> Void, openWallpaper: @escaping (Message) -> Void, openTheme: @escaping (Message) -> Void, openHashtag: @escaping (String?, String) -> Void, updateInputState: @escaping ((ChatTextInputState) -> ChatTextInputState) -> Void, updateInputMode: @escaping ((ChatInputMode) -> ChatInputMode) -> Void, openMessageShareMenu: @escaping (MessageId) -> Void, presentController: @escaping (ViewController, Any?) -> Void, navigationController: @escaping () -> NavigationController?, chatControllerNode: @escaping () -> ASDisplayNode?, reactionContainerNode: @escaping () -> ReactionSelectionParentNode?, presentGlobalOverlayController: @escaping (ViewController, Any?) -> Void, callPeer: @escaping (PeerId, Bool) -> Void, longTap: @escaping (ChatControllerInteractionLongTapAction, Message?) -> Void, openCheckoutOrReceipt: @escaping (MessageId) -> Void, openSearch: @escaping () -> Void, setupReply: @escaping (MessageId) -> Void, canSetupReply: @escaping (Message) -> ChatControllerInteractionSwipeAction, navigateToFirstDateMessage: @escaping(Int32) ->Void, requestRedeliveryOfFailedMessages: @escaping (MessageId) -> Void, addContact: @escaping (String) -> Void, rateCall: @escaping (Message, CallId) -> Void, requestSelectMessagePollOptions: @escaping (MessageId, [Data]) -> Void, requestOpenMessagePollResults: @escaping (MessageId, MediaId) -> Void, openAppStorePage: @escaping () -> Void, displayMessageTooltip: @escaping (MessageId, String, ASDisplayNode?, CGRect?) -> Void, seekToTimecode: @escaping (Message, Double, Bool) -> Void, scheduleCurrentMessage: @escaping () -> Void, sendScheduledMessagesNow: @escaping ([MessageId]) -> Void, editScheduledMessagesTime: @escaping ([MessageId]) -> Void, performTextSelectionAction: @escaping (UInt32, NSAttributedString, TextSelectionAction) -> Void, updateMessageLike: @escaping (MessageId, Bool) -> Void, openMessageReactions: @escaping (MessageId) -> Void, displaySwipeToReplyHint: @escaping () -> Void, dismissReplyMarkupMessage: @escaping (Message) -> Void, openMessagePollResults: @escaping (MessageId, Data) -> Void, openPollCreation: @escaping (Bool?) -> Void, displayPollSolution: @escaping (TelegramMediaPollResults.Solution, ASDisplayNode) -> Void, displayPsa: @escaping (String, ASDisplayNode) -> Void, displayDiceTooltip: @escaping (TelegramMediaDice) -> Void, animateDiceSuccess: @escaping () -> Void, greetingStickerNode: @escaping () -> (ASDisplayNode, ASDisplayNode, ASDisplayNode, () -> Void)?, openPeerContextMenu: @escaping (Peer, ASDisplayNode, CGRect, ContextGesture?) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, pollActionState: ChatInterfacePollActionState, stickerSettings: ChatInterfaceStickerSettings) { self.openMessage = openMessage self.openPeer = openPeer self.openPeerMention = openPeerMention @@ -215,7 +215,7 @@ public final class ChatControllerInteraction { static var `default`: ChatControllerInteraction { return ChatControllerInteraction(openMessage: { _, _ in - return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index d248495c13..04e3869f03 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -68,7 +68,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { private var highlightedState: Bool = false - private var heartbeatHaptic: HeartbeatHaptic? + private var haptic: EmojiHaptic? private var currentSwipeToReplyTranslation: CGFloat = 0.0 @@ -217,7 +217,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { didSet { if self.visibilityStatus != oldValue { self.updateVisibility() - self.heartbeatHaptic?.enabled = self.visibilityStatus + self.haptic?.enabled = self.visibilityStatus } } } @@ -228,10 +228,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } if let telegramDice = self.telegramDice { - if telegramDice.emoji == "🎲" { - let animationNode = SlotMachineAnimationNode(context: item.context) - self.animationNode = animationNode - } else { +// if telegramDice.emoji == "🎲" { +// let animationNode = SlotMachineAnimationNode(context: item.context) +// self.animationNode = animationNode +// } else { let animationNode = ManagedDiceAnimationNode(context: item.context, emoji: telegramDice.emoji.strippedEmoji) if !item.message.effectivelyIncoming(item.context.account.peerId) { animationNode.success = { [weak self] in @@ -241,7 +241,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } } self.animationNode = animationNode - } +// } } else { let animationNode: AnimatedStickerNode if let (node, parentNode, listNode, greetingCompletion) = item.controllerInteraction.greetingStickerNode(), let greetingStickerNode = node as? AnimatedStickerNode { @@ -1110,24 +1110,29 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } let beatingHearts: [UInt32] = [0x2764, 0x1F90E, 0x1F9E1, 0x1F49A, 0x1F49C, 0x1F49B, 0x1F5A4, 0x1F90D] - - if let text = self.item?.message.text, let firstScalar = text.unicodeScalars.first, beatingHearts.contains(firstScalar.value) { + let peach = 0x1F351 + + if let text = self.item?.message.text, let firstScalar = text.unicodeScalars.first, beatingHearts.contains(firstScalar.value) || firstScalar.value == peach { return .optionalAction({ let _ = startTime.start(next: { [weak self] time in guard let strongSelf = self else { return } - let heartbeatHaptic: HeartbeatHaptic - if let current = strongSelf.heartbeatHaptic { - heartbeatHaptic = current + var haptic: EmojiHaptic + if let current = strongSelf.haptic { + haptic = current } else { - heartbeatHaptic = HeartbeatHaptic() - heartbeatHaptic.enabled = true - strongSelf.heartbeatHaptic = heartbeatHaptic + if beatingHearts.contains(firstScalar.value) { + haptic = HeartbeatHaptic() + } else { + haptic = PeachHaptic() + } + haptic.enabled = true + strongSelf.haptic = haptic } - if !heartbeatHaptic.active { - heartbeatHaptic.start(time: time) + if !haptic.active { + haptic.start(time: time) } }) }) diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index 6b153f1771..df66db593a 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -907,6 +907,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } + if item.presentationData.isPreview { + needShareButton = false + } + var tmpWidth: CGFloat if allowFullWidth { tmpWidth = baseWidth @@ -1843,6 +1847,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode strongSelf.contextSourceNode.contentNode.addSubnode(nameNode) } nameNode.frame = CGRect(origin: CGPoint(x: contentOrigin.x + layoutConstants.text.bubbleInsets.left, y: layoutConstants.bubble.contentInsets.top + nameNodeOriginY), size: nameNodeSizeApply.0) + nameNode.displaysAsynchronously = !item.presentationData.isPreview if let credibilityIconImage = currentCredibilityIconImage { let credibilityIconNode: ASImageNode diff --git a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift index 3ed9230c12..2de1494996 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift @@ -508,6 +508,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { impressionIcon.removeFromSupernode() strongSelf.impressionIcon = nil } + strongSelf.impressionIcon?.displaysAsynchronously = !presentationData.isPreview strongSelf.dateNode.frame = CGRect(origin: CGPoint(x: leftInset + backgroundInsets.left + impressionWidth, y: backgroundInsets.top + 1.0 + offset), size: date.size) diff --git a/submodules/TelegramUI/Sources/ChatMessageGameBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageGameBubbleContentNode.swift index de894e9555..43c68319f1 100644 --- a/submodules/TelegramUI/Sources/ChatMessageGameBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageGameBubbleContentNode.swift @@ -26,7 +26,7 @@ final class ChatMessageGameBubbleContentNode: ChatMessageBubbleContentNode { self.addSubnode(self.contentNode) self.contentNode.openMedia = { [weak self] _ in if let strongSelf = self, let item = strongSelf.item { - item.controllerInteraction.requestMessageActionCallback(item.message.id, nil, true) + item.controllerInteraction.requestMessageActionCallback(item.message.id, nil, true, false) } } } diff --git a/submodules/TelegramUI/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Sources/ChatMessageItemView.swift index e4bab4067d..f114d2af30 100644 --- a/submodules/TelegramUI/Sources/ChatMessageItemView.swift +++ b/submodules/TelegramUI/Sources/ChatMessageItemView.swift @@ -782,9 +782,9 @@ public class ChatMessageItemView: ListViewItemNode { case .requestPhone: item.controllerInteraction.shareAccountContact() case .openWebApp: - item.controllerInteraction.requestMessageActionCallback(item.message.id, nil, true) - case let .callback(data): - item.controllerInteraction.requestMessageActionCallback(item.message.id, data, false) + item.controllerInteraction.requestMessageActionCallback(item.message.id, nil, true, false) + case let .callback(requiresPassword, data): + item.controllerInteraction.requestMessageActionCallback(item.message.id, data, false, requiresPassword) case let .switchInline(samePeer, query): var botPeer: Peer? diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift index 2211b4da21..242cc801c2 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift @@ -216,7 +216,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, openMessageContextMenu: { [weak self] message, selectAll, node, frame, _ in self?.openMessageContextMenu(message: message, selectAll: selectAll, node: node, frame: frame) }, openMessageContextActions: { _, _, _, _ in - }, navigateToMessage: { _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in + }, navigateToMessage: { _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, _, _ in self?.openUrl(url) }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { [weak self] message, associatedData in if let strongSelf = self, let navigationController = strongSelf.getNavigationController() { diff --git a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift index 2763398844..e3c585e781 100644 --- a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift +++ b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift @@ -108,7 +108,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { var selectStickerImpl: ((FileMediaReference, ASDisplayNode, CGRect) -> Bool)? self.controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in - return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { diff --git a/submodules/TelegramUI/Sources/HeartbeatHaptic.swift b/submodules/TelegramUI/Sources/HeartbeatHaptic.swift index 5c636cbea0..e70cc92788 100644 --- a/submodules/TelegramUI/Sources/HeartbeatHaptic.swift +++ b/submodules/TelegramUI/Sources/HeartbeatHaptic.swift @@ -2,11 +2,18 @@ import Foundation import Display import SwiftSignalKit -final class HeartbeatHaptic { +protocol EmojiHaptic { + var enabled: Bool { get set } + var active: Bool { get } + + func start(time: Double) +} + +final class HeartbeatHaptic: EmojiHaptic { private var hapticFeedback = HapticFeedback() private var timer: SwiftSignalKit.Timer? private var time: Double = 0.0 - var enabled = false { + var enabled: Bool = false { didSet { if !self.enabled { self.reset() diff --git a/submodules/TelegramUI/Sources/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayPlayerControllerNode.swift index b635f7ac1b..b81ff47c8c 100644 --- a/submodules/TelegramUI/Sources/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/Sources/OverlayPlayerControllerNode.swift @@ -76,7 +76,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu return false }, sendBotContextResultAsGif: { _, _, _, _ in return false - }, requestMessageActionCallback: { _, _, _ in + }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in diff --git a/submodules/TelegramUI/Sources/OwnershipTransferController.swift b/submodules/TelegramUI/Sources/OwnershipTransferController.swift new file mode 100644 index 0000000000..b2028a051a --- /dev/null +++ b/submodules/TelegramUI/Sources/OwnershipTransferController.swift @@ -0,0 +1,128 @@ +import Foundation +import UIKit +import AsyncDisplayKit +import Display +import SwiftSignalKit +import Postbox +import TelegramCore +import SyncCore +import TelegramPresentationData +import ActivityIndicator +import TextFormat +import AccountContext +import AlertUI +import PresentationDataUtils +import PasswordSetupUI +import Markdown +import PeerInfoUI + +private func commitOwnershipTransferController(context: AccountContext, present: @escaping (ViewController, Any?) -> Void, commit: @escaping (String) -> Signal, completion: @escaping (MessageActionCallbackResult) -> Void) -> ViewController { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + var dismissImpl: (() -> Void)? + var proceedImpl: (() -> Void)? + + var pushControllerImpl: ((ViewController) -> Void)? + + let disposable = MetaDisposable() + + let contentNode = ChannelOwnershipTransferAlertContentNode(theme: AlertControllerTheme(presentationData: presentationData), ptheme: presentationData.theme, strings: presentationData.strings, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: { + dismissImpl?() + }), TextAlertAction(type: .defaultAction, title: presentationData.strings.OwnershipTransfer_Transfer, action: { + proceedImpl?() + })]) + + contentNode.complete = { + proceedImpl?() + } + + let controller = AlertController(theme: AlertControllerTheme(presentationData: presentationData), contentNode: contentNode) + let presentationDataDisposable = context.sharedContext.presentationData.start(next: { [weak controller, weak contentNode] presentationData in + controller?.theme = AlertControllerTheme(presentationData: presentationData) + contentNode?.theme = presentationData.theme + }) + controller.dismissed = { + presentationDataDisposable.dispose() + disposable.dispose() + } + dismissImpl = { [weak controller, weak contentNode] in + contentNode?.dismissInput() + controller?.dismissAnimated() + } + proceedImpl = { [weak contentNode] in + guard let contentNode = contentNode else { + return + } + contentNode.updateIsChecking(true) + + disposable.set((commit(contentNode.password) |> deliverOnMainQueue).start(next: { result in + dismissImpl?() + }, error: { [weak contentNode] error in + var errorTextAndActions: (String, [TextAlertAction])? + switch error { + case .invalidPassword: + contentNode?.animateError() + case .limitExceeded: + errorTextAndActions = (presentationData.strings.TwoStepAuth_FloodError, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + case .userBlocked, .restricted: + errorTextAndActions = (presentationData.strings.Group_OwnershipTransfer_ErrorPrivacyRestricted, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + default: + errorTextAndActions = (presentationData.strings.Login_UnknownError, [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]) + } + contentNode?.updateIsChecking(false) + + if let (text, actions) = errorTextAndActions { + dismissImpl?() + present(textAlertController(context: context, title: nil, text: text, actions: actions), nil) + } + })) + } + + pushControllerImpl = { [weak controller] c in + controller?.push(c) + } + + return controller +} + + +func ownershipTransferController(context: AccountContext, initialError: MessageActionCallbackError, present: @escaping (ViewController, Any?) -> Void, commit: @escaping (String) -> Signal, completion: @escaping (MessageActionCallbackResult) -> Void) -> ViewController { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let theme = AlertControllerTheme(presentationData: presentationData) + + var title: NSAttributedString? = NSAttributedString(string: presentationData.strings.OwnershipTransfer_SecurityCheck, font: Font.medium(presentationData.listsFontSize.itemListBaseFontSize), textColor: theme.primaryColor, paragraphAlignment: .center) + + var text = presentationData.strings.OwnershipTransfer_SecurityRequirements + var actions: [TextAlertAction] = [] + + switch initialError { + case .requestPassword: + return commitOwnershipTransferController(context: context, present: present, commit: commit, completion: completion) + case .twoStepAuthTooFresh, .authSessionTooFresh: + text = text + presentationData.strings.OwnershipTransfer_ComeBackLater + actions = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})] + case .twoStepAuthMissing: + actions = [TextAlertAction(type: .genericAction, title: presentationData.strings.OwnershipTransfer_SetupTwoStepAuth, action: { + let controller = SetupTwoStepVerificationController(context: context, initialState: .automatic, stateUpdated: { update, shouldDismiss, controller in + if shouldDismiss { + controller.dismiss() + } + }) + present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + }), TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {})] + case .userBlocked, .restricted: + title = nil + text = presentationData.strings.Group_OwnershipTransfer_ErrorPrivacyRestricted + actions = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})] + default: + title = nil + text = presentationData.strings.Login_UnknownError + actions = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})] + } + + let body = MarkdownAttributeSet(font: Font.regular(13.0), textColor: theme.primaryColor) + let bold = MarkdownAttributeSet(font: Font.semibold(13.0), textColor: theme.primaryColor) + let attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: body, bold: bold, link: body, linkAttribute: { _ in return nil }), textAlignment: .center) + + return richTextAlertController(context: context, title: title, text: attributedText, actions: actions) +} diff --git a/submodules/TelegramUI/Sources/PeachHaptic.swift b/submodules/TelegramUI/Sources/PeachHaptic.swift new file mode 100644 index 0000000000..e92ffeb0af --- /dev/null +++ b/submodules/TelegramUI/Sources/PeachHaptic.swift @@ -0,0 +1,73 @@ +import Foundation +import Display +import SwiftSignalKit + +private let impactTime: Double = 0.4 + +final class PeachHaptic: EmojiHaptic { + private var hapticFeedback = HapticFeedback() + private var timer: SwiftSignalKit.Timer? + private var time: Double = 0.0 + var enabled: Bool = false { + didSet { + if !self.enabled { + self.reset() + } + } + } + + var active: Bool { + return self.timer != nil + } + + private func reset() { + if let timer = self.timer { + self.time = 0.0 + timer.invalidate() + self.timer = nil + } + } + + private func beat(time: Double) { + let epsilon = 0.1 + if fabs(impactTime - time) < epsilon { + self.hapticFeedback.impact(.heavy) + } + } + + func start(time: Double) { + self.hapticFeedback.prepareImpact() + + if time > impactTime { + return + } + + let startTime: Double = 0.0 + + let block = { [weak self] in + guard let strongSelf = self, strongSelf.enabled else { + return + } + + strongSelf.time = startTime + strongSelf.beat(time: startTime) + strongSelf.timer = SwiftSignalKit.Timer(timeout: 0.2, repeat: true, completion: { [weak self] in + guard let strongSelf = self, strongSelf.enabled else { + return + } + strongSelf.time += 0.2 + strongSelf.beat(time: strongSelf.time) + + if strongSelf.time > impactTime { + strongSelf.reset() + strongSelf.time = 0.0 + strongSelf.timer?.invalidate() + strongSelf.timer = nil + } + }, queue: Queue.mainQueue()) + strongSelf.timer?.start() + } + + block() + } +} diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 34a2d2a76e..6cba1f2a1f 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -1825,7 +1825,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD return false }, sendBotContextResultAsGif: { _, _, _, _ in return false - }, requestMessageActionCallback: { _, _, _ in + }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, concealed, external, _ in diff --git a/submodules/TelegramUI/Sources/PeerMediaCollectionController.swift b/submodules/TelegramUI/Sources/PeerMediaCollectionController.swift index 7f9fdcb0dd..08f6108245 100644 --- a/submodules/TelegramUI/Sources/PeerMediaCollectionController.swift +++ b/submodules/TelegramUI/Sources/PeerMediaCollectionController.swift @@ -327,7 +327,7 @@ public class PeerMediaCollectionController: TelegramBaseController { return false }, sendBotContextResultAsGif: { _, _, _, _ in return false - }, requestMessageActionCallback: { _, _, _ in + }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { [weak self] url, _, external, _ in diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index a4c3640344..e16044228f 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1158,7 +1158,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { clickThroughMessage?() }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _ in return false }, sendGif: { _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _ in return false - }, requestMessageActionCallback: { _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in + }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, presentController: { _, _ in }, navigationController: { return nil }, chatControllerNode: { diff --git a/submodules/TelegramUI/Sources/TelegramRootController.swift b/submodules/TelegramUI/Sources/TelegramRootController.swift index 99e3ae0cfd..ffc7cf94f2 100644 --- a/submodules/TelegramUI/Sources/TelegramRootController.swift +++ b/submodules/TelegramUI/Sources/TelegramRootController.swift @@ -127,6 +127,25 @@ public final class TelegramRootController: NavigationController { self.accountSettingsController = accountSettingsController self.rootTabController = tabBarController self.pushViewController(tabBarController, animated: false) + +// Queue.mainQueue().after(2.0) { +// let messageId = MessageId(peerId: PeerId(namespace: 2, id: 1488156064), namespace: 0, id: 528) +// let _ = ((self.context.account.postbox.transaction { transaction in +// return transaction.getMessage(messageId) +// }) |> deliverOnMainQueue).start(next: { [weak self] message in +// guard let strongSelf = self, let message = message else { +// return +// } +// +// let layout = ContainerViewLayout(size: CGSize(width: 414.0, height: 896.0), metrics: LayoutMetrics(widthClass: .compact, heightClass: .compact), deviceMetrics: .iPhoneX, intrinsicInsets: UIEdgeInsets(), safeInsets: UIEdgeInsets(), statusBarHeight: 0.0, inputHeight: nil, inputHeightIsInteractivellyChanging: false, inVoiceOver: false) +// let renderer = MessageStoryRenderer(context: strongSelf.context, message: message) +// let image = renderer.update(layout: layout) +// +// let node = renderer.containerNode +// node.frame = CGRect(origin: CGPoint(), size: layout.size) +// strongSelf.displayNode.addSubnode(node) +// }) +// } } public func updateRootControllers(showCallsTab: Bool) { @@ -174,3 +193,134 @@ public final class TelegramRootController: NavigationController { presentedLegacyShortcutCamera(context: self.context, saveCapturedMedia: false, saveEditedPhotos: false, mediaGrouping: true, parentController: controller) } } + +class MessageStoryRenderer { + private let context: AccountContext + private let presentationData: PresentationData + private let message: Message + + let containerNode: ASDisplayNode + private let instantChatBackgroundNode: WallpaperBackgroundNode + private let messagesContainerNode: ASDisplayNode + private var dateHeaderNode: ListViewItemHeaderNode? + private var messageNodes: [ListViewItemNode]? + private let addressNode: ImmediateTextNode + + init(context: AccountContext, message: Message) { + self.context = context + self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.message = message + + self.containerNode = ASDisplayNode() + + self.instantChatBackgroundNode = WallpaperBackgroundNode() + self.instantChatBackgroundNode.displaysAsynchronously = false + self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: presentationData.theme, wallpaper: .builtin(WallpaperSettings()), mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) + + self.messagesContainerNode = ASDisplayNode() + self.messagesContainerNode.clipsToBounds = true + self.messagesContainerNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0) + + let peer = message.peers[message.id.peerId]! + self.addressNode = ImmediateTextNode() + self.addressNode.displaysAsynchronously = false + self.addressNode.attributedText = NSAttributedString(string: "t.me/\(peer.addressName ?? "")", font: Font.medium(14.0), textColor: UIColor(rgb: 0xa8b7c4)) +// self.addressNode.textShadowColor = .black + + self.containerNode.addSubnode(self.instantChatBackgroundNode) + self.containerNode.addSubnode(self.messagesContainerNode) + self.containerNode.addSubnode(self.addressNode) + } + +// func update(layout: ContainerViewLayout, completion: (UIImage?) -> Void) { +// self.updateMessagesLayout(layout: layout) +// +// Queue.mainQueue().after(0.01) { +// UIGraphicsBeginImageContextWithOptions(layout.size, false, 3.0) +// self.containerNode.view.drawHierarchy(in: CGRect(origin: CGPoint(), size: layout.size), afterScreenUpdates: true) +// let img = UIGraphicsGetImageFromCurrentImageContext() +// UIGraphicsEndImageContext() +// completion(img) +// } +// } + + private func updateMessagesLayout(layout: ContainerViewLayout) { + let size = layout.size + self.containerNode.frame = CGRect(origin: CGPoint(), size: layout.size) + self.instantChatBackgroundNode.frame = CGRect(origin: CGPoint(), size: layout.size) + self.instantChatBackgroundNode.updateLayout(size: size, transition: .immediate) + self.messagesContainerNode.frame = CGRect(origin: CGPoint(), size: layout.size) + + let addressLayout = self.addressNode.updateLayout(size) + + let theme = self.presentationData.theme.withUpdated(preview: true) + let headerItem = self.context.sharedContext.makeChatMessageDateHeaderItem(context: self.context, timestamp: self.message.timestamp, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder) + + var items: [ListViewItem] = [] + let sampleMessages: [Message] = [self.message] + + items = sampleMessages.reversed().map { message in + self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.theme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil) + } + + let inset: CGFloat = 16.0 + let width = layout.size.width - inset * 2.0 + let params = ListViewItemLayoutParams(width: width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, availableHeight: layout.size.height) + if let messageNodes = self.messageNodes { + for i in 0 ..< items.count { + let itemNode = messageNodes[i] + items[i].updateNode(async: { $0() }, node: { + return itemNode + }, params: params, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], animation: .None, completion: { (layout, apply) in + let nodeFrame = CGRect(origin: CGPoint(x: 0.0, y: floor((size.height - layout.size.height) / 2.0)), size: CGSize(width: width, height: layout.size.height)) + + itemNode.contentSize = layout.contentSize + itemNode.insets = layout.insets + itemNode.frame = nodeFrame + itemNode.isUserInteractionEnabled = false + + apply(ListViewItemApply(isOnScreen: true)) + }) + } + } else { + var messageNodes: [ListViewItemNode] = [] + for i in 0 ..< items.count { + var itemNode: ListViewItemNode? + items[i].nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: true, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], completion: { node, apply in + itemNode = node + apply().1(ListViewItemApply(isOnScreen: true)) + }) + itemNode!.subnodeTransform = CATransform3DMakeScale(-1.0, 1.0, 1.0) + itemNode!.isUserInteractionEnabled = false + messageNodes.append(itemNode!) + self.messagesContainerNode.addSubnode(itemNode!) + } + self.messageNodes = messageNodes + } + + var bottomOffset: CGFloat = 0.0 + if let messageNodes = self.messageNodes { + for itemNode in messageNodes { + itemNode.frame = CGRect(origin: CGPoint(x: inset, y: floor((size.height - itemNode.frame.height) / 2.0)), size: itemNode.frame.size) + bottomOffset += itemNode.frame.maxY + itemNode.updateFrame(itemNode.frame, within: layout.size) + } + } + + self.addressNode.frame = CGRect(origin: CGPoint(x: inset + 16.0, y: bottomOffset + 3.0), size: CGSize(width: addressLayout.width, height: addressLayout.height + 3.0)) + + let dateHeaderNode: ListViewItemHeaderNode + if let currentDateHeaderNode = self.dateHeaderNode { + dateHeaderNode = currentDateHeaderNode + headerItem.updateNode(dateHeaderNode, previous: nil, next: headerItem) + } else { + dateHeaderNode = headerItem.node() + dateHeaderNode.subnodeTransform = CATransform3DMakeScale(-1.0, 1.0, 1.0) + self.messagesContainerNode.addSubnode(dateHeaderNode) + self.dateHeaderNode = dateHeaderNode + } + + dateHeaderNode.frame = CGRect(origin: CGPoint(x: 0.0, y: bottomOffset), size: CGSize(width: layout.size.width, height: headerItem.height)) + dateHeaderNode.updateLayout(size: self.containerNode.frame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) + } +} diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index a7d9b717fd..3195a121ef 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit a7d9b717fdf7e8e441b47692dc5771684b2d7970 +Subproject commit 3195a121ef3897d888ae55be1d0665a416560023 diff --git a/third-party/webrtc/webrtc-ios b/third-party/webrtc/webrtc-ios index cf2c8a8364..e4d49e73cd 160000 --- a/third-party/webrtc/webrtc-ios +++ b/third-party/webrtc/webrtc-ios @@ -1 +1 @@ -Subproject commit cf2c8a8364b4cfda7ea9eb448671033351851130 +Subproject commit e4d49e73cd8206518e7b3dd75d54af0f0ef5b810 From c75f3b0fc97378646c7333f99e5ecdf9a4617962 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 19 Aug 2020 19:17:13 +0300 Subject: [PATCH 04/10] Fix iPad key shortcuts --- .../TelegramUI/Sources/ChatController.swift | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 24b975e867..da56baa1d1 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -9236,6 +9236,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } public override var keyShortcuts: [KeyShortcut] { + if !self.traceVisibility() || !isTopmostChatController(self) { + return [] + } + let strings = self.presentationData.strings var inputShortcuts: [KeyShortcut] @@ -9346,16 +9350,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } let otherShortcuts: [KeyShortcut] = [ - KeyShortcut(title: strings.KeyCommand_ScrollUp, input: UIKeyCommand.inputUpArrow, modifiers: [.shift], action: { [weak self] in - if let strongSelf = self { - _ = strongSelf.chatDisplayNode.historyNode.scrollWithDirection(.down, distance: 75.0) - } - }), - KeyShortcut(title: strings.KeyCommand_ScrollDown, input: UIKeyCommand.inputDownArrow, modifiers: [.shift], action: { [weak self] in - if let strongSelf = self { - _ = strongSelf.chatDisplayNode.historyNode.scrollWithDirection(.up, distance: 75.0) - } - }), +// KeyShortcut(title: strings.KeyCommand_ScrollUp, input: UIKeyCommand.inputUpArrow, modifiers: [.shift], action: { [weak self] in +// if let strongSelf = self { +// _ = strongSelf.chatDisplayNode.historyNode.scrollWithDirection(.down, distance: 75.0) +// } +// }), +// KeyShortcut(title: strings.KeyCommand_ScrollDown, input: UIKeyCommand.inputDownArrow, modifiers: [.shift], action: { [weak self] in +// if let strongSelf = self { +// _ = strongSelf.chatDisplayNode.historyNode.scrollWithDirection(.up, distance: 75.0) +// } +// }), KeyShortcut(title: strings.KeyCommand_ChatInfo, input: "I", modifiers: [.command, .control], action: { [weak self] in if let strongSelf = self { strongSelf.interfaceInteraction?.openPeerInfo() From 28f76f75e4a359779ba9c25de2de1c56c2c5c124 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 19 Aug 2020 19:27:26 +0300 Subject: [PATCH 05/10] Add new emoji sequences --- submodules/Emoji/Sources/EmojiUtils.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/Emoji/Sources/EmojiUtils.swift b/submodules/Emoji/Sources/EmojiUtils.swift index da06ccc2bb..893bae47e8 100644 --- a/submodules/Emoji/Sources/EmojiUtils.swift +++ b/submodules/Emoji/Sources/EmojiUtils.swift @@ -5,7 +5,7 @@ import AVFoundation public extension UnicodeScalar { var isEmoji: Bool { switch self.value { - case 0x1F600...0x1F64F, 0x1F300...0x1F5FF, 0x1F680...0x1F6FF, 0x1F1E6...0x1F1FF, 0xE0020...0xE007F, 0xFE00...0xFE0F, 0x1F900...0x1F9FF, 0x1F018...0x1F0F5, 0x1F200...0x1F270, 65024...65039, 9100...9300, 8400...8447, 0x1F004, 0x1F18E, 0x1F191...0x1F19A, 0x1F5E8: + case 0x1F600...0x1F64F, 0x1F300...0x1F5FF, 0x1F680...0x1F6FF, 0x1F1E6...0x1F1FF, 0xE0020...0xE007F, 0xFE00...0xFE0F, 0x1F900...0x1F9FF, 0x1F018...0x1F0F5, 0x1F200...0x1F270, 65024...65039, 9100...9300, 8400...8447, 0x1F004, 0x1F18E, 0x1F191...0x1F19A, 0x1F5E8, 0x1FA70...0x1FA73, 0x1FA78...0x1FA7A, 0x1FA80...0x1FA82, 0x1FA90...0x1FA95: return true case 0x2603, 0x265F, 0x267E, 0x2692, 0x26C4, 0x26C8, 0x26CE, 0x26CF, 0x26D1...0x26D3, 0x26E9, 0x26F0...0x26F9, 0x2705, 0x270A, 0x270B, 0x2728, 0x274E, 0x2753...0x2755, 0x274C, 0x2795...0x2797, 0x27B0, 0x27BF: return true From 9b342df78dd368273731a545435805950738854c Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 21 Aug 2020 13:56:34 +0300 Subject: [PATCH 06/10] Update API [skip ci] --- .../Sources/ChatListSearchContainerNode.swift | 2 +- ...onSequenceCountrySelectionController.swift | 7 +- .../Sources/HashtagSearchController.swift | 2 +- submodules/SyncCore/Sources/Namespaces.swift | 7 + submodules/TelegramApi/Sources/Api0.swift | 2 +- submodules/TelegramApi/Sources/Api2.swift | 30 ++-- submodules/TelegramApi/Sources/Api3.swift | 41 +++--- .../TelegramCore/Sources/AccountManager.swift | 2 + .../TelegramCore/Sources/Countries.swift | 128 +++++++++++++++--- .../TelegramCore/Sources/SearchMessages.swift | 13 +- ...rizationSequencePhoneEntryController.swift | 2 +- 11 files changed, 171 insertions(+), 65 deletions(-) diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index 96189597db..d75ff72adc 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -762,7 +762,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo ) ) let location: SearchMessagesLocation - location = .general + location = .general(tags: nil) updateSearchContext { _ in return (nil, true) diff --git a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift index eadca6c645..79b65b718f 100644 --- a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift +++ b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionController.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import Postbox import TelegramPresentationData import TelegramStringFormatting import SearchBarNode @@ -46,7 +47,7 @@ private func loadCountryCodes() -> [Country] { let countryName = locale.localizedString(forIdentifier: countryId) ?? "" if let countryCodeInt = Int(countryCode) { - result.append(Country(code: countryId, defaultName: countryName, name: countryName, countryCodes: [Country.CountryCode(code: countryCode, prefixes: [], patterns: [])])) + result.append(Country(code: countryId, name: countryName, localizedName: nil, countryCodes: [Country.CountryCode(code: countryCode, prefixes: [], patterns: [])], hidden: false)) } if let maybeNameRange = maybeNameRange { @@ -61,8 +62,8 @@ private func loadCountryCodes() -> [Country] { private var countryCodes: [Country] = loadCountryCodes() -public func loadServerCountryCodes(network: Network) { - let _ = (getCountriesList(network: network, langCode: "") +public func loadServerCountryCodes(accountManager: AccountManager, network: Network) { + let _ = (getCountriesList(accountManager: accountManager, network: network, langCode: nil) |> deliverOnMainQueue).start(next: { countries in countryCodes = countries }) diff --git a/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift b/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift index 78442b6a65..538fa413c0 100644 --- a/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift +++ b/submodules/HashtagSearchUI/Sources/HashtagSearchController.swift @@ -41,7 +41,7 @@ public final class HashtagSearchController: TelegramBaseController { let chatListPresentationData = ChatListPresentationData(theme: self.presentationData.theme, fontSize: self.presentationData.listsFontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameSortOrder: self.presentationData.nameSortOrder, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: self.presentationData.disableAnimations) - let location: SearchMessagesLocation = .general + let location: SearchMessagesLocation = .general(tags: nil) let search = searchMessages(account: context.account, location: location, query: query, state: nil) let foundMessages: Signal<[ChatListSearchEntry], NoError> = search |> map { result, _ in diff --git a/submodules/SyncCore/Sources/Namespaces.swift b/submodules/SyncCore/Sources/Namespaces.swift index c678f7d3ab..1cc493ca0f 100644 --- a/submodules/SyncCore/Sources/Namespaces.swift +++ b/submodules/SyncCore/Sources/Namespaces.swift @@ -348,6 +348,7 @@ private enum SharedDataKeyValues: Int32 { case proxySettings = 4 case autodownloadSettings = 5 case themeSettings = 6 + case countriesList = 7 } public struct SharedDataKeys { @@ -386,6 +387,12 @@ public struct SharedDataKeys { key.setInt32(0, value: SharedDataKeyValues.themeSettings.rawValue) return key }() + + public static let countriesList: ValueBoxKey = { + let key = ValueBoxKey(length: 4) + key.setInt32(0, value: SharedDataKeyValues.countriesList.rawValue) + return key + }() } public func applicationSpecificItemCacheCollectionId(_ value: Int8) -> Int8 { diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index 7eb6f16d2b..9d6c66583c 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -449,7 +449,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-524237339] = { return Api.PageTableRow.parse_pageTableRow($0) } dict[-40996577] = { return Api.DraftMessage.parse_draftMessage($0) } dict[453805082] = { return Api.DraftMessage.parse_draftMessageEmpty($0) } - dict[-77073091] = { return Api.help.Country.parse_country($0) } + dict[-1014526429] = { return Api.help.Country.parse_country($0) } dict[418631927] = { return Api.StatsGroupTopPoster.parse_statsGroupTopPoster($0) } dict[-2128640689] = { return Api.account.SentEmailCode.parse_sentEmailCode($0) } dict[-1038136962] = { return Api.EncryptedFile.parse_encryptedFileEmpty($0) } diff --git a/submodules/TelegramApi/Sources/Api2.swift b/submodules/TelegramApi/Sources/Api2.swift index 16c442f2ff..a47b7c7b83 100644 --- a/submodules/TelegramApi/Sources/Api2.swift +++ b/submodules/TelegramApi/Sources/Api2.swift @@ -2003,17 +2003,18 @@ public struct help { } public enum Country: TypeConstructorDescription { - case country(iso2: String, defaultName: String, name: String, countryCodes: [Api.help.CountryCode]) + case country(flags: Int32, iso2: String, defaultName: String, name: String?, countryCodes: [Api.help.CountryCode]) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .country(let iso2, let defaultName, let name, let countryCodes): + case .country(let flags, let iso2, let defaultName, let name, let countryCodes): if boxed { - buffer.appendInt32(-77073091) + buffer.appendInt32(-1014526429) } + serializeInt32(flags, buffer: buffer, boxed: false) serializeString(iso2, buffer: buffer, boxed: false) serializeString(defaultName, buffer: buffer, boxed: false) - serializeString(name, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 1) != 0 {serializeString(name!, buffer: buffer, boxed: false)} buffer.appendInt32(481674261) buffer.appendInt32(Int32(countryCodes.count)) for item in countryCodes { @@ -2025,28 +2026,31 @@ public struct help { public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .country(let iso2, let defaultName, let name, let countryCodes): - return ("country", [("iso2", iso2), ("defaultName", defaultName), ("name", name), ("countryCodes", countryCodes)]) + case .country(let flags, let iso2, let defaultName, let name, let countryCodes): + return ("country", [("flags", flags), ("iso2", iso2), ("defaultName", defaultName), ("name", name), ("countryCodes", countryCodes)]) } } public static func parse_country(_ reader: BufferReader) -> Country? { - var _1: String? - _1 = parseString(reader) + var _1: Int32? + _1 = reader.readInt32() var _2: String? _2 = parseString(reader) var _3: String? _3 = parseString(reader) - var _4: [Api.help.CountryCode]? + var _4: String? + if Int(_1!) & Int(1 << 1) != 0 {_4 = parseString(reader) } + var _5: [Api.help.CountryCode]? if let _ = reader.readInt32() { - _4 = Api.parseVector(reader, elementSignature: 0, elementType: Api.help.CountryCode.self) + _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.help.CountryCode.self) } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.help.Country.country(iso2: _1!, defaultName: _2!, name: _3!, countryCodes: _4!) + let _c4 = (Int(_1!) & Int(1 << 1) == 0) || _4 != nil + let _c5 = _5 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 { + return Api.help.Country.country(flags: _1!, iso2: _2!, defaultName: _3!, name: _4, countryCodes: _5!) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index f2e20a21b1..ca53c4c50a 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -3348,26 +3348,6 @@ public extension Api { }) } - public static func searchGlobal(flags: Int32, folderId: Int32?, q: String, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1083038300) - serializeInt32(flags, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} - serializeString(q, buffer: buffer, boxed: false) - serializeInt32(offsetRate, buffer: buffer, boxed: false) - offsetPeer.serialize(buffer, true) - serializeInt32(offsetId, buffer: buffer, boxed: false) - serializeInt32(limit, buffer: buffer, boxed: false) - return (FunctionDescription(name: "messages.searchGlobal", parameters: [("flags", flags), ("folderId", folderId), ("q", q), ("offsetRate", offsetRate), ("offsetPeer", offsetPeer), ("offsetId", offsetId), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in - let reader = BufferReader(buffer) - var result: Api.messages.Messages? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.messages.Messages - } - return result - }) - } - public static func sendMessage(flags: Int32, peer: Api.InputPeer, replyToMsgId: Int32?, message: String, randomId: Int64, replyMarkup: Api.ReplyMarkup?, entities: [Api.MessageEntity]?, scheduleDate: Int32?) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(1376532592) @@ -3719,6 +3699,27 @@ public extension Api { return result }) } + + public static func searchGlobal(flags: Int32, folderId: Int32?, q: String, filter: Api.MessagesFilter, offsetRate: Int32, offsetPeer: Api.InputPeer, offsetId: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1934479725) + serializeInt32(flags, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} + serializeString(q, buffer: buffer, boxed: false) + filter.serialize(buffer, true) + serializeInt32(offsetRate, buffer: buffer, boxed: false) + offsetPeer.serialize(buffer, true) + serializeInt32(offsetId, buffer: buffer, boxed: false) + serializeInt32(limit, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.searchGlobal", parameters: [("flags", flags), ("folderId", folderId), ("q", q), ("filter", filter), ("offsetRate", offsetRate), ("offsetPeer", offsetPeer), ("offsetId", offsetId), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.Messages? in + let reader = BufferReader(buffer) + var result: Api.messages.Messages? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.Messages + } + return result + }) + } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/Sources/AccountManager.swift b/submodules/TelegramCore/Sources/AccountManager.swift index fb9b223ac9..9877a921ae 100644 --- a/submodules/TelegramCore/Sources/AccountManager.swift +++ b/submodules/TelegramCore/Sources/AccountManager.swift @@ -163,6 +163,8 @@ private var declaredEncodables: Void = { declareEncodable(CachedChatContextResult.self, f: { CachedChatContextResult(decoder: $0) }) declareEncodable(PeerAccessRestrictionInfo.self, f: { PeerAccessRestrictionInfo(decoder: $0) }) declareEncodable(TelegramMediaImage.VideoRepresentation.self, f: { TelegramMediaImage.VideoRepresentation(decoder: $0) }) + declareEncodable(Country.self, f: { Country(decoder: $0) }) + declareEncodable(Country.CountryCode.self, f: { Country.CountryCode(decoder: $0) }) return }() diff --git a/submodules/TelegramCore/Sources/Countries.swift b/submodules/TelegramCore/Sources/Countries.swift index 9d1349f6fb..15ebe870cb 100644 --- a/submodules/TelegramCore/Sources/Countries.swift +++ b/submodules/TelegramCore/Sources/Countries.swift @@ -5,8 +5,12 @@ import TelegramApi import SyncCore -public struct Country { - public struct CountryCode { +public struct Country: PostboxCoding, Equatable { + public static func == (lhs: Country, rhs: Country) -> Bool { + return lhs.code == rhs.code && lhs.name == rhs.name && lhs.localizedName == rhs.localizedName && lhs.countryCodes == rhs.countryCodes && lhs.hidden == rhs.hidden + } + + public struct CountryCode: PostboxCoding, Equatable { public let code: String public let prefixes: [String] public let patterns: [String] @@ -16,37 +20,125 @@ public struct Country { self.prefixes = prefixes self.patterns = patterns } + + public init(decoder: PostboxDecoder) { + self.code = decoder.decodeStringForKey("c", orElse: "") + self.prefixes = decoder.decodeStringArrayForKey("pfx") + self.patterns = decoder.decodeStringArrayForKey("ptrn") + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.code, forKey: "c") + encoder.encodeStringArray(self.prefixes, forKey: "pfx") + encoder.encodeStringArray(self.patterns, forKey: "ptrn") + } } public let code: String - public let defaultName: String public let name: String + public let localizedName: String? public let countryCodes: [CountryCode] + public let hidden: Bool - public init(code: String, defaultName: String, name: String, countryCodes: [CountryCode]) { + public init(code: String, name: String, localizedName: String?, countryCodes: [CountryCode], hidden: Bool) { self.code = code - self.defaultName = defaultName self.name = name + self.localizedName = localizedName self.countryCodes = countryCodes + self.hidden = hidden + } + + public init(decoder: PostboxDecoder) { + self.code = decoder.decodeStringForKey("c", orElse: "") + self.name = decoder.decodeStringForKey("n", orElse: "") + self.localizedName = decoder.decodeOptionalStringForKey("ln") + self.countryCodes = decoder.decodeObjectArrayForKey("cc").map { $0 as! CountryCode } + self.hidden = decoder.decodeBoolForKey("h", orElse: false) + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeString(self.code, forKey: "c") + encoder.encodeString(self.name, forKey: "n") + if let localizedName = self.localizedName { + encoder.encodeString(localizedName, forKey: "ln") + } else { + encoder.encodeNil(forKey: "ln") + } + encoder.encodeObjectArray(self.countryCodes, forKey: "cc") + encoder.encodeBool(self.hidden, forKey: "h") } } -public func getCountriesList(network: Network, langCode: String) -> Signal<[Country], NoError> { - return network.request(Api.functions.help.getCountriesList(langCode: langCode, hash: 0)) - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) +public final class CountriesList: PreferencesEntry, Equatable { + public let countries: [Country] + public let hash: Int32 + + public init(countries: [Country], hash: Int32) { + self.countries = countries + self.hash = hash } - |> map { result in - if let result = result { + + public init(decoder: PostboxDecoder) { + self.countries = decoder.decodeObjectArrayForKey("c").map { $0 as! Country } + self.hash = decoder.decodeInt32ForKey("h", orElse: 0) + } + + public func encode(_ encoder: PostboxEncoder) { + encoder.encodeObjectArray(self.countries, forKey: "c") + encoder.encodeInt32(self.hash, forKey: "h") + } + + public func isEqual(to: PreferencesEntry) -> Bool { + if let to = to as? CountriesList { + return self == to + } else { + return false + } + } + + public static func ==(lhs: CountriesList, rhs: CountriesList) -> Bool { + return lhs.countries == rhs.countries && lhs.hash == rhs.hash + } +} + + +public func getCountriesList(accountManager: AccountManager, network: Network, langCode: String?, forceUpdate: Bool = false) -> Signal<[Country], NoError> { + let fetch: ([Country]?, Int32?) -> Signal<[Country], NoError> = { current, hash in + return network.request(Api.functions.help.getCountriesList(langCode: langCode ?? "", hash: hash ?? 0)) + |> retryRequest + |> mapToSignal { result -> Signal<[Country], NoError> in switch result { case let .countriesList(apiCountries, hash): - return apiCountries.map { Country(apiCountry: $0) } + let result = apiCountries.compactMap { Country(apiCountry: $0) } + if result == current { + return .complete() + } else { + let _ = accountManager.transaction { transaction in + transaction.updateSharedData(SharedDataKeys.countriesList, { _ in + return CountriesList(countries: result, hash: hash) + }) + }.start() + return .single(result) + } case .countriesListNotModified: - return [] + return .complete() } - } else { - return [] + } + } + + if forceUpdate { + return fetch(nil, nil) + } else { + return accountManager.sharedData(keys: [SharedDataKeys.countriesList]) + |> map { sharedData -> ([Country], Int32) in + if let countriesList = sharedData.entries[SharedDataKeys.countriesList] as? CountriesList { + return (countriesList.countries, countriesList.hash) + } else { + return ([], 0) + } + } |> mapToSignal { current, hash -> Signal<[Country], NoError> in + return .single(current) + |> then(fetch(current, hash)) } } } @@ -65,8 +157,8 @@ extension Country.CountryCode { extension Country { init(apiCountry: Api.help.Country) { switch apiCountry { - case let .country(iso2, defaultName, name, countryCodes): - self.init(code: iso2, defaultName: defaultName, name: name, countryCodes: countryCodes.map { Country.CountryCode(apiCountryCode: $0) }) + case let .country(flags, iso2, defaultName, name, countryCodes): + self.init(code: iso2, name: defaultName, localizedName: name, countryCodes: countryCodes.map { Country.CountryCode(apiCountryCode: $0) }, hidden: (flags & 1 << 0) != 0) } } } diff --git a/submodules/TelegramCore/Sources/SearchMessages.swift b/submodules/TelegramCore/Sources/SearchMessages.swift index c7710ab77e..583f406f0c 100644 --- a/submodules/TelegramCore/Sources/SearchMessages.swift +++ b/submodules/TelegramCore/Sources/SearchMessages.swift @@ -7,7 +7,7 @@ import MtProtoKit import SyncCore public enum SearchMessagesLocation: Equatable { - case general + case general(tags: MessageTags?) case group(PeerGroupId) case peer(peerId: PeerId, fromId: PeerId?, tags: MessageTags?) case publicForwards(messageId: MessageId, datacenterId: Int?) @@ -193,7 +193,6 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } let filter: Api.MessagesFilter - if let tags = tags { if tags.contains(.file) { filter = .inputMessagesFilterDocument @@ -270,7 +269,8 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } case .group: remoteSearchResult = .single((nil, nil)) - case .general: + case let .general(tags): + let filter: Api.MessagesFilter = tags.flatMap { messageFilterForTagMask($0) } ?? .inputMessagesFilterEmpty remoteSearchResult = account.postbox.transaction { transaction -> (Int32, MessageIndex?, Api.InputPeer) in var lowerBound: MessageIndex? if let state = state, let message = state.main.messages.last { @@ -283,7 +283,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } } |> mapToSignal { (nextRate, lowerBound, inputPeer) in - return account.network.request(Api.functions.messages.searchGlobal(flags: 0, folderId: nil, q: query, offsetRate: nextRate, offsetPeer: inputPeer, offsetId: lowerBound?.id.id ?? 0, limit: limit), automaticFloodWait: false) + return account.network.request(Api.functions.messages.searchGlobal(flags: 0, folderId: nil, q: query, filter: filter, offsetRate: nextRate, offsetPeer: inputPeer, offsetId: lowerBound?.id.id ?? 0, limit: limit), automaticFloodWait: false) |> map { result -> (Api.messages.Messages?, Api.messages.Messages?) in return (result, nil) } @@ -292,8 +292,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } } case let .publicForwards(messageId, datacenterId): - remoteSearchResult = .single((nil, nil)) - /*remoteSearchResult = account.postbox.transaction { transaction -> (Api.InputChannel?, Int32, MessageIndex?, Api.InputPeer) in + remoteSearchResult = account.postbox.transaction { transaction -> (Api.InputChannel?, Int32, MessageIndex?, Api.InputPeer) in let sourcePeer = transaction.getPeer(messageId.peerId) let inputChannel = sourcePeer.flatMap { apiInputChannel($0) } @@ -330,7 +329,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q |> `catch` { _ -> Signal<(Api.messages.Messages?, Api.messages.Messages?), NoError> in return .single((nil, nil)) } - }*/ + } } return remoteSearchResult diff --git a/submodules/TelegramUI/Sources/AuthorizationSequencePhoneEntryController.swift b/submodules/TelegramUI/Sources/AuthorizationSequencePhoneEntryController.swift index bf5948de32..1ff91532a6 100644 --- a/submodules/TelegramUI/Sources/AuthorizationSequencePhoneEntryController.swift +++ b/submodules/TelegramUI/Sources/AuthorizationSequencePhoneEntryController.swift @@ -58,7 +58,7 @@ final class AuthorizationSequencePhoneEntryController: ViewController { self.openUrl = openUrl self.back = back - loadServerCountryCodes(network: account.network) + loadServerCountryCodes(accountManager: sharedContext.accountManager, network: account.network) super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: AuthorizationSequenceController.navigationBarTheme(presentationData.theme), strings: NavigationBarStrings(presentationStrings: presentationData.strings))) From edd2db706bf3b2e8875bd5a546d9ed550c58a34a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 21 Aug 2020 15:18:34 +0300 Subject: [PATCH 07/10] Add global search filtering --- .../Sources/ChatListSearchContainerNode.swift | 43 ++++++++++++++----- submodules/SyncCore/Sources/Namespaces.swift | 4 +- submodules/TelegramCore/Sources/Holes.swift | 4 ++ .../TelegramCore/Sources/SearchMessages.swift | 15 +------ .../Sources/StoreMessage_Telegram.swift | 3 +- 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index d75ff72adc..da6911a3a5 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -762,7 +762,30 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo ) ) let location: SearchMessagesLocation - location = .general(tags: nil) + let messageTags: MessageTags? + if query.hasPrefix("%media ") { + messageTags = .photoOrVideo + } else if query.hasPrefix("%photo ") { + messageTags = .photo + } else if query.hasPrefix("%video ") { + messageTags = .video + } else if query.hasPrefix("%file ") { + messageTags = .file + } else if query.hasPrefix("%music ") { + messageTags = .music + } else if query.hasPrefix("%link ") { + messageTags = .webPage + } else if query.hasPrefix("%gif ") { + messageTags = .gif + } else { + messageTags = nil + } + location = .general(tags: messageTags) + + var finalQuery = query + if let _ = messageTags, let index = finalQuery.firstIndex(of: " ") { + finalQuery = String(finalQuery.suffix(from: finalQuery.index(after: index))) + } updateSearchContext { _ in return (nil, true) @@ -771,22 +794,22 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo if filter.contains(.doNotSearchMessages) { foundRemoteMessages = .single((([], [:], 0), false)) } else { - if !query.isEmpty { + if !finalQuery.isEmpty { addAppLogEvent(postbox: context.account.postbox, time: Date().timeIntervalSince1970, type: "search_global_query", peerId: nil, data: .dictionary([:])) } - let searchSignal = searchMessages(account: context.account, location: location, query: query, state: nil, limit: 50) + let searchSignal = searchMessages(account: context.account, location: location, query: finalQuery, state: nil, limit: 50) |> map { result, updatedState -> ChatListSearchMessagesResult in - return ChatListSearchMessagesResult(query: query, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState) + return ChatListSearchMessagesResult(query: finalQuery, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState) } let loadMore = searchContext.get() |> mapToSignal { searchContext -> Signal<(([Message], [PeerId: CombinedPeerReadState], Int32), Bool), NoError> in if let searchContext = searchContext { if let _ = searchContext.loadMoreIndex { - return searchMessages(account: context.account, location: location, query: query, state: searchContext.result.state, limit: 80) + return searchMessages(account: context.account, location: location, query: finalQuery, state: searchContext.result.state, limit: 80) |> map { result, updatedState -> ChatListSearchMessagesResult in - return ChatListSearchMessagesResult(query: query, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState) + return ChatListSearchMessagesResult(query: finalQuery, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState) } |> mapToSignal { foundMessages -> Signal<(([Message], [PeerId: CombinedPeerReadState], Int32), Bool), NoError> in updateSearchContext { previous in @@ -818,7 +841,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo } let resolvedMessage = .single(nil) - |> then(context.sharedContext.resolveUrl(account: context.account, url: query) + |> then(context.sharedContext.resolveUrl(account: context.account, url: finalQuery) |> mapToSignal { resolvedUrl -> Signal in if case let .channelMessage(peerId, messageId) = resolvedUrl { return downloadMessage(postbox: context.account.postbox, network: context.account.network, messageId: messageId) @@ -904,7 +927,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo globalExpandType = .none } - let lowercasedQuery = query.lowercased() + let lowercasedQuery = finalQuery.lowercased() if presentationData.strings.DialogList_SavedMessages.lowercased().hasPrefix(lowercasedQuery) || "saved messages".hasPrefix(lowercasedQuery) { if !existingPeerIds.contains(accountPeer.id), filteredPeer(accountPeer, accountPeer) { existingPeerIds.insert(accountPeer.id) @@ -986,8 +1009,8 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo } } - if addContact != nil && isViablePhoneNumber(query) { - entries.append(.addContact(query, presentationData.theme, presentationData.strings)) + if addContact != nil && isViablePhoneNumber(finalQuery) { + entries.append(.addContact(finalQuery, presentationData.theme, presentationData.strings)) } return (entries, isSearching) diff --git a/submodules/SyncCore/Sources/Namespaces.swift b/submodules/SyncCore/Sources/Namespaces.swift index 1cc493ca0f..6a7ddf90d5 100644 --- a/submodules/SyncCore/Sources/Namespaces.swift +++ b/submodules/SyncCore/Sources/Namespaces.swift @@ -96,8 +96,10 @@ public extension MessageTags { static let unseenPersonalMessage = MessageTags(rawValue: 1 << 5) static let liveLocation = MessageTags(rawValue: 1 << 6) static let gif = MessageTags(rawValue: 1 << 7) + static let photo = MessageTags(rawValue: 1 << 8) + static let video = MessageTags(rawValue: 1 << 9) - static let all: MessageTags = [.photoOrVideo, .file, .music, .webPage, .voiceOrInstantVideo, .unseenPersonalMessage, .liveLocation, .gif] + static let all: MessageTags = [.photoOrVideo, .file, .music, .webPage, .voiceOrInstantVideo, .unseenPersonalMessage, .liveLocation, .gif, .photo, .video] } public extension GlobalMessageTags { diff --git a/submodules/TelegramCore/Sources/Holes.swift b/submodules/TelegramCore/Sources/Holes.swift index c4aebc3daf..53c07bf180 100644 --- a/submodules/TelegramCore/Sources/Holes.swift +++ b/submodules/TelegramCore/Sources/Holes.swift @@ -9,6 +9,10 @@ import SyncCore func messageFilterForTagMask(_ tagMask: MessageTags) -> Api.MessagesFilter? { if tagMask == .photoOrVideo { return Api.MessagesFilter.inputMessagesFilterPhotoVideo + } else if tagMask == .photo { + return Api.MessagesFilter.inputMessagesFilterPhotos + } else if tagMask == .video { + return Api.MessagesFilter.inputMessagesFilterVideo } else if tagMask == .file { return Api.MessagesFilter.inputMessagesFilterDocument } else if tagMask == .music { diff --git a/submodules/TelegramCore/Sources/SearchMessages.swift b/submodules/TelegramCore/Sources/SearchMessages.swift index 583f406f0c..e0e3f0a79c 100644 --- a/submodules/TelegramCore/Sources/SearchMessages.swift +++ b/submodules/TelegramCore/Sources/SearchMessages.swift @@ -192,20 +192,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q } } - let filter: Api.MessagesFilter - if let tags = tags { - if tags.contains(.file) { - filter = .inputMessagesFilterDocument - } else if tags.contains(.music) { - filter = .inputMessagesFilterMusic - } else if tags.contains(.webPage) { - filter = .inputMessagesFilterUrl - } else { - filter = .inputMessagesFilterEmpty - } - } else { - filter = .inputMessagesFilterEmpty - } + let filter: Api.MessagesFilter = tags.flatMap { messageFilterForTagMask($0) } ?? .inputMessagesFilterEmpty remoteSearchResult = account.postbox.transaction { transaction -> (peer: Peer, additionalPeer: Peer?, from: Peer?)? in guard let peer = transaction.getPeer(peerId) else { return nil diff --git a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift index fd4d4f3d25..02fd29efd6 100644 --- a/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/Sources/StoreMessage_Telegram.swift @@ -30,6 +30,7 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute], if let _ = attachment as? TelegramMediaImage { if !isSecret { tags.insert(.photoOrVideo) + tags.insert(.photo) } } else if let file = attachment as? TelegramMediaFile { var refinedTag: MessageTags? = .file @@ -41,7 +42,7 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute], refinedTag = .voiceOrInstantVideo } else { if !isSecret { - refinedTag = .photoOrVideo + refinedTag = [.photoOrVideo, .video] } else { refinedTag = nil } From 67b2c051d01fd7cc104eae171340f1837ac6ed37 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 21 Aug 2020 15:44:06 +0300 Subject: [PATCH 08/10] Improve message snapshot sharing --- .../Sources/AccountContext.swift | 2 +- .../BubbleSettingsController.swift | 8 +- .../ForwardPrivacyChatPreviewItem.swift | 2 +- .../TextSizeSelectionController.swift | 8 +- .../ThemeAccentColorControllerNode.swift | 2 +- .../Themes/ThemePreviewControllerNode.swift | 2 +- .../Themes/ThemeSettingsChatPreviewItem.swift | 2 +- .../Sources/Themes/WallpaperGalleryItem.swift | 21 +-- .../Sources/ShareController.swift | 15 +- .../ChatMessageAttachedContentNode.swift | 6 +- .../Sources/ChatMessageBubbleItemNode.swift | 11 +- .../ChatMessageDateAndStatusNode.swift | 3 +- .../Sources/SharedAccountContext.swift | 14 +- .../Sources/TelegramRootController.swift | 150 ------------------ 14 files changed, 43 insertions(+), 203 deletions(-) diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index ed6306da0d..4bc3fe02d3 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -531,7 +531,7 @@ public protocol SharedAccountContext: class { func makeComposeController(context: AccountContext) -> ViewController func makeChatListController(context: AccountContext, groupId: PeerGroupId, controlsHistoryPreload: Bool, hideNetworkActivityStatus: Bool, previewing: Bool, enableDebugActions: Bool) -> ChatListController func makeChatController(context: AccountContext, chatLocation: ChatLocation, subject: ChatControllerSubject?, botStart: ChatControllerInitialBotStart?, mode: ChatControllerPresentationMode) -> ChatController - func makeChatMessagePreviewItem(context: AccountContext, message: Message, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, chatBubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder, forcedResourceStatus: FileMediaResourceStatus?, tapMessage: ((Message) -> Void)?, clickThroughMessage: (() -> Void)?) -> ListViewItem + func makeChatMessagePreviewItem(context: AccountContext, messages: [Message], theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, chatBubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder, forcedResourceStatus: FileMediaResourceStatus?, tapMessage: ((Message) -> Void)?, clickThroughMessage: (() -> Void)?) -> ListViewItem func makeChatMessageDateHeaderItem(context: AccountContext, timestamp: Int32, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, chatBubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder) -> ListViewItemHeader func makePeerSharedMediaController(context: AccountContext, peerId: PeerId) -> ViewController? func makeContactSelectionController(_ params: ContactSelectionControllerParams) -> ContactSelectionController diff --git a/submodules/SettingsUI/Sources/BubbleSettings/BubbleSettingsController.swift b/submodules/SettingsUI/Sources/BubbleSettings/BubbleSettingsController.swift index 18984dbed5..600f8741f7 100644 --- a/submodules/SettingsUI/Sources/BubbleSettings/BubbleSettingsController.swift +++ b/submodules/SettingsUI/Sources/BubbleSettings/BubbleSettingsController.swift @@ -173,20 +173,20 @@ private final class BubbleSettingsControllerNode: ASDisplayNode, UIScrollViewDel messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message1], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message2], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let waveformBase64 = "DAAOAAkACQAGAAwADwAMABAADQAPABsAGAALAA0AGAAfABoAHgATABgAGQAYABQADAAVABEAHwANAA0ACQAWABkACQAOAAwACQAfAAAAGQAVAAAAEwATAAAACAAfAAAAHAAAABwAHwAAABcAGQAAABQADgAAABQAHwAAAB8AHwAAAAwADwAAAB8AEwAAABoAFwAAAB8AFAAAAAAAHwAAAAAAHgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAA=" let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 23, title: nil, performer: nil, waveform: MemoryBuffer(data: Data(base64Encoded: waveformBase64)!))] let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: 0, attributes: voiceAttributes) let message3 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local), tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message3], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local), tapMessage: nil, clickThroughMessage: nil)) let message4 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message4], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let width: CGFloat if case .regular = layout.metrics.widthClass { diff --git a/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift index 25ad1884d2..db6abc4344 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/ForwardPrivacyChatPreviewItem.swift @@ -159,7 +159,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode { let forwardInfo = MessageForwardInfo(author: item.linkEnabled ? peers[peerId] : nil, source: nil, sourceMessageId: nil, date: 0, authorSignature: item.linkEnabled ? nil : item.peerName, psaType: nil) - let messageItem = item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, message: Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: forwardInfo, author: nil, text: item.strings.Privacy_Forwards_PreviewMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []), theme: item.theme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, chatBubbleCorners: item.chatBubbleCorners, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil) + let messageItem = item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, messages: [Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: forwardInfo, author: nil, text: item.strings.Privacy_Forwards_PreviewMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [])], theme: item.theme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, chatBubbleCorners: item.chatBubbleCorners, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil) var node: ListViewItemNode? if let current = currentNode { diff --git a/submodules/SettingsUI/Sources/Text Size/TextSizeSelectionController.swift b/submodules/SettingsUI/Sources/Text Size/TextSizeSelectionController.swift index 9c01ad1baa..862a27987f 100644 --- a/submodules/SettingsUI/Sources/Text Size/TextSizeSelectionController.swift +++ b/submodules/SettingsUI/Sources/Text Size/TextSizeSelectionController.swift @@ -319,20 +319,20 @@ private final class TextSizeSelectionControllerNode: ASDisplayNode, UIScrollView messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: []) let message1 = Message(stableId: 4, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 4), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66003, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_3_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message1], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let message2 = Message(stableId: 3, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 3), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66002, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_2_Text, attributes: [ReplyMessageAttribute(messageId: replyMessageId)], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message2], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let waveformBase64 = "DAAOAAkACQAGAAwADwAMABAADQAPABsAGAALAA0AGAAfABoAHgATABgAGQAYABQADAAVABEAHwANAA0ACQAWABkACQAOAAwACQAfAAAAGQAVAAAAEwATAAAACAAfAAAAHAAAABwAHwAAABcAGQAAABQADgAAABQAHwAAAB8AHwAAAAwADwAAAB8AEwAAABoAFwAAAB8AFAAAAAAAHwAAAAAAHgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAAAA=" let voiceAttributes: [TelegramMediaFileAttribute] = [.Audio(isVoice: true, duration: 23, title: nil, performer: nil, waveform: MemoryBuffer(data: Data(base64Encoded: waveformBase64)!))] let voiceMedia = TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: LocalFileMediaResource(fileId: 0), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: 0, attributes: voiceAttributes) let message3 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: "", attributes: [], media: [voiceMedia], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message3, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local), tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message3], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local), tapMessage: nil, clickThroughMessage: nil)) let message4 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: otherPeerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message4, theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message4], theme: self.presentationData.theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let width: CGFloat if case .regular = layout.metrics.widthClass { diff --git a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift index 5d38dc26fd..2830ef49ba 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeAccentColorControllerNode.swift @@ -882,7 +882,7 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate sampleMessages.append(message8) items = sampleMessages.reversed().map { message in - let item = self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message, theme: self.theme, strings: self.presentationData.strings, wallpaper: self.wallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: !message.media.isEmpty ? FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local) : nil, tapMessage: { [weak self] message in + let item = self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message], theme: self.theme, strings: self.presentationData.strings, wallpaper: self.wallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: !message.media.isEmpty ? FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local) : nil, tapMessage: { [weak self] message in if message.flags.contains(.Incoming) { self?.updateSection(.accent) self?.requestSectionUpdate?(.accent) diff --git a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift index 86079f02cf..e6a3736b1f 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemePreviewControllerNode.swift @@ -487,7 +487,7 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate { sampleMessages.append(message8) items = sampleMessages.reversed().map { message in - self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message, theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: !message.media.isEmpty ? FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local) : nil, tapMessage: nil, clickThroughMessage: nil) + self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message], theme: self.previewTheme, strings: self.presentationData.strings, wallpaper: self.previewTheme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: !message.media.isEmpty ? FileMediaResourceStatus(mediaStatus: .playbackStatus(.paused), fetchStatus: .Local) : nil, tapMessage: nil, clickThroughMessage: nil) } let width: CGFloat diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift index 47b4bbda37..df4f629682 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsChatPreviewItem.swift @@ -165,7 +165,7 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode { } let message = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: messageItem.outgoing ? otherPeerId : peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: messageItem.outgoing ? [] : [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: messageItem.outgoing ? TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) : nil, text: messageItem.text, attributes: messageItem.reply != nil ? [ReplyMessageAttribute(messageId: replyMessageId)] : [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, message: message, theme: item.componentTheme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, chatBubbleCorners: item.chatBubbleCorners, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, messages: [message], theme: item.componentTheme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, chatBubbleCorners: item.chatBubbleCorners, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) } var nodes: [ListViewItemNode] = [] diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift index 932101a4f4..d489119662 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperGalleryItem.swift @@ -840,28 +840,13 @@ final class WallpaperGalleryItemNode: GalleryItemNode { let theme = self.presentationData.theme.withUpdated(preview: true) let message1 = Message(stableId: 2, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 2), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66001, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: bottomMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message1, theme: theme, strings: self.presentationData.strings, wallpaper: currentWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message1], theme: theme, strings: self.presentationData.strings, wallpaper: currentWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let message2 = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: topMessageText, attributes: [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: []) - items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message2, theme: theme, strings: self.presentationData.strings, wallpaper: currentWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) + items.append(self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: [message2], theme: theme, strings: self.presentationData.strings, wallpaper: currentWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)) let params = ListViewItemLayoutParams(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, availableHeight: layout.size.height) - if let messageNodes = self.messageNodes { -// for i in 0 ..< items.count { -// let itemNode = messageNodes[i] -// items[i].updateNode(async: { $0() }, node: { -// return itemNode -// }, params: params, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], animation: .None, completion: { (layout, apply) in -// let nodeFrame = CGRect(origin: itemNode.frame.origin, size: CGSize(width: layout.size.width, height: layout.size.height)) -// -// itemNode.contentSize = layout.contentSize -// itemNode.insets = layout.insets -// itemNode.frame = nodeFrame -// itemNode.isUserInteractionEnabled = false -// -// apply(ListViewItemApply(isOnScreen: true)) -// }) -// } + if let _ = self.messageNodes { } else { var messageNodes: [ListViewItemNode] = [] for i in 0 ..< items.count { diff --git a/submodules/ShareController/Sources/ShareController.swift b/submodules/ShareController/Sources/ShareController.swift index f9ceae7bb1..907362c78b 100644 --- a/submodules/ShareController/Sources/ShareController.swift +++ b/submodules/ShareController/Sources/ShareController.swift @@ -888,7 +888,7 @@ public final class ShareController: ViewController { } -class MessageStoryRenderer { +final class MessageStoryRenderer { private let context: AccountContext private let presentationData: PresentationData private let messages: [Message] @@ -909,7 +909,7 @@ class MessageStoryRenderer { self.instantChatBackgroundNode = WallpaperBackgroundNode() self.instantChatBackgroundNode.displaysAsynchronously = false - self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: presentationData.theme, wallpaper: .builtin(WallpaperSettings()), mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) + self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: self.presentationData.theme, wallpaper: self.presentationData.chatWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) self.messagesContainerNode = ASDisplayNode() self.messagesContainerNode.clipsToBounds = true @@ -920,8 +920,8 @@ class MessageStoryRenderer { self.addressNode = ImmediateTextNode() self.addressNode.displaysAsynchronously = false - self.addressNode.attributedText = NSAttributedString(string: "t.me/\(addressName)/\(message.id.id)", font: Font.medium(14.0), textColor: UIColor(rgb: 0xa8b7c4)) -// self.addressNode.textShadowColor = .black + self.addressNode.attributedText = NSAttributedString(string: "t.me/\(addressName)/\(message.id.id)", font: Font.medium(14.0), textColor: UIColor(rgb: 0xffffff)) + self.addressNode.textShadowColor = UIColor(rgb: 0x929292, alpha: 0.8) self.containerNode.addSubnode(self.instantChatBackgroundNode) self.containerNode.addSubnode(self.messagesContainerNode) @@ -952,12 +952,7 @@ class MessageStoryRenderer { let theme = self.presentationData.theme.withUpdated(preview: true) let headerItem = self.context.sharedContext.makeChatMessageDateHeaderItem(context: self.context, timestamp: self.messages.first?.timestamp ?? 0, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder) - var items: [ListViewItem] = [] - let sampleMessages: [Message] = self.messages - - items = sampleMessages.reversed().map { message in - self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.theme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil) - } + let items: [ListViewItem] = [self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, messages: self.messages, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.theme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil)] let inset: CGFloat = 16.0 let width = layout.size.width - inset * 2.0 diff --git a/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift index 75ca4111d1..2b7e30a494 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAttachedContentNode.swift @@ -282,6 +282,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { let currentAdditionalImageBadgeNode = self.additionalImageBadgeNode return { presentationData, automaticDownloadSettings, associatedData, attributes, context, controllerInteraction, message, messageRead, title, subtitle, text, entities, mediaAndFlags, mediaBadge, actionIcon, actionTitle, displayLine, layoutConstants, constrainedSize in + let isPreview = presentationData.isPreview let fontSize: CGFloat = floor(presentationData.fontSize.baseDisplaySize * 15.0 / 17.0) let titleFont = Font.semibold(fontSize) @@ -526,7 +527,6 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { let imageMode = !((refineContentImageLayout == nil && refineContentFileLayout == nil && contentInstantVideoSizeAndApply == nil) || preferMediaBeforeText) statusInText = !imageMode - if let count = webpageGalleryMediaCount { additionalImageBadgeContent = .text(inset: 0.0, backgroundColor: presentationData.theme.theme.chat.message.mediaDateAndStatusFillColor, foregroundColor: presentationData.theme.theme.chat.message.mediaDateAndStatusTextColor, text: NSAttributedString(string: presentationData.strings.Items_NOfM("1", "\(count)").0)) skipStandardStatus = imageMode @@ -658,7 +658,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { } var continueActionButtonLayout: ((CGFloat) -> (CGSize, () -> ChatMessageAttachedContentButtonNode))? - if let actionTitle = actionTitle { + if let actionTitle = actionTitle, !isPreview { let buttonImage: UIImage let buttonHighlightedImage: UIImage var buttonIconImage: UIImage? @@ -781,6 +781,8 @@ final class ChatMessageAttachedContentNode: ASDisplayNode { strongSelf.lineNode.frame = CGRect(origin: CGPoint(x: 13.0, y: insets.top), size: CGSize(width: 2.0, height: adjustedLineHeight - insets.top - insets.bottom - 2.0)) strongSelf.lineNode.isHidden = !displayLine + strongSelf.textNode.displaysAsynchronously = !isPreview + let _ = textApply() if let imageFrame = imageFrame { diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index df66db593a..0a03a0f7de 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -759,6 +759,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode currentForwardInfo: (Peer?, String?)?, isSelected: Bool? ) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, Bool) -> Void) { + let isPreview = item.presentationData.isPreview let accessibilityData = ChatMessageAccessibilityData(item: item, isSelected: isSelected) let fontSize = floor(item.presentationData.fontSize.baseDisplaySize * 14.0 / 17.0) @@ -848,11 +849,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } - if hasAvatar { - avatarInset = layoutConstants.avatarDiameter - } else { - avatarInset = 0.0 - } + avatarInset = hasAvatar ? layoutConstants.avatarDiameter : 0.0 let isFailed = item.content.firstMessage.effectivelyFailed(timestamp: item.context.account.network.getApproximateRemoteTimestamp()) @@ -907,7 +904,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } - if item.presentationData.isPreview { + if isPreview { needShareButton = false } @@ -992,7 +989,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePrevewItemNode } } else if let attribute = attribute as? ReplyMessageAttribute { replyMessage = firstMessage.associatedMessages[attribute.messageId] - } else if let attribute = attribute as? ReplyMarkupMessageAttribute, attribute.flags.contains(.inline), !attribute.rows.isEmpty { + } else if let attribute = attribute as? ReplyMarkupMessageAttribute, attribute.flags.contains(.inline), !attribute.rows.isEmpty && !isPreview { replyMarkup = attribute } } diff --git a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift index 2de1494996..0d6f734525 100644 --- a/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageDateAndStatusNode.swift @@ -496,6 +496,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { let _ = dateApply() if let currentImpressionIcon = currentImpressionIcon { + currentImpressionIcon.displaysAsynchronously = !presentationData.isPreview if currentImpressionIcon.image !== impressionImage { currentImpressionIcon.image = impressionImage } @@ -508,7 +509,7 @@ class ChatMessageDateAndStatusNode: ASDisplayNode { impressionIcon.removeFromSupernode() strongSelf.impressionIcon = nil } - strongSelf.impressionIcon?.displaysAsynchronously = !presentationData.isPreview + strongSelf.dateNode.frame = CGRect(origin: CGPoint(x: leftInset + backgroundInsets.left + impressionWidth, y: backgroundInsets.top + 1.0 + offset), size: date.size) diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index e16044228f..389a9d4c0f 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1148,7 +1148,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { return PeerSelectionControllerImpl(params) } - public func makeChatMessagePreviewItem(context: AccountContext, message: Message, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, chatBubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder, forcedResourceStatus: FileMediaResourceStatus?, tapMessage: ((Message) -> Void)? = nil, clickThroughMessage: (() -> Void)? = nil) -> ListViewItem { + public func makeChatMessagePreviewItem(context: AccountContext, messages: [Message], theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, chatBubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder, forcedResourceStatus: FileMediaResourceStatus?, tapMessage: ((Message) -> Void)? = nil, clickThroughMessage: (() -> Void)? = nil) -> ListViewItem { let controllerInteraction: ChatControllerInteraction if tapMessage != nil || clickThroughMessage != nil { controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in @@ -1202,7 +1202,17 @@ public final class SharedAccountContextImpl: SharedAccountContext { controllerInteraction = defaultChatControllerInteraction } - return ChatMessageItem(presentationData: ChatPresentationData(theme: ChatPresentationThemeData(theme: theme, wallpaper: wallpaper), fontSize: fontSize, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameOrder, disableAnimations: false, largeEmoji: false, chatBubbleCorners: chatBubbleCorners, animatedEmojiScale: 1.0, isPreview: true), context: context, chatLocation: .peer(message.id.peerId), associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, isScheduledMessages: false, contactsPeerIds: Set(), animatedEmojiStickers: [:], forcedResourceStatus: forcedResourceStatus), controllerInteraction: controllerInteraction, content: .message(message: message, read: true, selection: .none, attributes: ChatMessageEntryAttributes()), disableDate: true, additionalContent: nil) + let content: ChatMessageItemContent + let chatLocation: ChatLocation + if messages.count > 1 { + content = .group(messages: messages.map { ($0, true, .none, ChatMessageEntryAttributes()) }) + chatLocation = .peer(messages.first!.id.peerId) + } else { + content = .message(message: messages.first!, read: true, selection: .none, attributes: ChatMessageEntryAttributes()) + chatLocation = .peer(messages.first!.id.peerId) + } + + return ChatMessageItem(presentationData: ChatPresentationData(theme: ChatPresentationThemeData(theme: theme, wallpaper: wallpaper), fontSize: fontSize, strings: strings, dateTimeFormat: dateTimeFormat, nameDisplayOrder: nameOrder, disableAnimations: false, largeEmoji: false, chatBubbleCorners: chatBubbleCorners, animatedEmojiScale: 1.0, isPreview: true), context: context, chatLocation: chatLocation, associatedData: ChatMessageItemAssociatedData(automaticDownloadPeerType: .contact, automaticDownloadNetworkType: .cellular, isRecentActions: false, isScheduledMessages: false, contactsPeerIds: Set(), animatedEmojiStickers: [:], forcedResourceStatus: forcedResourceStatus), controllerInteraction: controllerInteraction, content: content, disableDate: true, additionalContent: nil) } public func makeChatMessageDateHeaderItem(context: AccountContext, timestamp: Int32, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, chatBubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameOrder: PresentationPersonNameOrder) -> ListViewItemHeader { diff --git a/submodules/TelegramUI/Sources/TelegramRootController.swift b/submodules/TelegramUI/Sources/TelegramRootController.swift index ffc7cf94f2..99e3ae0cfd 100644 --- a/submodules/TelegramUI/Sources/TelegramRootController.swift +++ b/submodules/TelegramUI/Sources/TelegramRootController.swift @@ -127,25 +127,6 @@ public final class TelegramRootController: NavigationController { self.accountSettingsController = accountSettingsController self.rootTabController = tabBarController self.pushViewController(tabBarController, animated: false) - -// Queue.mainQueue().after(2.0) { -// let messageId = MessageId(peerId: PeerId(namespace: 2, id: 1488156064), namespace: 0, id: 528) -// let _ = ((self.context.account.postbox.transaction { transaction in -// return transaction.getMessage(messageId) -// }) |> deliverOnMainQueue).start(next: { [weak self] message in -// guard let strongSelf = self, let message = message else { -// return -// } -// -// let layout = ContainerViewLayout(size: CGSize(width: 414.0, height: 896.0), metrics: LayoutMetrics(widthClass: .compact, heightClass: .compact), deviceMetrics: .iPhoneX, intrinsicInsets: UIEdgeInsets(), safeInsets: UIEdgeInsets(), statusBarHeight: 0.0, inputHeight: nil, inputHeightIsInteractivellyChanging: false, inVoiceOver: false) -// let renderer = MessageStoryRenderer(context: strongSelf.context, message: message) -// let image = renderer.update(layout: layout) -// -// let node = renderer.containerNode -// node.frame = CGRect(origin: CGPoint(), size: layout.size) -// strongSelf.displayNode.addSubnode(node) -// }) -// } } public func updateRootControllers(showCallsTab: Bool) { @@ -193,134 +174,3 @@ public final class TelegramRootController: NavigationController { presentedLegacyShortcutCamera(context: self.context, saveCapturedMedia: false, saveEditedPhotos: false, mediaGrouping: true, parentController: controller) } } - -class MessageStoryRenderer { - private let context: AccountContext - private let presentationData: PresentationData - private let message: Message - - let containerNode: ASDisplayNode - private let instantChatBackgroundNode: WallpaperBackgroundNode - private let messagesContainerNode: ASDisplayNode - private var dateHeaderNode: ListViewItemHeaderNode? - private var messageNodes: [ListViewItemNode]? - private let addressNode: ImmediateTextNode - - init(context: AccountContext, message: Message) { - self.context = context - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } - self.message = message - - self.containerNode = ASDisplayNode() - - self.instantChatBackgroundNode = WallpaperBackgroundNode() - self.instantChatBackgroundNode.displaysAsynchronously = false - self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: presentationData.theme, wallpaper: .builtin(WallpaperSettings()), mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) - - self.messagesContainerNode = ASDisplayNode() - self.messagesContainerNode.clipsToBounds = true - self.messagesContainerNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0) - - let peer = message.peers[message.id.peerId]! - self.addressNode = ImmediateTextNode() - self.addressNode.displaysAsynchronously = false - self.addressNode.attributedText = NSAttributedString(string: "t.me/\(peer.addressName ?? "")", font: Font.medium(14.0), textColor: UIColor(rgb: 0xa8b7c4)) -// self.addressNode.textShadowColor = .black - - self.containerNode.addSubnode(self.instantChatBackgroundNode) - self.containerNode.addSubnode(self.messagesContainerNode) - self.containerNode.addSubnode(self.addressNode) - } - -// func update(layout: ContainerViewLayout, completion: (UIImage?) -> Void) { -// self.updateMessagesLayout(layout: layout) -// -// Queue.mainQueue().after(0.01) { -// UIGraphicsBeginImageContextWithOptions(layout.size, false, 3.0) -// self.containerNode.view.drawHierarchy(in: CGRect(origin: CGPoint(), size: layout.size), afterScreenUpdates: true) -// let img = UIGraphicsGetImageFromCurrentImageContext() -// UIGraphicsEndImageContext() -// completion(img) -// } -// } - - private func updateMessagesLayout(layout: ContainerViewLayout) { - let size = layout.size - self.containerNode.frame = CGRect(origin: CGPoint(), size: layout.size) - self.instantChatBackgroundNode.frame = CGRect(origin: CGPoint(), size: layout.size) - self.instantChatBackgroundNode.updateLayout(size: size, transition: .immediate) - self.messagesContainerNode.frame = CGRect(origin: CGPoint(), size: layout.size) - - let addressLayout = self.addressNode.updateLayout(size) - - let theme = self.presentationData.theme.withUpdated(preview: true) - let headerItem = self.context.sharedContext.makeChatMessageDateHeaderItem(context: self.context, timestamp: self.message.timestamp, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.chatWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder) - - var items: [ListViewItem] = [] - let sampleMessages: [Message] = [self.message] - - items = sampleMessages.reversed().map { message in - self.context.sharedContext.makeChatMessagePreviewItem(context: self.context, message: message, theme: theme, strings: self.presentationData.strings, wallpaper: self.presentationData.theme.chat.defaultWallpaper, fontSize: self.presentationData.chatFontSize, chatBubbleCorners: self.presentationData.chatBubbleCorners, dateTimeFormat: self.presentationData.dateTimeFormat, nameOrder: self.presentationData.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil) - } - - let inset: CGFloat = 16.0 - let width = layout.size.width - inset * 2.0 - let params = ListViewItemLayoutParams(width: width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, availableHeight: layout.size.height) - if let messageNodes = self.messageNodes { - for i in 0 ..< items.count { - let itemNode = messageNodes[i] - items[i].updateNode(async: { $0() }, node: { - return itemNode - }, params: params, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], animation: .None, completion: { (layout, apply) in - let nodeFrame = CGRect(origin: CGPoint(x: 0.0, y: floor((size.height - layout.size.height) / 2.0)), size: CGSize(width: width, height: layout.size.height)) - - itemNode.contentSize = layout.contentSize - itemNode.insets = layout.insets - itemNode.frame = nodeFrame - itemNode.isUserInteractionEnabled = false - - apply(ListViewItemApply(isOnScreen: true)) - }) - } - } else { - var messageNodes: [ListViewItemNode] = [] - for i in 0 ..< items.count { - var itemNode: ListViewItemNode? - items[i].nodeConfiguredForParams(async: { $0() }, params: params, synchronousLoads: true, previousItem: i == 0 ? nil : items[i - 1], nextItem: i == (items.count - 1) ? nil : items[i + 1], completion: { node, apply in - itemNode = node - apply().1(ListViewItemApply(isOnScreen: true)) - }) - itemNode!.subnodeTransform = CATransform3DMakeScale(-1.0, 1.0, 1.0) - itemNode!.isUserInteractionEnabled = false - messageNodes.append(itemNode!) - self.messagesContainerNode.addSubnode(itemNode!) - } - self.messageNodes = messageNodes - } - - var bottomOffset: CGFloat = 0.0 - if let messageNodes = self.messageNodes { - for itemNode in messageNodes { - itemNode.frame = CGRect(origin: CGPoint(x: inset, y: floor((size.height - itemNode.frame.height) / 2.0)), size: itemNode.frame.size) - bottomOffset += itemNode.frame.maxY - itemNode.updateFrame(itemNode.frame, within: layout.size) - } - } - - self.addressNode.frame = CGRect(origin: CGPoint(x: inset + 16.0, y: bottomOffset + 3.0), size: CGSize(width: addressLayout.width, height: addressLayout.height + 3.0)) - - let dateHeaderNode: ListViewItemHeaderNode - if let currentDateHeaderNode = self.dateHeaderNode { - dateHeaderNode = currentDateHeaderNode - headerItem.updateNode(dateHeaderNode, previous: nil, next: headerItem) - } else { - dateHeaderNode = headerItem.node() - dateHeaderNode.subnodeTransform = CATransform3DMakeScale(-1.0, 1.0, 1.0) - self.messagesContainerNode.addSubnode(dateHeaderNode) - self.dateHeaderNode = dateHeaderNode - } - - dateHeaderNode.frame = CGRect(origin: CGPoint(x: 0.0, y: bottomOffset), size: CGSize(width: layout.size.width, height: headerItem.height)) - dateHeaderNode.updateLayout(size: self.containerNode.frame.size, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right) - } -} From 5f15fecb75ef6d26ef4a930a2363017123814ba1 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 21 Aug 2020 15:44:41 +0300 Subject: [PATCH 09/10] Various fixes --- .../Sources/ChatListSearchContainerNode.swift | 95 ++++++++++--------- .../Sources/CallControllerNode.swift | 6 +- .../PresentationThemeEssentialGraphics.swift | 11 ++- .../ChatMessageAnimatedStickerItemNode.swift | 2 +- .../TelegramUI/Sources/PrefetchManager.swift | 2 +- 5 files changed, 62 insertions(+), 54 deletions(-) diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index da6911a3a5..95ba00a378 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -927,60 +927,63 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo globalExpandType = .none } - let lowercasedQuery = finalQuery.lowercased() - if presentationData.strings.DialogList_SavedMessages.lowercased().hasPrefix(lowercasedQuery) || "saved messages".hasPrefix(lowercasedQuery) { - if !existingPeerIds.contains(accountPeer.id), filteredPeer(accountPeer, accountPeer) { - existingPeerIds.insert(accountPeer.id) - entries.append(.localPeer(accountPeer, nil, nil, index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, localExpandType)) - index += 1 - } - } - - var numberOfLocalPeers = 0 - for renderedPeer in foundLocalPeers.peers { - if case .expand = localExpandType, numberOfLocalPeers >= 5 { - break + if let _ = messageTags { + } else { + let lowercasedQuery = finalQuery.lowercased() + if presentationData.strings.DialogList_SavedMessages.lowercased().hasPrefix(lowercasedQuery) || "saved messages".hasPrefix(lowercasedQuery) { + if !existingPeerIds.contains(accountPeer.id), filteredPeer(accountPeer, accountPeer) { + existingPeerIds.insert(accountPeer.id) + entries.append(.localPeer(accountPeer, nil, nil, index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, localExpandType)) + index += 1 + } } - if let peer = renderedPeer.peers[renderedPeer.peerId], peer.id != context.account.peerId, filteredPeer(peer, accountPeer) { - if !existingPeerIds.contains(peer.id) { - existingPeerIds.insert(peer.id) - var associatedPeer: Peer? - if let associatedPeerId = peer.associatedPeerId { - associatedPeer = renderedPeer.peers[associatedPeerId] + var numberOfLocalPeers = 0 + for renderedPeer in foundLocalPeers.peers { + if case .expand = localExpandType, numberOfLocalPeers >= 5 { + break + } + + if let peer = renderedPeer.peers[renderedPeer.peerId], peer.id != context.account.peerId, filteredPeer(peer, accountPeer) { + if !existingPeerIds.contains(peer.id) { + existingPeerIds.insert(peer.id) + var associatedPeer: Peer? + if let associatedPeerId = peer.associatedPeerId { + associatedPeer = renderedPeer.peers[associatedPeerId] + } + entries.append(.localPeer(peer, associatedPeer, foundLocalPeers.unread[peer.id], index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, localExpandType)) + index += 1 + numberOfLocalPeers += 1 } - entries.append(.localPeer(peer, associatedPeer, foundLocalPeers.unread[peer.id], index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, localExpandType)) + } + } + + for peer in foundRemotePeers.0 { + if case .expand = localExpandType, numberOfLocalPeers >= 5 { + break + } + + if !existingPeerIds.contains(peer.peer.id), filteredPeer(peer.peer, accountPeer) { + existingPeerIds.insert(peer.peer.id) + entries.append(.localPeer(peer.peer, nil, nil, index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, localExpandType)) index += 1 numberOfLocalPeers += 1 } } - } - - for peer in foundRemotePeers.0 { - if case .expand = localExpandType, numberOfLocalPeers >= 5 { - break - } - - if !existingPeerIds.contains(peer.peer.id), filteredPeer(peer.peer, accountPeer) { - existingPeerIds.insert(peer.peer.id) - entries.append(.localPeer(peer.peer, nil, nil, index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, localExpandType)) - index += 1 - numberOfLocalPeers += 1 - } - } - var numberOfGlobalPeers = 0 - index = 0 - for peer in foundRemotePeers.1 { - if case .expand = globalExpandType, numberOfGlobalPeers >= 3 { - break - } - - if !existingPeerIds.contains(peer.peer.id), filteredPeer(peer.peer, accountPeer) { - existingPeerIds.insert(peer.peer.id) - entries.append(.globalPeer(peer, nil, index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, globalExpandType)) - index += 1 - numberOfGlobalPeers += 1 + var numberOfGlobalPeers = 0 + index = 0 + for peer in foundRemotePeers.1 { + if case .expand = globalExpandType, numberOfGlobalPeers >= 3 { + break + } + + if !existingPeerIds.contains(peer.peer.id), filteredPeer(peer.peer, accountPeer) { + existingPeerIds.insert(peer.peer.id) + entries.append(.globalPeer(peer, nil, index, presentationData.theme, presentationData.strings, presentationData.nameSortOrder, presentationData.nameDisplayOrder, globalExpandType)) + index += 1 + numberOfGlobalPeers += 1 + } } } diff --git a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift index 22e0f39a3a..8961bf8c87 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift @@ -1005,8 +1005,10 @@ final class CallControllerNode: ViewControllerTracingNode, CallControllerNodePro self.updateButtonsMode() self.updateDimVisibility() - if self.incomingVideoViewRequested && self.outgoingVideoViewRequested { - self.displayedCameraTooltip = true + if self.incomingVideoViewRequested || self.outgoingVideoViewRequested { + if self.incomingVideoViewRequested && self.outgoingVideoViewRequested { + self.displayedCameraTooltip = true + } self.displayedCameraConfirmation = true } if self.incomingVideoViewRequested && !self.outgoingVideoViewRequested && !self.displayedCameraTooltip && (self.toastContent?.isEmpty ?? true) { diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift index 2aa29887cd..065fbfd7b5 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeEssentialGraphics.swift @@ -308,10 +308,13 @@ public final class PrincipalThemeEssentialGraphics { self.clockFreeMinImage = emptyImage self.dateAndStatusMediaBackground = emptyImage self.dateAndStatusFreeBackground = emptyImage - self.incomingDateAndStatusImpressionIcon = emptyImage - self.outgoingDateAndStatusImpressionIcon = emptyImage - self.mediaImpressionIcon = emptyImage - self.freeImpressionIcon = emptyImage + + let impressionCountImage = UIImage(bundleImageName: "Chat/Message/ImpressionCount")! + self.incomingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.message.incoming.secondaryTextColor)! + self.outgoingDateAndStatusImpressionIcon = generateTintedImage(image: impressionCountImage, color: theme.message.outgoing.secondaryTextColor)! + self.mediaImpressionIcon = generateTintedImage(image: impressionCountImage, color: .white)! + self.freeImpressionIcon = generateTintedImage(image: impressionCountImage, color: serviceColor.primaryText)! + self.radialIndicatorFileIconIncoming = emptyImage self.radialIndicatorFileIconOutgoing = emptyImage } else { diff --git a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift index 04e3869f03..b27c890dba 100644 --- a/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -1109,7 +1109,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { |> deliverOnMainQueue } - let beatingHearts: [UInt32] = [0x2764, 0x1F90E, 0x1F9E1, 0x1F49A, 0x1F49C, 0x1F49B, 0x1F5A4, 0x1F90D] + let beatingHearts: [UInt32] = [0x2764, 0x1F90E, 0x1F9E1, 0x1F499, 0x1F49A, 0x1F49C, 0x1F49B, 0x1F5A4, 0x1F90D] let peach = 0x1F351 if let text = self.item?.message.text, let firstScalar = text.unicodeScalars.first, beatingHearts.contains(firstScalar.value) || firstScalar.value == peach { diff --git a/submodules/TelegramUI/Sources/PrefetchManager.swift b/submodules/TelegramUI/Sources/PrefetchManager.swift index f95df18e5b..314a814da1 100644 --- a/submodules/TelegramUI/Sources/PrefetchManager.swift +++ b/submodules/TelegramUI/Sources/PrefetchManager.swift @@ -38,7 +38,7 @@ private final class PrefetchManagerImpl { |> map { networkType -> MediaAutoDownloadNetworkType in switch networkType { case .none, .cellular: - return.cellular + return .cellular case .wifi: return .wifi } From 3e88d177fdf5ab512f10f5e38b016b0fd8b7119d Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 21 Aug 2020 17:27:41 +0300 Subject: [PATCH 10/10] Add silent posting in secret chats --- submodules/TelegramApi/Sources/Api3.swift | 68 ++++++++--------- .../ManagedSecretChatOutgoingOperations.swift | 74 +++++++++++++++++-- ...ecretChatIncomingDecryptedOperations.swift | 18 ++++- ...ChatSendMessageActionSheetController.swift | 9 ++- ...SendMessageActionSheetControllerNode.swift | 8 +- .../ChatTextInputActionButtonsNode.swift | 6 -- .../Sources/ChatTextInputPanelNode.swift | 2 +- 7 files changed, 131 insertions(+), 54 deletions(-) diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index ca53c4c50a..67999cfce8 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -2046,39 +2046,6 @@ public extension Api { }) } - public static func sendEncrypted(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1451792525) - peer.serialize(buffer, true) - serializeInt64(randomId, buffer: buffer, boxed: false) - serializeBytes(data, buffer: buffer, boxed: false) - return (FunctionDescription(name: "messages.sendEncrypted", parameters: [("peer", peer), ("randomId", randomId), ("data", data)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.SentEncryptedMessage? in - let reader = BufferReader(buffer) - var result: Api.messages.SentEncryptedMessage? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.messages.SentEncryptedMessage - } - return result - }) - } - - public static func sendEncryptedFile(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer, file: Api.InputEncryptedFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { - let buffer = Buffer() - buffer.appendInt32(-1701831834) - peer.serialize(buffer, true) - serializeInt64(randomId, buffer: buffer, boxed: false) - serializeBytes(data, buffer: buffer, boxed: false) - file.serialize(buffer, true) - return (FunctionDescription(name: "messages.sendEncryptedFile", parameters: [("peer", peer), ("randomId", randomId), ("data", data), ("file", file)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.SentEncryptedMessage? in - let reader = BufferReader(buffer) - var result: Api.messages.SentEncryptedMessage? - if let signature = reader.readInt32() { - result = Api.parse(reader, signature: signature) as? Api.messages.SentEncryptedMessage - } - return result - }) - } - public static func sendEncryptedService(peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() buffer.appendInt32(852769188) @@ -3720,6 +3687,41 @@ public extension Api { return result }) } + + public static func sendEncrypted(flags: Int32, peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1157265941) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt64(randomId, buffer: buffer, boxed: false) + serializeBytes(data, buffer: buffer, boxed: false) + return (FunctionDescription(name: "messages.sendEncrypted", parameters: [("flags", flags), ("peer", peer), ("randomId", randomId), ("data", data)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.SentEncryptedMessage? in + let reader = BufferReader(buffer) + var result: Api.messages.SentEncryptedMessage? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.SentEncryptedMessage + } + return result + }) + } + + public static func sendEncryptedFile(flags: Int32, peer: Api.InputEncryptedChat, randomId: Int64, data: Buffer, file: Api.InputEncryptedFile) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(1431914525) + serializeInt32(flags, buffer: buffer, boxed: false) + peer.serialize(buffer, true) + serializeInt64(randomId, buffer: buffer, boxed: false) + serializeBytes(data, buffer: buffer, boxed: false) + file.serialize(buffer, true) + return (FunctionDescription(name: "messages.sendEncryptedFile", parameters: [("flags", flags), ("peer", peer), ("randomId", randomId), ("data", data), ("file", file)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.SentEncryptedMessage? in + let reader = BufferReader(buffer) + var result: Api.messages.SentEncryptedMessage? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.messages.SentEncryptedMessage + } + return result + }) + } } public struct channels { public static func readHistory(channel: Api.InputChannel, maxId: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { diff --git a/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift b/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift index f65204e0d9..636f3f52ba 100644 --- a/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift +++ b/submodules/TelegramCore/Sources/ManagedSecretChatOutgoingOperations.swift @@ -757,6 +757,7 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g var viaBotName: String? var entities: [MessageTextEntity]? + var muted: Bool = false for attribute in message.attributes { if let attribute = attribute as? AutoremoveTimeoutMessageAttribute { @@ -769,6 +770,10 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } } else if let attribute = attribute as? TextEntitiesMessageAttribute { entities = attribute.entities + } else if let attribute = attribute as? NotificationInfoMessageAttribute { + if attribute.flags.contains(.muted) { + muted = true + } } } @@ -797,6 +802,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g return .layer8(.decryptedMessage(randomId: globallyUniqueId, randomBytes: randomBytes, message: message.text, media: decryptedMedia)) case .layer46: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -804,6 +812,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g flags |= (1 << 9) return .layer46(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: nil, viaBotName: viaBotName, replyToRandomId: replyGlobalId)) case .layer73: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -818,6 +829,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } return .layer73(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: decryptedEntites, viaBotName: viaBotName, replyToRandomId: replyGlobalId, groupedId: message.groupingKey)) case .layer101: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -889,6 +903,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } if let decryptedMedia = decryptedMedia { + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -913,6 +930,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } if let decryptedMedia = decryptedMedia { + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -944,6 +964,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } if let decryptedMedia = decryptedMedia { + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -969,6 +992,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g case .layer8: break case .layer46: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -976,6 +1002,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g flags |= (1 << 9) return .layer46(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: nil, viaBotName: viaBotName, replyToRandomId: replyGlobalId)) case .layer73: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -987,6 +1016,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g flags |= (1 << 9) return .layer73(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: decryptedEntites, viaBotName: viaBotName, replyToRandomId: replyGlobalId, groupedId: message.groupingKey)) case .layer101: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1004,6 +1036,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g case .layer8: break case .layer46: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1016,6 +1051,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } return .layer46(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: nil, viaBotName: viaBotName, replyToRandomId: replyGlobalId)) case .layer73: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1033,6 +1071,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } return .layer73(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: decryptedEntites, viaBotName: viaBotName, replyToRandomId: replyGlobalId, groupedId: message.groupingKey)) case .layer101: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1055,6 +1096,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g case .layer8: break case .layer46: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1062,6 +1106,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g flags |= (1 << 9) return .layer46(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: nil, viaBotName: viaBotName, replyToRandomId: replyGlobalId)) case .layer73: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1074,6 +1121,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g flags |= (1 << 9) return .layer73(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: decryptedMedia, entities: decryptedEntites, viaBotName: viaBotName, replyToRandomId: replyGlobalId, groupedId: message.groupingKey)) case .layer101: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1097,11 +1147,17 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g return .layer8(.decryptedMessage(randomId: globallyUniqueId, randomBytes: randomBytes, message: message.text, media: .decryptedMessageMediaEmpty)) case .layer46: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } return .layer46(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: .decryptedMessageMediaEmpty, entities: nil, viaBotName: viaBotName, replyToRandomId: replyGlobalId)) case .layer73: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1111,6 +1167,9 @@ private func boxedDecryptedMessage(transaction: Transaction, message: Message, g } return .layer73(.decryptedMessage(flags: flags, randomId: globallyUniqueId, ttl: messageAutoremoveTimeout, message: message.text, media: .decryptedMessageMediaEmpty, entities: decryptedEntites, viaBotName: viaBotName, replyToRandomId: replyGlobalId, groupedId: message.groupingKey)) case .layer101: + if muted { + flags |= (1 << 5) + } if let _ = viaBotName { flags |= (1 << 11) } @@ -1375,7 +1434,7 @@ private func sendMessage(auxiliaryMethods: AccountAuxiliaryMethods, postbox: Pos if let state = transaction.getPeerChatState(messageId.peerId) as? SecretChatState, let peer = transaction.getPeer(messageId.peerId) as? TelegramSecretChat { if let message = transaction.getMessage(messageId), let globallyUniqueId = message.globallyUniqueId { let decryptedMessage = boxedDecryptedMessage(transaction: transaction, message: message, globallyUniqueId: globallyUniqueId, uploadedFile: file, thumbnailData: thumbnailData, layer: layer) - return sendBoxedDecryptedMessage(postbox: postbox, network: network, peer: peer, state: state, operationIndex: tagLocalIndex, decryptedMessage: decryptedMessage, globallyUniqueId: globallyUniqueId, file: file, asService: wasDelivered, wasDelivered: wasDelivered) + return sendBoxedDecryptedMessage(postbox: postbox, network: network, peer: peer, state: state, operationIndex: tagLocalIndex, decryptedMessage: decryptedMessage, globallyUniqueId: globallyUniqueId, file: file, silent: message.muted, asService: wasDelivered, wasDelivered: wasDelivered) |> mapToSignal { result in return postbox.transaction { transaction -> Void in let forceRemove: Bool @@ -1469,7 +1528,7 @@ private func sendServiceActionMessage(postbox: Postbox, network: Network, peerId return postbox.transaction { transaction -> Signal in if let state = transaction.getPeerChatState(peerId) as? SecretChatState, let peer = transaction.getPeer(peerId) as? TelegramSecretChat { let decryptedMessage = boxedDecryptedSecretMessageAction(action: action) - return sendBoxedDecryptedMessage(postbox: postbox, network: network, peer: peer, state: state, operationIndex: tagLocalIndex, decryptedMessage: decryptedMessage, globallyUniqueId: action.globallyUniqueId, file: nil, asService: true, wasDelivered: wasDelivered) + return sendBoxedDecryptedMessage(postbox: postbox, network: network, peer: peer, state: state, operationIndex: tagLocalIndex, decryptedMessage: decryptedMessage, globallyUniqueId: action.globallyUniqueId, file: nil, silent: false, asService: true, wasDelivered: wasDelivered) |> mapToSignal { result in return postbox.transaction { transaction -> Void in let forceRemove: Bool @@ -1528,7 +1587,7 @@ private enum SendBoxedDecryptedMessageResult { case error(SendBoxedDecryptedMessageError) } -private func sendBoxedDecryptedMessage(postbox: Postbox, network: Network, peer: TelegramSecretChat, state: SecretChatState, operationIndex: Int32, decryptedMessage: BoxedDecryptedMessage, globallyUniqueId: Int64, file: SecretChatOutgoingFile?, asService: Bool, wasDelivered: Bool) -> Signal { +private func sendBoxedDecryptedMessage(postbox: Postbox, network: Network, peer: TelegramSecretChat, state: SecretChatState, operationIndex: Int32, decryptedMessage: BoxedDecryptedMessage, globallyUniqueId: Int64, file: SecretChatOutgoingFile?, silent: Bool, asService: Bool, wasDelivered: Bool) -> Signal { let payload = Buffer() var sequenceInfo: SecretChatOperationSequenceInfo? var maybeParameters: SecretChatEncryptionParameters? @@ -1573,6 +1632,11 @@ private func sendBoxedDecryptedMessage(postbox: Postbox, network: Network, peer: let sendMessage: Signal let inputPeer = Api.InputEncryptedChat.inputEncryptedChat(chatId: peer.id.id, accessHash: peer.accessHash) + var flags: Int32 = 0 + if silent { + flags |= (1 << 0) + } + if asService { let actionRandomId: Int64 if wasDelivered { @@ -1583,9 +1647,9 @@ private func sendBoxedDecryptedMessage(postbox: Postbox, network: Network, peer: sendMessage = network.request(Api.functions.messages.sendEncryptedService(peer: inputPeer, randomId: actionRandomId, data: Buffer(data: encryptedPayload))) } else { if let file = file { - sendMessage = network.request(Api.functions.messages.sendEncryptedFile(peer: inputPeer, randomId: globallyUniqueId, data: Buffer(data: encryptedPayload), file: file.reference.apiInputFile)) + sendMessage = network.request(Api.functions.messages.sendEncryptedFile(flags: flags, peer: inputPeer, randomId: globallyUniqueId, data: Buffer(data: encryptedPayload), file: file.reference.apiInputFile)) } else { - sendMessage = network.request(Api.functions.messages.sendEncrypted(peer: inputPeer, randomId: globallyUniqueId, data: Buffer(data: encryptedPayload))) + sendMessage = network.request(Api.functions.messages.sendEncrypted(flags: flags, peer: inputPeer, randomId: globallyUniqueId, data: Buffer(data: encryptedPayload))) } } return sendMessage diff --git a/submodules/TelegramCore/Sources/ProcessSecretChatIncomingDecryptedOperations.swift b/submodules/TelegramCore/Sources/ProcessSecretChatIncomingDecryptedOperations.swift index 8dd5af8087..b86d428398 100644 --- a/submodules/TelegramCore/Sources/ProcessSecretChatIncomingDecryptedOperations.swift +++ b/submodules/TelegramCore/Sources/ProcessSecretChatIncomingDecryptedOperations.swift @@ -686,7 +686,7 @@ private func maximumMediaAutoremoveTimeout(_ media: [Media]) -> Int32 { private func parseMessage(peerId: PeerId, authorId: PeerId, tagLocalIndex: Int32, timestamp: Int32, apiMessage: SecretApi46.DecryptedMessage, file: SecretChatFileReference?, messageIdForGloballyUniqueMessageId: (Int64) -> MessageId?) -> (StoreMessage, [(MediaResource, Data)])? { switch apiMessage { - case let .decryptedMessage(_, randomId, ttl, message, media, entities, viaBotName, replyToRandomId): + case let .decryptedMessage(flags, randomId, ttl, message, media, entities, viaBotName, replyToRandomId): var text = message var parsedMedia: [Media] = [] var attributes: [MessageAttribute] = [] @@ -698,6 +698,10 @@ private func parseMessage(peerId: PeerId, authorId: PeerId, tagLocalIndex: Int32 attributes.append(InlineBotMessageAttribute(peerId: nil, title: viaBotName)) } + if (flags & 1 << 5) != 0 { + attributes.append(NotificationInfoMessageAttribute(flags: .muted)) + } + if let media = media { switch media { case let .decryptedMessageMediaPhoto(thumb, thumbW, thumbH, w, h, size, key, iv, caption): @@ -882,7 +886,7 @@ private func parseEntities(_ entities: [SecretApi73.MessageEntity]) -> TextEntit private func parseMessage(peerId: PeerId, authorId: PeerId, tagLocalIndex: Int32, timestamp: Int32, apiMessage: SecretApi73.DecryptedMessage, file: SecretChatFileReference?, messageIdForGloballyUniqueMessageId: (Int64) -> MessageId?) -> (StoreMessage, [(MediaResource, Data)])? { switch apiMessage { - case let .decryptedMessage(_, randomId, ttl, message, media, entities, viaBotName, replyToRandomId, groupedId): + case let .decryptedMessage(flags, randomId, ttl, message, media, entities, viaBotName, replyToRandomId, groupedId): var text = message var parsedMedia: [Media] = [] var attributes: [MessageAttribute] = [] @@ -896,6 +900,10 @@ private func parseMessage(peerId: PeerId, authorId: PeerId, tagLocalIndex: Int32 attributes.append(InlineBotMessageAttribute(peerId: nil, title: viaBotName)) } + if (flags & 1 << 5) != 0 { + attributes.append(NotificationInfoMessageAttribute(flags: .muted)) + } + if let media = media { switch media { case let .decryptedMessageMediaPhoto(thumb, thumbW, thumbH, w, h, size, key, iv, caption): @@ -1116,7 +1124,7 @@ private func parseEntities(_ entities: [SecretApi101.MessageEntity]) -> TextEnti private func parseMessage(peerId: PeerId, authorId: PeerId, tagLocalIndex: Int32, timestamp: Int32, apiMessage: SecretApi101.DecryptedMessage, file: SecretChatFileReference?, messageIdForGloballyUniqueMessageId: (Int64) -> MessageId?) -> (StoreMessage, [(MediaResource, Data)])? { switch apiMessage { - case let .decryptedMessage(_, randomId, ttl, message, media, entities, viaBotName, replyToRandomId, groupedId): + case let .decryptedMessage(flags, randomId, ttl, message, media, entities, viaBotName, replyToRandomId, groupedId): var text = message var parsedMedia: [Media] = [] var attributes: [MessageAttribute] = [] @@ -1130,6 +1138,10 @@ private func parseMessage(peerId: PeerId, authorId: PeerId, tagLocalIndex: Int32 attributes.append(InlineBotMessageAttribute(peerId: nil, title: viaBotName)) } + if (flags & 1 << 5) != 0 { + attributes.append(NotificationInfoMessageAttribute(flags: .muted)) + } + if let media = media { switch media { case let .decryptedMessageMediaPhoto(thumb, thumbW, thumbH, w, h, size, key, iv, caption): diff --git a/submodules/TelegramUI/Sources/ChatSendMessageActionSheetController.swift b/submodules/TelegramUI/Sources/ChatSendMessageActionSheetController.swift index b3dc91fb9b..4b420cf10f 100644 --- a/submodules/TelegramUI/Sources/ChatSendMessageActionSheetController.swift +++ b/submodules/TelegramUI/Sources/ChatSendMessageActionSheetController.swift @@ -3,6 +3,7 @@ import UIKit import Display import AsyncDisplayKit import SwiftSignalKit +import SyncCore import TelegramPresentationData import AccountContext import ContextUI @@ -67,8 +68,10 @@ final class ChatSendMessageActionSheetController: ViewController { } var reminders = false - if case let .peer(peerId) = self.interfaceState.chatLocation, peerId == context.account.peerId { - reminders = true + var isSecret = false + if case let .peer(peerId) = self.interfaceState.chatLocation { + reminders = peerId == context.account.peerId + isSecret = peerId.namespace == Namespaces.Peer.SecretChat } self.displayNode = ChatSendMessageActionSheetControllerNode(context: self.context, reminders: reminders, gesture: gesture, sendButtonFrame: self.sendButtonFrame, textInputNode: self.textInputNode, forwardedCount: forwardedCount, send: { [weak self] in @@ -77,7 +80,7 @@ final class ChatSendMessageActionSheetController: ViewController { }, sendSilently: { [weak self] in self?.controllerInteraction?.sendCurrentMessage(true) self?.dismiss(cancel: false) - }, schedule: { [weak self] in + }, schedule: isSecret ? nil : { [weak self] in self?.controllerInteraction?.scheduleCurrentMessage() self?.dismiss(cancel: false) }, cancel: { [weak self] in diff --git a/submodules/TelegramUI/Sources/ChatSendMessageActionSheetControllerNode.swift b/submodules/TelegramUI/Sources/ChatSendMessageActionSheetControllerNode.swift index 9c845b4699..29415a9bb9 100644 --- a/submodules/TelegramUI/Sources/ChatSendMessageActionSheetControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatSendMessageActionSheetControllerNode.swift @@ -241,9 +241,11 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, sendSilently?() })) } - contentNodes.append(ActionSheetItemNode(theme: self.presentationData.theme, title: reminders ? self.presentationData.strings.Conversation_SendMessage_SetReminder: self.presentationData.strings.Conversation_SendMessage_ScheduleMessage, icon: .schedule, hasSeparator: false, action: { - schedule?() - })) + if let _ = schedule { + contentNodes.append(ActionSheetItemNode(theme: self.presentationData.theme, title: reminders ? self.presentationData.strings.Conversation_SendMessage_SetReminder: self.presentationData.strings.Conversation_SendMessage_ScheduleMessage, icon: .schedule, hasSeparator: false, action: { + schedule?() + })) + } self.contentNodes = contentNodes super.init() diff --git a/submodules/TelegramUI/Sources/ChatTextInputActionButtonsNode.swift b/submodules/TelegramUI/Sources/ChatTextInputActionButtonsNode.swift index 843549408b..7f46c65097 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputActionButtonsNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputActionButtonsNode.swift @@ -84,12 +84,6 @@ final class ChatTextInputActionButtonsNode: ASDisplayNode { self.micButtonPointerInteraction = PointerInteraction(view: self.micButton, style: .circle) } - @objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) { - if !self.sendButtonHasApplyIcon && gestureRecognizer.state == .began { - //self.sendButtonLongPressed?() - } - } - func updateTheme(theme: PresentationTheme) { self.micButton.updateTheme(theme: theme) self.expandMediaInputButton.setImage(PresentationResourcesChat.chatInputPanelExpandButtonImage(theme), for: []) diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index c6321b20ee..5a21dcb5f2 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -809,7 +809,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { self.textPlaceholderNode.frame = CGRect(origin: self.textPlaceholderNode.frame.origin, size: placeholderSize) } - self.actionButtons.sendButtonLongPressEnabled = peer.id.namespace != Namespaces.Peer.SecretChat && !interfaceState.isScheduledMessages + self.actionButtons.sendButtonLongPressEnabled = !interfaceState.isScheduledMessages } let sendButtonHasApplyIcon = interfaceState.interfaceState.editMessage != nil