Compare commits
691 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d031046edb | ||
|
|
7808cc6d41 | ||
|
|
a7b60c43b5 | ||
|
|
a8b959826c | ||
|
|
42f96f3c43 | ||
|
|
cc97093c5a | ||
|
|
7d5d086ade | ||
|
|
3da44eb5dd | ||
|
|
4955cdcdce | ||
|
|
597195a2e2 | ||
|
|
5966c74a27 | ||
|
|
caa1ae4436 | ||
|
|
af5ad84e72 | ||
|
|
728ed02a1c | ||
|
|
8e369a4aa5 | ||
|
|
35e457c924 | ||
|
|
097c3c4a5a | ||
|
|
10022a3c6d | ||
|
|
0dbb195106 | ||
|
|
6493cb9ed8 | ||
|
|
1cfda38345 | ||
|
|
bf20dbe3bc | ||
|
|
46d3f232af | ||
|
|
ade97fd2d2 | ||
|
|
39614aab3f | ||
|
|
6bab2b4df6 | ||
|
|
b4c7272351 | ||
|
|
d831775e2f | ||
|
|
bde39970a0 | ||
|
|
076291b98f | ||
|
|
1341907cfd | ||
|
|
b793c06759 | ||
|
|
475b2ac739 | ||
|
|
d1c310de00 | ||
|
|
8615a25cd1 | ||
|
|
de4eb1e59b | ||
|
|
8e8f6f905f | ||
|
|
a57eecd420 | ||
|
|
f306b11676 | ||
|
|
745ad45d47 | ||
|
|
5fee0a7a73 | ||
|
|
096ddcad6d | ||
|
|
3b7448ccab | ||
|
|
478c6c4d36 | ||
|
|
e2ea27cbef | ||
|
|
625ae87eea | ||
|
|
597816db09 | ||
|
|
ec3fc8c749 | ||
|
|
e64a096dca | ||
|
|
eaf30d58be | ||
|
|
94ac9f93fa | ||
|
|
04f040c9c5 | ||
|
|
af0e87c569 | ||
|
|
1a503e5f1d | ||
|
|
c46b659aa5 | ||
|
|
7a754f8b00 | ||
|
|
29fb263495 | ||
|
|
c8660b5385 | ||
|
|
d47b99b0b5 | ||
|
|
88e3c87cd9 | ||
|
|
fe0e526b79 | ||
|
|
c480ab1a3b | ||
|
|
49bc8ccd6a | ||
|
|
b180070ba3 | ||
|
|
b40f30ca98 | ||
|
|
c2a1817400 | ||
|
|
cb6698cf4a | ||
|
|
bcdb1bdfd2 | ||
|
|
effc9873c9 | ||
|
|
9561026cd4 | ||
|
|
5d335341ab | ||
|
|
cc8408d11c | ||
|
|
a197ed9e95 | ||
|
|
3b91e2dee4 | ||
|
|
c035ec6917 | ||
|
|
041ec1157f | ||
|
|
17578be4b9 | ||
|
|
1409d38ac3 | ||
|
|
b463c76eca | ||
|
|
d62fb5786d | ||
|
|
aad157cf56 | ||
|
|
2d3e2b1ef8 | ||
|
|
91ab82c9da | ||
|
|
9c23de7f1a | ||
|
|
60fb5fdaf0 | ||
|
|
4709e11e46 | ||
|
|
8c28ce4c99 | ||
|
|
20c63b98c7 | ||
|
|
8b42161898 | ||
|
|
b1823d981b | ||
|
|
b2e8e0431e | ||
|
|
486d5b63d3 | ||
|
|
84a1fec7b1 | ||
|
|
3a84c6afdd | ||
|
|
16d18b437d | ||
|
|
12fab565a4 | ||
|
|
f8d5a8a203 | ||
|
|
b9af4f3cb0 | ||
|
|
4b6107fa56 | ||
|
|
f90a010b84 | ||
|
|
ef0539c9fc | ||
|
|
00db325e91 | ||
|
|
d5429e769f | ||
|
|
714dae054a | ||
|
|
981babf302 | ||
|
|
0926bb1288 | ||
|
|
e13768ea50 | ||
|
|
6c19274eac | ||
|
|
394883b986 | ||
|
|
4240568ea5 | ||
|
|
a77131dfd6 | ||
|
|
caca679336 | ||
|
|
b08869abdb | ||
|
|
d5147c9d28 | ||
|
|
859e41f95a | ||
|
|
0e45f3ebd9 | ||
|
|
7f9461820b | ||
|
|
e59a60b3b5 | ||
|
|
926aae6847 | ||
|
|
744c1b925e | ||
|
|
3fc9ed0ccb | ||
|
|
0b7d544615 | ||
|
|
d19baeace2 | ||
|
|
cd0f58fa65 | ||
|
|
1f25301283 | ||
|
|
0788f3d7b0 | ||
|
|
f93b7a60f8 | ||
|
|
d0875a1178 | ||
|
|
29f8493a82 | ||
|
|
d4db838d43 | ||
|
|
0be2e8b672 | ||
|
|
0aa1031402 | ||
|
|
53c73accd0 | ||
|
|
be38800a70 | ||
|
|
f2fa1cd70d | ||
|
|
5dfce5f7b2 | ||
|
|
2b10e1e595 | ||
|
|
eb1ef6d2a7 | ||
|
|
fde63ccb21 | ||
|
|
b209683c8e | ||
|
|
b6be799938 | ||
|
|
ec8c634e9c | ||
|
|
b7a9aa9a0e | ||
|
|
2ca489b2fb | ||
|
|
daf76c1bc2 | ||
|
|
d3aa0664a7 | ||
|
|
f61c22b065 | ||
|
|
8041941565 | ||
|
|
0aa1cd0b52 | ||
|
|
1bbac5784b | ||
|
|
f925a9e961 | ||
|
|
8b6d475882 | ||
|
|
d82c422ea1 | ||
|
|
d7e57e42d8 | ||
|
|
7ee2ec13f0 | ||
|
|
a6e13a9f9e | ||
|
|
66f73a5a64 | ||
|
|
575684670c | ||
|
|
9661bac876 | ||
|
|
4b618a3578 | ||
|
|
0e79bd3d12 | ||
|
|
dd692f2d26 | ||
|
|
cba8387589 | ||
|
|
01c2ade501 | ||
|
|
b9fa14139a | ||
|
|
a8cb5419d6 | ||
|
|
f775670938 | ||
|
|
c035a25aaa | ||
|
|
6cae088d1f | ||
|
|
bee0534052 | ||
|
|
3e11d44cac | ||
|
|
4d269f6e97 | ||
|
|
e9496fb612 | ||
|
|
c9c82446cb | ||
|
|
0dec803177 | ||
|
|
2dc45ac907 | ||
|
|
a3d8db4ac0 | ||
|
|
aee6b6e224 | ||
|
|
736efd4692 | ||
|
|
ec5e846374 | ||
|
|
caf32cccd3 | ||
|
|
594b2bc8f2 | ||
|
|
d1ba270a8c | ||
|
|
2c1abd32bf | ||
|
|
79662dffa4 | ||
|
|
a79e025151 | ||
|
|
3fa168cee0 | ||
|
|
9c1ef76e49 | ||
|
|
8497b83f7c | ||
|
|
393c23ad12 | ||
|
|
01821cd779 | ||
|
|
3da733520d | ||
|
|
a605275157 | ||
|
|
8564e4d727 | ||
|
|
fc3acff5d6 | ||
|
|
515850ec9b | ||
|
|
837b256778 | ||
|
|
d16cab30d4 | ||
|
|
fcdd7ecd61 | ||
|
|
da9720530a | ||
|
|
4a10d86a29 | ||
|
|
3b5a007db5 | ||
|
|
2479b56c3b | ||
|
|
0909e8bd08 | ||
|
|
6109ec70b8 | ||
|
|
c20bd17029 | ||
|
|
10e3115c39 | ||
|
|
3425b40746 | ||
|
|
42fc4fbb31 | ||
|
|
f081917cd0 | ||
|
|
bdfb0ffe04 | ||
|
|
2b282c8d7d | ||
|
|
77d23ad182 | ||
|
|
79442fde97 | ||
|
|
f8e80bc266 | ||
|
|
cb4c629178 | ||
|
|
af0e11a1aa | ||
|
|
8ac6aca315 | ||
|
|
2638e54181 | ||
|
|
db97db4aba | ||
|
|
ded3f135bb | ||
|
|
be82df72e6 | ||
|
|
3fa6335b24 | ||
|
|
23868bf9cc | ||
|
|
5b67f4ac9b | ||
|
|
17fdef7d9e | ||
|
|
cf82e12bf4 | ||
|
|
6f27aeef10 | ||
|
|
df53ddf837 | ||
|
|
a3fd4f3fac | ||
|
|
24c0624704 | ||
|
|
33724be6ea | ||
|
|
4624d34f68 | ||
|
|
aeee016dc9 | ||
|
|
8ded88baf5 | ||
|
|
bdd35a6e2b | ||
|
|
d9a08bb6a6 | ||
|
|
cee833f102 | ||
|
|
c19a527872 | ||
|
|
6995fcafb5 | ||
|
|
b261d23645 | ||
|
|
21c1ba7607 | ||
|
|
5a2b8d06e3 | ||
|
|
9046daa1a6 | ||
|
|
65ccb4059e | ||
|
|
d2578e9e47 | ||
|
|
be17e2b919 | ||
|
|
26c2e7f245 | ||
|
|
9051716172 | ||
|
|
71b6a58683 | ||
|
|
32cd454554 | ||
|
|
6ffe555f6a | ||
|
|
7ac9ab3a51 | ||
|
|
a9b0464726 | ||
|
|
e4e85e5a39 | ||
|
|
c5f294a1ac | ||
|
|
5dc078a3f8 | ||
|
|
83753343cb | ||
|
|
42215343cf | ||
|
|
bedefee1d1 | ||
|
|
788eb014d4 | ||
|
|
13b7a07d2e | ||
|
|
f026271436 | ||
|
|
d13fe39629 | ||
|
|
62b3b60c45 | ||
|
|
74313d23f3 | ||
|
|
646390141a | ||
|
|
83cf12b475 | ||
|
|
a0226f9789 | ||
|
|
54fecd497e | ||
|
|
2106747496 | ||
|
|
ecce9dbaaa | ||
|
|
b606a7b21d | ||
|
|
35ff45971f | ||
|
|
7a436f32dd | ||
|
|
54d5358b75 | ||
|
|
20c2250abb | ||
|
|
2ddc1ee2e1 | ||
|
|
b55d2008c0 | ||
|
|
11b932707c | ||
|
|
d50aca0d33 | ||
|
|
671e81033c | ||
|
|
361d269bf3 | ||
|
|
ae81373cff | ||
|
|
160794b26c | ||
|
|
1dc57afbe1 | ||
|
|
d9f397ea3f | ||
|
|
c9a976bf87 | ||
|
|
7b921dea3b | ||
|
|
fcc6aaed91 | ||
|
|
eb0ab9609f | ||
|
|
bb359f6493 | ||
|
|
b24be50afe | ||
|
|
3e55380eed | ||
|
|
25c97a3ee8 | ||
|
|
2055cc70d1 | ||
|
|
788a81df6c | ||
|
|
1209bd35c5 | ||
|
|
f473a1a804 | ||
|
|
c8e95f7297 | ||
|
|
b1ed8cd1b1 | ||
|
|
64bb818fe9 | ||
|
|
ee172d951d | ||
|
|
41bc47eb6f | ||
|
|
423d2293f9 | ||
|
|
e6559276c0 | ||
|
|
13959ca36c | ||
|
|
520989a7e6 | ||
|
|
4c02d19a51 | ||
|
|
734e1166ad | ||
|
|
94fd3e32dd | ||
|
|
367adaa44d | ||
|
|
73b4621121 | ||
|
|
8256a4c686 | ||
|
|
b6b6673214 | ||
|
|
8ba2e95e6c | ||
|
|
40ab042fb5 | ||
|
|
25f401c22e | ||
|
|
d8566f770f | ||
|
|
f76f69b5cd | ||
|
|
487dd27ca1 | ||
|
|
32df03f08d | ||
|
|
658db59aaf | ||
|
|
695542cfd2 | ||
|
|
07cd35b1a8 | ||
|
|
74aae29b64 | ||
|
|
70713d5f62 | ||
|
|
dd1b006d8a | ||
|
|
ec8d604db7 | ||
|
|
9e8d60065b | ||
|
|
d603f4de51 | ||
|
|
77695091b3 | ||
|
|
20e81177a6 | ||
|
|
ce3ad95950 | ||
|
|
c5684e768a | ||
|
|
c8d5a60c74 | ||
|
|
4dad0a215a | ||
|
|
15698fd6f0 | ||
|
|
cd4654dfd2 | ||
|
|
3a3d4480cc | ||
|
|
5c3748db56 | ||
|
|
7dfdcc7be0 | ||
|
|
d1f2950167 | ||
|
|
59f61586a9 | ||
|
|
629dd6f9de | ||
|
|
f4fc8ec2c4 | ||
|
|
e8aa55d4d8 | ||
|
|
26b17325aa | ||
|
|
c71f35778d | ||
|
|
c9eb9a3ee0 | ||
|
|
06948ad15e | ||
|
|
029e0c9488 | ||
|
|
c0219cb95d | ||
|
|
78e553b724 | ||
|
|
b5b70beea0 | ||
|
|
177a7eaf43 | ||
|
|
ca863bfb5b | ||
|
|
c45025c6e5 | ||
|
|
10968d0da2 | ||
|
|
b0a65885c9 | ||
|
|
ad8f8513c3 | ||
|
|
f457a9d109 | ||
|
|
830fb3ccc2 | ||
|
|
9116328f29 | ||
|
|
aa7575dec4 | ||
|
|
bfe272e39f | ||
|
|
a7ca15657b | ||
|
|
41dada2c06 | ||
|
|
501784cd15 | ||
|
|
ac699ccf80 | ||
|
|
aadaf47569 | ||
|
|
6bc0179919 | ||
|
|
93fbad50bc | ||
|
|
a5ec616382 | ||
|
|
bf3f474195 | ||
|
|
14f68c2f33 | ||
|
|
92fadd2652 | ||
|
|
b68a7c7f04 | ||
|
|
50097e1a81 | ||
|
|
2414e927bd | ||
|
|
da768ac1d1 | ||
|
|
396c229a4d | ||
|
|
2b3f17e982 | ||
|
|
5ef48cac9c | ||
|
|
6ba922d7b0 | ||
|
|
f881192dd0 | ||
|
|
ef2a0bb05e | ||
|
|
54efa2353e | ||
|
|
2878533078 | ||
|
|
ac520b314d | ||
|
|
871fef2c4a | ||
|
|
99f4b93745 | ||
|
|
a757e07c3a | ||
|
|
5c4f006550 | ||
|
|
9ad38b9638 | ||
|
|
fe8ebc1659 | ||
|
|
a732d8f5e7 | ||
|
|
7ddcc47fcd | ||
|
|
70f22293cf | ||
|
|
90fb59348c | ||
|
|
daf545a72a | ||
|
|
771869e945 | ||
|
|
ac1fe2cfee | ||
|
|
ed064ee13c | ||
|
|
9fcdec4166 | ||
|
|
bd4cf82405 | ||
|
|
3653a6f011 | ||
|
|
adc6930ac6 | ||
|
|
7305d542ba | ||
|
|
874c84ad4e | ||
|
|
4edb11f128 | ||
|
|
785014f7b7 | ||
|
|
4cb5bea69b | ||
|
|
07bc84d425 | ||
|
|
9019a2cb08 | ||
|
|
716cc6ef9e | ||
|
|
a509be99b0 | ||
|
|
618ce15b21 | ||
|
|
d2b5651c3b | ||
|
|
51ff484913 | ||
|
|
547a5a14df | ||
|
|
5179d9a03f | ||
|
|
26e84dbab2 | ||
|
|
013c8ebeb4 | ||
|
|
846e96579d | ||
|
|
eaa491518e | ||
|
|
4df7761e9d | ||
|
|
6cdc8f9dbc | ||
|
|
95e4abd784 | ||
|
|
6f9a540a61 | ||
|
|
137fca73bd | ||
|
|
2159307643 | ||
|
|
ded570a480 | ||
|
|
4fd68d97d5 | ||
|
|
edfe998811 | ||
|
|
116ae04f54 | ||
|
|
ce8e42bcc2 | ||
|
|
ea9386f0aa | ||
|
|
58451aed91 | ||
|
|
a6df03d990 | ||
|
|
16b1881268 | ||
|
|
0d25b154d9 | ||
|
|
89fac88677 | ||
|
|
9604a3bd80 | ||
|
|
5b3ffc778d | ||
|
|
c6c06c149d | ||
|
|
a37f7077b0 | ||
|
|
5514ab0ccf | ||
|
|
63a753d35c | ||
|
|
4e82b7973f | ||
|
|
09094affed | ||
|
|
c5634580f6 | ||
|
|
7828a92f08 | ||
|
|
e60e65f574 | ||
|
|
7a25d70240 | ||
|
|
01428572b0 | ||
|
|
a43a5ce6c5 | ||
|
|
d4ba01bad0 | ||
|
|
5d5cae7860 | ||
|
|
f3db7e636b | ||
|
|
1c2951598b | ||
|
|
39f8394f98 | ||
|
|
29c5f6b706 | ||
|
|
b2c9a92c3e | ||
|
|
f3647d7f8c | ||
|
|
f3e65181cd | ||
|
|
d5b429e910 | ||
|
|
1bde096417 | ||
|
|
3db0b11a6b | ||
|
|
8d00d93949 | ||
|
|
277fe540dc | ||
|
|
1683dccb50 | ||
|
|
47195e316f | ||
|
|
8c9014fcf6 | ||
|
|
2d7675ace0 | ||
|
|
61cc7efc2a | ||
|
|
0464a558f0 | ||
|
|
ff9321e971 | ||
|
|
d10b7e8402 | ||
|
|
71f3f67fe3 | ||
|
|
47983d59fb | ||
|
|
df29af5aea | ||
|
|
27b443b24d | ||
|
|
7b4a542890 | ||
|
|
db6c69fa5f | ||
|
|
7dfeea3f4e | ||
|
|
92a41c881d | ||
|
|
3d769a6dce | ||
|
|
330dfaa4d9 | ||
|
|
b35fff01b0 | ||
|
|
cc19928977 | ||
|
|
c5424d0a9a | ||
|
|
f3572e52ac | ||
|
|
949c486cac | ||
|
|
082b5ba782 | ||
|
|
0f86968afd | ||
|
|
90f52d80d7 | ||
|
|
4e97599e9d | ||
|
|
e0b3e69351 | ||
|
|
e0b4d1edce | ||
|
|
a54bc449e4 | ||
|
|
ea41aab713 | ||
|
|
fd00450f44 | ||
|
|
e22aed55b0 | ||
|
|
cb838e6e52 | ||
|
|
3c931b11d6 | ||
|
|
a14dbffb65 | ||
|
|
64dcae3174 | ||
|
|
6af527ac76 | ||
|
|
e1624e5d22 | ||
|
|
21857450f3 | ||
|
|
8ea4f26e31 | ||
|
|
76ac6c3be7 | ||
|
|
c4c5036ec0 | ||
|
|
ad87c2a15e | ||
|
|
7dbf331e18 | ||
|
|
ab53b4eab7 | ||
|
|
7d678e5fa7 | ||
|
|
6adb3e7200 | ||
|
|
7906be37b6 | ||
|
|
c12743925e | ||
|
|
b17b806d91 | ||
|
|
98ab91a56a | ||
|
|
0f8d9e885a | ||
|
|
bc891ca55e | ||
|
|
9653cfdd56 | ||
|
|
0b4a255acc | ||
|
|
94feb953aa | ||
|
|
7b65c9174f | ||
|
|
e74021fbc9 | ||
|
|
e6a474d720 | ||
|
|
976c696004 | ||
|
|
c057c88d30 | ||
|
|
674bab69f5 | ||
|
|
97d93b23dc | ||
|
|
d363a6ea84 | ||
|
|
da7e8a8dc3 | ||
|
|
4296f93e1a | ||
|
|
d0b16ce05b | ||
|
|
c3340fd016 | ||
|
|
36f1a18b3b | ||
|
|
ef969df86e | ||
|
|
229f7a2c15 | ||
|
|
fbd8abc1c6 | ||
|
|
73f3110403 | ||
|
|
dfa5386a27 | ||
|
|
e5227a7e05 | ||
|
|
a6b844408a | ||
|
|
dbd4aecc56 | ||
|
|
3332f012cf | ||
|
|
456f4d7b8a | ||
|
|
0b4ef3214e | ||
|
|
e946bf5338 | ||
|
|
e8a1fc0300 | ||
|
|
0bf0fb29d2 | ||
|
|
566f2dd670 | ||
|
|
e52e1672e8 | ||
|
|
bf255c0e00 | ||
|
|
55fb3405e5 | ||
|
|
adbe5e9605 | ||
|
|
29bfe43386 | ||
|
|
ca30c35c2b | ||
|
|
d4ad5d9f13 | ||
|
|
fd79973509 | ||
|
|
d2bd109169 | ||
|
|
1b5b9f46d2 | ||
|
|
ed345e0823 | ||
|
|
90adc2d97c | ||
|
|
787ed443f4 | ||
|
|
7ffb341597 | ||
|
|
483909854a | ||
|
|
289257dd0f | ||
|
|
547a39d835 | ||
|
|
eef3cdd31b | ||
|
|
4bfe40d02e | ||
|
|
107b72f442 | ||
|
|
8adbbe6885 | ||
|
|
191f832e52 | ||
|
|
9f0a756f71 | ||
|
|
0079a18e97 | ||
|
|
876a803e0e | ||
|
|
7009e967d0 | ||
|
|
076aa9452e | ||
|
|
d77c7a70ab | ||
|
|
8255de1ba8 | ||
|
|
aad1296829 | ||
|
|
738aff9c4f | ||
|
|
7740780eeb | ||
|
|
9edbb9762a | ||
|
|
98bb520f47 | ||
|
|
ae2182c1e5 | ||
|
|
4807244682 | ||
|
|
119f7e757d | ||
|
|
e34e640dbb | ||
|
|
e755851237 | ||
|
|
dff168c62e | ||
|
|
b39bf11d9e | ||
|
|
d8f53d5f60 | ||
|
|
f10da51517 | ||
|
|
3dc0e3818b | ||
|
|
1493b23574 | ||
|
|
70e298cfe4 | ||
|
|
9d4b8bb9b0 | ||
|
|
089432be5e | ||
|
|
4b503ad7ed | ||
|
|
aeb593dd77 | ||
|
|
0d4a83ea47 | ||
|
|
95b26911e0 | ||
|
|
4c2be58dd3 | ||
|
|
374e95de31 | ||
|
|
cfe3285e68 | ||
|
|
7b184e553b | ||
|
|
02e37ab2f2 | ||
|
|
48206bcf95 | ||
|
|
d0eb7ec522 | ||
|
|
77c2e12ebc | ||
|
|
a479fcd55c | ||
|
|
396635fa1d | ||
|
|
4755be4ace | ||
|
|
1148a2e144 | ||
|
|
827e755552 | ||
|
|
b80f5f9706 | ||
|
|
518f0e22cd | ||
|
|
610e0e7913 | ||
|
|
e7be8e1c60 | ||
|
|
ac15457961 | ||
|
|
eeb8af3ca6 | ||
|
|
8245660c81 | ||
|
|
b03120d83a | ||
|
|
eab9186790 | ||
|
|
89dd9c93ef | ||
|
|
bb141b4268 | ||
|
|
1244200987 | ||
|
|
2af4b2b512 | ||
|
|
ed8c8aba17 | ||
|
|
20ad39bdf9 | ||
|
|
1d26a01144 | ||
|
|
5ee7cb4dbf | ||
|
|
d14e32f63e | ||
|
|
bb4476890f | ||
|
|
0b115dedf5 | ||
|
|
2cb7d8ea77 | ||
|
|
23dbe4742a | ||
|
|
58d762f130 | ||
|
|
d7e2046ef3 | ||
|
|
56555c330b | ||
|
|
4e3db5b693 | ||
|
|
05b628da9b | ||
|
|
2f9ae75a65 | ||
|
|
e8e74e7ac7 | ||
|
|
c765c4198f | ||
|
|
a2fe91af03 | ||
|
|
ccc61028b8 | ||
|
|
b610de30f4 | ||
|
|
653d7aadb1 | ||
|
|
95ea61cd41 | ||
|
|
96cef39576 | ||
|
|
07bbfd1353 | ||
|
|
92fec8304e | ||
|
|
7d4c3766d5 | ||
|
|
ed9028e1c4 | ||
|
|
ecaf3340f6 | ||
|
|
f8c396e2cf | ||
|
|
b23420f775 | ||
|
|
af3cf63e5f | ||
|
|
311691a3bc | ||
|
|
4b0c4eee30 | ||
|
|
5dcca4482a | ||
|
|
fc47aa0da9 | ||
|
|
83eb352747 | ||
|
|
e4811505c8 | ||
|
|
3aebf59a61 | ||
|
|
b5d3391956 | ||
|
|
f502229cc8 | ||
|
|
ec9f8943de | ||
|
|
19d5b17d2e | ||
|
|
bc523c2685 | ||
|
|
b871a29275 | ||
|
|
3fe9ba41ba | ||
|
|
4e95d62018 | ||
|
|
d57d95c53f | ||
|
|
87f52cf7df | ||
|
|
3c246fa49d | ||
|
|
5285f74b13 | ||
|
|
80fb506f84 | ||
|
|
fd6e135700 | ||
|
|
9bf5f992a3 | ||
|
|
f539912405 | ||
|
|
a0fb81b871 | ||
|
|
3d0b139c40 | ||
|
|
29a458c8a0 |
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,6 +1,6 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: API issue
|
||||
- name: Platform-wide issue
|
||||
url: https://bugs.telegram.org
|
||||
about: Any bug report or feature request affecting more than only Telegram Desktop.
|
||||
- name: Issue of other client
|
||||
|
||||
2
.github/workflows/docker.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
curl -sSL https://install.python-poetry.org | python3 -
|
||||
|
||||
- name: Free up some disk space.
|
||||
uses: jlumbroso/free-disk-space@76866dbe54312617f00798d1762df7f43def6e5c
|
||||
uses: jlumbroso/free-disk-space@f68fdb76e2ea636224182cfb7377ff9a1708f9b8
|
||||
|
||||
- name: Docker image build.
|
||||
run: |
|
||||
|
||||
4
.github/workflows/linux.yml
vendored
@@ -41,7 +41,7 @@ on:
|
||||
jobs:
|
||||
|
||||
linux:
|
||||
name: CentOS 7
|
||||
name: Rocky Linux 8
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ghcr.io/${{ github.repository }}/centos_env
|
||||
@@ -51,7 +51,7 @@ jobs:
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: scl enable rh-python38 -- scl enable llvm-toolset-7.0 -- scl enable devtoolset-10 -- bash --noprofile --norc -eo pipefail {0}
|
||||
shell: scl enable gcc-toolset-12 -- bash --noprofile --norc -eo pipefail {0}
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
|
||||
4
.github/workflows/master_updater.yml
vendored
@@ -11,7 +11,9 @@ jobs:
|
||||
SKIP: "0"
|
||||
to_branch: "master"
|
||||
steps:
|
||||
- uses: actions/checkout@v3.1.0
|
||||
- uses: actions/checkout@v4.1.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
if: env.SKIP == '0'
|
||||
- name: Push the code to the master branch.
|
||||
if: env.SKIP == '0'
|
||||
|
||||
2
.github/workflows/snap.yml
vendored
@@ -61,7 +61,7 @@ jobs:
|
||||
sudo snap run lxd waitready
|
||||
|
||||
- name: Free up some disk space.
|
||||
uses: jlumbroso/free-disk-space@76866dbe54312617f00798d1762df7f43def6e5c
|
||||
uses: jlumbroso/free-disk-space@f68fdb76e2ea636224182cfb7377ff9a1708f9b8
|
||||
|
||||
- name: Telegram Desktop snap build.
|
||||
run: sg lxd -c 'snap run snapcraft -v'
|
||||
|
||||
14
.github/workflows/win.yml
vendored
@@ -60,13 +60,10 @@ jobs:
|
||||
steps:
|
||||
- name: Prepare directories.
|
||||
run: |
|
||||
mkdir %userprofile%\TBuild
|
||||
mkdir %userprofile%\TBuild\Libraries
|
||||
mklink /d %GITHUB_WORKSPACE%\TBuild %userprofile%\TBuild
|
||||
echo TBUILD=%GITHUB_WORKSPACE%\TBuild>>%GITHUB_ENV%
|
||||
|
||||
mkdir %userprofile%\TBuild Libraries
|
||||
mklink /d %userprofile%\TBuild\Libraries %GITHUB_WORKSPACE%\Libraries
|
||||
|
||||
- name: Get repository name.
|
||||
shell: bash
|
||||
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
@@ -100,7 +97,7 @@ jobs:
|
||||
id: cache-libs
|
||||
uses: actions/cache@v3.0.11
|
||||
with:
|
||||
path: Libraries
|
||||
path: ${{ env.TBUILD }}\Libraries
|
||||
key: ${{ runner.OS }}-${{ matrix.arch }}-libs-${{ env.CACHE_KEY }}
|
||||
restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-libs-
|
||||
|
||||
@@ -108,7 +105,9 @@ jobs:
|
||||
env:
|
||||
GYP_MSVS_OVERRIDE_PATH: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\'
|
||||
GYP_MSVS_VERSION: 2022
|
||||
run: '%TBUILD%\%REPO_NAME%\Telegram\build\prepare\win.bat skip-release silent'
|
||||
run: |
|
||||
cd %TBUILD%
|
||||
%REPO_NAME%\Telegram\build\prepare\win.bat skip-release silent
|
||||
|
||||
- name: Read defines.
|
||||
shell: bash
|
||||
@@ -124,7 +123,7 @@ jobs:
|
||||
echo "TDESKTOP_BUILD_DEFINE=$DEFINE" >> $GITHUB_ENV
|
||||
|
||||
API="-D TDESKTOP_API_TEST=ON"
|
||||
if [ ${{ github.ref == 'refs/heads/nightly' }} ]; then
|
||||
if [ $GITHUB_REF == 'refs/heads/nightly' ]; then
|
||||
echo "Use the open credentials."
|
||||
API="-D TDESKTOP_API_ID=611335 -D TDESKTOP_API_HASH=d524b414d21f4d37f08684c1df41ac9c"
|
||||
fi
|
||||
@@ -132,6 +131,7 @@ jobs:
|
||||
|
||||
- name: Free up some disk space.
|
||||
run: |
|
||||
cd %TBUILD%
|
||||
del /S Libraries\*.pdb
|
||||
del /S Libraries\*.pch
|
||||
del /S Libraries\*.obj
|
||||
|
||||
6
.gitmodules
vendored
@@ -58,9 +58,6 @@
|
||||
[submodule "Telegram/ThirdParty/range-v3"]
|
||||
path = Telegram/ThirdParty/range-v3
|
||||
url = https://github.com/ericniebler/range-v3.git
|
||||
[submodule "Telegram/ThirdParty/fcitx-qt5"]
|
||||
path = Telegram/ThirdParty/fcitx-qt5
|
||||
url = https://github.com/fcitx/fcitx-qt5.git
|
||||
[submodule "Telegram/ThirdParty/nimf"]
|
||||
path = Telegram/ThirdParty/nimf
|
||||
url = https://github.com/hamonikr/nimf.git
|
||||
@@ -103,3 +100,6 @@
|
||||
[submodule "Telegram/ThirdParty/wayland"]
|
||||
path = Telegram/ThirdParty/wayland
|
||||
url = https://github.com/gitlab-freedesktop-mirrors/wayland.git
|
||||
[submodule "Telegram/ThirdParty/libprisma"]
|
||||
path = Telegram/ThirdParty/libprisma
|
||||
url = https://github.com/desktop-app/libprisma.git
|
||||
|
||||
@@ -59,9 +59,9 @@ include(cmake/options.cmake)
|
||||
|
||||
if (NOT DESKTOP_APP_USE_PACKAGED)
|
||||
if (WIN32)
|
||||
set(qt_version 5.15.9)
|
||||
set(qt_version 5.15.10)
|
||||
elseif (APPLE)
|
||||
set(qt_version 6.3.2)
|
||||
set(qt_version 6.2.5)
|
||||
endif()
|
||||
endif()
|
||||
include(cmake/external/qt/package.cmake)
|
||||
|
||||
@@ -17,13 +17,18 @@ The latest version is available for
|
||||
|
||||
* [Windows 7 and above (64 bit)](https://telegram.org/dl/desktop/win64) ([portable](https://telegram.org/dl/desktop/win64_portable))
|
||||
* [Windows 7 and above (32 bit)](https://telegram.org/dl/desktop/win) ([portable](https://telegram.org/dl/desktop/win_portable))
|
||||
* [macOS 10.12 and above](https://telegram.org/dl/desktop/mac)
|
||||
* [macOS 10.13 and above](https://telegram.org/dl/desktop/mac)
|
||||
* [Linux static build for 64 bit](https://telegram.org/dl/desktop/linux)
|
||||
* [Snap](https://snapcraft.io/telegram-desktop)
|
||||
* [Flatpak](https://flathub.org/apps/details/org.telegram.desktop)
|
||||
|
||||
## Old system versions
|
||||
|
||||
Version **4.9.9** was the last that supports older systems
|
||||
|
||||
* [macOS 10.12](https://updates.tdesktop.com/tmac/tsetup.4.9.9.dmg)
|
||||
* [Linux with glibc < 2.28 static build](https://updates.tdesktop.com/tlinux/tsetup.4.9.9.tar.xz)
|
||||
|
||||
Version **2.4.4** was the last that supports older systems
|
||||
|
||||
* [OS X 10.10 and 10.11](https://updates.tdesktop.com/tosx/tsetup-osx.2.4.4.dmg)
|
||||
|
||||
@@ -28,6 +28,7 @@ include(cmake/lib_ffmpeg.cmake)
|
||||
include(cmake/lib_stripe.cmake)
|
||||
include(cmake/lib_tgvoip.cmake)
|
||||
include(cmake/lib_tgcalls.cmake)
|
||||
include(cmake/lib_prisma.cmake)
|
||||
include(cmake/td_export.cmake)
|
||||
include(cmake/td_mtproto.cmake)
|
||||
include(cmake/td_lang.cmake)
|
||||
@@ -151,6 +152,8 @@ PRIVATE
|
||||
api/api_sensitive_content.h
|
||||
api/api_single_message_search.cpp
|
||||
api/api_single_message_search.h
|
||||
api/api_statistics.cpp
|
||||
api/api_statistics.h
|
||||
api/api_text_entities.cpp
|
||||
api/api_text_entities.h
|
||||
api/api_toggling_media.cpp
|
||||
@@ -167,6 +170,8 @@ PRIVATE
|
||||
api/api_user_privacy.h
|
||||
api/api_views.cpp
|
||||
api/api_views.h
|
||||
api/api_websites.cpp
|
||||
api/api_websites.h
|
||||
api/api_who_reacted.cpp
|
||||
api/api_who_reacted.h
|
||||
boxes/filters/edit_filter_box.cpp
|
||||
@@ -193,6 +198,8 @@ PRIVATE
|
||||
boxes/peers/edit_participant_box.h
|
||||
boxes/peers/edit_participants_box.cpp
|
||||
boxes/peers/edit_participants_box.h
|
||||
boxes/peers/edit_peer_color_box.cpp
|
||||
boxes/peers/edit_peer_color_box.h
|
||||
boxes/peers/edit_peer_common.h
|
||||
boxes/peers/edit_peer_info_box.cpp
|
||||
boxes/peers/edit_peer_info_box.h
|
||||
@@ -411,6 +418,7 @@ PRIVATE
|
||||
core/crash_report_window.h
|
||||
core/crash_reports.cpp
|
||||
core/crash_reports.h
|
||||
core/deadlock_detector.h
|
||||
core/file_utilities.cpp
|
||||
core/file_utilities.h
|
||||
core/launcher.cpp
|
||||
@@ -447,6 +455,7 @@ PRIVATE
|
||||
data/data_audio_msg_id.h
|
||||
data/data_auto_download.cpp
|
||||
data/data_auto_download.h
|
||||
data/data_boosts.h
|
||||
data/data_bot_app.cpp
|
||||
data/data_bot_app.h
|
||||
data/data_chat.cpp
|
||||
@@ -549,6 +558,7 @@ PRIVATE
|
||||
data/data_sparse_ids.h
|
||||
data/data_sponsored_messages.cpp
|
||||
data/data_sponsored_messages.h
|
||||
data/data_statistics.h
|
||||
data/data_stories.cpp
|
||||
data/data_stories.h
|
||||
data/data_stories_ids.cpp
|
||||
@@ -643,6 +653,8 @@ PRIVATE
|
||||
history/view/controls/history_view_compose_controls.h
|
||||
history/view/controls/history_view_compose_search.cpp
|
||||
history/view/controls/history_view_compose_search.h
|
||||
history/view/controls/history_view_draft_options.cpp
|
||||
history/view/controls/history_view_draft_options.h
|
||||
history/view/controls/history_view_forward_panel.cpp
|
||||
history/view/controls/history_view_forward_panel.h
|
||||
history/view/controls/history_view_ttl_button.cpp
|
||||
@@ -651,6 +663,8 @@ PRIVATE
|
||||
history/view/controls/history_view_voice_record_bar.h
|
||||
history/view/controls/history_view_voice_record_button.cpp
|
||||
history/view/controls/history_view_voice_record_button.h
|
||||
history/view/controls/history_view_webpage_processor.cpp
|
||||
history/view/controls/history_view_webpage_processor.h
|
||||
history/view/media/history_view_call.cpp
|
||||
history/view/media/history_view_call.h
|
||||
history/view/media/history_view_contact.cpp
|
||||
@@ -669,6 +683,8 @@ PRIVATE
|
||||
history/view/media/history_view_game.h
|
||||
history/view/media/history_view_gif.cpp
|
||||
history/view/media/history_view_gif.h
|
||||
history/view/media/history_view_giveaway.cpp
|
||||
history/view/media/history_view_giveaway.h
|
||||
history/view/media/history_view_invoice.cpp
|
||||
history/view/media/history_view_invoice.h
|
||||
history/view/media/history_view_large_emoji.cpp
|
||||
@@ -808,20 +824,10 @@ PRIVATE
|
||||
history/history_view_highlight_manager.h
|
||||
history/history_widget.cpp
|
||||
history/history_widget.h
|
||||
info/info_content_widget.cpp
|
||||
info/info_content_widget.h
|
||||
info/info_controller.cpp
|
||||
info/info_controller.h
|
||||
info/info_layer_widget.cpp
|
||||
info/info_layer_widget.h
|
||||
info/info_memento.cpp
|
||||
info/info_memento.h
|
||||
info/info_section_widget.cpp
|
||||
info/info_section_widget.h
|
||||
info/info_top_bar.cpp
|
||||
info/info_top_bar.h
|
||||
info/info_wrap_widget.cpp
|
||||
info/info_wrap_widget.h
|
||||
info/boosts/info_boosts_inner_widget.cpp
|
||||
info/boosts/info_boosts_inner_widget.h
|
||||
info/boosts/info_boosts_widget.cpp
|
||||
info/boosts/info_boosts_widget.h
|
||||
info/common_groups/info_common_groups_inner_widget.cpp
|
||||
info/common_groups/info_common_groups_inner_widget.h
|
||||
info/common_groups/info_common_groups_widget.cpp
|
||||
@@ -877,6 +883,15 @@ PRIVATE
|
||||
info/profile/info_profile_widget.h
|
||||
info/settings/info_settings_widget.cpp
|
||||
info/settings/info_settings_widget.h
|
||||
info/statistics/info_statistics_common.h
|
||||
info/statistics/info_statistics_inner_widget.cpp
|
||||
info/statistics/info_statistics_inner_widget.h
|
||||
info/statistics/info_statistics_list_controllers.cpp
|
||||
info/statistics/info_statistics_list_controllers.h
|
||||
info/statistics/info_statistics_recent_message.cpp
|
||||
info/statistics/info_statistics_recent_message.h
|
||||
info/statistics/info_statistics_widget.cpp
|
||||
info/statistics/info_statistics_widget.h
|
||||
info/stories/info_stories_inner_widget.cpp
|
||||
info/stories/info_stories_inner_widget.h
|
||||
info/stories/info_stories_provider.cpp
|
||||
@@ -895,6 +910,20 @@ PRIVATE
|
||||
info/userpic/info_userpic_emoji_builder_preview.h
|
||||
info/userpic/info_userpic_emoji_builder_widget.cpp
|
||||
info/userpic/info_userpic_emoji_builder_widget.h
|
||||
info/info_content_widget.cpp
|
||||
info/info_content_widget.h
|
||||
info/info_controller.cpp
|
||||
info/info_controller.h
|
||||
info/info_layer_widget.cpp
|
||||
info/info_layer_widget.h
|
||||
info/info_memento.cpp
|
||||
info/info_memento.h
|
||||
info/info_section_widget.cpp
|
||||
info/info_section_widget.h
|
||||
info/info_top_bar.cpp
|
||||
info/info_top_bar.h
|
||||
info/info_wrap_widget.cpp
|
||||
info/info_wrap_widget.h
|
||||
inline_bots/bot_attach_web_view.cpp
|
||||
inline_bots/bot_attach_web_view.h
|
||||
inline_bots/inline_bot_layout_internal.cpp
|
||||
@@ -1259,6 +1288,8 @@ PRIVATE
|
||||
settings/settings_main.h
|
||||
settings/settings_notifications.cpp
|
||||
settings/settings_notifications.h
|
||||
settings/settings_notifications_type.cpp
|
||||
settings/settings_notifications_type.h
|
||||
settings/settings_power_saving.cpp
|
||||
settings/settings_power_saving.h
|
||||
settings/settings_premium.cpp
|
||||
@@ -1270,6 +1301,8 @@ PRIVATE
|
||||
settings/settings_scale_preview.cpp
|
||||
settings/settings_scale_preview.h
|
||||
settings/settings_type.h
|
||||
settings/settings_websites.cpp
|
||||
settings/settings_websites.h
|
||||
storage/details/storage_file_utilities.cpp
|
||||
storage/details/storage_file_utilities.h
|
||||
storage/details/storage_settings_scheme.cpp
|
||||
@@ -1468,6 +1501,7 @@ PRIVATE
|
||||
qrc/emoji_5.qrc
|
||||
qrc/emoji_6.qrc
|
||||
qrc/emoji_7.qrc
|
||||
qrc/emoji_8.qrc
|
||||
qrc/emoji_preview.qrc
|
||||
qrc/telegram/animations.qrc
|
||||
qrc/telegram/export.qrc
|
||||
@@ -1531,6 +1565,7 @@ elseif (APPLE)
|
||||
PRE_LINK
|
||||
COMMAND mkdir -p $<TARGET_FILE_DIR:Telegram>/../Resources
|
||||
COMMAND cp ${CMAKE_BINARY_DIR}/lib_ui.rcc $<TARGET_FILE_DIR:Telegram>/../Resources
|
||||
COMMAND cp ${CMAKE_BINARY_DIR}/lib_spellcheck.rcc $<TARGET_FILE_DIR:Telegram>/../Resources
|
||||
)
|
||||
if (NOT build_macstore)
|
||||
add_custom_command(TARGET Telegram
|
||||
|
||||
BIN
Telegram/Resources/animations/stats.tgs
Normal file
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.0 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 821 KiB After Width: | Height: | Size: 832 KiB |
BIN
Telegram/Resources/emoji/emoji_8.webp
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
Telegram/Resources/icons/chat/mini_copy.png
Normal file
|
After Width: | Height: | Size: 324 B |
BIN
Telegram/Resources/icons/chat/mini_copy@2x.png
Normal file
|
After Width: | Height: | Size: 484 B |
BIN
Telegram/Resources/icons/chat/mini_copy@3x.png
Normal file
|
After Width: | Height: | Size: 623 B |
BIN
Telegram/Resources/icons/chat/mini_quote.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
Telegram/Resources/icons/chat/mini_quote@2x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Telegram/Resources/icons/chat/mini_quote@3x.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
Telegram/Resources/icons/emoji/emoji_skin.png
Normal file
|
After Width: | Height: | Size: 412 B |
BIN
Telegram/Resources/icons/emoji/emoji_skin@2x.png
Normal file
|
After Width: | Height: | Size: 698 B |
BIN
Telegram/Resources/icons/emoji/emoji_skin@3x.png
Normal file
|
After Width: | Height: | Size: 952 B |
BIN
Telegram/Resources/icons/limits/boost.png
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
Telegram/Resources/icons/limits/boost@2x.png
Normal file
|
After Width: | Height: | Size: 796 B |
BIN
Telegram/Resources/icons/limits/boost@3x.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Telegram/Resources/icons/mediaview/views.png
Normal file
|
After Width: | Height: | Size: 476 B |
BIN
Telegram/Resources/icons/mediaview/views@2x.png
Normal file
|
After Width: | Height: | Size: 884 B |
BIN
Telegram/Resources/icons/mediaview/views@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Telegram/Resources/icons/menu/boosts.png
Normal file
|
After Width: | Height: | Size: 589 B |
BIN
Telegram/Resources/icons/menu/boosts@2x.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Telegram/Resources/icons/menu/boosts@3x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Telegram/Resources/icons/menu/ip_address.png
Normal file
|
After Width: | Height: | Size: 701 B |
BIN
Telegram/Resources/icons/menu/ip_address@2x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/menu/ip_address@3x.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
Telegram/Resources/icons/menu/link_above.png
Normal file
|
After Width: | Height: | Size: 450 B |
BIN
Telegram/Resources/icons/menu/link_above@2x.png
Normal file
|
After Width: | Height: | Size: 725 B |
BIN
Telegram/Resources/icons/menu/link_above@3x.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
Telegram/Resources/icons/menu/link_below.png
Normal file
|
After Width: | Height: | Size: 454 B |
BIN
Telegram/Resources/icons/menu/link_below@2x.png
Normal file
|
After Width: | Height: | Size: 761 B |
BIN
Telegram/Resources/icons/menu/link_below@3x.png
Normal file
|
After Width: | Height: | Size: 1017 B |
BIN
Telegram/Resources/icons/menu/link_enlarge.png
Normal file
|
After Width: | Height: | Size: 582 B |
BIN
Telegram/Resources/icons/menu/link_enlarge@2x.png
Normal file
|
After Width: | Height: | Size: 965 B |
BIN
Telegram/Resources/icons/menu/link_enlarge@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Telegram/Resources/icons/menu/link_shrink.png
Normal file
|
After Width: | Height: | Size: 542 B |
BIN
Telegram/Resources/icons/menu/link_shrink@2x.png
Normal file
|
After Width: | Height: | Size: 991 B |
BIN
Telegram/Resources/icons/menu/link_shrink@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Telegram/Resources/icons/menu/payment_address.png
Normal file
|
After Width: | Height: | Size: 584 B |
BIN
Telegram/Resources/icons/menu/payment_address@2x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/menu/payment_address@3x.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
Telegram/Resources/icons/menu/premium.png
Normal file
|
After Width: | Height: | Size: 687 B |
BIN
Telegram/Resources/icons/menu/premium@2x.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Telegram/Resources/icons/menu/premium@3x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
Telegram/Resources/icons/menu/stats.png
Normal file
|
After Width: | Height: | Size: 548 B |
BIN
Telegram/Resources/icons/menu/stats@2x.png
Normal file
|
After Width: | Height: | Size: 938 B |
BIN
Telegram/Resources/icons/menu/stats@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Telegram/Resources/icons/mini_forward.png
Normal file
|
After Width: | Height: | Size: 319 B |
BIN
Telegram/Resources/icons/mini_forward@2x.png
Normal file
|
After Width: | Height: | Size: 539 B |
BIN
Telegram/Resources/icons/mini_forward@3x.png
Normal file
|
After Width: | Height: | Size: 777 B |
BIN
Telegram/Resources/icons/mini_reply_story.png
Normal file
|
After Width: | Height: | Size: 588 B |
BIN
Telegram/Resources/icons/mini_reply_story@2x.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Telegram/Resources/icons/mini_reply_story@3x.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
Telegram/Resources/icons/stories/boost_mini.png
Normal file
|
After Width: | Height: | Size: 366 B |
BIN
Telegram/Resources/icons/stories/boost_mini@2x.png
Normal file
|
After Width: | Height: | Size: 589 B |
BIN
Telegram/Resources/icons/stories/boost_mini@3x.png
Normal file
|
After Width: | Height: | Size: 863 B |
@@ -129,6 +129,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_reconnecting#other" = "Reconnect in {count} s...";
|
||||
"lng_reconnecting_try_now" = "Try now";
|
||||
|
||||
"lng_code_block_header_copy" = "copy";
|
||||
|
||||
"lng_status_service_notifications" = "service notifications";
|
||||
"lng_status_support" = "support";
|
||||
"lng_status_bot" = "bot";
|
||||
@@ -402,6 +404,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_dlg_search_from" = "From: {user}";
|
||||
|
||||
"lng_settings_save" = "Save";
|
||||
"lng_settings_apply" = "Apply";
|
||||
|
||||
"lng_username_title" = "Username";
|
||||
"lng_username_description1" = "You can choose a username on Telegram. If you do, other people will be able to find you by this username and contact you without knowing your phone number.";
|
||||
@@ -451,6 +454,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_show_from" = "Show notifications from";
|
||||
"lng_settings_notify_all" = "All accounts";
|
||||
"lng_settings_notify_all_about" = "Turn this off if you want to receive notifications only from the account you are currently using.";
|
||||
"lng_settings_notify_global" = "Global settings";
|
||||
"lng_settings_notify_title" = "Notifications for chats";
|
||||
"lng_settings_desktop_notify" = "Desktop notifications";
|
||||
"lng_settings_native_title" = "Native notifications";
|
||||
@@ -458,8 +462,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_use_native_notifications" = "Use native notifications";
|
||||
"lng_settings_notifications_position" = "Location on the screen";
|
||||
"lng_settings_notifications_count" = "Notifications count";
|
||||
"lng_settings_sound_notify" = "Play sound";
|
||||
"lng_settings_sound_notify_off" = "Off";
|
||||
"lng_settings_sound_allowed" = "Allow sound";
|
||||
"lng_settings_alert_windows" = "Flash the taskbar icon";
|
||||
"lng_settings_alert_mac" = "Bounce the dock icon";
|
||||
"lng_settings_alert_linux" = "Draw attention to the window";
|
||||
@@ -480,6 +483,36 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_notification_hide_all" = "Hide all";
|
||||
"lng_notification_sample" = "This is a sample notification";
|
||||
"lng_notification_reminder" = "Reminder";
|
||||
"lng_notification_private_chats" = "Private chats";
|
||||
"lng_notification_groups" = "Groups";
|
||||
"lng_notification_channels" = "Channels";
|
||||
"lng_notification_click_to_change" = "Click here to change";
|
||||
"lng_notification_on" = "On, {exceptions}";
|
||||
"lng_notification_off" = "Off, {exceptions}";
|
||||
"lng_notification_exceptions#one" = "{count} exception";
|
||||
"lng_notification_exceptions#other" = "{count} exceptions";
|
||||
"lng_notification_exceptions_title" = "Exceptions";
|
||||
"lng_notification_title_private_chats" = "Notifications for private chats";
|
||||
"lng_notification_about_private_chats#one" = "Please note that **{count} chat** is listed as an exception and won't be affected by this change.";
|
||||
"lng_notification_about_private_chats#other" = "Please note that **{count} chats** are listed as exceptions and won't be affected by this change.";
|
||||
"lng_notification_title_groups" = "Notifications for groups";
|
||||
"lng_notification_about_groups#one" = "Please note that **{count} group** is listed as an exception and won't be affected by this change.";
|
||||
"lng_notification_about_groups#other" = "Please note that **{count} groups** are listed as exceptions and won't be affected by this change.";
|
||||
"lng_notification_title_channels" = "Notifications for channels";
|
||||
"lng_notification_about_channels#one" = "Please note that **{count} channel** is listed as an exception and won't be affected by this change.";
|
||||
"lng_notification_about_channels#other" = "Please note that **{count} channels** are listed as exceptions and won't be affected by this change.";
|
||||
"lng_notification_exceptions_view" = "View exceptions";
|
||||
"lng_notification_enable" = "Enable notifications";
|
||||
"lng_notification_sound" = "Sound";
|
||||
"lng_notification_tone" = "Notification tone";
|
||||
"lng_notification_exceptions_muted" = "Muted";
|
||||
"lng_notification_exceptions_unmuted" = "Unmuted";
|
||||
"lng_notification_exceptions_add" = "Add an exception";
|
||||
"lng_notification_exceptions_clear" = "Delete all exceptions";
|
||||
"lng_notification_exceptions_clear_sure" = "Are you sure you want to delete all exceptions?";
|
||||
"lng_notification_exceptions_clear_button" = "Delete";
|
||||
"lng_notification_exceptions_remove" = "Remove";
|
||||
"lng_notification_context_remove" = "Remove exception";
|
||||
|
||||
"lng_reaction_text" = "{reaction} to your «{text}»";
|
||||
"lng_reaction_notext" = "{reaction} to your message";
|
||||
@@ -513,11 +546,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_workmode_tray" = "Show tray icon";
|
||||
"lng_settings_workmode_window" = "Show taskbar icon";
|
||||
"lng_settings_close_to_taskbar" = "Close to taskbar";
|
||||
"lng_settings_monochrome_icon" = "Use monochrome icon";
|
||||
"lng_settings_window_system" = "Window title";
|
||||
"lng_settings_title_chat_name" = "Show chat name";
|
||||
"lng_settings_title_account_name" = "Show active account";
|
||||
"lng_settings_title_total_count" = "Total unread count";
|
||||
"lng_settings_native_frame" = "Use system window frame";
|
||||
"lng_settings_qt_frame" = "Use Qt window frame";
|
||||
"lng_settings_auto_start" = "Launch Telegram when system starts";
|
||||
"lng_settings_start_min" = "Launch minimized";
|
||||
"lng_settings_auto_start_disabled_uwp" = "Starting with the system was disabled in Windows Settings.\n\nPlease enable Telegram Desktop in the Startup Apps Settings.";
|
||||
@@ -646,13 +681,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_sensitive_about" = "Display sensitive media in public channels on all your Telegram devices.";
|
||||
"lng_settings_security_bots" = "Bots and websites";
|
||||
"lng_settings_clear_payment_info" = "Clear Payment and Shipping Info";
|
||||
"lng_settings_logged_in" = "Logged In with Telegram";
|
||||
"lng_settings_logged_in_about" = "Websites where you've used Telegram to log in.";
|
||||
"lng_settings_logged_in_title" = "Logged In with Telegram";
|
||||
"lng_settings_logged_in" = "Connected websites";
|
||||
"lng_settings_logged_in_title" = "Logged in with Telegram";
|
||||
"lng_settings_logged_in_description" = "You can log in on websites that support signing in with Telegram.";
|
||||
"lng_settings_disconnect_all" = "Disconnect All Websites";
|
||||
"lng_settings_disconnect_all" = "Disconnect all websites";
|
||||
"lng_settings_disconnect_title" = "Disconnect website";
|
||||
"lng_settings_disconnect_sure" = "Are you sure you want to disconnect {domain}?";
|
||||
"lng_settings_disconnect_block" = "Block {name}";
|
||||
"lng_settings_disconnect_all_title" = "Disconnect websites";
|
||||
"lng_settings_disconnect_all_sure" = "Are you sure you want to disconnect all websites where you logged in with Telegram?";
|
||||
"lng_settings_disconnect" = "Disconnect";
|
||||
"lng_settings_connected_title" = "Connected websites";
|
||||
"lng_settings_connected_about" = "Click to disconnect from your Telegram account.";
|
||||
|
||||
"lng_settings_power_menu" = "Battery and Animations";
|
||||
"lng_settings_power_title" = "Power Usage";
|
||||
@@ -735,11 +774,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_clear_payment_info_clear" = "Clear";
|
||||
"lng_clear_payment_info_confirm" = "Delete your shipping info and instruct all payment providers to remove your saved credit cards? Note that Telegram never stores your credit card data.";
|
||||
|
||||
"lng_settings_theme_settings" = "Theme settings";
|
||||
"lng_settings_theme_name_color" = "Your name color";
|
||||
"lng_settings_auto_night_mode" = "Auto-Night mode";
|
||||
"lng_settings_auto_night_enabled" = "Match the system settings";
|
||||
"lng_settings_auto_night_mode_off" = "Off";
|
||||
"lng_settings_auto_night_mode_on" = "System";
|
||||
"lng_settings_auto_night_warning" = "You have enabled auto-night mode. If you want to change the dark mode settings, you'll need to disable it first.";
|
||||
"lng_settings_auto_night_disable" = "Disable";
|
||||
|
||||
"lng_settings_color_title" = "Color preview";
|
||||
"lng_settings_color_reply" = "Reply to your message";
|
||||
"lng_settings_color_reply_channel" = "Reply to your channel message";
|
||||
"lng_settings_color_text" = "Your name and replies to your messages will be shown in the selected color.";
|
||||
"lng_settings_color_text_channel" = "The name of the channel and replies to its messages will be shown in the selected color.";
|
||||
"lng_settings_color_link_name" = "Telegram";
|
||||
"lng_settings_color_link_title" = "Link Preview";
|
||||
"lng_settings_color_link_description" = "Your selected color will also tint the link preview.";
|
||||
"lng_settings_color_about" = "You can choose a color to tint your name, the links you send, and replies to your messages.";
|
||||
"lng_settings_color_about_channel" = "You can choose a color to tint your channel's name, the links it sends, and replies to its messages.";
|
||||
"lng_settings_color_emoji" = "Add icons to replies";
|
||||
"lng_settings_color_emoji_remove" = "Remove icon";
|
||||
"lng_settings_color_emoji_off" = "Off";
|
||||
"lng_settings_color_emoji_about" = "Make replies to your messages stand out by adding custom patterns to them.";
|
||||
"lng_settings_color_emoji_about_channel" = "Make replies to your channel's messages stand out by adding custom patterns to them.";
|
||||
"lng_settings_color_subscribe" = "Subscribe to {link} to choose a custom color for your name.";
|
||||
"lng_settings_color_changed" = "Your name color has been updated!";
|
||||
"lng_settings_color_changed_channel" = "Your channel color has been updated!";
|
||||
|
||||
"lng_suggest_hide_new_title" = "Hide new chats?";
|
||||
"lng_suggest_hide_new_about" = "You are receiving lots of new chats from users who are not in your Contact List.\n\nDo you want to have such chats **automatically muted** and **archived**?";
|
||||
"lng_suggest_hide_new_to_settings" = "Go to Settings";
|
||||
@@ -767,7 +828,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_background_text1" = "Ah, you kids today with techno music! You should enjoy the classics, like Hasselhoff!";
|
||||
"lng_background_text2" = "I can't even take you seriously right now.";
|
||||
"lng_background_bad_link" = "This background link appears to be invalid.";
|
||||
"lng_background_apply" = "Apply";
|
||||
"lng_background_share" = "Share";
|
||||
"lng_background_link_copied" = "Link copied to clipboard";
|
||||
"lng_background_blur" = "Blurred";
|
||||
@@ -962,6 +1022,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_sessions_terminate" = "Terminate Session";
|
||||
"lng_sessions_application" = "Application";
|
||||
"lng_sessions_system" = "System version";
|
||||
"lng_sessions_browser" = "Browser";
|
||||
"lng_sessions_ip" = "IP address";
|
||||
"lng_sessions_location" = "Location";
|
||||
"lng_sessions_location_about" = "This location is based only on the IP address and may not always be accurate.";
|
||||
@@ -1106,6 +1167,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_mute_box_title" = "Mute notifications for...";
|
||||
|
||||
"lng_preview_loading" = "Getting Link Info...";
|
||||
"lng_preview_cant" = "Could not generate preview for this link.";
|
||||
|
||||
"lng_profile_settings_section" = "Settings";
|
||||
"lng_profile_bot_settings" = "Bot Settings";
|
||||
@@ -1147,6 +1209,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_profile_loading" = "Loading...";
|
||||
"lng_profile_saved_stories#one" = "{count} saved story";
|
||||
"lng_profile_saved_stories#other" = "{count} saved stories";
|
||||
"lng_profile_posts#one" = "{count} post";
|
||||
"lng_profile_posts#other" = "{count} posts";
|
||||
"lng_profile_photos#one" = "{count} photo";
|
||||
"lng_profile_photos#other" = "{count} photos";
|
||||
"lng_profile_gifs#one" = "{count} GIF";
|
||||
@@ -1576,6 +1640,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_action_suggested_video" = "{user} suggests you to use this profile video.";
|
||||
"lng_action_suggested_video_button" = "View Video";
|
||||
"lng_action_attach_menu_bot_allowed" = "You allowed this bot to message you when you added it in the attachment menu.";
|
||||
"lng_action_webapp_bot_allowed" = "You allowed this bot to message you in his web-app.";
|
||||
"lng_action_set_wallpaper_me" = "You set a new wallpaper for this chat";
|
||||
"lng_action_set_wallpaper" = "{user} set a new wallpaper for this chat";
|
||||
"lng_action_set_wallpaper_button" = "View Wallpaper";
|
||||
@@ -1601,6 +1666,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_action_story_mention_button" = "View Story";
|
||||
"lng_action_story_mention_me_unavailable" = "The story where you mentioned {user} is no longer available.";
|
||||
"lng_action_story_mention_unavailable" = "The story where {user} mentioned you is no longer available.";
|
||||
"lng_action_giveaway_started" = "{from} just started a giveaway of Telegram Premium subscriptions to its followers.";
|
||||
|
||||
"lng_premium_gift_duration_months#one" = "for {count} month";
|
||||
"lng_premium_gift_duration_months#other" = "for {count} months";
|
||||
@@ -1764,6 +1830,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_bot_share_location_unavailable" = "Sorry, location sharing is currently unavailable in Telegram Desktop.";
|
||||
"lng_bot_share_phone" = "Do you want to share your phone number with this bot?";
|
||||
"lng_bot_share_phone_confirm" = "Share";
|
||||
"lng_bot_allow_write_title" = "Allow messaging";
|
||||
"lng_bot_allow_write" = "Do you want to allow this bot writing you?";
|
||||
"lng_bot_allow_write_confirm" = "Allow";
|
||||
|
||||
"lng_attach_failed" = "Failed";
|
||||
"lng_attach_file" = "File";
|
||||
@@ -1807,6 +1876,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_emoji_set_active" = "Current set";
|
||||
"lng_emoji_set_download" = "Download {size}";
|
||||
"lng_emoji_set_loading" = "{percent}, {progress}";
|
||||
"lng_emoji_color_all" = "Choose color for all emoji";
|
||||
"lng_emoji_copy" = "Copy emoji";
|
||||
"lng_emoji_view_pack" = "View pack";
|
||||
"lng_emoji_remove_recent" = "Remove from recents";
|
||||
"lng_emoji_reset_recent" = "Reset recents";
|
||||
"lng_emoji_reset_recent_sure" = "Do you want to reset recent emoji?";
|
||||
"lng_emoji_reset_recent_button" = "Reset";
|
||||
|
||||
"lng_recent_stickers" = "Frequently used";
|
||||
"lng_faved_stickers_add" = "Add to Favorites";
|
||||
@@ -1953,6 +2029,161 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_premium_gift_terms" = "You can review the list of features and terms of use for Telegram Premium {link}.";
|
||||
"lng_premium_gift_terms_link" = "here";
|
||||
|
||||
"lng_boost_channel_button" = "Boost Channel";
|
||||
"lng_boost_level#one" = "Level {count}";
|
||||
"lng_boost_level#other" = "Level {count}";
|
||||
"lng_boost_channel_title_first" = "Enable stories for channel";
|
||||
"lng_boost_channel_needs_first#one" = "{channel} needs **{count}** more boost to enable posting stories. Help make it possible!";
|
||||
"lng_boost_channel_needs_first#other" = "{channel} needs **{count}** more boosts to enable posting stories. Help make it possible!";
|
||||
"lng_boost_channel_title_more" = "Help upgrade channel";
|
||||
"lng_boost_channel_needs_more#one" = "{channel} needs **{count}** more boost to be able to {post}.";
|
||||
"lng_boost_channel_needs_more#other" = "{channel} needs **{count}** more boosts to be able to {post}.";
|
||||
"lng_boost_channel_title_max" = "Maximum level reached";
|
||||
"lng_boost_channel_you_title" = "You boosted {channel}!";
|
||||
"lng_boost_channel_you_first#one" = "This channel needs **{count}** more boost\nto enable stories.";
|
||||
"lng_boost_channel_you_first#other" = "This channel needs **{count}** more boosts\nto enable stories.";
|
||||
"lng_boost_channel_you_more#one" = "This channel needs **{count}** more boost\nto be able to {post}.";
|
||||
"lng_boost_channel_you_more#other" = "This channel needs **{count}** more boosts\nto be able to {post}.";
|
||||
"lng_boost_channel_reached_first" = "This channel reached **Level 1** and can now post stories.";
|
||||
"lng_boost_channel_reached_more#one" = "This channel reached **Level {count}** and can now {post}.";
|
||||
"lng_boost_channel_reached_more#other" = "This channel reached **Level {count}** and can now {post}.";
|
||||
"lng_boost_channel_post_stories#one" = "post **{count} story** per day";
|
||||
"lng_boost_channel_post_stories#other" = "post **{count} stories** per day";
|
||||
"lng_boost_error_gifted_title" = "Can't boost with gifted Premium!";
|
||||
"lng_boost_error_gifted_text" = "Because your **Telegram Premium** subscription was gifted to you, you can't use it to boost channels.";
|
||||
"lng_boost_error_already_title" = "Already Boosted!";
|
||||
"lng_boost_error_already_text" = "You are already boosting this channel.";
|
||||
"lng_boost_error_premium_title" = "Premium needed!";
|
||||
"lng_boost_error_premium_text" = "Only **Telegram Premium** subscribers can boost channels. Do you want to subscribe to **Telegram Premium**?";
|
||||
"lng_boost_error_premium_yes" = "Yes";
|
||||
"lng_boost_error_flood_title" = "Can't boost too often!";
|
||||
"lng_boost_error_flood_text" = "You can change the channel you boost only once a day. Next time you can boost is in {left}.";
|
||||
"lng_boost_now_instead" = "You currently boost {channel}. Do you want to boost {other} instead?";
|
||||
"lng_boost_now_replace" = "Replace";
|
||||
|
||||
"lng_boost_channel_title_color" = "Enable colors";
|
||||
"lng_boost_channel_needs_level_color#one" = "Your channel needs to reach **Level {count}** to change channel color.";
|
||||
"lng_boost_channel_needs_level_color#other" = "Your channel needs to reach **Level {count}** to change channel color.";
|
||||
"lng_boost_channel_ask" = "Ask your **Premium** subscribers to boost your channel with this link:";
|
||||
"lng_boost_channel_ask_button" = "Copy Link";
|
||||
"lng_boost_channel_or" = "or";
|
||||
"lng_boost_channel_gifting" = "Boost your channel by gifting your subscribers Telegram Premium. {link}";
|
||||
"lng_boost_channel_gifting_link" = "Get boosts >";
|
||||
|
||||
"lng_giveaway_new_title" = "Boosts via Gifts";
|
||||
"lng_giveaway_new_about" = "Get more boosts for your channel by gifting Premium to your subscribers.";
|
||||
"lng_giveaway_create_option" = "Create Giveaway";
|
||||
"lng_giveaway_create_subtitle" = "winners are chosen randomly";
|
||||
"lng_giveaway_award_option" = "Award Specific Users";
|
||||
"lng_giveaway_award_subtitle" = "Select recipients >";
|
||||
"lng_giveaway_award_chosen#one" = "{count} recipient >";
|
||||
"lng_giveaway_award_chosen#other" = "{count} recipients >";
|
||||
"lng_giveaway_quantity_title" = "Quantity of prizes / boosts";
|
||||
"lng_giveaway_quantity#one" = "{count} Subscription / Boost";
|
||||
"lng_giveaway_quantity#other" = "{count} Subscriptions / Boosts";
|
||||
"lng_giveaway_quantity_about" = "Choose how many Premium subscriptions to give away and boosts to receive.";
|
||||
"lng_giveaway_channels_title" = "Channels included in the giveaway";
|
||||
"lng_giveaway_channels_this#one" = "this channel will receive {count} boost";
|
||||
"lng_giveaway_channels_this#other" = "this channel will receive {count} boosts";
|
||||
"lng_giveaway_channels_add" = "Add Channel";
|
||||
"lng_giveaway_channels_about" = "Choose the channels the users need to join to take part in the giveaway.";
|
||||
"lng_giveaway_users_title" = "Users eligible for the giveaway";
|
||||
"lng_giveaway_users_all" = "All subscribers";
|
||||
"lng_giveaway_users_new" = "Only new subscribers";
|
||||
"lng_giveaway_users_about" = "Choose if you want to limit the giveaway only to the newly joined subscribers.";
|
||||
"lng_giveaway_start" = "Start Giveaway";
|
||||
"lng_giveaway_award" = "Gift Premium";
|
||||
"lng_giveaway_date_title" = "Date when giveaway ends";
|
||||
"lng_giveaway_date" = "Date and Time";
|
||||
"lng_giveaway_date_about#one" = "Choose when {count} subscriber of your channel will be randomly selected to receive Telegram Premium.";
|
||||
"lng_giveaway_date_about#other" = "Choose when {count} subscribers of your channel will be randomly selected to receive Telegram Premium.";
|
||||
"lng_giveaway_duration_title#one" = "Duration of Premium subscription";
|
||||
"lng_giveaway_duration_title#other" = "Duration of Premium subscriptions";
|
||||
"lng_giveaway_duration_price" = "{price} x {amount}";
|
||||
"lng_giveaway_duration_about" = "You can review the list of features and terms of use for Telegram Premium {link}.";
|
||||
"lng_giveaway_duration_about_link" = "here";
|
||||
"lng_giveaway_date_select" = "Select Date and Time";
|
||||
"lng_giveaway_date_confirm" = "Confirm";
|
||||
"lng_giveaway_channels_select#one" = "Select up to {count} channel";
|
||||
"lng_giveaway_channels_select#other" = "Select up to {count} channels";
|
||||
"lng_giveaway_recipients_save" = "Save Recipients";
|
||||
"lng_giveaway_recipients_deselect" = "Deselect All";
|
||||
|
||||
"lng_prize_title" = "Congratulations!";
|
||||
"lng_prize_about" = "You won a prize in a giveaway organized by {channel}.";
|
||||
"lng_prize_duration" = "Your prize is a **Telegram Premium** subscription {duration}.";
|
||||
"lng_prize_gift_about" = "You've received a gift from {channel}.";
|
||||
"lng_prize_gift_duration" = "Your gift is a **Telegram Premium** subscription {duration}.";
|
||||
"lng_prize_open" = "Open Gift Link";
|
||||
"lng_prize_unclaimed_title" = "Unclaimed Prize";
|
||||
"lng_prize_unclaimed_about" = "You have an unclaimed prize from a giveaway by {channel}.";
|
||||
"lng_prize_unclaimed_duration" = "This prize is a **Telegram Premium** subscription {duration}.";
|
||||
|
||||
"lng_prizes_title#one" = "Giveaway Prize";
|
||||
"lng_prizes_title#other" = "Giveaway Prizes";
|
||||
"lng_prizes_about#one" = "**{count}** Telegram Premium Subscription {duration}.";
|
||||
"lng_prizes_about#other" = "**{count}** Telegram Premium Subscriptions {duration}.";
|
||||
"lng_prizes_participants" = "Participants";
|
||||
"lng_prizes_participants_all#one" = "All subscribers of the channel:";
|
||||
"lng_prizes_participants_all#other" = "All subscribers of the channels:";
|
||||
"lng_prizes_participants_new#one" = "All users who joined the channel below after this date:";
|
||||
"lng_prizes_participants_new#other" = "All users who joined the channels below after this date:";
|
||||
"lng_prizes_countries" = "from {countries}";
|
||||
"lng_prizes_countries_and_one" = "{countries}, {country}";
|
||||
"lng_prizes_countries_and_last" = "{countries} and {country}";
|
||||
"lng_prizes_date" = "Winners Selection Date";
|
||||
"lng_prizes_how_works" = "Learn more";
|
||||
"lng_prizes_how_title" = "About this giveaway";
|
||||
"lng_prizes_end_title" = "Giveaway ended";
|
||||
"lng_prizes_how_text" = "This giveaway is sponsored by {admins}.";
|
||||
"lng_prizes_end_text" = "This giveaway was sponsored by {admins}.";
|
||||
"lng_prizes_admins#one" = "the admins of {channel}, who aquired **{count} Telegram Premium** subscription {duration} for its followers";
|
||||
"lng_prizes_admins#other" = "the admins of {channel}, who aquired **{count} Telegram Premium** subscriptions {duration} for its followers.";
|
||||
"lng_prizes_how_when_finish" = "On {date}, Telegram will automatically select {winners}.";
|
||||
"lng_prizes_end_when_finish" = "On {date}, Telegram automatically selected {winners}.";
|
||||
"lng_prizes_end_activated#one" = "**{count}** of the winners already used their gift link.";
|
||||
"lng_prizes_end_activated#other" = "**{count}** of the winners already used their gift links.";
|
||||
"lng_prizes_winners_all_of_one#one" = "{count} random subscribers of {channel}.";
|
||||
"lng_prizes_winners_all_of_one#other" = "{count} random subscribers of {channel}.";
|
||||
"lng_prizes_winners_all_of_many#one" = "{count} random subscribers of {channel} and other listed channels.";
|
||||
"lng_prizes_winners_all_of_many#other" = "{count} random subscribers of {channel} and other listed channels.";
|
||||
"lng_prizes_winners_new_of_one#one" = "{count} random user that joined {channel} after {start_date}";
|
||||
"lng_prizes_winners_new_of_one#other" = "{count} random users that joined {channel} after {start_date}";
|
||||
"lng_prizes_winners_new_of_many#one" = "{count} random user that joined {channel} and other listed channels after {start_date}";
|
||||
"lng_prizes_winners_new_of_many#other" = "{count} random users that joined {channel} and other listed channels after {start_date}";
|
||||
"lng_prizes_how_participate_one" = "To take part in this giveaway please join channel {channel} before {date}.";
|
||||
"lng_prizes_how_participate_many" = "To take part in this giveaway please join channel {channel} and other listed channels before {date}.";
|
||||
"lng_prizes_how_no_admin" = "You are not eligible to participate in this giveaway, because you are an admin of participating channel ({channel}).";
|
||||
"lng_prizes_how_no_joined" = "You are not eligible to participate in this giveaway, because you joined this channel on {date}, which is before the contest started.";
|
||||
"lng_prizes_how_no_country" = "You are not eligible to participate in this giveaway, because your country is not included in the terms of the giveaway.";
|
||||
"lng_prizes_how_yes_joined_one" = "You are participating in this giveaway, because you have joined channel {channel}.";
|
||||
"lng_prizes_how_yes_joined_many" = "You are participating in this giveaway, because you have joined channel {channel} (and other listed channels).";
|
||||
"lng_prizes_you_won" = "You won a prize in this giveaway {cup}";
|
||||
"lng_prizes_view_prize" = "View my prize";
|
||||
"lng_prizes_you_didnt" = "You didn't win a prize in this giveaway.";
|
||||
"lng_prizes_cancelled" = "The channel cancelled the prizes by reversing the payment for them.";
|
||||
"lng_prizes_badge" = "x{amount}";
|
||||
|
||||
"lng_gift_link_title" = "Gift Link";
|
||||
"lng_gift_link_about" = "This link allows you to activate\na **Telegram Premium** subscription.";
|
||||
"lng_gift_link_label_from" = "From";
|
||||
"lng_gift_link_label_to" = "To";
|
||||
"lng_gift_link_label_to_unclaimed" = "No recipient";
|
||||
"lng_gift_link_label_gift" = "Gift";
|
||||
"lng_gift_link_gift_premium" = "Telegram Premium {duration}";
|
||||
"lng_gift_link_label_reason" = "Reason";
|
||||
"lng_gift_link_reason_giveaway" = "Giveaway";
|
||||
"lng_gift_link_reason_unclaimed" = "Incomplete Giveaway";
|
||||
"lng_gift_link_reason_chosen" = "You were selected by the channel";
|
||||
"lng_gift_link_label_date" = "Date";
|
||||
"lng_gift_link_also_send" = "You can also {link} to a friend as a gift.";
|
||||
"lng_gift_link_also_send_link" = "send this link";
|
||||
"lng_gift_link_use" = "Use Link";
|
||||
"lng_gift_link_used_title" = "Used Gift Link";
|
||||
"lng_gift_link_used_about" = "This link was used to activate\na **Telegram Premium** subscription.";
|
||||
"lng_gift_link_used_footer" = "This link was used on {date}.";
|
||||
"lng_gift_link_expired" = "Gift code link expired";
|
||||
|
||||
"lng_accounts_limit_title" = "Limit Reached";
|
||||
"lng_accounts_limit1#one" = "You have reached the limit of **{count}** connected accounts.";
|
||||
"lng_accounts_limit1#other" = "You have reached the limit of **{count}** connected accounts.";
|
||||
@@ -2132,6 +2363,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_saved_messages" = "Saved Messages";
|
||||
"lng_saved_short" = "Save";
|
||||
"lng_saved_forward_here" = "Forward messages here for quick access";
|
||||
"lng_saved_quote_here" = "Quote here to save";
|
||||
|
||||
"lng_scheduled_messages" = "Scheduled Messages";
|
||||
"lng_scheduled_messages_empty" = "No scheduled messages here yet...";
|
||||
@@ -2214,17 +2446,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_bot_remove_from_menu" = "Remove From Menu";
|
||||
"lng_bot_remove_from_menu_sure" = "Remove {bot} from the attachment menu?";
|
||||
"lng_bot_remove_from_menu_done" = "Bot removed from the menu.";
|
||||
"lng_bot_remove_from_side_menu" = "Remove From Menu";
|
||||
"lng_bot_remove_from_side_menu_sure" = "Remove {bot} from the main menu?";
|
||||
"lng_bot_remove_from_side_menu_done" = "Bot removed from the main menu.";
|
||||
"lng_bot_settings" = "Settings";
|
||||
"lng_bot_open" = "Open Bot";
|
||||
"lng_bot_reload_page" = "Reload Page";
|
||||
"lng_bot_add_to_menu" = "{bot} asks your permission to be added as an option to your attachments menu so you can access it from any chat.";
|
||||
"lng_bot_add_to_menu_done" = "Bot added to the menu.";
|
||||
"lng_bot_will_be_added" = "{bot} shortcuts will be added to the attachment options and the main menu.";
|
||||
"lng_bot_side_menu_new" = "NEW";
|
||||
"lng_bot_menu_not_supported" = "This bot isn't supported in the attach menu.";
|
||||
"lng_bot_menu_already_added" = "This bot is already added in your attach menu.";
|
||||
"lng_bot_menu_button" = "Menu";
|
||||
"lng_bot_close_warning_title" = "Warning";
|
||||
"lng_bot_close_warning" = "Changes that you made may not be saved.";
|
||||
"lng_bot_close_warning_sure" = "Close anyway";
|
||||
"lng_bot_add_to_side_menu" = "{bot} asks your permission to be added as an option to your main menu so you can access it any time.";
|
||||
"lng_bot_add_to_side_menu_done" = "Bot added to the main menu.";
|
||||
|
||||
"lng_typing" = "typing";
|
||||
"lng_user_typing" = "{user} is typing";
|
||||
@@ -2328,9 +2567,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_context_open_gif" = "Open GIF";
|
||||
"lng_context_save_gif" = "Save GIF";
|
||||
"lng_context_delete_gif" = "Delete GIF";
|
||||
"lng_context_open_channel" = "Open Channel";
|
||||
"lng_context_attached_stickers" = "Attached Stickers";
|
||||
"lng_context_to_msg" = "Go To Message";
|
||||
"lng_context_reply_msg" = "Reply";
|
||||
"lng_context_quote_and_reply" = "Quote & Reply";
|
||||
"lng_context_edit_msg" = "Edit";
|
||||
"lng_context_forward_msg" = "Forward Message";
|
||||
"lng_context_send_now_msg" = "Send now";
|
||||
@@ -2435,6 +2676,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_inline_switch_choose" = "Choose conversation...";
|
||||
"lng_inline_switch_cant" = "Sorry, no way to write here :(";
|
||||
|
||||
"lng_reply_in_another_title" = "Reply in...";
|
||||
"lng_reply_in_another_chat" = "Reply in Another Chat";
|
||||
"lng_reply_show_in_chat" = "Show in Chat";
|
||||
"lng_reply_remove" = "Do Not Reply";
|
||||
"lng_reply_about_quote" = "You can select specific part to quote.";
|
||||
"lng_reply_options_header" = "Reply to Message";
|
||||
"lng_reply_options_quote" = "Update Quote";
|
||||
"lng_reply_header_short" = "Reply";
|
||||
"lng_reply_quote_selected" = "Quote Selected";
|
||||
"lng_reply_from_private_chat" = "This reply is from a private chat.";
|
||||
"lng_link_options_header" = "Link Preview Settings";
|
||||
"lng_link_header_short" = "Link";
|
||||
"lng_link_move_up" = "Move Up";
|
||||
"lng_link_move_down" = "Move Down";
|
||||
"lng_link_shrink_photo" = "Shrink Photo";
|
||||
"lng_link_enlarge_photo" = "Enlarge Photo";
|
||||
"lng_link_remove" = "Do Not Preview";
|
||||
"lng_link_about_choose" = "Click on a link to generate its preview.";
|
||||
|
||||
"lng_share_cant" = "Sorry, no way to share here :(";
|
||||
"lng_reply_cant" = "Sorry, no way to reply to an old message in supergroup :(";
|
||||
"lng_reply_cant_forward" = "Sorry, you can't reply to a message that was sent before the group was upgraded to a supergroup. Do you wish to forward it and add your comment?";
|
||||
@@ -2457,6 +2717,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_edit_bot_title" = "Edit bot";
|
||||
"lng_edit_sign_messages" = "Sign messages";
|
||||
"lng_edit_group" = "Edit group";
|
||||
"lng_edit_channel_color" = "Change name color";
|
||||
"lng_edit_self_title" = "Edit your name";
|
||||
"lng_confirm_contact_data" = "New Contact";
|
||||
"lng_add_contact" = "Create";
|
||||
@@ -2585,6 +2846,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_menu_formatting_italic" = "Italic";
|
||||
"lng_menu_formatting_underline" = "Underline";
|
||||
"lng_menu_formatting_strike_out" = "Strike-through";
|
||||
"lng_menu_formatting_blockquote" = "Quote";
|
||||
"lng_menu_formatting_monospace" = "Monospace";
|
||||
"lng_menu_formatting_spoiler" = "Spoiler";
|
||||
"lng_menu_formatting_link_create" = "Create link";
|
||||
@@ -2597,6 +2859,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_formatting_link_create" = "Create";
|
||||
|
||||
"lng_text_copied" = "Text copied to clipboard.";
|
||||
"lng_code_copied" = "Block copied to clipboard.";
|
||||
|
||||
"lng_spellchecker_submenu" = "Spelling";
|
||||
"lng_spellchecker_add" = "Add to Dictionary";
|
||||
@@ -2705,6 +2968,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
"lng_payments_terms_title" = "Terms of Service";
|
||||
"lng_payments_terms_text" = "Subscribe and accept terms of service of {bot}?";
|
||||
"lng_payments_terms_text_once" = "Are you accepting terms of service of {bot}?";
|
||||
"lng_payments_terms_agree" = "I agree to {link}";
|
||||
"lng_payments_terms_link" = "Terms of Service";
|
||||
"lng_payments_terms_accept" = "Accept";
|
||||
@@ -3037,9 +3301,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gigagroup_suggest_more" = "Learn more";
|
||||
|
||||
"lng_rights_channel_info" = "Change channel info";
|
||||
"lng_rights_channel_manage" = "Manage messages";
|
||||
"lng_rights_channel_post" = "Post messages";
|
||||
"lng_rights_channel_edit" = "Edit messages of others";
|
||||
"lng_rights_channel_delete" = "Delete messages of others";
|
||||
"lng_rights_channel_manage_stories" = "Manage stories";
|
||||
"lng_rights_channel_post_stories" = "Post stories";
|
||||
"lng_rights_channel_edit_stories" = "Edit stories of others";
|
||||
"lng_rights_channel_delete_stories" = "Delete stories of others";
|
||||
"lng_rights_channel_manage_calls" = "Manage live streams";
|
||||
"lng_rights_group_info" = "Change group info";
|
||||
"lng_rights_group_ban" = "Ban users";
|
||||
@@ -3256,6 +3525,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_admin_log_participant_volume_channel" = "{from} changed live stream volume for {user} to {percent}";
|
||||
"lng_admin_log_antispam_enabled" = "{from} enabled aggressive anti-spam";
|
||||
"lng_admin_log_antispam_disabled" = "{from} disabled aggressive anti-spam";
|
||||
"lng_admin_log_change_color" = "{from} changed channel color from {previous} to {color}";
|
||||
"lng_admin_log_set_background_emoji" = "{from} set channel background emoji to {emoji}";
|
||||
"lng_admin_log_change_background_emoji" = "{from} changed channel background emoji from {previous} to {emoji}";
|
||||
"lng_admin_log_removed_background_emoji" = "{from} removed channel background emoji {emoji}";
|
||||
"lng_admin_log_user_with_username" = "{name} ({mention})";
|
||||
"lng_admin_log_messages_ttl_set" = "{from} enabled messages auto-delete after {duration}";
|
||||
"lng_admin_log_messages_ttl_changed" = "{from} changed messages auto-delete period from {previous} to {duration}";
|
||||
@@ -3298,6 +3571,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_admin_log_admin_post_messages" = "Post messages";
|
||||
"lng_admin_log_admin_edit_messages" = "Edit messages";
|
||||
"lng_admin_log_admin_delete_messages" = "Delete messages";
|
||||
"lng_admin_log_admin_post_stories" = "Post stories";
|
||||
"lng_admin_log_admin_edit_stories" = "Edit stories";
|
||||
"lng_admin_log_admin_delete_stories" = "Delete stories";
|
||||
"lng_admin_log_admin_remain_anonymous" = "Remain anonymous";
|
||||
"lng_admin_log_admin_ban_users" = "Ban users";
|
||||
"lng_admin_log_admin_invite_users" = "Add members";
|
||||
@@ -3513,6 +3789,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_export_option_choose_format" = "Choose export format";
|
||||
"lng_export_option_html" = "Human-readable HTML";
|
||||
"lng_export_option_json" = "Machine-readable JSON";
|
||||
"lng_export_option_html_and_json" = "Both";
|
||||
"lng_export_limits" = "From: {from}, to: {till}";
|
||||
"lng_export_beginning" = "the oldest message";
|
||||
"lng_export_end" = "present";
|
||||
@@ -3777,6 +4054,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_view_button_voice_chat_channel" = "Live stream";
|
||||
"lng_view_button_request_join" = "Request to Join";
|
||||
"lng_view_button_external_link" = "Open link";
|
||||
"lng_view_button_boost" = "Boost";
|
||||
|
||||
"lng_sponsored_hide_ads" = "Hide";
|
||||
"lng_sponsored_title" = "What are sponsored messages?";
|
||||
@@ -3787,6 +4065,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
"lng_telegram_features_url" = "https://t.me/TelegramTips";
|
||||
|
||||
"lng_mini_apps_disclaimer_title" = "Warning";
|
||||
"lng_mini_apps_disclaimer_text" = "You are about to use a mini app operated by an independent party **not affiliated with Telegram**. You must agree to the Terms of Use of mini apps to continue.";
|
||||
"lng_mini_apps_disclaimer_button" = "I agree to the {link}";
|
||||
"lng_mini_apps_disclaimer_link" = "Terms of Use";
|
||||
"lng_mini_apps_tos_url" = "https://telegram.org/tos/mini-apps";
|
||||
|
||||
"lng_ringtones_box_title" = "Notification Sound";
|
||||
"lng_ringtones_box_cloud_subtitle" = "Choose your tone";
|
||||
"lng_ringtones_box_upload_choose" = "Choose ringtone";
|
||||
@@ -3904,6 +4188,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_stories_recent_button" = "Recent Stories";
|
||||
"lng_stories_archive_title" = "Stories Archive";
|
||||
"lng_stories_archive_about" = "Only you can see archived stories unless you choose to save them to your profile.";
|
||||
"lng_stories_channel_archive_about" = "Only admins of the channel can see archived stories unless they are saved to the channel page.";
|
||||
"lng_stories_reply_sent" = "Message Sent";
|
||||
"lng_stories_hidden_to_contacts" = "Stories from {user} will now be shown in **Archived Chats**.";
|
||||
"lng_stories_shown_in_chats" = "Stories from {user} will now be shown in the **Chats List**.";
|
||||
@@ -3923,6 +4208,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_stories_archive_done" = "This story is hidden from your profile.";
|
||||
"lng_stories_archive_done_many#one" = "{count} story is hidden from your profile.";
|
||||
"lng_stories_archive_done_many#other" = "{count} stories are hidden from your profile.";
|
||||
"lng_stories_channel_save_sure" = "Do you want to save this story to the channel page?";
|
||||
"lng_stories_channel_save_sure_many#one" = "Do you want to save {count} story to the channel page?";
|
||||
"lng_stories_channel_save_sure_many#other" = "Do you want to save {count} stories to the channel page?";
|
||||
"lng_stories_channel_save_done" = "This story is saved to the channel page.";
|
||||
"lng_stories_channel_save_done_many#one" = "{count} story is saved to the channel page.";
|
||||
"lng_stories_channel_save_done_many#other" = "{count} stories are saved to the channel page.";
|
||||
"lng_stories_channel_save_done_about" = "Saved stories can be viewed by others on the channel page until they are removed.";
|
||||
"lng_stories_channel_archive_sure" = "Do you want to hide this story from the channel page?";
|
||||
"lng_stories_channel_archive_sure_many#one" = "Do you want to hide {count} story from the channel page?";
|
||||
"lng_stories_channel_archive_sure_many#other" = "Do you want to hide {count} stories from the channel page?";
|
||||
"lng_stories_channel_archive_done" = "This story is hidden from the channel page.";
|
||||
"lng_stories_channel_archive_done_many#one" = "{count} story is hidden from the channel page.";
|
||||
"lng_stories_channel_archive_done_many#other" = "{count} stories are hidden from the channel page.";
|
||||
"lng_stories_save_promo" = "Subscribe to {link} to download other people's unprotected stories to disk.";
|
||||
|
||||
"lng_stealth_mode_menu_item" = "Stealth Mode";
|
||||
@@ -3945,6 +4243,80 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
"lng_stories_link_invalid" = "This link is broken or has expired.";
|
||||
|
||||
"lng_stats_title" = "Statistics";
|
||||
"lng_stats_message_title" = "Message Statistic";
|
||||
"lng_stats_zoom_out" = "Zoom Out";
|
||||
|
||||
"lng_stats_overview_title" = "Overview";
|
||||
"lng_stats_overview_member_count" = "Followers";
|
||||
"lng_stats_overview_mean_view_count" = "Views Per Post";
|
||||
"lng_stats_overview_mean_share_count" = "Shared Per Post";
|
||||
"lng_stats_overview_enabled_notifications" = "Enabled Notifications";
|
||||
"lng_stats_overview_messages" = "Messages";
|
||||
"lng_stats_overview_group_mean_view_count" = "Viewing Members";
|
||||
"lng_stats_overview_group_mean_post_count" = "Posting Members";
|
||||
"lng_stats_overview_message_private_shares" = "Private Shares";
|
||||
"lng_stats_overview_message_public_shares" = "Public Shares";
|
||||
"lng_stats_overview_message_views" = "Views";
|
||||
"lng_stats_overview_message_public_share#one" = "{count} public share";
|
||||
"lng_stats_overview_message_public_share#other" = "{count} public shares";
|
||||
|
||||
"lng_stats_members_title" = "Top members";
|
||||
"lng_stats_admins_title" = "Top admins";
|
||||
"lng_stats_inviters_title" = "Top inviters";
|
||||
"lng_stats_member_messages#one" = "{count} message";
|
||||
"lng_stats_member_messages#other" = "{count} messages";
|
||||
"lng_stats_member_characters#one" = "{count} symbol per message";
|
||||
"lng_stats_member_characters#other" = "{count} symbols per message";
|
||||
"lng_stats_member_deletions#one" = "{count} deletions";
|
||||
"lng_stats_member_deletions#other" = "{count} deletions";
|
||||
"lng_stats_member_bans#one" = "{count} ban";
|
||||
"lng_stats_member_bans#other" = "{count} bans";
|
||||
"lng_stats_member_restrictions#one" = "{count} restriction";
|
||||
"lng_stats_member_restrictions#other" = "{count} restrictions";
|
||||
"lng_stats_member_invitations#one" = "{count} invitation";
|
||||
"lng_stats_member_invitations#other" = "{count} invitations";
|
||||
|
||||
"lng_stats_recent_messages_title" = "Recent posts";
|
||||
"lng_stats_recent_messages_views#one" = "{count} view";
|
||||
"lng_stats_recent_messages_views#other" = "{count} views";
|
||||
"lng_stats_recent_messages_shares#one" = "{count} share";
|
||||
"lng_stats_recent_messages_shares#other" = "{count} shares";
|
||||
|
||||
"lng_stats_loading" = "Loading stats...";
|
||||
"lng_stats_loading_subtext" = "Please wait a few moments while we generate your stats.";
|
||||
|
||||
"lng_chart_title_member_count" = "Growth";
|
||||
"lng_chart_title_join" = "Followers";
|
||||
"lng_chart_title_mute" = "Notifications";
|
||||
"lng_chart_title_view_count_by_hour" = "Views by hours";
|
||||
"lng_chart_title_view_count_by_source" = "Views by source";
|
||||
"lng_chart_title_join_by_source" = "New followers by source";
|
||||
"lng_chart_title_language" = "Languages";
|
||||
"lng_chart_title_message_interaction" = "Interactions";
|
||||
"lng_chart_title_instant_view_interaction" = "IV Interactions";
|
||||
|
||||
"lng_chart_title_group_join" = "Group members";
|
||||
"lng_chart_title_group_join_by_source" = "New members by source";
|
||||
"lng_chart_title_group_language" = "Members's primary language";
|
||||
"lng_chart_title_group_message_content" = "Messages";
|
||||
"lng_chart_title_group_action" = "Actions";
|
||||
"lng_chart_title_group_day" = "Views by hours";
|
||||
"lng_chart_title_group_week" = "Top days of week";
|
||||
|
||||
"lng_boosts_title" = "Boosts";
|
||||
"lng_boosts_level" = "Level";
|
||||
"lng_boosts_existing" = "Existing boosts";
|
||||
"lng_boosts_premium_audience" = "Premium subscribers";
|
||||
"lng_boosts_next_level" = "Boosts to level up";
|
||||
"lng_boosts_list_title#one" = "{count} booster";
|
||||
"lng_boosts_list_title#other" = "{count} boosters";
|
||||
"lng_boosts_list_subtext" = "Your channel is currently boosted by these users.";
|
||||
"lng_boosts_show_more" = "Show More Boosts";
|
||||
"lng_boosts_list_status" = "boost expires on {date}";
|
||||
"lng_boosts_link_title" = "Link for boosting";
|
||||
"lng_boosts_link_subtext" = "Share this link with your subscribers to get more boosts.";
|
||||
|
||||
// Wnd specific
|
||||
|
||||
"lng_wnd_choose_program_menu" = "Choose Default Program...";
|
||||
|
||||
5
Telegram/Resources/qrc/emoji_8.qrc
Normal file
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/gui">
|
||||
<file alias="emoji/emoji_8.webp">../emoji/emoji_8.webp</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -10,5 +10,6 @@
|
||||
<file alias="cloud_password/email.tgs">../../animations/cloud_password/email.tgs</file>
|
||||
<file alias="ttl.tgs">../../animations/ttl.tgs</file>
|
||||
<file alias="discussion.tgs">../../animations/discussion.tgs</file>
|
||||
<file alias="stats.tgs">../../animations/stats.tgs</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
|
||||
ProcessorArchitecture="ARCHITECTURE"
|
||||
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
|
||||
Version="4.9.0.0" />
|
||||
Version="4.11.2.0" />
|
||||
<Properties>
|
||||
<DisplayName>Telegram Desktop</DisplayName>
|
||||
<PublisherDisplayName>Telegram Messenger LLP</PublisherDisplayName>
|
||||
|
||||
@@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico"
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 4,9,0,0
|
||||
PRODUCTVERSION 4,9,0,0
|
||||
FILEVERSION 4,11,2,0
|
||||
PRODUCTVERSION 4,11,2,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -62,10 +62,10 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||
VALUE "FileDescription", "Telegram Desktop"
|
||||
VALUE "FileVersion", "4.9.0.0"
|
||||
VALUE "FileVersion", "4.11.2.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2023"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "4.9.0.0"
|
||||
VALUE "ProductVersion", "4.11.2.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
||||
@@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 4,9,0,0
|
||||
PRODUCTVERSION 4,9,0,0
|
||||
FILEVERSION 4,11,2,0
|
||||
PRODUCTVERSION 4,11,2,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -53,10 +53,10 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||
VALUE "FileDescription", "Telegram Desktop Updater"
|
||||
VALUE "FileVersion", "4.9.0.0"
|
||||
VALUE "FileVersion", "4.11.2.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2023"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "4.9.0.0"
|
||||
VALUE "ProductVersion", "4.11.2.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
||||
@@ -267,7 +267,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
QByteArray inner = f.readAll();
|
||||
stream << name << quint32(inner.size()) << inner;
|
||||
#ifdef Q_OS_UNIX
|
||||
#ifndef Q_OS_WIN
|
||||
stream << (QFileInfo(fullName).isExecutable() ? true : false);
|
||||
#endif
|
||||
}
|
||||
@@ -281,7 +281,7 @@ int main(int argc, char *argv[])
|
||||
cout << "Compression start, size: " << resultSize << "\n";
|
||||
|
||||
QByteArray compressed, resultCheck;
|
||||
#if defined Q_OS_WIN && !defined DESKTOP_APP_USE_PACKAGED // use Lzma SDK for win
|
||||
#if defined Q_OS_WIN && !defined TDESKTOP_USE_PACKAGED // use Lzma SDK for win
|
||||
const int32 hSigLen = 128, hShaLen = 20, hPropsLen = LZMA_PROPS_SIZE, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hPropsLen + hOriginalSizeLen; // header
|
||||
|
||||
compressed.resize(hSize + resultSize + 1024 * 1024); // rsa signature + sha1 + lzma props + max compressed size
|
||||
@@ -496,10 +496,8 @@ int main(int argc, char *argv[])
|
||||
QString outName((targetwin64 ? QString("tx64upd%1") : QString("tupdate%1")).arg(AlphaVersion ? AlphaVersion : version));
|
||||
#elif defined Q_OS_MAC
|
||||
QString outName((targetarmac ? QString("tarmacupd%1") : QString("tmacupd%1")).arg(AlphaVersion ? AlphaVersion : version));
|
||||
#elif defined Q_OS_UNIX
|
||||
QString outName(QString("tlinuxupd%1").arg(AlphaVersion ? AlphaVersion : version));
|
||||
#else
|
||||
#error Unknown platform!
|
||||
QString outName(QString("tlinuxupd%1").arg(AlphaVersion ? AlphaVersion : version));
|
||||
#endif
|
||||
if (AlphaVersion) {
|
||||
outName += "_" + AlphaSignature;
|
||||
|
||||
@@ -27,7 +27,7 @@ extern "C" {
|
||||
#include <openssl/evp.h>
|
||||
} // extern "C"
|
||||
|
||||
#if defined Q_OS_WIN && !defined DESKTOP_APP_USE_PACKAGED // use Lzma SDK for win
|
||||
#if defined Q_OS_WIN && !defined TDESKTOP_USE_PACKAGED // use Lzma SDK for win
|
||||
#include <LzmaLib.h>
|
||||
#else
|
||||
#include <lzma.h>
|
||||
|
||||
@@ -41,6 +41,7 @@ bool do_mkdir(const char *path) { // from http://stackoverflow.com/questions/675
|
||||
}
|
||||
|
||||
bool _debug = false;
|
||||
bool writeprotected = false;
|
||||
string updaterDir;
|
||||
string updaterName;
|
||||
string workDir;
|
||||
@@ -88,7 +89,7 @@ void writeLog(const char *format, ...) {
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
bool copyFile(const char *from, const char *to, bool writeprotected) {
|
||||
bool copyFile(const char *from, const char *to) {
|
||||
FILE *ffrom = fopen(from, "rb"), *fto = fopen(to, "wb");
|
||||
if (!ffrom) {
|
||||
if (fto) fclose(fto);
|
||||
@@ -211,7 +212,7 @@ void delFolder() {
|
||||
rmdir(delFolder.c_str());
|
||||
}
|
||||
|
||||
bool update(bool writeprotected) {
|
||||
bool update() {
|
||||
writeLog("Update started..");
|
||||
|
||||
string updDir = workDir + "tupdates/temp", readyFilePath = workDir + "tupdates/temp/ready", tdataDir = workDir + "tupdates/temp/tdata";
|
||||
@@ -324,7 +325,7 @@ bool update(bool writeprotected) {
|
||||
writeLog("Copying file '%s' to '%s'..", fname.c_str(), tofname.c_str());
|
||||
int copyTries = 0, triesLimit = 30;
|
||||
do {
|
||||
if (!copyFile(fname.c_str(), tofname.c_str(), writeprotected)) {
|
||||
if (!copyFile(fname.c_str(), tofname.c_str())) {
|
||||
++copyTries;
|
||||
usleep(100000);
|
||||
} else {
|
||||
@@ -359,10 +360,10 @@ int main(int argc, char *argv[]) {
|
||||
bool needupdate = true;
|
||||
bool autostart = false;
|
||||
bool debug = false;
|
||||
bool writeprotected = false;
|
||||
bool tosettings = false;
|
||||
bool startintray = false;
|
||||
bool customWorkingDir = false;
|
||||
bool justUpdate = false;
|
||||
|
||||
char *key = 0;
|
||||
char *workdir = 0;
|
||||
@@ -381,6 +382,9 @@ int main(int argc, char *argv[]) {
|
||||
customWorkingDir = true;
|
||||
} else if (equal(argv[i], "-writeprotected")) {
|
||||
writeprotected = true;
|
||||
justUpdate = true;
|
||||
} else if (equal(argv[i], "-justupdate")) {
|
||||
justUpdate = true;
|
||||
} else if (equal(argv[i], "-key") && ++i < argc) {
|
||||
key = argv[i];
|
||||
} else if (equal(argv[i], "-workpath") && ++i < argc) {
|
||||
@@ -455,7 +459,7 @@ int main(int argc, char *argv[]) {
|
||||
} else {
|
||||
writeLog("Passed workpath is '%s'", workDir.c_str());
|
||||
}
|
||||
update(writeprotected);
|
||||
update();
|
||||
}
|
||||
} else {
|
||||
writeLog("Error: bad exe name!");
|
||||
@@ -464,36 +468,38 @@ int main(int argc, char *argv[]) {
|
||||
writeLog("Error: short exe name!");
|
||||
}
|
||||
|
||||
const auto fullBinaryPath = exePath + exeName;
|
||||
|
||||
auto values = vector<string>();
|
||||
const auto push = [&](string arg) {
|
||||
// Force null-terminated .data() call result.
|
||||
values.push_back(arg + char(0));
|
||||
};
|
||||
push(!argv0.empty() ? argv0 : fullBinaryPath);
|
||||
push("-noupdate");
|
||||
if (autostart) push("-autostart");
|
||||
if (debug) push("-debug");
|
||||
if (startintray) push("-startintray");
|
||||
if (tosettings) push("-tosettings");
|
||||
if (key) {
|
||||
push("-key");
|
||||
push(key);
|
||||
}
|
||||
if (customWorkingDir && workdir) {
|
||||
push("-workdir");
|
||||
push(workdir);
|
||||
}
|
||||
|
||||
auto args = vector<char*>();
|
||||
for (auto &arg : values) {
|
||||
args.push_back(arg.data());
|
||||
}
|
||||
args.push_back(nullptr);
|
||||
|
||||
// let the parent launch instead
|
||||
if (!writeprotected) {
|
||||
if (justUpdate) {
|
||||
writeLog("Closing log and quitting..");
|
||||
} else {
|
||||
const auto fullBinaryPath = exePath + exeName;
|
||||
|
||||
auto values = vector<string>();
|
||||
const auto push = [&](string arg) {
|
||||
// Force null-terminated .data() call result.
|
||||
values.push_back(arg + char(0));
|
||||
};
|
||||
push(!argv0.empty() ? argv0 : fullBinaryPath);
|
||||
push("-noupdate");
|
||||
if (autostart) push("-autostart");
|
||||
if (debug) push("-debug");
|
||||
if (startintray) push("-startintray");
|
||||
if (tosettings) push("-tosettings");
|
||||
if (key) {
|
||||
push("-key");
|
||||
push(key);
|
||||
}
|
||||
if (customWorkingDir && workdir) {
|
||||
push("-workdir");
|
||||
push(workdir);
|
||||
}
|
||||
|
||||
auto args = vector<char*>();
|
||||
for (auto &arg : values) {
|
||||
args.push_back(arg.data());
|
||||
}
|
||||
args.push_back(nullptr);
|
||||
|
||||
pid_t pid = fork();
|
||||
switch (pid) {
|
||||
case -1:
|
||||
@@ -503,9 +509,10 @@ int main(int argc, char *argv[]) {
|
||||
execv(fullBinaryPath.c_str(), args.data());
|
||||
return 1;
|
||||
}
|
||||
|
||||
writeLog("Executed Telegram, closing log and quitting..");
|
||||
}
|
||||
|
||||
writeLog("Executed Telegram, closing log and quitting..");
|
||||
closeLog();
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -72,26 +72,9 @@ Authorizations::Entry ParseEntry(const MTPDauthorization &data) {
|
||||
appName,
|
||||
appVer.isEmpty() ? QString() : (' ' + appVer));
|
||||
result.ip = qs(data.vip());
|
||||
if (!result.hash) {
|
||||
result.active = tr::lng_status_online(tr::now);
|
||||
} else {
|
||||
const auto now = QDateTime::currentDateTime();
|
||||
const auto lastTime = base::unixtime::parse(result.activeTime);
|
||||
const auto nowDate = now.date();
|
||||
const auto lastDate = lastTime.date();
|
||||
if (lastDate == nowDate) {
|
||||
result.active = QLocale().toString(
|
||||
lastTime.time(),
|
||||
QLocale::ShortFormat);
|
||||
} else if (lastDate.year() == nowDate.year()
|
||||
&& lastDate.weekNumber() == nowDate.weekNumber()) {
|
||||
result.active = langDayOfWeek(lastDate);
|
||||
} else {
|
||||
result.active = QLocale().toString(
|
||||
lastDate,
|
||||
QLocale::ShortFormat);
|
||||
}
|
||||
}
|
||||
result.active = result.hash
|
||||
? Authorizations::ActiveDateString(result.activeTime)
|
||||
: tr::lng_status_online(tr::now);
|
||||
result.location = country;
|
||||
|
||||
return result;
|
||||
@@ -129,16 +112,15 @@ void Authorizations::reload() {
|
||||
)).done([=](const MTPaccount_Authorizations &result) {
|
||||
_requestId = 0;
|
||||
_lastReceived = crl::now();
|
||||
result.match([&](const MTPDaccount_authorizations &auths) {
|
||||
_ttlDays = auths.vauthorization_ttl_days().v;
|
||||
_list = (
|
||||
auths.vauthorizations().v
|
||||
) | ranges::views::transform([](const MTPAuthorization &d) {
|
||||
return ParseEntry(d.c_authorization());
|
||||
}) | ranges::to<List>;
|
||||
refreshCallsDisabledHereFromCloud();
|
||||
_listChanges.fire({});
|
||||
});
|
||||
const auto &data = result.data();
|
||||
_ttlDays = data.vauthorization_ttl_days().v;
|
||||
_list = ranges::views::all(
|
||||
data.vauthorizations().v
|
||||
) | ranges::views::transform([](const MTPAuthorization &auth) {
|
||||
return ParseEntry(auth.data());
|
||||
}) | ranges::to<List>;
|
||||
refreshCallsDisabledHereFromCloud();
|
||||
_listChanges.fire({});
|
||||
}).fail([=] {
|
||||
_requestId = 0;
|
||||
}).send();
|
||||
@@ -190,19 +172,21 @@ Authorizations::List Authorizations::list() const {
|
||||
return _list;
|
||||
}
|
||||
|
||||
auto Authorizations::listChanges() const
|
||||
auto Authorizations::listValue() const
|
||||
-> rpl::producer<Authorizations::List> {
|
||||
return rpl::single(
|
||||
list()
|
||||
) | rpl::then(
|
||||
_listChanges.events() | rpl::map([=] { return list(); }));
|
||||
_listChanges.events() | rpl::map([=] { return list(); })
|
||||
);
|
||||
}
|
||||
|
||||
rpl::producer<int> Authorizations::totalChanges() const {
|
||||
rpl::producer<int> Authorizations::totalValue() const {
|
||||
return rpl::single(
|
||||
total()
|
||||
) | rpl::then(
|
||||
_listChanges.events() | rpl::map([=] { return total(); }));
|
||||
_listChanges.events() | rpl::map([=] { return total(); })
|
||||
);
|
||||
}
|
||||
|
||||
void Authorizations::updateTTL(int days) {
|
||||
@@ -254,6 +238,19 @@ rpl::producer<bool> Authorizations::callsDisabledHereChanges() const {
|
||||
return _callsDisabledHere.changes();
|
||||
}
|
||||
|
||||
QString Authorizations::ActiveDateString(TimeId active) {
|
||||
const auto now = QDateTime::currentDateTime();
|
||||
const auto lastTime = base::unixtime::parse(active);
|
||||
const auto nowDate = now.date();
|
||||
const auto lastDate = lastTime.date();
|
||||
return (lastDate == nowDate)
|
||||
? QLocale().toString(lastTime.time(), QLocale::ShortFormat)
|
||||
: (lastDate.year() == nowDate.year()
|
||||
&& lastDate.weekNumber() == nowDate.weekNumber())
|
||||
? langDayOfWeek(lastDate)
|
||||
: QLocale().toString(lastDate, QLocale::ShortFormat);
|
||||
}
|
||||
|
||||
int Authorizations::total() const {
|
||||
return ranges::count_if(
|
||||
_list,
|
||||
|
||||
@@ -38,9 +38,9 @@ public:
|
||||
[[nodiscard]] crl::time lastReceivedTime();
|
||||
|
||||
[[nodiscard]] List list() const;
|
||||
[[nodiscard]] rpl::producer<List> listChanges() const;
|
||||
[[nodiscard]] rpl::producer<List> listValue() const;
|
||||
[[nodiscard]] int total() const;
|
||||
[[nodiscard]] rpl::producer<int> totalChanges() const;
|
||||
[[nodiscard]] rpl::producer<int> totalValue() const;
|
||||
|
||||
void updateTTL(int days);
|
||||
[[nodiscard]] rpl::producer<int> ttlDays() const;
|
||||
@@ -53,6 +53,8 @@ public:
|
||||
[[nodiscard]] rpl::producer<bool> callsDisabledHereValue() const;
|
||||
[[nodiscard]] rpl::producer<bool> callsDisabledHereChanges() const;
|
||||
|
||||
[[nodiscard]] static QString ActiveDateString(TimeId active);
|
||||
|
||||
private:
|
||||
void refreshCallsDisabledHereFromCloud();
|
||||
|
||||
|
||||
@@ -77,45 +77,59 @@ void BlockedPeers::block(not_null<PeerData*> peer) {
|
||||
_session->changes().peerUpdated(
|
||||
peer,
|
||||
Data::PeerUpdate::Flag::IsBlocked);
|
||||
} else if (_blockRequests.find(peer) == end(_blockRequests)) {
|
||||
const auto requestId = _api.request(MTPcontacts_Block(
|
||||
MTP_flags(0),
|
||||
peer->input
|
||||
)).done([=] {
|
||||
_blockRequests.erase(peer);
|
||||
peer->setIsBlocked(true);
|
||||
if (_slice) {
|
||||
_slice->list.insert(
|
||||
_slice->list.begin(),
|
||||
{ peer->id, base::unixtime::now() });
|
||||
++_slice->total;
|
||||
_changes.fire_copy(*_slice);
|
||||
}
|
||||
}).fail([=] {
|
||||
_blockRequests.erase(peer);
|
||||
}).send();
|
||||
|
||||
_blockRequests.emplace(peer, requestId);
|
||||
return;
|
||||
} else if (blockAlreadySent(peer, true)) {
|
||||
return;
|
||||
}
|
||||
const auto requestId = _api.request(MTPcontacts_Block(
|
||||
MTP_flags(0),
|
||||
peer->input
|
||||
)).done([=] {
|
||||
const auto data = _blockRequests.take(peer);
|
||||
peer->setIsBlocked(true);
|
||||
if (_slice) {
|
||||
_slice->list.insert(
|
||||
_slice->list.begin(),
|
||||
{ peer->id, base::unixtime::now() });
|
||||
++_slice->total;
|
||||
_changes.fire_copy(*_slice);
|
||||
}
|
||||
if (data) {
|
||||
for (const auto &callback : data->callbacks) {
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
}).fail([=] {
|
||||
if (const auto data = _blockRequests.take(peer)) {
|
||||
for (const auto &callback : data->callbacks) {
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
}).send();
|
||||
|
||||
_blockRequests.emplace(peer, Request{
|
||||
.requestId = requestId,
|
||||
.blocking = true,
|
||||
});
|
||||
}
|
||||
|
||||
void BlockedPeers::unblock(
|
||||
not_null<PeerData*> peer,
|
||||
Fn<void()> onDone,
|
||||
Fn<void(bool success)> done,
|
||||
bool force) {
|
||||
if (!force && !peer->isBlocked()) {
|
||||
_session->changes().peerUpdated(
|
||||
peer,
|
||||
Data::PeerUpdate::Flag::IsBlocked);
|
||||
return;
|
||||
} else if (_blockRequests.find(peer) != end(_blockRequests)) {
|
||||
} else if (blockAlreadySent(peer, false, done)) {
|
||||
return;
|
||||
}
|
||||
const auto requestId = _api.request(MTPcontacts_Unblock(
|
||||
MTP_flags(0),
|
||||
peer->input
|
||||
)).done([=] {
|
||||
_blockRequests.erase(peer);
|
||||
const auto data = _blockRequests.take(peer);
|
||||
peer->setIsBlocked(false);
|
||||
if (_slice) {
|
||||
auto &list = _slice->list;
|
||||
@@ -130,13 +144,46 @@ void BlockedPeers::unblock(
|
||||
}
|
||||
_changes.fire_copy(*_slice);
|
||||
}
|
||||
if (onDone) {
|
||||
onDone();
|
||||
if (data) {
|
||||
for (const auto &callback : data->callbacks) {
|
||||
callback(true);
|
||||
}
|
||||
}
|
||||
}).fail([=] {
|
||||
_blockRequests.erase(peer);
|
||||
if (const auto data = _blockRequests.take(peer)) {
|
||||
for (const auto &callback : data->callbacks) {
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
}).send();
|
||||
_blockRequests.emplace(peer, requestId);
|
||||
const auto i = _blockRequests.emplace(peer, Request{
|
||||
.requestId = requestId,
|
||||
.blocking = false,
|
||||
}).first;
|
||||
if (done) {
|
||||
i->second.callbacks.push_back(std::move(done));
|
||||
}
|
||||
}
|
||||
|
||||
bool BlockedPeers::blockAlreadySent(
|
||||
not_null<PeerData*> peer,
|
||||
bool blocking,
|
||||
Fn<void(bool success)> done) {
|
||||
const auto i = _blockRequests.find(peer);
|
||||
if (i == end(_blockRequests)) {
|
||||
return false;
|
||||
} else if (i->second.blocking == blocking) {
|
||||
if (done) {
|
||||
i->second.callbacks.push_back(std::move(done));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const auto callbacks = base::take(i->second.callbacks);
|
||||
_blockRequests.erase(i);
|
||||
for (const auto &callback : callbacks) {
|
||||
callback(false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void BlockedPeers::reload() {
|
||||
@@ -160,7 +207,7 @@ auto BlockedPeers::slice() -> rpl::producer<BlockedPeers::Slice> {
|
||||
: (_changes.events() | rpl::type_erased());
|
||||
}
|
||||
|
||||
void BlockedPeers::request(int offset, Fn<void(BlockedPeers::Slice)> onDone) {
|
||||
void BlockedPeers::request(int offset, Fn<void(BlockedPeers::Slice)> done) {
|
||||
if (_requestId) {
|
||||
return;
|
||||
}
|
||||
@@ -170,7 +217,7 @@ void BlockedPeers::request(int offset, Fn<void(BlockedPeers::Slice)> onDone) {
|
||||
MTP_int(offset ? kBlockedPerPage : kBlockedFirstSlice)
|
||||
)).done([=](const MTPcontacts_Blocked &result) {
|
||||
_requestId = 0;
|
||||
onDone(TLToSlice(result, _session->data()));
|
||||
done(TLToSlice(result, _session->data()));
|
||||
}).fail([=] {
|
||||
_requestId = 0;
|
||||
}).send();
|
||||
|
||||
@@ -39,20 +39,31 @@ public:
|
||||
|
||||
void reload();
|
||||
rpl::producer<Slice> slice();
|
||||
void request(int offset, Fn<void(Slice)> onDone);
|
||||
void request(int offset, Fn<void(Slice)> done);
|
||||
|
||||
void block(not_null<PeerData*> peer);
|
||||
void unblock(
|
||||
not_null<PeerData*> peer,
|
||||
Fn<void()> onDone = nullptr,
|
||||
Fn<void(bool success)> done = nullptr,
|
||||
bool force = false);
|
||||
|
||||
private:
|
||||
struct Request {
|
||||
std::vector<Fn<void(bool success)>> callbacks;
|
||||
mtpRequestId requestId = 0;
|
||||
bool blocking = false;
|
||||
};
|
||||
|
||||
[[nodiscard]] bool blockAlreadySent(
|
||||
not_null<PeerData*> peer,
|
||||
bool blocking,
|
||||
Fn<void(bool success)> done = nullptr);
|
||||
|
||||
const not_null<Main::Session*> _session;
|
||||
|
||||
MTP::Sender _api;
|
||||
|
||||
base::flat_map<not_null<PeerData*>, mtpRequestId> _blockRequests;
|
||||
base::flat_map<not_null<PeerData*>, Request> _blockRequests;
|
||||
mtpRequestId _requestId = 0;
|
||||
std::optional<Slice> _slice;
|
||||
rpl::event_stream<Slice> _changes;
|
||||
|
||||
@@ -169,9 +169,7 @@ void SendBotCallbackData(
|
||||
void HideSingleUseKeyboard(
|
||||
not_null<Window::SessionController*> controller,
|
||||
not_null<HistoryItem*> item) {
|
||||
controller->content()->hideSingleUseKeyboard(
|
||||
item->history()->peer,
|
||||
item->id);
|
||||
controller->content()->hideSingleUseKeyboard(item->fullId());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -312,12 +310,14 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
|
||||
case ButtonType::Default: {
|
||||
// Copy string before passing it to the sending method
|
||||
// because the original button can be destroyed inside.
|
||||
const auto replyTo = item->isRegular() ? item->id : 0;
|
||||
const auto replyTo = item->isRegular()
|
||||
? item->fullId()
|
||||
: FullMsgId();
|
||||
controller->content()->sendBotCommand({
|
||||
.peer = item->history()->peer,
|
||||
.command = QString(button->text),
|
||||
.context = item->fullId(),
|
||||
.replyTo = replyTo,
|
||||
.replyTo = { replyTo },
|
||||
});
|
||||
} break;
|
||||
|
||||
@@ -363,7 +363,7 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
|
||||
|
||||
case ButtonType::RequestPhone: {
|
||||
HideSingleUseKeyboard(controller, item);
|
||||
const auto itemId = item->id;
|
||||
const auto itemId = item->fullId();
|
||||
const auto topicRootId = item->topicRootId();
|
||||
const auto history = item->history();
|
||||
controller->show(Ui::MakeConfirmBox({
|
||||
@@ -376,7 +376,7 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
|
||||
auto action = Api::SendAction(history);
|
||||
action.clearDraft = false;
|
||||
action.replyTo = {
|
||||
.msgId = itemId,
|
||||
.messageId = itemId,
|
||||
.topicRootId = topicRootId,
|
||||
};
|
||||
history->session().api().shareContact(
|
||||
@@ -397,13 +397,11 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
|
||||
chosen |= PollData::Flag::Quiz;
|
||||
}
|
||||
}
|
||||
const auto replyToId = MsgId(0);
|
||||
const auto topicRootId = MsgId(0);
|
||||
const auto replyTo = FullReplyTo();
|
||||
Window::PeerMenuCreatePoll(
|
||||
controller,
|
||||
item->history()->peer,
|
||||
replyToId,
|
||||
topicRootId,
|
||||
replyTo,
|
||||
chosen,
|
||||
disabled);
|
||||
} break;
|
||||
|
||||
@@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
#include "apiwrap.h"
|
||||
#include "window/window_session_controller.h"
|
||||
#include "info/profile/info_profile_badge.h"
|
||||
#include "lang/lang_keys.h"
|
||||
#include "main/main_session.h"
|
||||
#include "ui/empty_userpic.h"
|
||||
@@ -25,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "ui/toast/toast.h"
|
||||
#include "boxes/premium_limits_box.h"
|
||||
#include "styles/style_boxes.h"
|
||||
#include "styles/style_info.h"
|
||||
#include "styles/style_layers.h"
|
||||
|
||||
namespace Api {
|
||||
@@ -195,6 +197,13 @@ ConfirmInviteBox::ConfirmInviteBox(
|
||||
: _session(session)
|
||||
, _submit(std::move(submit))
|
||||
, _title(this, st::confirmInviteTitle)
|
||||
, _badge(std::make_unique<Info::Profile::Badge>(
|
||||
this,
|
||||
st::infoPeerBadge,
|
||||
_session,
|
||||
rpl::single(Info::Profile::Badge::Content{ BadgeForInvite(invite) }),
|
||||
nullptr,
|
||||
[=] { return false; }))
|
||||
, _status(this, st::confirmInviteStatus)
|
||||
, _about(this, st::confirmInviteAbout)
|
||||
, _aboutRequests(this, st::confirmInviteStatus)
|
||||
@@ -275,9 +284,24 @@ ConfirmInviteBox::ChatInvite ConfirmInviteBox::Parse(
|
||||
.isMegagroup = data.is_megagroup(),
|
||||
.isBroadcast = data.is_broadcast(),
|
||||
.isRequestNeeded = data.is_request_needed(),
|
||||
.isFake = data.is_fake(),
|
||||
.isScam = data.is_scam(),
|
||||
.isVerified = data.is_verified(),
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]] Info::Profile::BadgeType ConfirmInviteBox::BadgeForInvite(
|
||||
const ChatInvite &invite) {
|
||||
using Type = Info::Profile::BadgeType;
|
||||
return invite.isVerified
|
||||
? Type::Verified
|
||||
: invite.isScam
|
||||
? Type::Scam
|
||||
: invite.isFake
|
||||
? Type::Fake
|
||||
: Type::None;
|
||||
}
|
||||
|
||||
void ConfirmInviteBox::prepare() {
|
||||
addButton(
|
||||
(_requestApprove
|
||||
@@ -326,8 +350,26 @@ void ConfirmInviteBox::prepare() {
|
||||
|
||||
void ConfirmInviteBox::resizeEvent(QResizeEvent *e) {
|
||||
BoxContent::resizeEvent(e);
|
||||
_title->move((width() - _title->width()) / 2, st::confirmInviteTitleTop);
|
||||
_status->move((width() - _status->width()) / 2, st::confirmInviteStatusTop);
|
||||
|
||||
const auto padding = st::boxRowPadding;
|
||||
auto nameWidth = width() - padding.left() - padding.right();
|
||||
auto badgeWidth = 0;
|
||||
if (const auto widget = _badge->widget()) {
|
||||
badgeWidth = st::infoVerifiedCheckPosition.x() + widget->width();
|
||||
nameWidth -= badgeWidth;
|
||||
}
|
||||
_title->resizeToWidth(std::min(nameWidth, _title->textMaxWidth()));
|
||||
_title->moveToLeft(
|
||||
(width() - _title->width() - badgeWidth) / 2,
|
||||
st::confirmInviteTitleTop);
|
||||
const auto badgeLeft = _title->x() + _title->width();
|
||||
const auto badgeTop = _title->y();
|
||||
const auto badgeBottom = _title->y() + _title->height();
|
||||
_badge->move(badgeLeft, badgeTop, badgeBottom);
|
||||
|
||||
_status->move(
|
||||
(width() - _status->width()) / 2,
|
||||
st::confirmInviteStatusTop);
|
||||
auto bottom = _status->y()
|
||||
+ _status->height()
|
||||
+ st::boxPadding.bottom()
|
||||
|
||||
@@ -12,6 +12,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
class UserData;
|
||||
class ChannelData;
|
||||
|
||||
namespace Info::Profile {
|
||||
class Badge;
|
||||
enum class BadgeType;
|
||||
} // namespace Info::Profile
|
||||
|
||||
namespace Main {
|
||||
class Session;
|
||||
} // namespace Main
|
||||
@@ -66,10 +71,15 @@ private:
|
||||
bool isMegagroup = false;
|
||||
bool isBroadcast = false;
|
||||
bool isRequestNeeded = false;
|
||||
bool isFake = false;
|
||||
bool isScam = false;
|
||||
bool isVerified = false;
|
||||
};
|
||||
[[nodiscard]] static ChatInvite Parse(
|
||||
not_null<Main::Session*> session,
|
||||
const MTPDchatInvite &data);
|
||||
[[nodiscard]] Info::Profile::BadgeType BadgeForInvite(
|
||||
const ChatInvite &invite);
|
||||
|
||||
ConfirmInviteBox(
|
||||
not_null<Main::Session*> session,
|
||||
@@ -81,12 +91,14 @@ private:
|
||||
|
||||
Fn<void()> _submit;
|
||||
object_ptr<Ui::FlatLabel> _title;
|
||||
std::unique_ptr<Info::Profile::Badge> _badge;
|
||||
object_ptr<Ui::FlatLabel> _status;
|
||||
object_ptr<Ui::FlatLabel> _about;
|
||||
object_ptr<Ui::FlatLabel> _aboutRequests;
|
||||
std::shared_ptr<Data::PhotoMedia> _photo;
|
||||
std::unique_ptr<Ui::EmptyUserpic> _photoEmpty;
|
||||
std::vector<Participant> _participants;
|
||||
|
||||
bool _isChannel = false;
|
||||
bool _requestApprove = false;
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ SendAction::SendAction(
|
||||
SendOptions options)
|
||||
: history(thread->owningHistory())
|
||||
, options(options)
|
||||
, replyTo({ .msgId = thread->topicRootId() }) {
|
||||
replyTo.topicRootId = replyTo.msgId;
|
||||
, replyTo({ .messageId = { history->peer->id, thread->topicRootId() } }) {
|
||||
replyTo.topicRootId = replyTo.messageId.msg;
|
||||
}
|
||||
|
||||
SendOptions DefaultSendWhenOnlineOptions() {
|
||||
@@ -31,7 +31,7 @@ SendOptions DefaultSendWhenOnlineOptions() {
|
||||
}
|
||||
|
||||
MTPInputReplyTo SendAction::mtpReplyTo() const {
|
||||
return Data::ReplyToForMTP(&history->owner(), replyTo);
|
||||
return Data::ReplyToForMTP(history, replyTo);
|
||||
}
|
||||
|
||||
} // namespace Api
|
||||
|
||||
@@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include "data/data_drafts.h"
|
||||
|
||||
class History;
|
||||
|
||||
namespace Data {
|
||||
@@ -22,7 +24,6 @@ struct SendOptions {
|
||||
TimeId scheduled = 0;
|
||||
bool silent = false;
|
||||
bool handleSupportSwitch = false;
|
||||
bool removeWebPageId = false;
|
||||
bool hideViaBot = false;
|
||||
};
|
||||
[[nodiscard]] SendOptions DefaultSendWhenOnlineOptions();
|
||||
@@ -54,7 +55,7 @@ struct MessageToSend {
|
||||
|
||||
SendAction action;
|
||||
TextWithTags textWithTags;
|
||||
WebPageId webPageId = 0;
|
||||
Data::WebPageDraft webPage;
|
||||
};
|
||||
|
||||
struct RemoteFileInfo {
|
||||
|
||||
@@ -11,8 +11,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "api/api_media.h"
|
||||
#include "api/api_text_entities.h"
|
||||
#include "ui/boxes/confirm_box.h"
|
||||
#include "data/data_histories.h"
|
||||
#include "data/data_scheduled_messages.h"
|
||||
#include "data/data_session.h"
|
||||
#include "data/data_web_page.h"
|
||||
#include "history/history.h"
|
||||
#include "history/history_item.h"
|
||||
#include "lang/lang_keys.h"
|
||||
@@ -45,6 +47,7 @@ template <typename DoneCallback, typename FailCallback>
|
||||
mtpRequestId EditMessage(
|
||||
not_null<HistoryItem*> item,
|
||||
const TextWithEntities &textWithEntities,
|
||||
Data::WebPageDraft webpage,
|
||||
SendOptions options,
|
||||
DoneCallback &&done,
|
||||
FailCallback &&fail,
|
||||
@@ -65,15 +68,21 @@ mtpRequestId EditMessage(
|
||||
|
||||
const auto emptyFlag = MTPmessages_EditMessage::Flag(0);
|
||||
const auto flags = emptyFlag
|
||||
| (!text.isEmpty() || media
|
||||
| ((!text.isEmpty() || media)
|
||||
? MTPmessages_EditMessage::Flag::f_message
|
||||
: emptyFlag)
|
||||
| ((media && inputMedia.has_value())
|
||||
? MTPmessages_EditMessage::Flag::f_media
|
||||
: emptyFlag)
|
||||
| (options.removeWebPageId
|
||||
| (webpage.removed
|
||||
? MTPmessages_EditMessage::Flag::f_no_webpage
|
||||
: emptyFlag)
|
||||
| ((!webpage.removed && !webpage.url.isEmpty())
|
||||
? MTPmessages_EditMessage::Flag::f_media
|
||||
: emptyFlag)
|
||||
| ((!webpage.removed && !webpage.url.isEmpty() && webpage.invert)
|
||||
? MTPmessages_EditMessage::Flag::f_invert_media
|
||||
: emptyFlag)
|
||||
| (!sentEntities.v.isEmpty()
|
||||
? MTPmessages_EditMessage::Flag::f_entities
|
||||
: emptyFlag)
|
||||
@@ -89,7 +98,7 @@ mtpRequestId EditMessage(
|
||||
item->history()->peer->input,
|
||||
MTP_int(id),
|
||||
MTP_string(text),
|
||||
inputMedia.value_or(MTPInputMedia()),
|
||||
inputMedia.value_or(Data::WebPageForMTP(webpage, text.isEmpty())),
|
||||
MTPReplyMarkup(),
|
||||
sentEntities,
|
||||
MTP_int(options.scheduled)
|
||||
@@ -133,9 +142,15 @@ mtpRequestId EditMessage(
|
||||
FailCallback &&fail,
|
||||
std::optional<MTPInputMedia> inputMedia = std::nullopt) {
|
||||
const auto &text = item->originalText();
|
||||
const auto webpage = (!item->media() || !item->media()->webpage())
|
||||
? Data::WebPageDraft{ .removed = true }
|
||||
: Data::WebPageDraft{
|
||||
.id = item->media()->webpage()->id,
|
||||
};
|
||||
return EditMessage(
|
||||
item,
|
||||
text,
|
||||
webpage,
|
||||
options,
|
||||
std::forward<DoneCallback>(done),
|
||||
std::forward<FailCallback>(fail),
|
||||
@@ -216,12 +231,19 @@ mtpRequestId EditCaption(
|
||||
SendOptions options,
|
||||
Fn<void()> done,
|
||||
Fn<void(const QString &)> fail) {
|
||||
return EditMessage(item, caption, options, done, fail);
|
||||
return EditMessage(
|
||||
item,
|
||||
caption,
|
||||
Data::WebPageDraft(),
|
||||
options,
|
||||
done,
|
||||
fail);
|
||||
}
|
||||
|
||||
mtpRequestId EditTextMessage(
|
||||
not_null<HistoryItem*> item,
|
||||
const TextWithEntities &caption,
|
||||
Data::WebPageDraft webpage,
|
||||
SendOptions options,
|
||||
Fn<void(mtpRequestId requestId)> done,
|
||||
Fn<void(const QString &, mtpRequestId requestId)> fail) {
|
||||
@@ -229,7 +251,7 @@ mtpRequestId EditTextMessage(
|
||||
applyUpdates();
|
||||
done(id);
|
||||
};
|
||||
return EditMessage(item, caption, options, callback, fail);
|
||||
return EditMessage(item, caption, webpage, options, callback, fail);
|
||||
}
|
||||
|
||||
} // namespace Api
|
||||
|
||||
@@ -9,6 +9,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
class HistoryItem;
|
||||
|
||||
namespace Data {
|
||||
struct WebPageDraft;
|
||||
} // namespace Data
|
||||
|
||||
namespace MTP {
|
||||
class Error;
|
||||
} // namespace MTP
|
||||
@@ -48,6 +52,7 @@ mtpRequestId EditCaption(
|
||||
mtpRequestId EditTextMessage(
|
||||
not_null<HistoryItem*> item,
|
||||
const TextWithEntities &caption,
|
||||
Data::WebPageDraft webpage,
|
||||
SendOptions options,
|
||||
Fn<void(mtpRequestId requestId)> done,
|
||||
Fn<void(const QString &error, mtpRequestId requestId)> fail);
|
||||
|
||||
@@ -103,10 +103,10 @@ void GlobalPrivacy::update(
|
||||
| (archiveAndMute
|
||||
? Flag::f_archive_and_mute_new_noncontact_peers
|
||||
: Flag())
|
||||
| (unarchiveOnNewMessage == UnarchiveOnNewMessage::AnyUnmuted
|
||||
| (unarchiveOnNewMessage == UnarchiveOnNewMessage::None
|
||||
? Flag::f_keep_archived_unmuted
|
||||
: Flag())
|
||||
| (unarchiveOnNewMessage != UnarchiveOnNewMessage::None
|
||||
| (unarchiveOnNewMessage != UnarchiveOnNewMessage::AnyUnmuted
|
||||
? Flag::f_keep_archived_folders
|
||||
: Flag());
|
||||
_requestId = _api.request(MTPaccount_SetGlobalPrivacySettings(
|
||||
@@ -125,10 +125,10 @@ void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &data) {
|
||||
data.match([&](const MTPDglobalPrivacySettings &data) {
|
||||
_archiveAndMute = data.is_archive_and_mute_new_noncontact_peers();
|
||||
_unarchiveOnNewMessage = data.is_keep_archived_unmuted()
|
||||
? UnarchiveOnNewMessage::AnyUnmuted
|
||||
? UnarchiveOnNewMessage::None
|
||||
: data.is_keep_archived_folders()
|
||||
? UnarchiveOnNewMessage::NotInFoldersUnmuted
|
||||
: UnarchiveOnNewMessage::None;
|
||||
: UnarchiveOnNewMessage::AnyUnmuted;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -510,40 +510,57 @@ void PeerPhoto::requestUserPhotos(
|
||||
_userPhotosRequests.emplace(user, requestId);
|
||||
}
|
||||
|
||||
auto PeerPhoto::emojiList(EmojiListType type) -> EmojiListData & {
|
||||
switch (type) {
|
||||
case EmojiListType::Profile: return _profileEmojiList;
|
||||
case EmojiListType::Group: return _groupEmojiList;
|
||||
case EmojiListType::Background: return _backgroundEmojiList;
|
||||
}
|
||||
Unexpected("Type in PeerPhoto::emojiList.");
|
||||
}
|
||||
|
||||
auto PeerPhoto::emojiList(EmojiListType type) const
|
||||
-> const EmojiListData & {
|
||||
return const_cast<PeerPhoto*>(this)->emojiList(type);
|
||||
}
|
||||
|
||||
void PeerPhoto::requestEmojiList(EmojiListType type) {
|
||||
if (_requestIdEmojiList) {
|
||||
auto &list = emojiList(type);
|
||||
if (list.requestId) {
|
||||
return;
|
||||
}
|
||||
const auto isGroup = (type == EmojiListType::Group);
|
||||
const auto d = [=](const MTPEmojiList &result) {
|
||||
_requestIdEmojiList = 0;
|
||||
result.match([](const MTPDemojiListNotModified &data) {
|
||||
}, [&](const MTPDemojiList &data) {
|
||||
auto &list = isGroup ? _profileEmojiList : _groupEmojiList;
|
||||
list = ranges::views::all(
|
||||
data.vdocument_id().v
|
||||
) | ranges::views::transform(&MTPlong::v) | ranges::to_vector;
|
||||
});
|
||||
const auto send = [&](auto &&request) {
|
||||
return _api.request(
|
||||
std::move(request)
|
||||
).done([=](const MTPEmojiList &result) {
|
||||
auto &list = emojiList(type);
|
||||
list.requestId = 0;
|
||||
result.match([](const MTPDemojiListNotModified &data) {
|
||||
}, [&](const MTPDemojiList &data) {
|
||||
list.list = ranges::views::all(
|
||||
data.vdocument_id().v
|
||||
) | ranges::views::transform(
|
||||
&MTPlong::v
|
||||
) | ranges::to_vector;
|
||||
});
|
||||
}).fail([=] {
|
||||
emojiList(type).requestId = 0;
|
||||
}).send();
|
||||
};
|
||||
const auto f = [=] { _requestIdEmojiList = 0; };
|
||||
_requestIdEmojiList = isGroup
|
||||
? _api.request(
|
||||
MTPaccount_GetDefaultGroupPhotoEmojis()
|
||||
).done(d).fail(f).send()
|
||||
: _api.request(
|
||||
MTPaccount_GetDefaultProfilePhotoEmojis()
|
||||
).done(d).fail(f).send();
|
||||
list.requestId = (type == EmojiListType::Profile)
|
||||
? send(MTPaccount_GetDefaultProfilePhotoEmojis())
|
||||
: (type == EmojiListType::Group)
|
||||
? send(MTPaccount_GetDefaultGroupPhotoEmojis())
|
||||
: send(MTPaccount_GetDefaultBackgroundEmojis());
|
||||
}
|
||||
|
||||
rpl::producer<PeerPhoto::EmojiList> PeerPhoto::emojiListValue(
|
||||
EmojiListType type) {
|
||||
auto &list = (type == EmojiListType::Group)
|
||||
? _profileEmojiList
|
||||
: _groupEmojiList;
|
||||
if (list.current().empty() && !_requestIdEmojiList) {
|
||||
auto &list = emojiList(type);
|
||||
if (list.list.current().empty() && !list.requestId) {
|
||||
requestEmojiList(type);
|
||||
}
|
||||
return list.value();
|
||||
return list.list.value();
|
||||
}
|
||||
|
||||
// Non-personal photo in case a personal photo is set.
|
||||
|
||||
@@ -31,6 +31,7 @@ public:
|
||||
enum class EmojiListType {
|
||||
Profile,
|
||||
Group,
|
||||
Background,
|
||||
};
|
||||
|
||||
struct UserPhoto {
|
||||
@@ -73,6 +74,10 @@ private:
|
||||
Suggestion,
|
||||
Fallback,
|
||||
};
|
||||
struct EmojiListData {
|
||||
rpl::variable<EmojiList> list;
|
||||
mtpRequestId requestId = 0;
|
||||
};
|
||||
|
||||
void ready(
|
||||
const FullMsgId &msgId,
|
||||
@@ -84,6 +89,9 @@ private:
|
||||
UploadType type,
|
||||
Fn<void()> done);
|
||||
|
||||
[[nodiscard]] EmojiListData &emojiList(EmojiListType type);
|
||||
[[nodiscard]] const EmojiListData &emojiList(EmojiListType type) const;
|
||||
|
||||
const not_null<Main::Session*> _session;
|
||||
MTP::Sender _api;
|
||||
|
||||
@@ -101,9 +109,9 @@ private:
|
||||
not_null<UserData*>,
|
||||
not_null<PhotoData*>> _nonPersonalPhotos;
|
||||
|
||||
mtpRequestId _requestIdEmojiList = 0;
|
||||
rpl::variable<EmojiList> _profileEmojiList;
|
||||
rpl::variable<EmojiList> _groupEmojiList;
|
||||
EmojiListData _profileEmojiList;
|
||||
EmojiListData _groupEmojiList;
|
||||
EmojiListData _backgroundEmojiList;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ void Polls::create(
|
||||
|
||||
const auto history = action.history;
|
||||
const auto peer = history->peer;
|
||||
const auto topicRootId = action.replyTo.msgId
|
||||
const auto topicRootId = action.replyTo.messageId
|
||||
? action.replyTo.topicRootId
|
||||
: 0;
|
||||
auto sendFlags = MTPmessages_SendMedia::Flags(0);
|
||||
|
||||
@@ -17,6 +17,21 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "apiwrap.h"
|
||||
|
||||
namespace Api {
|
||||
namespace {
|
||||
|
||||
[[nodiscard]] GiftCode Parse(const MTPDpayments_checkedGiftCode &data) {
|
||||
return {
|
||||
.from = peerFromMTP(data.vfrom_id()),
|
||||
.to = data.vto_id() ? peerFromUser(*data.vto_id()) : PeerId(),
|
||||
.giveawayId = data.vgiveaway_msg_id().value_or_empty(),
|
||||
.date = data.vdate().v,
|
||||
.used = data.vused_date().value_or_empty(),
|
||||
.months = data.vmonths().v,
|
||||
.giveaway = data.is_via_giveaway(),
|
||||
};
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Premium::Premium(not_null<ApiWrap*> api)
|
||||
: _session(&api->session())
|
||||
@@ -183,6 +198,115 @@ void Premium::reloadCloudSet() {
|
||||
}).send();
|
||||
}
|
||||
|
||||
void Premium::checkGiftCode(
|
||||
const QString &slug,
|
||||
Fn<void(GiftCode)> done) {
|
||||
if (_giftCodeRequestId) {
|
||||
if (_giftCodeSlug == slug) {
|
||||
return;
|
||||
}
|
||||
_api.request(_giftCodeRequestId).cancel();
|
||||
}
|
||||
_giftCodeSlug = slug;
|
||||
_giftCodeRequestId = _api.request(MTPpayments_CheckGiftCode(
|
||||
MTP_string(slug)
|
||||
)).done([=](const MTPpayments_CheckedGiftCode &result) {
|
||||
_giftCodeRequestId = 0;
|
||||
|
||||
const auto &data = result.data();
|
||||
_session->data().processUsers(data.vusers());
|
||||
_session->data().processChats(data.vchats());
|
||||
done(updateGiftCode(slug, Parse(data)));
|
||||
}).fail([=](const MTP::Error &error) {
|
||||
_giftCodeRequestId = 0;
|
||||
|
||||
done(updateGiftCode(slug, {}));
|
||||
}).send();
|
||||
}
|
||||
|
||||
GiftCode Premium::updateGiftCode(
|
||||
const QString &slug,
|
||||
const GiftCode &code) {
|
||||
auto &now = _giftCodes[slug];
|
||||
if (now != code) {
|
||||
now = code;
|
||||
_giftCodeUpdated.fire_copy(slug);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
rpl::producer<GiftCode> Premium::giftCodeValue(const QString &slug) const {
|
||||
return _giftCodeUpdated.events_starting_with_copy(
|
||||
slug
|
||||
) | rpl::filter(rpl::mappers::_1 == slug) | rpl::map([=] {
|
||||
const auto i = _giftCodes.find(slug);
|
||||
return (i != end(_giftCodes)) ? i->second : GiftCode();
|
||||
});
|
||||
}
|
||||
|
||||
void Premium::applyGiftCode(const QString &slug, Fn<void(QString)> done) {
|
||||
_api.request(MTPpayments_ApplyGiftCode(
|
||||
MTP_string(slug)
|
||||
)).done([=](const MTPUpdates &result) {
|
||||
_session->api().applyUpdates(result);
|
||||
done({});
|
||||
}).fail([=](const MTP::Error &error) {
|
||||
done(error.type());
|
||||
}).send();
|
||||
}
|
||||
|
||||
void Premium::resolveGiveawayInfo(
|
||||
not_null<PeerData*> peer,
|
||||
MsgId messageId,
|
||||
Fn<void(GiveawayInfo)> done) {
|
||||
Expects(done != nullptr);
|
||||
|
||||
_giveawayInfoDone = std::move(done);
|
||||
if (_giveawayInfoRequestId) {
|
||||
if (_giveawayInfoPeer == peer
|
||||
&& _giveawayInfoMessageId == messageId) {
|
||||
return;
|
||||
}
|
||||
_api.request(_giveawayInfoRequestId).cancel();
|
||||
}
|
||||
_giveawayInfoPeer = peer;
|
||||
_giveawayInfoMessageId = messageId;
|
||||
_giveawayInfoRequestId = _api.request(MTPpayments_GetGiveawayInfo(
|
||||
_giveawayInfoPeer->input,
|
||||
MTP_int(_giveawayInfoMessageId.bare)
|
||||
)).done([=](const MTPpayments_GiveawayInfo &result) {
|
||||
_giveawayInfoRequestId = 0;
|
||||
|
||||
auto info = GiveawayInfo();
|
||||
result.match([&](const MTPDpayments_giveawayInfo &data) {
|
||||
info.participating = data.is_participating();
|
||||
info.state = data.is_preparing_results()
|
||||
? GiveawayState::Preparing
|
||||
: GiveawayState::Running;
|
||||
info.adminChannelId = data.vadmin_disallowed_chat_id()
|
||||
? ChannelId(*data.vadmin_disallowed_chat_id())
|
||||
: ChannelId();
|
||||
info.disallowedCountry = qs(
|
||||
data.vdisallowed_country().value_or_empty());
|
||||
info.tooEarlyDate
|
||||
= data.vjoined_too_early_date().value_or_empty();
|
||||
info.startDate = data.vstart_date().v;
|
||||
}, [&](const MTPDpayments_giveawayInfoResults &data) {
|
||||
info.state = data.is_refunded()
|
||||
? GiveawayState::Refunded
|
||||
: GiveawayState::Finished;
|
||||
info.giftCode = qs(data.vgift_code_slug().value_or_empty());
|
||||
info.activatedCount = data.vactivated_count().v;
|
||||
info.finishDate = data.vfinish_date().v;
|
||||
info.startDate = data.vstart_date().v;
|
||||
});
|
||||
_giveawayInfoDone(std::move(info));
|
||||
}).fail([=] {
|
||||
_giveawayInfoRequestId = 0;
|
||||
_giveawayInfoDone({});
|
||||
}).send();
|
||||
}
|
||||
|
||||
const Data::SubscriptionOptions &Premium::subscriptionOptions() const {
|
||||
return _subscriptionOptions;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,49 @@ class Session;
|
||||
|
||||
namespace Api {
|
||||
|
||||
struct GiftCode {
|
||||
PeerId from = 0;
|
||||
PeerId to = 0;
|
||||
MsgId giveawayId = 0;
|
||||
TimeId date = 0;
|
||||
TimeId used = 0; // 0 if not used.
|
||||
int months = 0;
|
||||
bool giveaway = false;
|
||||
|
||||
explicit operator bool() const {
|
||||
return months != 0;
|
||||
}
|
||||
|
||||
friend inline bool operator==(
|
||||
const GiftCode&,
|
||||
const GiftCode&) = default;
|
||||
};
|
||||
|
||||
enum class GiveawayState {
|
||||
Invalid,
|
||||
Running,
|
||||
Preparing,
|
||||
Finished,
|
||||
Refunded,
|
||||
};
|
||||
|
||||
struct GiveawayInfo {
|
||||
QString giftCode;
|
||||
QString disallowedCountry;
|
||||
ChannelId adminChannelId = 0;
|
||||
GiveawayState state = GiveawayState::Invalid;
|
||||
TimeId tooEarlyDate = 0;
|
||||
TimeId finishDate = 0;
|
||||
TimeId startDate = 0;
|
||||
int winnersCount = 0;
|
||||
int activatedCount = 0;
|
||||
bool participating = false;
|
||||
|
||||
explicit operator bool() const {
|
||||
return state != GiveawayState::Invalid;
|
||||
}
|
||||
};
|
||||
|
||||
class Premium final {
|
||||
public:
|
||||
explicit Premium(not_null<ApiWrap*> api);
|
||||
@@ -40,6 +83,19 @@ public:
|
||||
[[nodiscard]] int64 monthlyAmount() const;
|
||||
[[nodiscard]] QString monthlyCurrency() const;
|
||||
|
||||
void checkGiftCode(
|
||||
const QString &slug,
|
||||
Fn<void(GiftCode)> done);
|
||||
GiftCode updateGiftCode(const QString &slug, const GiftCode &code);
|
||||
[[nodiscard]] rpl::producer<GiftCode> giftCodeValue(
|
||||
const QString &slug) const;
|
||||
void applyGiftCode(const QString &slug, Fn<void(QString)> done);
|
||||
|
||||
void resolveGiveawayInfo(
|
||||
not_null<PeerData*> peer,
|
||||
MsgId messageId,
|
||||
Fn<void(GiveawayInfo)> done);
|
||||
|
||||
[[nodiscard]] auto subscriptionOptions() const
|
||||
-> const Data::SubscriptionOptions &;
|
||||
|
||||
@@ -71,6 +127,16 @@ private:
|
||||
int64 _monthlyAmount = 0;
|
||||
QString _monthlyCurrency;
|
||||
|
||||
mtpRequestId _giftCodeRequestId = 0;
|
||||
QString _giftCodeSlug;
|
||||
base::flat_map<QString, GiftCode> _giftCodes;
|
||||
rpl::event_stream<QString> _giftCodeUpdated;
|
||||
|
||||
mtpRequestId _giveawayInfoRequestId = 0;
|
||||
PeerData *_giveawayInfoPeer = nullptr;
|
||||
MsgId _giveawayInfoMessageId = 0;
|
||||
Fn<void(GiveawayInfo)> _giveawayInfoDone;
|
||||
|
||||
Data::SubscriptionOptions _subscriptionOptions;
|
||||
|
||||
};
|
||||
|
||||
@@ -78,12 +78,8 @@ void SendReport(
|
||||
MTP_string(comment)
|
||||
)).done(std::move(done)).send();
|
||||
}, [&](StoryId id) {
|
||||
const auto user = peer->asUser();
|
||||
if (!user) {
|
||||
return;
|
||||
}
|
||||
peer->session().api().request(MTPstories_Report(
|
||||
user->inputUser,
|
||||
peer->input,
|
||||
MTP_vector<MTPint>(1, MTP_int(id)),
|
||||
ReasonToTL(reason),
|
||||
MTP_string(comment)
|
||||
|
||||