Compare commits

...

278 Commits
v6.3.2 ... dev

Author SHA1 Message Date
Ilya Fedin
5739a37c7f Cache ThirdParty together with Libraries on macOS 2025-12-27 09:25:47 +04:00
Ilya Fedin
8639936e45 Remove depot_tools and yasm
They're actually unused
2025-12-27 09:25:47 +04:00
Ilya Fedin
89d9270ea6 Add six dependency required by gyp on macOS 2025-12-27 09:25:47 +04:00
Ilya Fedin
e52aa98a9f Switch service actions to ubuntu-slim 2025-12-26 14:11:29 +04:00
Ilya Fedin
af24830233 Fix Ctrl+, shortcut on Linux
Regression was introduced in 30819509d3
2025-12-26 14:11:14 +04:00
Ilya Fedin
bece15eaac Ensure patches aren't cleared up in actions
They're used by following steps
2025-12-23 04:52:00 +03:00
John Preston
e762ec4631 Beta version 3.6.10.
- Fix user info showing from large group messages.
- Fix sent state of outgoing messages in forums.
- Show who sent your unique collectible gifts.
- Update Qt on all platforms.
2025-12-22 22:29:56 +04:00
23rd
7341c05d36 Added initial ability to translate admin log entries. 2025-12-22 22:29:38 +04:00
23rd
b1bf68b830 Added simple tooltip to fromPhoto element in view messages.
Fixed #773.
2025-12-22 22:29:38 +04:00
Ilya Fedin
1a071c5c6b Ensure prepare.py cache keys aren't cleared in actions 2025-12-22 22:01:39 +04:00
Ilya Fedin
6de7e7f4a8 Cherry-pick a jpegli fix for DHT marker 2025-12-22 18:37:54 +04:00
John Preston
632a14e65a Update lib_ui for updated Qt. 2025-12-22 17:57:40 +04:00
John Preston
321576658f Show gift sender badge. 2025-12-22 17:56:56 +04:00
John Preston
fac241b87e Return some of getDifference on unknown peers. 2025-12-22 17:56:56 +04:00
John Preston
39bd52c1e2 Fix crash in bot chat userpic right click. 2025-12-22 17:56:56 +04:00
John Preston
e55f394db5 Fix updating access hash, fix userpic loading. 2025-12-22 17:56:56 +04:00
John Preston
00d7eeb742 Fix chat row update when message is sent. 2025-12-22 17:56:55 +04:00
John Preston
bcfa106959 Show max 3 joined by invite link. 2025-12-22 17:56:55 +04:00
John Preston
fe3c545455 Fix controls disappearing in group calls. 2025-12-22 17:56:55 +04:00
John Preston
885d431d65 Fix text selection in topic webpage/collapsed-quote. 2025-12-22 17:56:55 +04:00
John Preston
a103047e03 Attempt to fix topic draft saving. 2025-12-22 17:56:55 +04:00
John Preston
b04866a2fc Fix video metadata rotation reading. 2025-12-22 17:56:55 +04:00
John Preston
28434f4bee Full support and build fix. 2025-12-22 17:56:55 +04:00
John Preston
53324d5494 Initial support for min-user-from-message request. 2025-12-22 17:56:55 +04:00
23rd
66645ce523 Fixed local storage of user photos when previous userpic set as main. 2025-12-22 17:56:55 +04:00
23rd
06caf65a6a Fixed local storage of user photos when userpic was uploaded. 2025-12-22 17:56:55 +04:00
23rd
5026b07626 Added ability to replace user photo entry in storage. 2025-12-22 17:56:55 +04:00
23rd
8cfa722966 Fixed local storage of user photos when self userpic was deleted. 2025-12-22 17:56:55 +04:00
23rd
f31337ecb5 Improved style of box for denied unconfirmed authentications. 2025-12-22 17:56:55 +04:00
23rd
f468666973 Moved out creation of lottie icon in circle to single place. 2025-12-22 17:56:55 +04:00
23rd
590421daaa Added name of single passkey to right label in privacy settings. 2025-12-22 17:56:55 +04:00
23rd
e1248ba0b2 Fixed left padding of text in resolving phone menu item. 2025-12-22 17:56:55 +04:00
23rd
89b15142ef Returned button for topics list to profile info. 2025-12-22 17:56:55 +04:00
23rd
57b22d2ad2 Added accounts list to dock menu on macOS. 2025-12-22 17:56:54 +04:00
23rd
d51dd1cdb5 Fixed verified icon and gift status together in profile top bar. 2025-12-22 17:56:54 +04:00
23rd
6418af0ada Improved division by zero in photo editor stroke rendering calculations. 2025-12-22 17:56:54 +04:00
Ilya Fedin
08d6e8c7eb Update Qt
6.10.0 -> 6.10.1
6.2.12 -> 6.2.13
5.15.17 -> 5.15.18
2025-12-22 17:53:10 +04:00
dependabot[bot]
cf7ae1adf2 Bump actions/upload-artifact from 5 to 6
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 15:10:45 +04:00
dependabot[bot]
691f796df6 Bump actions/cache from 4 to 5
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 15:09:52 +04:00
dependabot[bot]
2775074113 Bump dessant/lock-threads from 5 to 6
Bumps [dessant/lock-threads](https://github.com/dessant/lock-threads) from 5 to 6.
- [Release notes](https://github.com/dessant/lock-threads/releases)
- [Changelog](https://github.com/dessant/lock-threads/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dessant/lock-threads/compare/v5...v6)

---
updated-dependencies:
- dependency-name: dessant/lock-threads
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 15:08:55 +04:00
Ilya Fedin
bf9014342c More aggressive libraries clean up in macOS action 2025-12-22 14:00:18 +04:00
Ilya Fedin
fb9a456b59 More aggressive libraries clean up in Windows action 2025-12-22 14:00:18 +04:00
Ilya Fedin
e36e52fd9e Disable debug symbols in Windows action 2025-12-22 14:00:18 +04:00
Ilya Fedin
f076793fa6 Revert "Keep only one Windows action run"
This reverts commit 0116f098f8.
2025-12-22 14:00:18 +04:00
Ilya Fedin
0116f098f8 Keep only one Windows action run
This decreases the queue and fits cache in 10 GB
2025-12-18 22:16:53 +04:00
Ilya Fedin
fc728e7a13 Disable debug symbols in macOS action 2025-12-18 22:16:53 +04:00
Ilya Fedin
5114c9a58e Revert "Free more disk space in mac action"
This reverts commit ccf6a3fb97.
2025-12-18 22:16:53 +04:00
Ilya Fedin
3bd896b8fa Authorize getting WebRTC version in macOS packaged action
It gets rate limited otherwise...
2025-12-18 22:16:53 +04:00
Ilya Fedin
dddefc3904 Move WebRTC version before general cache key
That's more logical
2025-12-18 22:16:53 +04:00
Ilya Fedin
fc0cbaadd5 Separate action artifact flavor with space 2025-12-18 22:16:53 +04:00
John Preston
6b862688cb Show all variants when clicking on percents. 2025-12-18 21:17:07 +04:00
John Preston
767eedaa76 Fix the cover in unique variants previews. 2025-12-18 21:17:07 +04:00
John Preston
1578c3c09d Fix glitching unique variants previews. 2025-12-18 21:17:07 +04:00
John Preston
9496ebd19e Remove AddFullWidthButton helper. 2025-12-18 21:17:07 +04:00
John Preston
1ea2d936b5 Fix crash in Settings in Windows on ARM. 2025-12-17 13:01:54 +04:00
23rd
6ce7641971 Replaced WebAuthn dll loading with SafeLoadLibrary on Windows. 2025-12-16 17:09:13 +03:00
23rd
98f5247126 Fixed full recreation of pattern bg while scroll reactions settings. 2025-12-16 14:31:34 +03:00
23rd
bf36718c93 Fixed full recreation of pattern bg while scroll notifications settings. 2025-12-16 14:29:28 +03:00
23rd
11c193b699 Improved cache quality of animated emoji in reactions settings box. 2025-12-16 12:35:05 +03:00
23rd
5c1604fc53 Fixed cache of graphs in chart widgets on retina. 2025-12-16 11:46:36 +03:00
23rd
4c545181ad Fixed display of resolving phone menu item with increased round radius. 2025-12-16 11:17:42 +03:00
23rd
5ee8100274 Added date of saved forwards to tooltip. 2025-12-16 11:17:42 +03:00
23rd
86351f48d6 Fixed display of forwarded messages from self to self. 2025-12-16 11:17:42 +03:00
23rd
6996e410d5 Fixed empty userpic in history top bar for sublist with hidden author. 2025-12-16 11:17:42 +03:00
23rd
5d6994f170 Removed outdated 1000-member limit for channel deletion. 2025-12-16 04:26:32 +03:00
John Preston
beb4fafdf3 Version 6.3.9.
- Fix possible crash in audio playback speed menu.
- Fix possible crash in forum or bot topic deletion.
2025-12-15 22:51:14 +04:00
John Preston
3e22cb6d0a Fix crash in media playback speed dropdown.
Fixes #30111.
2025-12-15 21:40:55 +04:00
John Preston
849def7e75 Don't disable dice/slots animation. 2025-12-15 21:40:54 +04:00
John Preston
1a4195f7e2 Fix possible crash on topic deletion. 2025-12-15 21:40:54 +04:00
John Preston
0b4a718afe Don't re-create topic when clearing its messages. 2025-12-15 21:40:54 +04:00
John Preston
b53ca51d37 Fix crash on topic icon emoji without title. 2025-12-15 21:40:54 +04:00
John Preston
60c9707a64 Fix incorrect reporting of gift as channel's. 2025-12-15 21:40:54 +04:00
John Preston
08a979e638 Use more simple tr::... text helpers. 2025-12-15 21:40:54 +04:00
John Preston
629158fedb Fix crash in bad attach bots parsing. 2025-12-15 21:40:54 +04:00
John Preston
f15e99ce1d Don't check payment when editing a message. 2025-12-15 21:40:53 +04:00
23rd
18f9c040e0 Removed obsolete code that prevented menu from inactive window on macOS. 2025-12-15 21:40:53 +04:00
23rd
7f6baa0fdc Added right press-move-release gesture to menu on Unix systems.
Fixed #29826.
Fixed #10366.
2025-12-15 21:40:53 +04:00
23rd
bb9a112677 Fixed unnecessary recreation of fireworks in history view todo list. 2025-12-15 21:40:53 +04:00
23rd
7952d2688e Slightly improved animation of personal channel when it is removed. 2025-12-15 21:40:53 +04:00
23rd
0f41fd1356 Added ability to remove personal channel from your profile section. 2025-12-15 21:40:53 +04:00
23rd
8c3a8a7d20 Added ability set currently opened channel as personal from info menu. 2025-12-15 21:40:53 +04:00
John Preston
dbbe4b9398 Version 6.3.8. (Linux only)
- Fix crash on older Linux.
2025-12-15 16:40:41 +04:00
John Preston
e0b0f00621 Version 6.3.7: Fix build with GCC. 2025-12-15 16:18:32 +04:00
John Preston
516d6cf11e Version 6.3.7.
- Fix login with passkey visibility on Windows.
- Improve gift upgrading experience.
2025-12-14 16:03:36 +04:00
Reza Bakhshi Laktasaraei
673db168ac Feat: Set accessibility name for Main menu toggle and add related strings. 2025-12-14 16:03:23 +04:00
John Preston
496e96d00a Fix currency icon in channel post offers. 2025-12-14 16:02:52 +04:00
John Preston
88fdc16070 Don't allow free buy gift offers. 2025-12-14 16:02:51 +04:00
23rd
df98cdb127 Fixed build on Windows and Linux. 2025-12-14 12:54:55 +03:00
23rd
68b245c3d6 Removed button from dialogs widget when dialogs are empty in archive. 2025-12-14 10:39:10 +03:00
John Preston
0248c8d8c0 Increase gift upgrade animation speed. 2025-12-13 14:05:50 +04:00
John Preston
3ac517b716 Fix build with GCC. 2025-12-13 14:03:02 +04:00
John Preston
8414c3e382 Put keyboard buttons above outside reactions. 2025-12-13 13:35:56 +04:00
23rd
9f8dc1d7d3 Fixed opening details of upgraded and transferred star gift. 2025-12-13 13:35:56 +04:00
23rd
56927d2780 Fixed string name and value matching in table during gift upgrade. 2025-12-13 13:35:56 +04:00
23rd
a027284826 Added voices to SMTC.
Fixed #28915.
2025-12-13 13:35:56 +04:00
23rd
e0159c32cc Returned display of button in box for passkey creation when unsupported. 2025-12-13 13:35:56 +04:00
23rd
9cc30741d9 Attempted once again to improve status color with dark theme in profile.
Previous related commit: 7a75c80b27.
2025-12-13 13:35:56 +04:00
23rd
863752e974 Added invalidation gift button background cache on palette changes. 2025-12-13 13:35:56 +04:00
23rd
cb76031165 Fixed fade color of animated attribute while upgrading gift. 2025-12-13 13:35:55 +04:00
23rd
c45cf07b06 Fixed text color of peer value in table on palette change. 2025-12-13 13:35:55 +04:00
23rd
d35d425918 Fixed display of ToS link to any box of gifts with empty credits. 2025-12-12 22:22:56 +04:00
23rd
d4a3a53484 Simplified ability to enable all reactions in channels. 2025-12-12 22:22:55 +04:00
John Preston
5d90b12a08 Fix blockquotes without skip block optimal size. 2025-12-12 21:40:08 +04:00
John Preston
e3ce190f4e Use real upgrade code instead of testing. 2025-12-12 21:09:22 +04:00
John Preston
ffd50c5582 Finish upgrading gifts animation. 2025-12-12 20:53:38 +04:00
John Preston
c758f05a7a Finish gift upgrade cover animation. 2025-12-12 17:43:21 +04:00
John Preston
9263c08068 Started the gift upgrade animation. 2025-12-12 14:59:44 +04:00
John Preston
703f77ac93 Upgrade gift while staying in the same box. 2025-12-11 22:25:43 +04:00
John Preston
32bdb5a519 Don't show gift value box twice. 2025-12-11 10:49:37 +04:00
John Preston
d8484a7b2b Update cmake_helpers. 2025-12-11 10:48:07 +04:00
23rd
eca8dfb0ec Renamed rpl::start_with_ with rpl::on_. 2025-12-10 21:28:33 +03:00
23rd
29b714dd5f Used fallback name for passkeys without name in list from settings. 2025-12-10 20:46:56 +03:00
23rd
3f3b2cb2ba Fixed display of passkey button in privacy settings section. 2025-12-10 20:46:56 +03:00
John Preston
c31d9ded27 No price decrease countdown for free upgrades. 2025-12-10 14:27:34 +04:00
John Preston
03df5b8546 rpl::type_erased() -> rpl::type_erased. 2025-12-10 14:27:05 +04:00
John Preston
03e1e5cca9 Fix login with passkey link display. 2025-12-10 14:26:09 +04:00
John Preston
10d5cc0d24 Fix appConfig refresh on DC change. 2025-12-10 14:10:55 +04:00
John Preston
506c8ff73c Don't show upgrade costs for free upgrades. 2025-12-10 13:38:54 +04:00
John Preston
924e9a21b5 Don't offer View Profile / Send Message in private chat. 2025-12-10 12:30:42 +04:00
John Preston
2f528a9853 Fix seconds phrase for auctions. 2025-12-10 12:09:06 +04:00
23rd
7f58650794 Added preview of reaction to posts on right click. 2025-12-10 09:47:48 +03:00
23rd
b9a109c146 Added ability to set custom animation duration for MediaPreviewWidget. 2025-12-10 09:47:48 +03:00
23rd
9fb4f4b556 Fixed display of original date with nearest days in self. 2025-12-10 09:47:48 +03:00
23rd
52d78ef724 Increased round radius for popup menu. 2025-12-10 09:47:48 +03:00
23rd
7ce7b88a40 Implemented adaptive drawing algorithm with smoothing in image editor.
- Adaptive point filtering - zoom-based minimum distance (3px / zoom)
  prevents point overflow during fast movements.

- Speed-based pressure simulation - exponential smoothing (decay 0.95)
  creates variable line thickness: pressure = clamp(1.0 - speed * 0.1).

- Two-pass
  weighted averaging - smoothed = current * 0.5 + neighbors * 0.25
  eliminates jagged lines while preserving initial direction.

- Incremental rendering with 3-point overlap - draws only new segments,
  reduces complexity from O(n^2) to O(n).

- QPainterPath with quadratic Bezier curves - single fillPath() call
  instead of multiple drawEllipse().
2025-12-10 09:47:48 +03:00
23rd
4a43dfd091 Added profile color support to calls panel. 2025-12-10 09:47:48 +03:00
23rd
52cc76636c Moved out verify details below app button when it is presented in info. 2025-12-10 09:47:48 +03:00
23rd
f0a3ddb184 Fixed phrase in menu item to share gift collection. 2025-12-10 09:47:48 +03:00
23rd
b172c9a3b2 Added check for empty proxy list before showing delete all menu item. 2025-12-10 09:47:48 +03:00
Ilya Fedin
6cfda1dd43 Use gi::object_cast 2025-12-10 10:43:28 +04:00
Ilya Fedin
2ae31f7285 Support crashpad_handler in packaged mode 2025-12-09 13:46:07 +04:00
Ilya Fedin
412c06160a Fix setting Breakpad framework path with non-Xcode generators 2025-12-09 13:45:31 +04:00
Ilya Fedin
c27c47dd52 Set M_ARENA_MAX earlier
It doesn't work properly with auto-updatable builds otherwise
2025-12-09 12:36:12 +04:00
Ilya Fedin
6ea30feb18 Attach malloc_trim lifetime to LinuxIntegration 2025-12-09 12:36:12 +04:00
Ilya Fedin
a7be550550 Fix packaged build with Updater on macOS 2025-12-09 12:35:51 +04:00
Ilya Fedin
a279f0a296 Attempt to fix cache key instability in macOS packaged and Linux actions 2025-12-09 12:33:21 +04:00
John Preston
1c4f663941 Version 6.3.6.
- Fix crash in media viewer.
- Fix crash in experimental settings.
2025-12-06 00:07:39 +04:00
John Preston
94f9321db9 Fix crash in experimental settings opening. 2025-12-06 00:05:31 +04:00
John Preston
ae70b10cea Fix crash in media viewer. 2025-12-05 23:58:08 +04:00
John Preston
4f685552e7 Version 6.3.5.
- Offer stars or TON for unique gifts.
- Preview gift auctions before they start.
- Support passkey login on Windows.
2025-12-05 23:11:53 +04:00
John Preston
e085a76165 Fix build with GCC. 2025-12-05 23:11:32 +04:00
23rd
30bd3ed013 Removed WebAuthn support from entitlements. 2025-12-05 23:11:32 +04:00
23rd
25edab4c94 Fixed build with Xcode. 2025-12-05 23:11:32 +04:00
23rd
3aa241d825 Removed WebAuthn support for macOS for now. 2025-12-05 23:11:32 +04:00
John Preston
9b867af7fd Use known gift number in some places. 2025-12-05 20:11:54 +04:00
John Preston
0df3be8630 Use better ratio stars/usd/ton. 2025-12-05 20:11:54 +04:00
John Preston
542326af8f Show offer value diff percent. 2025-12-05 20:11:54 +04:00
John Preston
ea5052e69e Add "Ban Users" channel admin right. 2025-12-05 20:11:54 +04:00
John Preston
2dd96b2269 Better phrases for upcoming auctions. 2025-12-05 20:11:54 +04:00
John Preston
627152e2a9 Nice gifts promo box. 2025-12-05 20:11:54 +04:00
John Preston
f01c93ed58 Update API scheme on layer 220. 2025-12-05 20:11:54 +04:00
John Preston
6fe61ed58a Add gifts premium promo. 2025-12-05 20:11:54 +04:00
John Preston
43347f671c Show rarity in gift variants preview. 2025-12-05 20:11:54 +04:00
John Preston
0b67fa65f2 Full upgradable variants preview. 2025-12-05 20:11:54 +04:00
John Preston
65b3a36984 Implement upcoming auction preview box. 2025-12-05 20:11:54 +04:00
John Preston
b08cf75f0b Start auction preview display. 2025-12-05 20:11:54 +04:00
John Preston
0cc21e5ca2 Update API scheme on layer 220. 2025-12-05 20:11:54 +04:00
John Preston
48f9a92cc3 Improve Checkbox / Button accessibility. 2025-12-05 20:11:54 +04:00
John Preston
939882ef68 Show profile design gift wear promo. 2025-12-05 20:11:54 +04:00
John Preston
52084cf0ae Apply correct min/max offer values. 2025-12-05 20:11:54 +04:00
John Preston
f06f654191 Confirm making an offer. 2025-12-05 20:11:53 +04:00
John Preston
356d20542e Use nice radius in offer with buttons. 2025-12-05 20:11:53 +04:00
John Preston
31ea4cfe80 Process offers with accept / reject. 2025-12-05 20:11:53 +04:00
John Preston
1e89ee4e50 Show Reject/Accept buttons for offers. 2025-12-05 20:11:53 +04:00
John Preston
6fccbf036c Rename HistoryMessage[SuggestedPost->Suggestion]. 2025-12-05 20:11:53 +04:00
John Preston
41d206e354 Rename SuggestPostOptions to SuggestOptions. 2025-12-05 20:11:53 +04:00
John Preston
23880ac6c1 Update API scheme to layer 220.
Allow offering to buy gifts.
2025-12-05 20:11:53 +04:00
John Preston
4439cbf553 Pass effect_id to forward message requests. 2025-12-05 20:11:53 +04:00
23rd
f506f1b830 Added read availability of passkeys from appConfig. 2025-12-05 20:11:53 +04:00
23rd
feb1ea6502 Wrapped text recognition on macOS with experimental toggle. 2025-12-05 20:11:53 +04:00
23rd
fea80b4919 Wrapped passkeys on macOS with experimental toggle due to instability. 2025-12-05 20:11:53 +04:00
23rd
373bb8d74c Improved display of ripple on release in buttons from subsection tabs. 2025-12-05 20:11:53 +04:00
23rd
3ddefd78ba Fixed display of tabbed selector on installed set for read-only peers. 2025-12-05 20:11:53 +04:00
23rd
d62e4da163 Added simple cache of recognized text to media view overlay. 2025-12-05 20:11:53 +04:00
23rd
8c60863e11 Added ability to copy recognized text from media view overlay. 2025-12-05 20:11:53 +04:00
23rd
d5be8c8989 Added initial ability to recognize text to media view overlay. 2025-12-05 20:11:53 +04:00
23rd
255b30e88a Added initial implementation of text recognition for macOS. 2025-12-05 20:11:53 +04:00
23rd
d2dd124be0 Added dummy platform files for text recognition. 2025-12-05 20:11:53 +04:00
23rd
1053b30a6d Added api support for max count of passkeys for accounts. 2025-12-05 18:15:54 +04:00
23rd
e7c1073e13 Added initial error handler to passkeys processing. 2025-12-05 18:15:54 +04:00
23rd
0480c6a4af Added initial ability to login with passkey. 2025-12-05 18:15:54 +04:00
23rd
c70a49c0f3 Added initial api support to login with passkey. 2025-12-05 18:15:54 +04:00
John Preston
7840fd481a Use correct icon for passkey in Settings. 2025-12-05 18:15:54 +04:00
23rd
2a8b491c95 Replaced pure text with Text::String in list of passkeys in settings. 2025-12-05 18:15:54 +04:00
23rd
39c4344047 Added divider with description to section of settings for passkeys. 2025-12-05 18:15:54 +04:00
23rd
cdb58e4ebd Added button for new passkeys to section of settings. 2025-12-05 18:15:54 +04:00
23rd
972325fb6d Added menu to simple list of passkeys in section of settings. 2025-12-05 18:15:54 +04:00
23rd
933b6bedc9 Added icons to simple list of passkeys in section of settings. 2025-12-05 18:15:54 +04:00
23rd
2db8a5d00a Added initial simple list of passkeys to section of settings. 2025-12-05 18:15:54 +04:00
23rd
be043ea349 Added initial api support to delete passkey. 2025-12-05 18:15:54 +04:00
23rd
e531abf31b Added header with lottie to section of settings for passkeys. 2025-12-05 18:15:54 +04:00
23rd
a6af680e59 Added initial entry point to section of settings for passkeys. 2025-12-05 18:15:54 +04:00
23rd
8292334c9b Moved out Settings::Passkeys class from header. 2025-12-05 18:15:54 +04:00
23rd
f20c5a1d3c Added initial box as entry point for passkey creation. 2025-12-05 18:15:53 +04:00
23rd
d1e2ec0309 Added initial api support to request of passkeys for account. 2025-12-05 18:15:53 +04:00
23rd
fe91cae8bc Added initial api support to register passkey. 2025-12-05 18:15:53 +04:00
23rd
7bb30bc4a8 Added initial dummy files for component of passkeys. 2025-12-05 18:15:53 +04:00
23rd
2d41d5903b Added initial dummy files for settings section of passkeys. 2025-12-05 18:15:53 +04:00
23rd
df672ffaf5 Added phrases for settings section of passkeys. 2025-12-05 18:15:53 +04:00
23rd
cb100623fb Added initial macOS API support for passkeys. 2025-12-05 18:15:53 +04:00
23rd
30ef7270b3 Added initial Win API support for passkeys. 2025-12-05 18:15:53 +04:00
23rd
91694a69eb Added initial implementation of deserialization data for passkeys. 2025-12-05 18:15:53 +04:00
23rd
cb07bcf0db Added initial dummy platform files for passkeys. 2025-12-05 18:15:53 +04:00
23rd
a31e384409 Added dummy files for credential data of passkeys. 2025-12-05 18:15:53 +04:00
John Preston
4829c6d028 Update API scheme to layer 219. 2025-12-05 18:15:53 +04:00
Ilya Fedin
ccf6a3fb97 Free more disk space in mac action 2025-12-05 09:58:57 +04:00
Ilya Fedin
2005814fca Actually free space in macOS action
Looks like the command was broken all the time but it was unnoticable due to `|| true`
2025-12-05 09:58:57 +04:00
Ilya Fedin
7319665bda Free more disk space in snap action 2025-12-05 09:58:57 +04:00
Ilya Fedin
d74074a21b Stop creating empty TCP log 2025-12-01 19:39:47 +04:00
John Preston
113115f58c Fix selecting gifts for a collection. 2025-12-01 12:20:33 +04:00
John Preston
e84799283d Simplify and fix link wrapping. 2025-12-01 12:20:33 +04:00
John Preston
71272ed2ec Improve view of finished auctions. 2025-12-01 11:38:35 +04:00
Ilya Fedin
6787c338ac Fix Russian bounds
No way it occupies 360° of latitude
2025-12-01 11:30:47 +04:00
Ilya Fedin
774a44ac7e Stop using geocode-glib
It doesn't seem to work properly anymore, it ignores the passed location doing reversed geocoding based on GeoIP only
2025-12-01 11:30:47 +04:00
23rd
29cdd358cc Added regional English/Portuguese spell check support for macOS. 2025-11-29 09:42:12 +03:00
23rd
b9b1bd5e58 Improved once again display of original date in self.
Related commits are 417d151f2c and cbc03d1e45.
2025-11-29 09:17:39 +03:00
23rd
59814aaeb0 Added ability to view stories anonymously from info stories section. 2025-11-29 09:04:42 +03:00
23rd
fd52b3c23b Fixed once again unwanted reset filter on creation of tabs strip.
Regression was introduced in c0bbb669e0.
2025-11-29 08:27:45 +03:00
John Preston
6e75a41ee6 Version 6.3.4: Fix build with Xcode. 2025-11-26 16:44:09 +04:00
John Preston
84266aef2c Version 6.3.4.
- Show active auctions above chats list.
- Add star sending effects in live stories.
- Fix back button in group member profile view.
- Export separate topics message history.
- Export audio files saved to profile.
- Many different crash fixes.
2025-11-26 14:58:32 +04:00
John Preston
40a7f8ea50 Try allowing only tab-focus for screen readers. 2025-11-26 14:57:35 +04:00
John Preston
7c4fcdd9cb Update emoji to Unicode 16. 2025-11-26 14:48:16 +04:00
John Preston
92e87852c1 Fix top bar title/subtitle in saved messages.
Fixes #30018.
2025-11-26 13:27:32 +04:00
John Preston
73c4da2b21 Show '+' to the right of all bids. 2025-11-26 13:01:15 +04:00
23rd
9f4da7e890 Added button for profile color to settings information section. 2025-11-26 05:37:09 +03:00
23rd
8b23457373 Fixed display of verified icon in box from web bot preview.
Regression was introduced in e7fa330215.
2025-11-26 05:30:38 +03:00
23rd
ab2fd7c749 Once again fixed position of tag preview in chats filter settings.
Previous related commit 512e6de39b.
2025-11-26 05:20:23 +03:00
John Preston
040a6ddf3a Fix build with MSVC. 2025-11-25 21:34:26 +04:00
John Preston
55afe0912f Add screen reader state logging. 2025-11-25 21:28:57 +04:00
23rd
ee48127094 Added send small button to box of entry from credits earn history. 2025-11-25 20:01:09 +03:00
23rd
445576d568 Added ToS link to any box of entry from credits earn history. 2025-11-25 18:59:47 +03:00
23rd
8f1d40892e Added info of limited gifts to box of entry from credits earn history. 2025-11-25 18:59:47 +03:00
23rd
766db9660c Swap name of sender and subtext for paid messages in earn history list. 2025-11-25 18:59:47 +03:00
23rd
68665ec1f2 Added phrase for paid reactions of live stories to credits earn history. 2025-11-25 18:59:47 +03:00
John Preston
b400964aa1 Don't allow admin to send stars in streams. 2025-11-25 19:37:26 +04:00
John Preston
317530cfa3 Attempt to fix audio cracks in streams. 2025-11-25 19:37:10 +04:00
John Preston
e8fba23b59 Don't allow sending stars from stream admin. 2025-11-25 19:05:55 +04:00
John Preston
ef749e695e Show nice layout of stars-only messages. 2025-11-25 18:30:09 +04:00
John Preston
712ef33d6b Submit custom bid with Enter. 2025-11-25 17:50:25 +04:00
John Preston
0441b7dbc3 Show star senders in live stories. 2025-11-25 17:50:25 +04:00
23rd
3ee0dcbacd Provided topic name to export controller for topic history. 2025-11-25 06:19:41 +03:00
23rd
57411b962f Added initial ability to export topic history. 2025-11-25 06:19:34 +03:00
23rd
4eee00d95e Added forwarded_from_id field to json export for forwarded messages. 2025-11-25 06:14:06 +03:00
23rd
957a08962f Added dark theme to exported html. 2025-11-25 06:14:06 +03:00
23rd
21c82f5fe1 Added ability to view stories anonymously from context menu. 2025-11-25 06:14:06 +03:00
23rd
27964993f6 Added safe guard to userpic in peer qr box. 2025-11-25 06:14:06 +03:00
John Preston
14e296e1f9 Improve layout of about auction box. 2025-11-24 22:06:55 +04:00
John Preston
23c0ff934f Skip premium badge for Saved Messages. 2025-11-24 22:01:56 +04:00
John Preston
c64ef1e20e Allow transfering gifts without premium. 2025-11-24 21:04:51 +04:00
John Preston
ed97619c6c Guard by widget instead of session. 2025-11-24 19:22:20 +04:00
23rd
924ec592b1 Improved paint with ready full peer before animation in profile top bar. 2025-11-24 18:18:13 +03:00
23rd
669c581701 Added dummy filler to PeerQrBox when result link is empty. 2025-11-24 17:46:49 +03:00
23rd
e97ae3d537 Fixed display of QR button in info profile when no usernames. 2025-11-24 17:46:49 +03:00
23rd
08800b68f4 Slightly improved subtext for topic link in info profile. 2025-11-24 17:46:49 +03:00
23rd
a59db6529c Added default guarded callback for simple QR box for peer username. 2025-11-24 17:46:49 +03:00
dependabot[bot]
02a54ceea6 Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 17:59:24 +04:00
John Preston
f0a7c547e8 Add safe check for strange click reports. 2025-11-24 17:51:42 +04:00
John Preston
ecfb343690 Fix crash in going from saved music to a chat. 2025-11-24 17:38:54 +04:00
John Preston
c65472c9b3 Add more assertions to find a problem. 2025-11-24 17:27:29 +04:00
John Preston
c42864d35e Fix crash in several video removed from video call. 2025-11-24 17:08:10 +04:00
John Preston
b02ce599e6 Fix possible crash in usernames order saving. 2025-11-24 14:47:14 +04:00
John Preston
1ae5495b91 Add some more assertions for subsection tabs. 2025-11-24 14:20:10 +04:00
John Preston
c4fbb8c199 Fix possible crash in group call box closing. 2025-11-24 14:19:37 +04:00
John Preston
313872dacc Fix crash in live location message destruction. 2025-11-24 12:23:13 +04:00
John Preston
ef15136a3b Fix possible crash in conference box closing. 2025-11-24 10:12:38 +04:00
John Preston
4342c8d761 Fix Live stories display without OpenGL. 2025-11-24 09:59:34 +04:00
23rd
644744ac9e Improved phrase of original date in self. 2025-11-23 18:29:01 +03:00
23rd
cbc03d1e45 Fixed display of original date in self when original sender is hidden. 2025-11-23 18:13:34 +03:00
23rd
7f56192b97 Fixed handler of login email in intro section.
This occurs both log in with setting up of login email
and log in by code from login email (set before).
2025-11-23 16:25:01 +03:00
23rd
6590f3b741 Added simple handle of EMAIL_NOT_SETUP error from email login section. 2025-11-23 16:25:01 +03:00
23rd
c0bbb669e0 Fixed unwanted switching to default filter on creation of tabs strip. 2025-11-23 16:25:01 +03:00
23rd
63014adfef Fixed rpl trigger for back button in profile top bar. 2025-11-23 16:25:01 +03:00
23rd
1ad055c8c8 Updated libiconv to v1.18. 2025-11-22 12:36:36 +03:00
John Preston
9b558564e9 Show my place correctly. 2025-11-21 21:26:44 +04:00
John Preston
476e66d027 Version 6.3.3: Fix build with Xcode. 2025-11-21 20:37:46 +04:00
John Preston
fc11d81673 Version 6.3.3.
- Some more improvements for gift auctions.
2025-11-21 19:07:31 +04:00
John Preston
629754a353 Correctly track emoji pausing in suggestions bar. 2025-11-21 19:05:02 +04:00
John Preston
147dbee051 Implement active auctions chats list bar. 2025-11-21 18:58:03 +04:00
892 changed files with 20384 additions and 9623 deletions

View File

@@ -60,7 +60,7 @@ rpl::lifetime &parentLifetime = /* ... get lifetime from context ... */;
To consume values from a producer, you start a pipeline using one of the `rpl::start_...` methods. These methods subscribe to the producer and execute callbacks for the events they handle.
The most common method is `rpl::start_with_next`:
The most common method is `rpl::on_next`:
```cpp
auto counter = /* ... */; // Type: rpl::producer<int>
@@ -69,20 +69,20 @@ rpl::lifetime lifetime;
// Counter is consumed here, use std::move if it's an l-value.
std::move(
counter
) | rpl::start_with_next([=]\(int nextValue) {
) | rpl::on_next([=]\(int nextValue) {
// Process the next integer value emitted by the producer.
qDebug() << "Received: " << nextValue;
}, lifetime); // Pass the lifetime to manage the subscription.
// Note: `counter` is now in a moved-from state and likely invalid.
// If you need to start the same producer multiple times, duplicate it:
// rpl::duplicate(counter) | rpl::start_with_next(...);
// rpl::duplicate(counter) | rpl::on_next(...);
// If you DON'T pass a lifetime to a start_... method:
auto counter2 = /* ... */; // Type: rpl::producer<int>
rpl::lifetime subscriptionLifetime = std::move(
counter2
) | rpl::start_with_next([=]\(int nextValue) { /* ... */ });
) | rpl::on_next([=]\(int nextValue) { /* ... */ });
// The returned lifetime MUST be stored. If it's discarded immediately,
// the subscription stops instantly.
// `counter2` is also moved-from here.
@@ -98,7 +98,7 @@ rpl::lifetime lifetime;
// If it's the only use, std::move(dataStream) would be preferred.
rpl::duplicate(
dataStream
) | rpl::start_with_error([=]\(Error &&error) {
) | rpl::on_error([=]\(Error &&error) {
// Handle the error signaled by the producer.
qDebug() << "Error: " << error.text();
}, lifetime);
@@ -106,7 +106,7 @@ rpl::duplicate(
// Using dataStream again, perhaps duplicated again or moved if last use.
rpl::duplicate(
dataStream
) | rpl::start_with_done([=] {
) | rpl::on_done([=] {
// Execute when the producer signals it's finished emitting values.
qDebug() << "Stream finished.";
}, lifetime);
@@ -114,7 +114,7 @@ rpl::duplicate(
// Last use of dataStream, so we move it.
std::move(
dataStream
) | rpl::start_with_next_error_done(
) | rpl::on_next_error_done(
[=]\(QString &&value) { /* handle next value */ },
[=]\(Error &&error) { /* handle error */ },
[=] { /* handle done */ },
@@ -169,7 +169,7 @@ You can combine multiple producers into one:
// The lambda receives unpacked arguments, not the tuple itself.
std::move(
combined
) | rpl::start_with_next([=]\(int count, const QString &text) {
) | rpl::on_next([=]\(int count, const QString &text) {
// No need for std::get<0>(latest), etc.
qDebug() << "Combined: Count=" << count << ", Text=" << text;
}, lifetime);
@@ -181,7 +181,7 @@ You can combine multiple producers into one:
return count > 0 && !text.isEmpty();
}) | rpl::map([=]\(int count, const QString &text) {
return text.repeated(count);
}) | rpl::start_with_next([=]\(const QString &result) {
}) | rpl::on_next([=]\(const QString &result) {
qDebug() << "Mapped & Filtered: " << result;
}, lifetime);
```
@@ -197,7 +197,7 @@ You can combine multiple producers into one:
// Starting the merged producer consumes it.
std::move(
merged
) | rpl::start_with_next([=]\(QString &&value) {
) | rpl::on_next([=]\(QString &&value) {
// Receives values from either sourceA or sourceB as they arrive.
qDebug() << "Merged value: " << value;
}, lifetime);

View File

@@ -6,7 +6,7 @@ on:
jobs:
cant-reproduce:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: lee-dohm/no-response@v0.5.0
with:

View File

@@ -9,7 +9,7 @@ on:
jobs:
Copyright-year:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: desktop-app/action_code_updater@master
with:

View File

@@ -17,7 +17,7 @@ jobs:
steps:
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
submodules: recursive

View File

@@ -6,7 +6,7 @@ on:
jobs:
comment:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- name: Process an issue.
uses: desktop-app/action_issue_closer@master

View File

@@ -59,7 +59,7 @@ jobs:
steps:
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
submodules: recursive
@@ -71,6 +71,7 @@ jobs:
poetry install
DOCKERFILE=$(DEBUG= LTO= poetry run gen_dockerfile)
echo "$DOCKERFILE" > Dockerfile
rm -rf __pycache__
- name: Free up some disk space.
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be
@@ -81,7 +82,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Libraries cache.
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ${{ runner.temp }}/.buildx-cache
key: ${{ runner.OS }}-libs-${{ hashFiles('Telegram/build/docker/centos_env/**') }}
@@ -108,7 +109,7 @@ jobs:
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo Define from matrix: $DEFINE
echo "ARTIFACT_NAME=Telegram_${{ matrix.defines }}" >> $GITHUB_ENV
echo "ARTIFACT_NAME=Telegram ${{ matrix.defines }}" >> $GITHUB_ENV
else
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
fi
@@ -148,7 +149,7 @@ jobs:
cd out/Debug
mkdir artifact
mv {Telegram,Updater} artifact/
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:

View File

@@ -6,9 +6,9 @@ on:
jobs:
lock:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: dessant/lock-threads@v5
- uses: dessant/lock-threads@v6
with:
github-token: ${{ github.token }}
issue-inactive-days: 45

View File

@@ -56,7 +56,7 @@ jobs:
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
submodules: recursive
path: ${{ env.REPO_NAME }}
@@ -74,19 +74,15 @@ jobs:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
- name: ThirdParty cache.
id: cache-third-party
uses: actions/cache@v4
with:
path: ThirdParty
key: ${{ runner.OS }}-third-party-${{ hashFiles(format('{0}/{1}', env.REPO_NAME, env.PREPARE_PATH)) }}
restore-keys: ${{ runner.OS }}-third-party-
sudo sed -i '' '/CMAKE_${lang}_FLAGS_DEBUG_INIT/s/ -g//' /opt/homebrew/share/cmake/Modules/Compiler/GNU.cmake
- name: Libraries cache.
id: cache-libs
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: Libraries
path: |
Libraries
ThirdParty
key: ${{ runner.OS }}-libs-${{ hashFiles(format('{0}/{1}', env.REPO_NAME, env.PREPARE_PATH)) }}
restore-keys: ${{ runner.OS }}-libs-
@@ -95,9 +91,7 @@ jobs:
./$REPO_NAME/Telegram/build/prepare/mac.sh skip-release silent
- name: Free up some disk space.
run: |
cd Libraries
find . -iname "*.dir" -exec rm -rf {} || true \;
run: find Libraries '(' '(' ! '(' -name '*.a' -o -name '*.h' -o -name '*.hpp' -o -name '*.inc' -o -name '*.cmake' -o -path '*/include/*' -o -path '*/objects-*' -o -path '*/cache_keys/*' -o -path '*/patches/*' -o -perm +111 ')' -type f ')' -o -empty ')' -delete
- name: Telegram Desktop build.
if: env.ONLY_CACHE == 'false'
@@ -108,7 +102,7 @@ jobs:
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo Define from matrix: $DEFINE
echo "ARTIFACT_NAME=Telegram_${{ matrix.defines }}" >> $GITHUB_ENV
echo "ARTIFACT_NAME=Telegram ${{ matrix.defines }}" >> $GITHUB_ENV
else
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
fi
@@ -131,7 +125,7 @@ jobs:
mkdir artifact
mv Telegram.app artifact/
mv Updater artifact/
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:

View File

@@ -60,7 +60,7 @@ jobs:
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
submodules: recursive
path: ${{ env.REPO_NAME }}
@@ -85,7 +85,7 @@ jobs:
echo "MACOSX_DEPLOYMENT_TARGET=$(grep 'set(QT_SUPPORTED_MIN_MACOS_VERSION' /opt/homebrew/Cellar/qtbase/*/lib/cmake/Qt6/Qt6ConfigExtras.cmake | sed -E 's/^.*"(.*)"\)$/\1/')" >> $GITHUB_ENV
echo "LibrariesPath=`pwd`" >> $GITHUB_ENV
curl -o tg_owt-version.json https://api.github.com/repos/desktop-app/tg_owt/git/refs/heads/master
echo "WEBRTC=`curl -sSL --header 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' https://api.github.com/repos/desktop-app/tg_owt/git/refs/heads/master | jq -r .object.sha`" >> $GITHUB_ENV
- name: RNNoise.
run: |
@@ -100,10 +100,10 @@ jobs:
- name: WebRTC cache.
id: cache-webrtc
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ${{ env.LibrariesPath }}/tg_owt
key: ${{ runner.OS }}-webrtc-${{ env.CACHE_KEY }}-${{ hashFiles('**/tg_owt-version.json') }}
key: ${{ runner.OS }}-webrtc-${{ env.WEBRTC }}-${{ env.CACHE_KEY }}
- name: WebRTC.
if: steps.cache-webrtc.outputs.cache-hit != 'true'
run: |
@@ -122,7 +122,7 @@ jobs:
- name: TDE2E cache.
id: cache-tde2e
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ${{ env.LibrariesPath }}/tde2e
key: ${{ runner.OS }}-tde2e-${{ env.CACHE_KEY }}
@@ -159,7 +159,7 @@ jobs:
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo Define from matrix: $DEFINE
echo "ARTIFACT_NAME=Telegram_${{ matrix.defines }}" >> $GITHUB_ENV
echo "ARTIFACT_NAME=Telegram ${{ matrix.defines }}" >> $GITHUB_ENV
else
echo "ARTIFACT_NAME=Telegram" >> $GITHUB_ENV
fi
@@ -187,7 +187,7 @@ jobs:
cd $REPO_NAME/build
mkdir artifact
mv Telegram.dmg artifact/
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:

View File

@@ -6,7 +6,7 @@ on:
jobs:
User-agent:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: desktop-app/action_code_updater@master
with:

View File

@@ -8,7 +8,7 @@ on:
jobs:
needs-user-action:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: lee-dohm/no-response@v0.5.0
with:

View File

@@ -47,7 +47,7 @@ jobs:
steps:
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
submodules: recursive
@@ -61,16 +61,11 @@ jobs:
sudo lxd waitready
- name: Free up some disk space.
uses: endersonmenezes/free-disk-space@6c4664f43348c8c7011b53488d5ca65e9fc5cd1a
uses: samueldr/more-space-action@97048bd0df83fb05b5257887bdbaffc848887673
with:
remove_android: true
remove_dotnet: true
remove_haskell: true
remove_tool_cache: true
remove_swap: true
remove_packages: "azure-cli google-cloud-cli microsoft-edge-stable google-chrome-stable firefox postgresql* temurin-* *llvm* mysql* dotnet-sdk-*"
remove_packages_one_command: true
remove_folders: "/usr/share/swift /usr/share/miniconda /usr/share/az* /usr/share/glade* /usr/local/lib/node_modules /usr/local/share/chromium /usr/local/share/powershell"
enable-remove-default-apt-patterns: false
enable-lvm-span: true
lvm-span-mountpoint: /var/snap/lxd/common/lxd/storage-pools/default/containers
- name: Telegram Desktop snap build.
run: sudo -u $USER snap run snapcraft --verbosity=debug
@@ -84,7 +79,7 @@ jobs:
mkdir artifact
mv $artifact_name artifact
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:

View File

@@ -5,7 +5,7 @@ on:
jobs:
stale:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: actions/stale@v10
with:

View File

@@ -9,7 +9,7 @@ on:
jobs:
User-agent:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: desktop-app/action_code_updater@master
with:

View File

@@ -8,7 +8,7 @@ on:
jobs:
waiting-for-answer:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
steps:
- uses: lee-dohm/no-response@v0.5.0
with:

View File

@@ -72,7 +72,7 @@ jobs:
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
submodules: recursive
path: ${{ env.TBUILD }}\${{ env.REPO_NAME }}
@@ -85,6 +85,8 @@ jobs:
SDK="$(grep "SDK version" $DOCPATH | sed -r 's/.*\*\*(.*)\*\* SDK version.*/\1/')"
echo "SDK=$SDK" >> $GITHUB_ENV
sed -i '/CMAKE_${lang}_FLAGS_DEBUG_INIT/s/${_Zi}//' "$PROGRAMFILES"/CMake/share/cmake*/Modules/Platform/Windows-MSVC.cmake
echo "$(sha256sum $TBUILD/$REPO_NAME/$PREPARE_PATH | awk '{ print $1 }')" >> CACHE_KEY.txt
echo "$SDK" >> CACHE_KEY.txt
echo "CACHE_KEY=$(sha256sum CACHE_KEY.txt | awk '{ print $1 }')" >> $GITHUB_ENV
@@ -106,7 +108,7 @@ jobs:
- name: ThirdParty cache.
id: cache-third-party
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ${{ env.TBUILD }}\ThirdParty
key: ${{ runner.OS }}-${{ matrix.arch }}-third-party-${{ env.CACHE_KEY }}
@@ -114,7 +116,7 @@ jobs:
- name: Libraries cache.
id: cache-libs
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ${{ env.TBUILD }}\Libraries
key: ${{ runner.OS }}-${{ matrix.arch }}-libs-${{ env.CACHE_KEY }}
@@ -140,14 +142,14 @@ jobs:
*) ARCH="${{ matrix.arch }}";;
esac
echo "Architecture from matrix: $ARCH"
ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.arch }}"
ARTIFACT_NAME="${ARTIFACT_NAME} ${{ matrix.arch }}"
fi
GENERATOR=""
if [ -n "${{ matrix.generator }}" ]; then
GENERATOR="-G \"${{ matrix.generator }}\""
echo "Generator from matrix: $GENERATOR"
ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.generator }}"
ARTIFACT_NAME="${ARTIFACT_NAME} ${{ matrix.generator }}"
fi
echo "TDESKTOP_BUILD_GENERATOR=$GENERATOR" >> $GITHUB_ENV
@@ -158,7 +160,7 @@ jobs:
if [ -n "${{ matrix.defines }}" ]; then
DEFINE="-D ${{ matrix.defines }}=ON"
echo "Define from matrix: $DEFINE"
ARTIFACT_NAME="${ARTIFACT_NAME}_${{ matrix.defines }}"
ARTIFACT_NAME="${ARTIFACT_NAME} ${{ matrix.defines }}"
fi
echo "TDESKTOP_BUILD_DEFINE=$DEFINE" >> $GITHUB_ENV
@@ -172,11 +174,8 @@ jobs:
echo "TDESKTOP_BUILD_API=$API" >> $GITHUB_ENV
- name: Free up some disk space.
run: |
cd %TBUILD%
del /S Libraries\*.pdb
del /S Libraries\*.pch
del /S Libraries\*.obj
shell: bash
run: find TBuild/Libraries '(' '(' ! '(' -name '*.lib' -o -name '*.a' -o -name '*.exe' -o -name '*.h' -o -name '*.hpp' -o -name '*.inc' -o -name '*.cmake' -o -path '*/include/*' -o -path '*/objects-*' -o -path '*/cache_keys/*' -o -path '*/patches/*' ')' -type f ')' -o -empty ')' -delete
- name: Telegram Desktop build.
if: env.ONLY_CACHE == 'false'
@@ -203,7 +202,7 @@ jobs:
mkdir artifact
move %OUT%\Telegram.exe artifact/
move %OUT%\Updater.exe artifact/
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
name: Upload artifact.
if: (env.UPLOAD_ARTIFACT == 'true') || (github.ref == 'refs/heads/nightly')
with:

View File

@@ -337,6 +337,8 @@ PRIVATE
boxes/star_gift_auction_box.h
boxes/star_gift_box.cpp
boxes/star_gift_box.h
boxes/star_gift_preview_box.cpp
boxes/star_gift_preview_box.h
boxes/star_gift_resale_box.cpp
boxes/star_gift_resale_box.h
boxes/sticker_set_box.cpp
@@ -405,6 +407,8 @@ PRIVATE
calls/calls_instance.h
calls/calls_panel.cpp
calls/calls_panel.h
calls/calls_panel_background.cpp
calls/calls_panel_background.h
calls/calls_signal_bars.cpp
calls/calls_signal_bars.h
calls/calls_top_bar.cpp
@@ -523,6 +527,8 @@ PRIVATE
data/components/gift_auctions.h
data/components/location_pickers.cpp
data/components/location_pickers.h
data/components/passkeys.cpp
data/components/passkeys.h
data/components/promo_suggestions.cpp
data/components/promo_suggestions.h
data/components/recent_peers.cpp
@@ -918,6 +924,8 @@ PRIVATE
history/view/history_view_pinned_tracker.h
history/view/history_view_quick_action.cpp
history/view/history_view_quick_action.h
history/view/history_view_reaction_preview.cpp
history/view/history_view_reaction_preview.h
history/view/history_view_reply.cpp
history/view/history_view_reply.h
history/view/history_view_requests_bar.cpp
@@ -1401,6 +1409,7 @@ PRIVATE
platform/linux/specific_linux.h
platform/linux/tray_linux.cpp
platform/linux/tray_linux.h
platform/linux/webauthn_linux.cpp
platform/mac/file_utilities_mac.mm
platform/mac/file_utilities_mac.h
platform/mac/launcher_mac.mm
@@ -1420,6 +1429,7 @@ PRIVATE
platform/mac/specific_mac_p.h
platform/mac/tray_mac.mm
platform/mac/tray_mac.h
platform/mac/webauthn_mac.mm
platform/mac/window_title_mac.mm
platform/mac/touchbar/items/mac_formatter_item.h
platform/mac/touchbar/items/mac_formatter_item.mm
@@ -1454,6 +1464,7 @@ PRIVATE
platform/win/specific_win.h
platform/win/tray_win.cpp
platform/win/tray_win.h
platform/win/webauthn_win.cpp
platform/win/windows_app_user_model_id.cpp
platform/win/windows_app_user_model_id.h
platform/win/windows_dlls.cpp
@@ -1472,6 +1483,7 @@ PRIVATE
platform/platform_overlay_widget.h
platform/platform_specific.h
platform/platform_tray.h
platform/platform_webauthn.h
platform/platform_window_title.h
profile/profile_back_button.cpp
profile/profile_back_button.h
@@ -1557,6 +1569,8 @@ PRIVATE
settings/settings_notifications.h
settings/settings_notifications_type.cpp
settings/settings_notifications_type.h
settings/settings_passkeys.cpp
settings/settings_passkeys.h
settings/settings_power_saving.cpp
settings/settings_power_saving.h
settings/settings_premium.cpp
@@ -1900,15 +1914,17 @@ elseif (APPLE)
COMMAND cp ${CMAKE_BINARY_DIR}/lib_spellcheck.rcc $<TARGET_FILE_DIR:Telegram>/../Resources
)
if (NOT build_macstore AND NOT DESKTOP_APP_DISABLE_CRASH_REPORTS)
if (DESKTOP_APP_MAC_ARCH STREQUAL "x86_64" OR DESKTOP_APP_MAC_ARCH STREQUAL "arm64")
set(crashpad_dir_part ".${DESKTOP_APP_MAC_ARCH}")
if (DESKTOP_APP_USE_PACKAGED)
find_program(CRASHPAD_HANDLER crashpad_handler REQUIRED)
elseif (DESKTOP_APP_MAC_ARCH STREQUAL "x86_64" OR DESKTOP_APP_MAC_ARCH STREQUAL "arm64")
set(CRASHPAD_HANDLER "${libs_loc}/crashpad/out/$<IF:$<CONFIG:Debug>,Debug,Release>.${DESKTOP_APP_MAC_ARCH}/crashpad_handler")
else()
set(crashpad_dir_part "")
set(CRASHPAD_HANDLER "${libs_loc}/crashpad/out/$<IF:$<CONFIG:Debug>,Debug,Release>/crashpad_handler")
endif()
add_custom_command(TARGET Telegram
PRE_LINK
COMMAND mkdir -p $<TARGET_FILE_DIR:Telegram>/../Helpers
COMMAND cp ${libs_loc}/crashpad/out/$<IF:$<CONFIG:Debug>,Debug,Release>${crashpad_dir_part}/crashpad_handler $<TARGET_FILE_DIR:Telegram>/../Helpers/
COMMAND cp ${CRASHPAD_HANDLER} $<TARGET_FILE_DIR:Telegram>/../Helpers/
)
endif()
else()
@@ -1928,8 +1944,9 @@ if (build_macstore)
set(bundle_identifier "org.telegram.desktop")
set(bundle_entitlements "Telegram Lite.entitlements")
set(output_name "Telegram Lite")
set_target_properties(Telegram PROPERTIES
XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${libs_loc}/breakpad/src/client/mac/build/Release
target_link_options(Telegram
PRIVATE
-F${libs_loc}/breakpad/src/client/mac/build/Release
)
target_link_frameworks(Telegram PRIVATE Breakpad)
add_custom_command(TARGET Telegram
@@ -2117,7 +2134,7 @@ if (NOT DESKTOP_APP_DISABLE_AUTOUPDATE AND NOT build_macstore AND NOT build_wins
endif()
elseif (APPLE)
add_custom_command(TARGET Updater
PRE_LINK
POST_BUILD
COMMAND mkdir -p $<TARGET_FILE_DIR:Telegram>/../Frameworks
COMMAND cp $<TARGET_FILE:Updater> $<TARGET_FILE_DIR:Telegram>/../Frameworks/
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 935 KiB

After

Width:  |  Height:  |  Size: 938 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 250 KiB

View File

@@ -652,4 +652,101 @@ div.toast_shown {
.reactions .reaction .count {
margin-right: 8px;
line-height: 20px;
}
@media (prefers-color-scheme: dark) {
html, body {
background-color: #1a2026; /* groupCallBg */
margin: 0;
padding: 0;
}
.page_wrap {
background-color: #1a2026; /* groupCallBg */
color: #ffffff; /* groupCallMembersFg */
min-height: 100vh;
}
.page_wrap a {
color: #4db8ff; /* groupCallActiveFg */
}
.page_header {
background-color: #1a2026; /* groupCallBg */
border-bottom: 1px solid #2c333d; /* groupCallMembersBg */
}
.bold {
color: #ffffff; /* groupCallMembersFg */
}
.details {
color: #91979e; /* groupCallMemberNotJoinedStatus */
}
.page_body {
background-color: #1a2026; /* groupCallBg */
}
code {
color: #ff8aac; /* historyPeer6UserpicBg */
background-color: #2c333d; /* groupCallMembersBg */
}
pre {
color: #ffffff; /* groupCallMembersFg */
background-color: #2c333d; /* groupCallMembersBg */
border: 1px solid #323a45; /* groupCallMembersBgOver */
}
.with_divider {
border-top: 1px solid #2c333d; /* groupCallMembersBg */
}
a.block_link:hover {
background-color: #323a45; /* groupCallMembersBgOver */
}
.list_page .entry {
color: #ffffff; /* groupCallMembersFg */
}
.message {
color: #ffffff; /* groupCallMembersFg */
}
div.selected {
background-color: #323a45; /* groupCallMembersBgOver */
}
.default .from_name {
color: #4db8ff; /* groupCallActiveFg */
}
.default .media .description {
color: #ffffff; /* groupCallMembersFg */
}
msgInBg,
.historyComposeAreaBg {
background-color: #2c333d; /* groupCallMembersBg */
}
msgOutBg {
background-color: #323a45; /* groupCallMembersBgOver */
}
msgInBgSelected {
background-color: #39424f; /* groupCallMembersBgRipple */
}
msgOutBgSelected {
background-color: #39424f; /* groupCallMembersBgRipple */
}
.spoiler {
background: #323a45; /* groupCallMembersBgOver */
}
.spoiler.hidden {
background: #61c0ff; /* groupCallMemberInactiveStatus */
}
.bot_button {
background-color: #4db8ff40; /* groupCallActiveFg with opacity */
}
.reactions .reaction {
background-color: #2c333d; /* groupCallMembersBg */
color: #4db8ff; /* groupCallActiveFg */
}
.reactions .reaction.active {
background-color: #4db8ff; /* groupCallActiveFg */
color: #1a2026; /* groupCallBg */
}
.reactions .reaction.paid {
background-color: #323a45; /* groupCallMembersBgOver */
color: #febb5b; /* historyPeer8UserpicBg */
}
.reactions .reaction.active.paid {
background-color: #febb5b; /* historyPeer8UserpicBg */
color: #1a2026; /* groupCallBg */
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -22,7 +22,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_menu_my_stories" = "My Stories";
"lng_menu_my_groups" = "My Groups";
"lng_menu_my_channels" = "My Channels";
"lng_open_menu" = "Open navigation menu";
"lng_main_menu" = "Main menu";
"lng_filter_unread_chats#one" = "{text} ({count} unread chat)";
"lng_filter_unread_chats#other" = "{text} ({count} unread chats)";
"lng_disable_notifications_from_tray" = "Disable notifications";
"lng_enable_notifications_from_tray" = "Enable notifications";
@@ -378,6 +380,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_intro_qr_step2" = "Go to Settings > Devices > Link Desktop Device";
"lng_intro_qr_step3" = "Scan this image to Log In";
"lng_intro_qr_skip" = "Or log in using your phone number";
"lng_intro_qr_phone" = "Log in using phone number";
"lng_intro_qr_passkey" = "Log in using passkey";
"lng_intro_fragment_title" = "Enter code";
"lng_intro_fragment_about" = "Get the code for {phone_number} in the Anonymous Numbers section on Fragment.";
@@ -793,6 +797,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_channel_label" = "Personal channel";
"lng_settings_channel_add" = "Add";
"lng_settings_channel_remove" = "Remove";
"lng_settings_channel_menu_remove" = "Remove Personal Channel";
"lng_settings_channel_no_yet" = "You don't have any public channels yet.";
"lng_settings_channel_start" = "Start a Channel";
"lng_settings_channel_saved" = "Your personal channel was updated.";
@@ -1252,6 +1257,28 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_restart_now" = "Restart";
"lng_settings_restart_later" = "Later";
"lng_settings_passkeys_title" = "Passkeys";
"lng_settings_passkeys_about" = "Manage your passkey, stored safely in the cloud service you choose.";
"lng_settings_passkeys_button" = "Add Passkey";
"lng_settings_passkeys_button_about" = "Your passkey is stored securely in your password manager. {link}";
"lng_settings_passkeys_delete_sure_title" = "Delete Passkey";
"lng_settings_passkeys_delete_sure_about" = "Once deleted, this passkey can't be used to log in.";
"lng_settings_passkeys_delete_sure_about2" = "Don't forget to remove it from your password manager too.";
"lng_settings_passkeys_none_title" = "Protect your account";
"lng_settings_passkeys_none_about" = "Log in safely and keep your account secure.";
"lng_settings_passkeys_none_info1_title" = "Create a Passkey";
"lng_settings_passkeys_none_info1_about" = "Make a passkey to sign in easily and safely.";
"lng_settings_passkeys_none_info2_title" = "Log in with face recognition";
"lng_settings_passkeys_none_info2_about" = "Use your face, fingerprint, or screen lock to sign in.";
"lng_settings_passkeys_none_info3_title" = "Store Passkey securely";
"lng_settings_passkeys_none_info3_about" = "Your passkey is stored safely in the cloud service you choose.";
"lng_settings_passkeys_none_button" = "Create Passkey";
"lng_settings_passkeys_none_button_unsupported" = "Unsupported";
"lng_settings_passkeys_created" = "Created {date}";
"lng_settings_passkeys_last_used" = "Last used {date}";
"lng_settings_passkeys_unsigned_error" = "Passkeys are not available in unsigned builds. Please use an official signed version of Telegram Desktop.";
"lng_settings_passkey_unknown" = "Passkey";
"lng_settings_quick_dialog_action_title" = "Chat list quick action";
"lng_settings_quick_dialog_action_about" = "Choose the action you want to perform when you middle-click or swipe left in the chat list.";
"lng_settings_quick_dialog_action_both" = "Swipe left and Middle-click";
@@ -1735,6 +1762,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_profile_block_user" = "Block user";
"lng_profile_unblock_user" = "Unblock user";
"lng_profile_export_chat" = "Export chat history";
"lng_profile_export_topic" = "Export topic history";
"lng_profile_gift_premium" = "Gift Premium";
"lng_media_selected_photo#one" = "{count} Photo";
"lng_media_selected_photo#other" = "{count} Photos";
@@ -2267,8 +2295,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_action_proximity_distance_km#other" = "{count} km";
"lng_action_webview_data_done" = "Data from the \"{text}\" button was transferred to the bot.";
"lng_action_gift_received" = "{user} sent you a gift for {cost}";
"lng_action_gift_received_sold" = "{user} sold you a gift for {cost}";
"lng_action_gift_unique_received" = "{user} sent you a unique collectible item";
"lng_action_gift_sent" = "You sent a gift for {cost}";
"lng_action_gift_sent_sold" = "You sold a gift for {cost}";
"lng_action_gift_unique_sent" = "You sent a unique collectible item";
"lng_action_gift_upgraded" = "{user} turned the gift from you into a unique collectible";
"lng_action_gift_upgraded_channel" = "{user} turned this gift to {channel} into a unique collectible";
@@ -2324,6 +2354,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_action_gift_premium_about" = "Subscription for exclusive Telegram features.";
"lng_action_gift_refunded" = "This gift was downgraded because a request to refund the payment related to this gift was made, and the money was returned.";
"lng_action_gift_got_ton" = "Use TON to suggest posts to channels.";
"lng_action_gift_offer" = "{user} offered you {cost} for {name}.";
"lng_action_gift_offer_you" = "You offered {cost} for {name}.";
"lng_action_gift_offer_state_expires" = "This offer expires in {time}.";
"lng_action_gift_offer_time_large" = "{hours} h";
"lng_action_gift_offer_time_medium" = "{hours} h {minutes} m";
"lng_action_gift_offer_time_small" = "{minutes} m";
"lng_action_gift_offer_state_accepted" = "This offer was accepted.";
"lng_action_gift_offer_state_rejected" = "This offer was rejected.";
"lng_action_gift_offer_state_expired" = "This offer has expired.";
"lng_action_gift_offer_sold" = "{user} sold {name} for {cost}.";
"lng_action_gift_offer_sold_you" = "You sold {name} for {cost}.";
"lng_action_gift_offer_decline" = "Reject";
"lng_action_gift_offer_accept" = "Accept";
"lng_action_gift_offer_expired" = "The offer from {user} to buy your {name} for {cost} has expired.";
"lng_action_gift_offer_expired_your" = "Your offer to buy {name} for {cost} has expired.";
"lng_action_gift_offer_declined" = "{user} rejected your offer to buy {name} for {cost}.";
"lng_action_gift_offer_declined_you" = "You rejected {user}'s offer to buy your {name} for {cost}.";
"lng_action_suggested_photo_me" = "You suggested this photo for {user}'s Telegram profile.";
"lng_action_suggested_photo" = "{user} suggests this photo for your Telegram profile.";
"lng_action_suggested_photo_button" = "View Photo";
@@ -2616,6 +2663,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_forwarded_story" = "Story from {user}";
"lng_forwarded_story_expired" = "This story has expired.";
"lng_forwarded_date" = "Original: {date}";
"lng_forwarded_saved_date" = "Saved date: {date}";
"lng_forwarded_channel" = "Forwarded from {channel}";
"lng_forwarded_psa_default" = "Forwarded from {channel}";
"lng_forwarded_via" = "Forwarded from {user} via {inline_bot}";
@@ -2807,6 +2855,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_premium_summary_about_todo_lists" = "Plan, assign, and complete tasks - seamlessly and efficiently.";
"lng_premium_summary_subtitle_peer_colors" = "Name and Profile Colors";
"lng_premium_summary_about_peer_colors" = "Choose a color and logo for your profile and replies to your messages.";
"lng_premium_summary_subtitle_gifts" = "Telegram Gifts";
"lng_premium_summary_about_gifts" = "Gifts are collectible items you can trade or showcase on your profile.";
"lng_premium_summary_bottom_subtitle" = "About Telegram Premium";
"lng_premium_summary_bottom_about" = "While the free version of Telegram already gives its users more than any other messaging application, **Telegram Premium** pushes its capabilities even further.\n\n**Telegram Premium** is a paid option, because most Premium Features require additional expenses from Telegram to third parties such as data center providers and server manufacturers. Contributions from **Telegram Premium** users allow us to cover such costs and also help Telegram stay free for everyone.";
"lng_premium_summary_button" = "Subscribe for {cost} per month";
@@ -2957,6 +3007,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_credits_summary_history_entry_inner_in" = "In-App Purchase";
"lng_credits_summary_balance" = "Balance";
"lng_credits_commission" = "{amount} commission";
"lng_credits_paid_messages_fee_live_reaction" = "Fee for Live Story Reaction";
"lng_credits_paid_messages_fee#one" = "Fee for {count} Message";
"lng_credits_paid_messages_fee#other" = "Fee for {count} Messages";
"lng_credits_paid_messages_fee_about" = "You receive {percent} of the price that you charge for each incoming message. {link}";
@@ -3094,6 +3145,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_credits_small_balance_for_message" = "Buy **Stars** to send messages to {user}.";
"lng_credits_small_balance_for_messages" = "Buy **Stars** to send messages.";
"lng_credits_small_balance_for_suggest" = "Buy **Stars** to suggest post to {channel}.";
"lng_credits_small_balance_for_offer" = "Buy **Stars** to offer for this gift.";
"lng_credits_small_balance_for_search" = "Buy **Stars** to search through public posts.";
"lng_credits_small_balance_fallback" = "Buy **Stars** to unlock content and services on Telegram.";
"lng_credits_purchase_blocked" = "Sorry, you can't purchase this item with Telegram Stars.";
@@ -3690,6 +3742,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_stars_premium" = "premium";
"lng_gift_stars_auction" = "auction";
"lng_gift_stars_auction_join" = "Join";
"lng_gift_stars_auction_view" = "View";
"lng_gift_stars_auction_soon" = "soon";
"lng_gift_stars_auction_upgraded" = "upgraded";
"lng_gift_stars_your_left#one" = "{count} left";
"lng_gift_stars_your_left#other" = "{count} left";
"lng_gift_stars_your_finished" = "none left";
@@ -3781,6 +3836,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_unique_backdrop" = "Backdrop";
"lng_gift_unique_symbol" = "Symbol";
"lng_gift_unique_rarity" = "Only {percent} of such collectibles have this attribute.";
"lng_gift_unique_sender" = "{from} sent you this gift on {date}";
"lng_gift_unique_sender_you" = "You bought this gift on {date}";
"lng_gift_unique_availability_label" = "Quantity";
"lng_gift_unique_availability#one" = "{count} of {amount} issued";
"lng_gift_unique_availability#other" = "{count} of {amount} issued";
@@ -3858,6 +3915,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_upgrade_tradable_about" = "Sell or auction your gift on third-party NFT marketplaces.";
"lng_gift_upgrade_tradable_about_user" = "{name} will be able to sell the gift on Telegram and NFT marketplaces.";
"lng_gift_upgrade_tradable_about_channel" = "Admins of {name} will be able to sell the gift on Telegram and NFT marketplaces.";
"lng_gift_upgrade_wearable_title" = "Wearable";
"lng_gift_upgrade_wearable_about" = "Display gifts on your page and set them as profile covers or statuses.";
"lng_gift_upgrade_button" = "Upgrade for {price}";
"lng_gift_upgrade_decreases" = "Price decreases in {time}";
"lng_gift_upgrade_see_table" = "See how this price will decrease {arrow}";
@@ -3910,6 +3969,25 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_transfer_unlist" = "Unlist";
"lng_gift_transfer_locked_title" = "Action Locked";
"lng_gift_transfer_locked_text" = "Transfer this gift to your Telegram account on Fragment to unlock this action.";
"lng_gift_offer_button" = "Offer to Buy";
"lng_gift_offer_title" = "Offer to Buy";
"lng_gift_offer_stars_about" = "Choose how many Stars you'd like to offer for {name}.";
"lng_gift_offer_ton_about" = "Choose how many TON you'd like to offer for {name}.";
"lng_gift_offer_duration" = "Offer Duration";
"lng_gift_offer_duration_about" = "Choose how long {user} can accept your offer. When the time expires, the amount will be refunded.";
"lng_gift_offer_cost_button" = "Offer {cost}";
"lng_gift_offer_reject_title" = "Reject Offer";
"lng_gift_offer_confirm_reject" = "Are you sure you want to reject the offer from {user}?";
"lng_gift_offer_confirm_accept" = "Do you want to sell {name} to {user} for {cost}?";
"lng_gift_offer_you_get" = "You will receive {cost} after fees.";
"lng_gift_offer_higher" = "The price you are offered is {percent} higher than the average price for {name}.";
"lng_gift_offer_lower" = "The price you are offered is {percent} lower than the average price for {name}.";
"lng_gift_offer_sell_for" = "Sell for {price}";
"lng_gift_offer_confirm_title" = "Confirm Offer";
"lng_gift_offer_confirm_text" = "Do you want to offer {cost} to {user} for {name}?";
"lng_gift_offer_table_offer" = "Offer";
"lng_gift_offer_table_fee" = "Fee";
"lng_gift_offer_table_duration" = "Duration";
"lng_gift_sell_unlist_title" = "Unlist {name}";
"lng_gift_sell_unlist_sure" = "Are you sure you want to unlist your gift?";
"lng_gift_sell_title" = "Price in Stars";
@@ -3937,6 +4015,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_wear_badge_title" = "Radiant Badge";
"lng_gift_wear_badge_about" = "The glittering icon of this item will be displayed next to your name.";
"lng_gift_wear_badge_about_channel" = "The glittering icon of this item will be displayed next to channel's name.";
"lng_gift_wear_design_title" = "Unique Profile Design";
"lng_gift_wear_design_about" = "Your profile page will get the color and the symbol of this item.";
"lng_gift_wear_design_about_channel" = "Your channel page will get the color and the symbol of this item.";
"lng_gift_wear_proof_title" = "Proof of Ownership";
"lng_gift_wear_proof_about" = "Clicking the icon of this item next to your name will show its info and owner.";
"lng_gift_wear_proof_about_channel" = "Clicking the icon of this item next to channel's name will show its info and owner.";
@@ -4016,6 +4097,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_auction_text_link" = "Learn more {arrow}";
"lng_auction_text_ended" = "Auction ended.";
"lng_auction_start_label" = "Started";
"lng_auction_starts_label" = "Starts";
"lng_auction_rounds_label" = "Rounds";
"lng_auction_rounds_exact" = "Round {n}";
"lng_auction_rounds_range" = "Rounds {n}-{last}";
"lng_auction_rounds_seconds#one" = "{count} second each";
"lng_auction_rounds_seconds#other" = "{count} seconds each";
"lng_auction_rounds_minutes#one" = "{count} minute each";
"lng_auction_rounds_minutes#other" = "{count} minutes each";
"lng_auction_rounds_hours#one" = "{count} hour each";
"lng_auction_rounds_hours#other" = "{count} hours each";
"lng_auction_rounds_extended" = "{duration} + {increase} for late bids in top {n}";
"lng_auction_end_label" = "Ends";
"lng_auction_round_label" = "Current Round";
"lng_auction_round_value" = "{n} of {amount}";
@@ -4030,10 +4122,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_auction_join_time_left" = "{time} left";
"lng_auction_join_time_medium" = "{hours} h {minutes} m";
"lng_auction_join_time_small" = "{minutes} m";
"lng_auction_join_starts_in" = "starts in {time}";
"lng_auction_join_early_bid" = "Place an Early Bid";
"lng_auction_menu_about" = "About";
"lng_auction_menu_copy_link" = "Copy Link";
"lng_auction_menu_share" = "Share";
"lng_auction_bid_title" = "Place a Bid";
"lng_auction_bid_title_early" = "Place an Early Bid";
"lng_auction_bid_subtitle#one" = "Top {count} bidder will win";
"lng_auction_bid_subtitle#other" = "Top {count} bidders will win";
"lng_auction_bid_your" = "your bid";
@@ -4045,6 +4140,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_auction_bid_until" = "until next round";
"lng_auction_bid_left#one" = "left";
"lng_auction_bid_left#other" = "left";
"lng_auction_bid_before_start" = "before start";
"lng_auction_bid_your_title" = "Your bid will be";
"lng_auction_bid_your_outbid" = "You've been outbid";
"lng_auction_bid_your_winning" = "You're winning";
@@ -4081,13 +4177,34 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_auction_bought_title#other" = "{count} Items Bought";
"lng_auction_bought_date" = "Date";
"lng_auction_bought_bid" = "Accepted Bid";
"lng_auction_bought_round" = "Round #{n}";
"lng_auction_bought_in_round" = "{name} in round {n}";
"lng_auction_change_title" = "Change Recipient";
"lng_auction_change_button" = "Change";
"lng_auction_change_already" = "You've already placed a bid on this gift for {name}.";
"lng_auction_change_to" = "Do you want to raise your bid and change the recipient to {name}?";
"lng_auction_change_already_me" = "You've already placed a bid on this gift for yourself.";
"lng_auction_change_to_me" = "Do you want to raise your bid and change the recipient to yourself?";
"lng_auction_preview_name" = "Upcoming Auction";
"lng_auction_preview_learn_gifts" = "Learn more about Telegram Gifts {arrow}";
"lng_auction_preview_variants#one" = "View {emoji} {count} Variant {arrow}";
"lng_auction_preview_variants#other" = "View {emoji} {count} Variants {arrow}";
"lng_auction_preview_random" = "Random Traits";
"lng_auction_preview_selected" = "Selected Traits";
"lng_auction_preview_randomize" = "Randomize Traits";
"lng_auction_preview_model" = "model";
"lng_auction_preview_models#one" = "This collectible features **{count}** unique model.";
"lng_auction_preview_models#other" = "This collectible features **{count}** unique models.";
"lng_auction_preview_models_button" = "Models";
"lng_auction_preview_backdrop" = "backdrop";
"lng_auction_preview_backdrops#one" = "This collectible features **{count}** unique backdrop.";
"lng_auction_preview_backdrops#other" = "This collectible features **{count}** unique backdrops.";
"lng_auction_preview_backdrops_button" = "Backdrops";
"lng_auction_preview_symbol" = "symbol";
"lng_auction_preview_symbols#one" = "This collectible features **{count}** unique symbol.";
"lng_auction_preview_symbols#other" = "This collectible features **{count}** unique symbols.";
"lng_auction_preview_symbols_button" = "Symbols";
"lng_auction_preview_wear" = "More about wearing gifts {arrow}";
"lng_auction_preview_free_upgrade" = "You can upgrade your gift for free, sell it on the market, or set it as your profile cover.";
"lng_accounts_limit_title" = "Limit Reached";
"lng_accounts_limit1#one" = "You have reached the limit of **{count}** connected account.";
@@ -4790,6 +4907,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_paid_react_send" = "Send {price}";
"lng_paid_react_agree" = "By sending stars, you agree to the {link}.";
"lng_paid_react_agree_link" = "Terms of Service";
"lng_paid_react_admin_cant" = "You can't send Stars to your own Live Story.";
"lng_paid_react_toast#one" = "Star Sent!";
"lng_paid_react_toast#other" = "Stars Sent!";
"lng_paid_react_toast_anonymous#one" = "Star sent anonymously!";
@@ -4811,6 +4929,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_paid_reaction_title" = "React with Stars";
"lng_paid_reaction_about" = "Highlight and pin your message by sending Stars to {name}.";
"lng_paid_reaction_button" = "Send {stars}";
"lng_paid_admin_title" = "Receive Stars from Viewers";
"lng_paid_admin_about" = "Viewers can send you Star Reactions.";
"lng_sensitive_tag" = "18+";
"lng_sensitive_title" = "18+";
@@ -5062,6 +5182,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_edit_channel_status_about" = "Choose a status that will be shown next to the channel's name.";
"lng_edit_channel_status_group" = "Set Group Emoji Status";
"lng_edit_channel_status_about_group" = "Choose a status that will be shown next to the group's name.";
"lng_edit_channel_personal_channel" = "Set as Personal Channel";
"lng_edit_self_title" = "Edit your name";
"lng_confirm_contact_data" = "New Contact";
"lng_add_contact" = "Create";
@@ -6312,6 +6433,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_export_option_other" = "Miscellaneous data";
"lng_export_option_other_about" = "Other types of data not mentioned above (beta).";
"lng_export_header_chats" = "Chat export settings";
"lng_export_header_topic" = "Topic export settings";
"lng_export_option_personal_chats" = "Personal chats";
"lng_export_option_bot_chats" = "Bot chats";
"lng_export_option_private_groups" = "Private groups";
@@ -6806,6 +6928,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_stories_my_name" = "My Story";
"lng_stories_archive" = "Hide Stories";
"lng_stories_unarchive" = "Unhide Stories";
"lng_stories_view_anonymously" = "View Anonymously";
"lng_stories_row_count#one" = "{count} Story";
"lng_stories_row_count#other" = "{count} Stories";
"lng_stories_views#one" = "{count} view";
@@ -6900,6 +7023,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_stealth_mode_next_about" = "Hide my views for the next 25 minutes.";
"lng_stealth_mode_unlock" = "Unlock Stealth Mode";
"lng_stealth_mode_enable" = "Enable Stealth Mode";
"lng_stealth_mode_enable_and_open" = "Enable and open the story";
"lng_stealth_mode_cooldown_in" = "Available in {left}";
"lng_stealth_mode_cooldown_tip" = "Please wait until **Stealth Mode** is ready to use again.";
"lng_stealth_mode_enabled_tip_title" = "Stealth Mode On";
@@ -7311,6 +7435,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_mac_menu_player_resume" = "Resume";
"lng_mac_menu_player_next" = "Next";
"lng_mac_menu_player_previous" = "Previous";
"lng_mac_menu_profiles" = "Profiles";
"lng_mac_touchbar_favorite_stickers" = "Favorite stickers";

View File

@@ -50,6 +50,8 @@
<file alias="rtmp.tgs">../../animations/rtmp.tgs</file>
<file alias="show_or_premium_lastseen.tgs">../../animations/show_or_premium_lastseen.tgs</file>
<file alias="show_or_premium_readtime.tgs">../../animations/show_or_premium_readtime.tgs</file>
<file alias="passkeys.tgs">../../animations/passkeys.tgs</file>
<file alias="ban.tgs">../../animations/ban.tgs</file>
<file alias="profile_muting.tgs">../../animations/profile/profile_muting.tgs</file>
<file alias="profile_unmuting.tgs">../../animations/profile/profile_unmuting.tgs</file>

View File

@@ -10,7 +10,7 @@
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
ProcessorArchitecture="ARCHITECTURE"
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
Version="6.3.2.0" />
Version="6.3.10.0" />
<Properties>
<DisplayName>Telegram Desktop</DisplayName>
<PublisherDisplayName>Telegram Messenger LLP</PublisherDisplayName>

View File

@@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 6,3,2,0
PRODUCTVERSION 6,3,2,0
FILEVERSION 6,3,10,0
PRODUCTVERSION 6,3,10,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -62,10 +62,10 @@ BEGIN
BEGIN
VALUE "CompanyName", "Telegram FZ-LLC"
VALUE "FileDescription", "Telegram Desktop"
VALUE "FileVersion", "6.3.2.0"
VALUE "FileVersion", "6.3.10.0"
VALUE "LegalCopyright", "Copyright (C) 2014-2025"
VALUE "ProductName", "Telegram Desktop"
VALUE "ProductVersion", "6.3.2.0"
VALUE "ProductVersion", "6.3.10.0"
END
END
BLOCK "VarFileInfo"

View File

@@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 6,3,2,0
PRODUCTVERSION 6,3,2,0
FILEVERSION 6,3,10,0
PRODUCTVERSION 6,3,10,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", "6.3.2.0"
VALUE "FileVersion", "6.3.10.0"
VALUE "LegalCopyright", "Copyright (C) 2014-2025"
VALUE "ProductName", "Telegram Desktop"
VALUE "ProductVersion", "6.3.2.0"
VALUE "ProductVersion", "6.3.10.0"
END
END
BLOCK "VarFileInfo"

View File

@@ -100,7 +100,7 @@ Authorizations::Authorizations(not_null<ApiWrap*> api)
_unreviewed = api->session().settings().unreviewed();
crl::on_main(&api->session(), [=] { removeExpiredUnreviewed(); });
Core::App().settings().deviceModelChanges(
) | rpl::start_with_next([=](const QString &model) {
) | rpl::on_next([=](const QString &model) {
auto changed = false;
for (auto &entry : _list) {
if (!entry.hash) {

View File

@@ -83,7 +83,7 @@ void BlockedPeers::block(not_null<PeerData*> peer) {
}
const auto requestId = _api.request(MTPcontacts_Block(
MTP_flags(0),
peer->input
peer->input()
)).done([=] {
const auto data = _blockRequests.take(peer);
peer->setIsBlocked(true);
@@ -127,7 +127,7 @@ void BlockedPeers::unblock(
}
const auto requestId = _api.request(MTPcontacts_Unblock(
MTP_flags(0),
peer->input
peer->input()
)).done([=] {
const auto data = _blockRequests.take(peer);
peer->setIsBlocked(false);
@@ -204,7 +204,7 @@ auto BlockedPeers::slice() -> rpl::producer<BlockedPeers::Slice> {
}
return _slice
? _changes.events_starting_with_copy(*_slice)
: (_changes.events() | rpl::type_erased());
: (_changes.events() | rpl::type_erased);
}
void BlockedPeers::request(int offset, Fn<void(BlockedPeers::Slice)> done) {

View File

@@ -91,7 +91,7 @@ void SendBotCallbackData(
const auto show = controller->uiShow();
button->requestId = api->request(MTPmessages_GetBotCallbackAnswer(
MTP_flags(flags),
history->peer->input,
history->peer->input(),
MTP_int(item->id),
MTP_bytes(sendData),
password ? password->result : MTP_inputCheckPasswordEmpty()
@@ -218,7 +218,7 @@ void SendBotCallbackDataWithPassword(
session,
tr::lng_bots_password_confirm_check_about(
tr::now,
Ui::Text::WithEntities));
tr::marked));
if (box) {
show->showBox(std::move(box), Ui::LayerOption::CloseOther);
} else {
@@ -227,7 +227,7 @@ void SendBotCallbackDataWithPassword(
api->cloudPassword().state(
) | rpl::take(
1
) | rpl::start_with_next([=](const Core::CloudPasswordState &state) mutable {
) | rpl::on_next([=](const Core::CloudPasswordState &state) mutable {
if (lifetime) {
base::take(lifetime)->destroy();
}
@@ -400,7 +400,7 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
}
}
const auto replyTo = FullReplyTo();
const auto suggest = SuggestPostOptions();
const auto suggest = SuggestOptions();
Window::PeerMenuCreatePoll(
controller,
item->history()->peer,
@@ -421,13 +421,13 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
const auto id = int32(button->buttonId);
const auto chosen = [=](std::vector<not_null<PeerData*>> result) {
peer->session().api().request(MTPmessages_SendBotRequestedPeer(
peer->input,
peer->input(),
MTP_int(itemId),
MTP_int(id),
MTP_vector_from_range(
result | ranges::views::transform([](
not_null<PeerData*> peer) {
return MTPInputPeer(peer->input);
return MTPInputPeer(peer->input());
}))
)).done([=](const MTPUpdates &result) {
peer->session().api().applyUpdates(result);

View File

@@ -116,24 +116,24 @@ private:
tr::now,
lt_folder,
std::move(boldTitle),
Ui::Text::WithEntities)
tr::marked)
: (type == Type::AddingChats)
? tr::lng_filters_by_link_more_sure(
tr::now,
lt_folder,
std::move(boldTitle),
Ui::Text::WithEntities)
tr::marked)
: (type == Type::AllAdded)
? tr::lng_filters_by_link_already_about(
tr::now,
lt_folder,
std::move(boldTitle),
Ui::Text::WithEntities)
tr::marked)
: tr::lng_filters_by_link_remove_sure(
tr::now,
lt_folder,
std::move(boldTitle),
Ui::Text::WithEntities);
tr::marked);
}
void InitFilterLinkHeader(
@@ -174,13 +174,13 @@ void InitFilterLinkHeader(
box->setAddedTopScrollSkip(max);
std::move(
header.wheelEvents
) | rpl::start_with_next([=](not_null<QWheelEvent*> e) {
) | rpl::on_next([=](not_null<QWheelEvent*> e) {
box->sendScrollViewportEvent(e);
}, widget->lifetime());
std::move(
header.closeRequests
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
box->closeBox();
}, widget->lifetime());
@@ -193,7 +193,7 @@ void InitFilterLinkHeader(
box->scrolls(
) | rpl::filter([=] {
return !state->processing;
}) | rpl::start_with_next([=] {
}) | rpl::on_next([=] {
state->processing = true;
const auto guard = gsl::finally([&] { state->processing = false; });
@@ -237,7 +237,7 @@ void ImportInvite(
fail(error.type());
};
auto inputs = peers | ranges::views::transform([](auto peer) {
return MTPInputPeer(peer->input);
return MTPInputPeer(peer->input());
}) | ranges::to<QVector<MTPInputPeer>>();
if (!slug.isEmpty()) {
api->request(MTPchatlists_JoinChatlistInvite(
@@ -470,7 +470,7 @@ void ToggleChatsController::adjust(
void ToggleChatsController::setRealContentHeight(rpl::producer<int> value) {
std::move(
value
) | rpl::start_with_next([=](int height) {
) | rpl::on_next([=](int height) {
const auto desired = _desiredHeight.current();
if (height <= computeListSt().item.height) {
return;
@@ -547,7 +547,7 @@ void ShowImportToast(
? tr::lng_filters_added_title
: tr::lng_filters_updated_title;
auto text = Ui::Text::Wrapped(
phrase(tr::now, lt_folder, title.text, Ui::Text::WithEntities),
phrase(tr::now, lt_folder, title.text, tr::marked),
EntityType::Bold);
if (added > 0) {
const auto phrase = created
@@ -644,7 +644,7 @@ void ProcessFilterInvite(
const auto button = owned.data();
box->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
const auto &padding = st::filterInviteBox.buttonPadding;
button->resizeToWidth(width
- padding.left()
@@ -662,7 +662,7 @@ void ProcessFilterInvite(
const auto state = box->lifetime().make_state<State>();
raw->selectedValue(
) | rpl::start_with_next([=](
) | rpl::on_next([=](
base::flat_set<not_null<PeerData*>> &&peers) {
button->setClickedCallback([=] {
if (peers.empty()) {
@@ -777,7 +777,7 @@ void CheckFilterInvite(
if (notLoaded) {
const auto lifetime = std::make_shared<rpl::lifetime>();
owner.chatsFilters().changed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
lifetime->destroy();
ProcessFilterInvite(
weak,
@@ -873,7 +873,7 @@ void ProcessFilterRemove(
const auto button = owned.data();
box->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
const auto &padding = st::filterInviteBox.buttonPadding;
button->resizeToWidth(width
- padding.left()
@@ -886,7 +886,7 @@ void ProcessFilterRemove(
HandleEnterInBox(box);
raw->selectedValue(
) | rpl::start_with_next([=](
) | rpl::on_next([=](
base::flat_set<not_null<PeerData*>> &&peers) {
button->setClickedCallback([=] {
done(peers | ranges::to_vector);

View File

@@ -44,7 +44,7 @@ void RemoveChatFilter(
MTP_vector<MTPInputPeer>(ranges::views::all(
leave
) | ranges::views::transform([](not_null<PeerData*> peer) {
return MTPInputPeer(peer->input);
return MTPInputPeer(peer->input());
}) | ranges::to<QVector<MTPInputPeer>>())
)).done([=](const MTPUpdates &result) {
api->applyUpdates(result);

View File

@@ -159,7 +159,7 @@ void ConfirmSubscriptionBox(
state->frame.setDevicePixelRatio(style::DevicePixelRatio());
const auto options = Images::Option::RoundCircle;
userpic->paintRequest(
) | rpl::start_with_next([=, small = Data::PhotoSize::Small] {
) | rpl::on_next([=, small = Data::PhotoSize::Small] {
state->frame.fill(Qt::transparent);
{
auto p = QPainter(&state->frame);
@@ -194,7 +194,7 @@ void ConfirmSubscriptionBox(
state->photoMedia->wanted(Data::PhotoSize::Small, Data::FileOrigin());
if (!state->photoMedia->image(Data::PhotoSize::Small)) {
session->downloaderTaskFinished(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
userpic->update();
}, userpic->lifetime());
}
@@ -224,13 +224,13 @@ void ConfirmSubscriptionBox(
box,
tr::lng_channel_invite_subscription_about(
lt_channel,
rpl::single(Ui::Text::Bold(name)),
rpl::single(tr::bold(name)),
lt_price,
tr::lng_credits_summary_options_credits(
lt_count,
rpl::single(amount) | tr::to_count(),
Ui::Text::Bold),
Ui::Text::WithEntities),
tr::bold),
tr::marked),
st::inviteLinkSubscribeBoxAbout),
style::al_top);
Ui::AddSkip(content);
@@ -243,9 +243,9 @@ void ConfirmSubscriptionBox(
tr::lng_paid_react_agree_link(),
tr::lng_group_invite_subscription_about_url()
) | rpl::map([](const QString &text, const QString &url) {
return Ui::Text::Link(text, url);
return tr::link(text, url);
}),
Ui::Text::RichLangValue),
tr::rich),
st::inviteLinkSubscribeBoxTerms),
style::al_top);
@@ -260,7 +260,7 @@ void ConfirmSubscriptionBox(
rpl::combine(
balance->sizeValue(),
content->sizeValue()
) | rpl::start_with_next([=](const QSize &, const QSize &) {
) | rpl::on_next([=](const QSize &, const QSize &) {
balance->moveToRight(
st::creditsHistoryRightSkip * 2,
st::creditsHistoryRightSkip);
@@ -408,7 +408,7 @@ void CheckChatInvite(
box->boxClosing(
) | rpl::filter([=] {
return !invitePeekChannel->amIn();
}) | rpl::start_with_next([=] {
}) | rpl::on_next([=] {
if (const auto strong = weak.get()) {
strong->clearSectionStack(Window::SectionShow(
Window::SectionShow::Way::ClearStack,
@@ -527,7 +527,7 @@ ConfirmInviteBox::ConfirmInviteBox(
_photo->wanted(Data::PhotoSize::Small, Data::FileOrigin());
if (!_photo->image(Data::PhotoSize::Small)) {
_session->downloaderTaskFinished(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
update();
}, lifetime());
}

View File

@@ -422,7 +422,7 @@ void ChatParticipants::requestForAdd(
_forAdd.channel = channel;
_forAdd.requestId = _api.request(MTPchannels_GetParticipants(
channel->inputChannel,
channel->inputChannel(),
MTP_channelParticipantsRecent(),
MTP_int(offset),
MTP_int(channel->session().serverConfig().chatSizeMax),
@@ -450,7 +450,7 @@ void ChatParticipants::requestLast(not_null<ChannelData*> channel) {
const auto offset = 0;
const auto participantsHash = uint64(0);
const auto requestId = _api.request(MTPchannels_GetParticipants(
channel->inputChannel,
channel->inputChannel(),
MTP_channelParticipantsRecent(),
MTP_int(offset),
MTP_int(channel->session().serverConfig().chatSizeMax),
@@ -480,7 +480,7 @@ void ChatParticipants::requestBots(not_null<ChannelData*> channel) {
const auto offset = 0;
const auto participantsHash = uint64(0);
const auto requestId = _api.request(MTPchannels_GetParticipants(
channel->inputChannel,
channel->inputChannel(),
MTP_channelParticipantsBots(),
MTP_int(offset),
MTP_int(channel->session().serverConfig().chatSizeMax),
@@ -516,7 +516,7 @@ void ChatParticipants::requestAdmins(not_null<ChannelData*> channel) {
const auto offset = 0;
const auto participantsHash = uint64(0);
const auto requestId = _api.request(MTPchannels_GetParticipants(
channel->inputChannel,
channel->inputChannel(),
MTP_channelParticipantsAdmins(),
MTP_int(offset),
MTP_int(channel->session().serverConfig().chatSizeMax),
@@ -555,8 +555,8 @@ void ChatParticipants::add(
if (const auto chat = peer->asChat()) {
for (const auto &user : users) {
_api.request(MTPmessages_AddChatUser(
chat->inputChat,
user->inputUser,
chat->inputChat(),
user->inputUser(),
MTP_int(passGroupHistory ? kForwardMessagesOnAdd : 0)
)).done([=](const MTPmessages_InvitedUsers &result) {
const auto &data = result.data();
@@ -587,7 +587,7 @@ void ChatParticipants::add(
const auto send = [&] {
const auto callback = base::take(done);
_api.request(MTPchannels_InviteToChannel(
channel->inputChannel,
channel->inputChannel(),
MTP_vector<MTPInputUser>(list)
)).done([=](const MTPmessages_InvitedUsers &result) {
const auto &data = result.data();
@@ -606,7 +606,7 @@ void ChatParticipants::add(
}).afterDelay(kSmallDelayMs).send();
};
for (const auto &user : users) {
list.push_back(user->inputUser);
list.push_back(user->inputUser());
if (list.size() == kMaxUsersPerInvite) {
send();
list.clear();
@@ -653,8 +653,8 @@ void ChatParticipants::Restrict(
Fn<void()> onDone,
Fn<void()> onFail) {
channel->session().api().request(MTPchannels_EditBanned(
channel->inputChannel,
participant->input,
channel->inputChannel(),
participant->input(),
RestrictionsToMTP(newRights)
)).done([=](const MTPUpdates &result) {
channel->session().api().applyUpdates(result);
@@ -692,7 +692,7 @@ void ChatParticipants::requestSelf(not_null<ChannelData*> channel) {
};
_selfParticipantRequests.emplace(channel);
_api.request(MTPchannels_GetParticipant(
channel->inputChannel,
channel->inputChannel(),
MTP_inputPeerSelf()
)).done([=](const MTPchannels_ChannelParticipant &result) {
_selfParticipantRequests.erase(channel);
@@ -742,8 +742,8 @@ void ChatParticipants::kick(
_api.request(MTPmessages_DeleteChatUser(
MTP_flags(0),
chat->inputChat,
participant->asUser()->inputUser
chat->inputChat(),
participant->asUser()->inputUser()
)).done([=](const MTPUpdates &result) {
chat->session().api().applyUpdates(result);
}).send();
@@ -758,8 +758,8 @@ void ChatParticipants::kick(
const auto rights = ChannelData::KickedRestrictedRights(participant);
const auto requestId = _api.request(MTPchannels_EditBanned(
channel->inputChannel,
participant->input,
channel->inputChannel(),
participant->input(),
RestrictionsToMTP(rights)
)).done([=](const MTPUpdates &result) {
channel->session().api().applyUpdates(result);
@@ -782,8 +782,8 @@ void ChatParticipants::unblock(
}
const auto requestId = _api.request(MTPchannels_EditBanned(
channel->inputChannel,
participant->input,
channel->inputChannel(),
participant->input(),
MTP_chatBannedRights(MTP_flags(0), MTP_int(0))
)).done([=](const MTPUpdates &result) {
channel->session().api().applyUpdates(result);
@@ -814,7 +814,7 @@ void ChatParticipants::loadSimilarPeers(not_null<PeerData*> peer) {
_similar[peer].requestId = _api.request(
MTPchannels_GetChannelRecommendations(
MTP_flags(Flag::f_channel),
channel->inputChannel)
channel->inputChannel())
).done([=](const MTPmessages_Chats &result) {
auto &similar = _similar[channel];
similar.requestId = 0;
@@ -832,7 +832,7 @@ void ChatParticipants::loadSimilarPeers(not_null<PeerData*> peer) {
}).send();
} else if (const auto bot = peer->asBot()) {
_similar[peer].requestId = _api.request(
MTPbots_GetBotRecommendations(bot->inputUser)
MTPbots_GetBotRecommendations(bot->inputUser())
).done([=](const MTPusers_Users &result) {
auto &similar = _similar[peer];
similar.requestId = 0;

View File

@@ -68,7 +68,7 @@ void CloudPassword::clearUnconfirmedPassword() {
rpl::producer<Core::CloudPasswordState> CloudPassword::state() const {
return _state
? _stateChanges.events_starting_with_copy(*_state)
: (_stateChanges.events() | rpl::type_erased());
: (_stateChanges.events() | rpl::type_erased);
}
auto CloudPassword::stateCurrent() const

View File

@@ -14,7 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Api {
MTPSuggestedPost SuggestToMTP(SuggestPostOptions suggest) {
MTPSuggestedPost SuggestToMTP(SuggestOptions suggest) {
using Flag = MTPDsuggestedPost::Flag;
return suggest.exists
? MTP_suggestedPost(

View File

@@ -19,7 +19,7 @@ namespace Api {
inline constexpr auto kScheduledUntilOnlineTimestamp = TimeId(0x7FFFFFFE);
[[nodiscard]] MTPSuggestedPost SuggestToMTP(SuggestPostOptions suggest);
[[nodiscard]] MTPSuggestedPost SuggestToMTP(SuggestOptions suggest);
struct SendOptions {
uint64 price = 0;
@@ -34,7 +34,7 @@ struct SendOptions {
bool invertCaption = false;
bool hideViaBot = false;
crl::time ttlSeconds = 0;
SuggestPostOptions suggest;
SuggestOptions suggest;
friend inline bool operator==(
const SendOptions &,

View File

@@ -95,7 +95,7 @@ void ConfirmPhone::resolve(
codeHandles->fire_copy(code);
});
box->resendRequests(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_api.request(MTPauth_ResendCode(
MTP_flags(0),
MTP_string(phone),
@@ -110,7 +110,7 @@ void ConfirmPhone::resolve(
rpl::merge(
codeHandles->events(),
box->checkRequests()
) | rpl::start_with_next([=](const QString &code) {
) | rpl::on_next([=](const QString &code) {
if (_checkRequestId) {
return;
}
@@ -142,7 +142,7 @@ void ConfirmPhone::resolve(
}).handleFloodErrors().send();
}, box->lifetime());
box->boxClosing(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
controller->session().account().setHandleLoginCode(nullptr);
}, box->lifetime());

View File

@@ -131,7 +131,7 @@ rpl::producer<rpl::no_value, QString> CreditsTopupOptions::request() {
using TLOption = MTPStarsGiftOption;
_api.request(MTPpayments_GetStarsGiftOptions(
MTP_flags(MTPpayments_GetStarsGiftOptions::Flag::f_user_id),
user->inputUser
user->inputUser()
)).done([=](const MTPVector<TLOption> &result) {
_options = optionsFromTL(result.v);
consumer.put_done();
@@ -162,7 +162,7 @@ void CreditsStatus::request(
_requestId = _api.request(MTPpayments_GetStarsStatus(
MTP_flags(0),
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input()
)).done([=](const TLResult &result) {
_requestId = 0;
const auto &balance = result.data().vbalance();
@@ -204,7 +204,7 @@ void CreditsHistory::request(
_requestId = _api.request(MTPpayments_GetStarsTransactions(
MTP_flags(_flags),
MTPstring(), // subscription_id
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input,
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input(),
MTP_string(token),
MTP_int(kTransactionsLimit)
)).done([=](const MTPpayments_StarsStatus &result) {
@@ -227,7 +227,7 @@ void CreditsHistory::requestSubscriptions(
MTP_flags(missingBalance
? MTPpayments_getStarsSubscriptions::Flag::f_missing_balance
: MTPpayments_getStarsSubscriptions::Flags(0)),
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input,
_peer->isSelf() ? MTP_inputPeerSelf() : _peer->input(),
MTP_string(token)
)).done([=](const MTPpayments_StarsStatus &result) {
_requestId = 0;
@@ -285,7 +285,7 @@ rpl::producer<rpl::no_value, QString> CreditsEarnStatistics::request() {
const auto finish = [=](const QString &url) {
api().request(MTPpayments_GetStarsRevenueStats(
MTP_flags(0),
(_isUser ? user()->input : channel()->input)
(_isUser ? user()->input() : channel()->input())
)).done([=](const MTPpayments_StarsRevenueStats &result) {
const auto &data = result.data();
const auto &status = data.vstatus().data();
@@ -315,7 +315,7 @@ rpl::producer<rpl::no_value, QString> CreditsEarnStatistics::request() {
api().request(
MTPpayments_GetStarsRevenueAdsAccountUrl(
(_isUser ? user()->input : channel()->input))
(_isUser ? user()->input() : channel()->input()))
).done([=](const MTPpayments_StarsRevenueAdsAccountUrl &result) {
finish(qs(result.data().vurl()));
}).fail([=](const MTP::Error &error) {
@@ -408,7 +408,7 @@ MTPInputSavedStarGift InputSavedStarGiftId(
: id.isUser()
? MTP_inputSavedStarGiftUser(MTP_int(id.userMessageId().bare))
: MTP_inputSavedStarGiftChat(
id.chat()->input,
id.chat()->input(),
MTP_long(id.chatSavedId()));
}

View File

@@ -146,6 +146,8 @@ Data::CreditsHistoryEntry CreditsHistoryEntryFromTL(
? starrefAmount
: CreditsAmount()),
.paidMessagesCommission = paidMessagesCount ? starrefCommission : 0,
.limitedCount = parsedGift ? parsedGift->limitedCount : 0,
.limitedLeft = parsedGift ? parsedGift->limitedLeft : 0,
.starsConverted = int(nonUniqueGift
? nonUniqueGift->vconvert_stars().v
: 0),

View File

@@ -25,7 +25,7 @@ void RestrictSponsored(
bool restricted,
Fn<void(QString)> failed) {
channel->session().api().request(MTPchannels_RestrictSponsoredMessages(
channel->inputChannel,
channel->inputChannel(),
MTP_bool(restricted))
).done([=](const MTPUpdates &updates) {
channel->session().api().applyUpdates(updates);
@@ -69,7 +69,7 @@ void HandleWithdrawalButton(
state->lifetime = session->api().cloudPassword().state(
) | rpl::take(
1
) | rpl::start_with_next([=](const Core::CloudPasswordState &pass) {
) | rpl::on_next([=](const Core::CloudPasswordState &pass) {
state->loading = false;
auto fields = PasscodeBox::CloudFields::From(pass);
@@ -105,8 +105,8 @@ void HandleWithdrawalButton(
? F::f_ton
: F::f_amount),
currencyReceiver
? currencyReceiver->input
: creditsReceiver->input,
? currencyReceiver->input()
: creditsReceiver->input(),
MTP_long(creditsReceiver
? receiver.creditsAmount()
: 0),
@@ -145,8 +145,8 @@ void HandleWithdrawalButton(
? F::f_ton
: F::f_amount),
currencyReceiver
? currencyReceiver->input
: creditsReceiver->input,
? currencyReceiver->input()
: creditsReceiver->input(),
MTP_long(creditsReceiver
? receiver.creditsAmount()
: 0),

View File

@@ -146,7 +146,7 @@ mtpRequestId SuggestMedia(
const auto randomId = base::RandomValue<uint64>();
return api->request(MTPmessages_SendMedia(
MTP_flags(flags),
item->history()->peer->input,
item->history()->peer->input(),
ReplyToForMTP(item->history(), replyTo),
inputMedia.value_or(Data::WebPageForMTP(webpage, text.isEmpty())),
MTP_string(text),
@@ -310,7 +310,7 @@ mtpRequestId EditMessage(
: item->id;
return api->request(MTPmessages_EditMessage(
MTP_flags(flags),
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(id),
MTP_string(text),
inputMedia.value_or(Data::WebPageForMTP(webpage, text.isEmpty())),

View File

@@ -68,7 +68,7 @@ void GlobalPrivacy::reload(Fn<void()> callback) {
}).send();
_session->appConfig().value(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_showArchiveAndMute = _session->appConfig().get<bool>(
u"autoarchive_setting_available"_q,
false);

View File

@@ -101,7 +101,7 @@ void InviteLinks::performCreate(
: Flag(0))
| (requestApproval ? Flag::f_request_needed : Flag(0))
| (args.subscription ? Flag::f_subscription_pricing : Flag(0))),
args.peer->input,
args.peer->input(),
MTP_int(args.expireDate),
MTP_int(args.usageLimit),
MTP_string(args.label),
@@ -270,7 +270,7 @@ void InviteLinks::performEdit(
: Flag(0));
_api->request(MTPmessages_EditExportedChatInvite(
MTP_flags(editOnlyTitle ? Flag::f_title : flags),
peer->input,
peer->input(),
MTP_string(link),
MTP_int(expireDate),
MTP_int(usageLimit),
@@ -365,7 +365,7 @@ void InviteLinks::destroy(
callbacks.push_back(std::move(done));
}
_api->request(MTPmessages_DeleteExportedChatInvite(
peer->input,
peer->input(),
MTP_string(link)
)).done([=] {
const auto callbacks = _deleteCallbacks.take(key);
@@ -400,8 +400,8 @@ void InviteLinks::destroyAllRevoked(
callbacks.push_back(std::move(done));
}
_api->request(MTPmessages_DeleteRevokedExportedChatInvites(
peer->input,
admin->inputUser
peer->input(),
admin->inputUser()
)).done([=] {
if (const auto callbacks = _deleteRevokedCallbacks.take(peer)) {
for (const auto &callback : *callbacks) {
@@ -418,7 +418,7 @@ void InviteLinks::requestMyLinks(not_null<PeerData*> peer) {
}
const auto requestId = _api->request(MTPmessages_GetExportedChatInvites(
MTP_flags(0),
peer->input,
peer->input(),
MTP_inputUserSelf(),
MTPint(), // offset_date
MTPstring(), // offset_link
@@ -471,8 +471,8 @@ void InviteLinks::processRequest(
using Flag = MTPmessages_HideChatJoinRequest::Flag;
_api->request(MTPmessages_HideChatJoinRequest(
MTP_flags(approved ? Flag::f_approved : Flag(0)),
peer->input,
user->inputUser
peer->input(),
user->inputUser()
)).done([=](const MTPUpdates &result) {
if (const auto chat = peer->asChat()) {
if (chat->count > 0) {
@@ -601,7 +601,7 @@ void InviteLinks::requestJoinedFirstSlice(LinkKey key) {
}
const auto requestId = _api->request(MTPmessages_GetChatInviteImporters(
MTP_flags(MTPmessages_GetChatInviteImporters::Flag::f_link),
key.peer->input,
key.peer->input(),
MTP_string(key.link),
MTPstring(), // q
MTP_int(0), // offset_date
@@ -780,8 +780,8 @@ void InviteLinks::requestMoreLinks(
_api->request(MTPmessages_GetExportedChatInvites(
MTP_flags(Flag::f_offset_link
| (revoked ? Flag::f_revoked : Flag(0))),
peer->input,
admin->inputUser,
peer->input(),
admin->inputUser(),
MTP_int(lastDate),
MTP_string(lastLink),
MTP_int(kPerPage)

View File

@@ -105,10 +105,10 @@ void MessagesSearch::searchRequest() {
| (savedPeer ? Flag::f_saved_peer_id : Flag())
| (_request.topMsgId ? Flag::f_top_msg_id : Flag())
| (_request.tags.empty() ? Flag() : Flag::f_saved_reaction)),
_history->peer->input,
_history->peer->input(),
MTP_string(_request.query),
(fromPeer ? fromPeer->input : MTP_inputPeerEmpty()),
(savedPeer ? savedPeer->input : MTP_inputPeerEmpty()),
(fromPeer ? fromPeer->input() : MTP_inputPeerEmpty()),
(savedPeer ? savedPeer->input() : MTP_inputPeerEmpty()),
MTP_vector_from_range(_request.tags | ranges::views::transform(
Data::ReactionToMTP
)),

View File

@@ -36,7 +36,7 @@ MessagesSearchMerged::MessagesSearchMerged(not_null<History*> history)
};
_apiSearch.messagesFounds(
) | rpl::start_with_next([=](const FoundMessages &data) {
) | rpl::on_next([=](const FoundMessages &data) {
if (data.nextToken == _concatedFound.nextToken) {
addFound(data);
checkFull(data);
@@ -50,7 +50,7 @@ MessagesSearchMerged::MessagesSearchMerged(not_null<History*> history)
if (_migratedSearch) {
_migratedSearch->messagesFounds(
) | rpl::start_with_next([=](const FoundMessages &data) {
) | rpl::on_next([=](const FoundMessages &data) {
if (_isFull) {
addFound(data);
}

View File

@@ -153,7 +153,7 @@ PeerPhoto::PeerPhoto(not_null<ApiWrap*> api)
// You can't use _session->lifetime() in the constructor,
// only queued, because it is not constructed yet.
_session->uploader().photoReady(
) | rpl::start_with_next([=](const Storage::UploadedMedia &data) {
) | rpl::on_next([=](const Storage::UploadedMedia &data) {
ready(data.fullId, data.info.file, std::nullopt);
}, _session->lifetime());
});
@@ -243,12 +243,16 @@ void PeerPhoto::suggest(not_null<PeerData*> peer, UserPhoto &&photo) {
void PeerPhoto::clear(not_null<PhotoData*> photo) {
const auto self = _session->user();
if (self->userpicPhotoId() == photo->id) {
const auto photoId = photo->id;
const auto peerId = self->id;
_api.request(MTPphotos_UpdateProfilePhoto(
MTP_flags(0),
MTPInputUser(), // bot
MTP_inputPhotoEmpty()
)).done([=](const MTPphotos_Photo &result) {
self->setPhoto(MTP_userProfilePhotoEmpty());
_session->storage().remove(
Storage::UserPhotosRemoveOne(peerToUser(peerId), photoId));
}).send();
} else if (photo->peer && photo->peer->userpicPhotoId() == photo->id) {
const auto applier = [=](const MTPUpdates &result) {
@@ -256,12 +260,12 @@ void PeerPhoto::clear(not_null<PhotoData*> photo) {
};
if (const auto chat = photo->peer->asChat()) {
_api.request(MTPmessages_EditChatPhoto(
chat->inputChat,
chat->inputChat(),
MTP_inputChatPhotoEmpty()
)).done(applier).send();
} else if (const auto channel = photo->peer->asChannel()) {
_api.request(MTPchannels_EditPhoto(
channel->inputChannel,
channel->inputChannel(),
MTP_inputChatPhotoEmpty()
)).done(applier).send();
}
@@ -290,7 +294,7 @@ void PeerPhoto::clear(not_null<PhotoData*> photo) {
void PeerPhoto::clearPersonal(not_null<UserData*> user) {
_api.request(MTPphotos_UploadContactProfilePhoto(
MTP_flags(MTPphotos_UploadContactProfilePhoto::Flag::f_save),
user->inputUser,
user->inputUser(),
MTPInputFile(),
MTPInputFile(), // video
MTPdouble(), // video_start_ts
@@ -314,15 +318,20 @@ void PeerPhoto::set(not_null<PeerData*> peer, not_null<PhotoData*> photo) {
return;
}
if (peer == _session->user()) {
const auto photoId = photo->id;
const auto peerId = peer->id;
_api.request(MTPphotos_UpdateProfilePhoto(
MTP_flags(0),
MTPInputUser(), // bot
photo->mtpInput()
)).done([=](const MTPphotos_Photo &result) {
result.match([&](const MTPDphotos_photo &data) {
_session->data().processPhoto(data.vphoto());
_session->data().processUsers(data.vusers());
});
const auto newPhoto = _session->data().processPhoto(
result.data().vphoto());
_session->data().processUsers(result.data().vusers());
_session->storage().replace(Storage::UserPhotosReplace(
peerToUser(peerId),
photoId,
newPhoto->id));
}).send();
} else {
const auto applier = [=](const MTPUpdates &result) {
@@ -330,12 +339,12 @@ void PeerPhoto::set(not_null<PeerData*> peer, not_null<PhotoData*> photo) {
};
if (const auto chat = peer->asChat()) {
_api.request(MTPmessages_EditChatPhoto(
chat->inputChat,
chat->inputChat(),
MTP_inputChatPhoto(photo->mtpInput())
)).done(applier).send();
} else if (const auto channel = peer->asChannel()) {
_api.request(MTPchannels_EditPhoto(
channel->inputChannel,
channel->inputChannel(),
MTP_inputChatPhoto(photo->mtpInput())
)).done(applier).send();
}
@@ -362,7 +371,7 @@ void PeerPhoto::ready(
const auto botUserInput = [&] {
const auto user = peer->asUser();
return (user && user->botInfo && user->botInfo->canEditInformation)
? std::make_optional<MTPInputUser>(user->inputUser)
? std::make_optional<MTPInputUser>(user->inputUser())
: std::nullopt;
}();
if (peer->isSelf() || botUserInput) {
@@ -386,6 +395,10 @@ void PeerPhoto::ready(
_session->storage().add(Storage::UserPhotosSetBack(
peerToUser(peer->id),
photoId));
} else {
_session->storage().add(Storage::UserPhotosAddNew(
peerToUser(peer->id),
photoId));
}
if (done) {
done();
@@ -396,7 +409,7 @@ void PeerPhoto::ready(
using Flag = MTPDinputChatUploadedPhoto::Flag;
const auto none = MTPDinputChatUploadedPhoto::Flags(0);
history->sendRequestId = _api.request(MTPmessages_EditChatPhoto(
chat->inputChat,
chat->inputChat(),
MTP_inputChatUploadedPhoto(
MTP_flags((file ? Flag::f_file : none)
| (videoSize ? Flag::f_video_emoji_markup : none)),
@@ -410,7 +423,7 @@ void PeerPhoto::ready(
const auto none = MTPDinputChatUploadedPhoto::Flags(0);
const auto history = _session->data().history(channel);
history->sendRequestId = _api.request(MTPchannels_EditPhoto(
channel->inputChannel,
channel->inputChannel(),
MTP_inputChatUploadedPhoto(
MTP_flags((file ? Flag::f_file : none)
| (videoSize ? Flag::f_video_emoji_markup : none)),
@@ -428,7 +441,7 @@ void PeerPhoto::ready(
| ((type == UploadType::Suggestion)
? Flag::f_suggest
: Flag::f_save)),
user->inputUser,
user->inputUser(),
file ? (*file) : MTPInputFile(),
MTPInputFile(), // video
MTPdouble(), // video_start_ts
@@ -456,7 +469,7 @@ void PeerPhoto::requestUserPhotos(
}
const auto requestId = _api.request(MTPphotos_GetUserPhotos(
user->inputUser,
user->inputUser(),
MTP_int(0),
MTP_long(afterId),
MTP_int(kSharedMediaLimit)

View File

@@ -90,7 +90,7 @@ void Polls::create(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
PollDataToInputMedia(&data),
MTP_string(),
@@ -99,7 +99,7 @@ void Polls::create(
MTPVector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTP_long(action.options.effectId),
MTP_long(starsPaid),
@@ -162,7 +162,7 @@ void Polls::sendVotes(
ranges::back_inserter(prepared),
[](const QByteArray &option) { return MTP_bytes(option); });
const auto requestId = _api.request(MTPmessages_SendVote(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id),
MTP_vector<MTPbytes>(prepared)
)).done([=](const MTPUpdates &result) {
@@ -188,7 +188,7 @@ void Polls::close(not_null<HistoryItem*> item) {
}
const auto requestId = _api.request(MTPmessages_EditMessage(
MTP_flags(MTPmessages_EditMessage::Flag::f_media),
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id),
MTPstring(),
PollDataToInputMedia(poll, true),
@@ -212,7 +212,7 @@ void Polls::reloadResults(not_null<HistoryItem*> item) {
return;
}
const auto requestId = _api.request(MTPmessages_GetPollResults(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id)
)).done([=](const MTPUpdates &result) {
_pollReloadRequestIds.erase(itemId);

View File

@@ -95,7 +95,7 @@ Premium::Premium(not_null<ApiWrap*> api)
// only queued, because it is not constructed yet.
Data::AmPremiumValue(
_session
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
reload();
if (_session->premium()) {
reloadCloudSet();
@@ -365,7 +365,7 @@ void Premium::resolveGiveawayInfo(
_giveawayInfoPeer = peer;
_giveawayInfoMessageId = messageId;
_giveawayInfoRequestId = _api.request(MTPpayments_GetGiveawayInfo(
_giveawayInfoPeer->input,
_giveawayInfoPeer->input(),
MTP_int(_giveawayInfoMessageId.bare)
)).done([=](const MTPpayments_GiveawayInfo &result) {
_giveawayInfoRequestId = 0;
@@ -500,7 +500,7 @@ rpl::producer<rpl::no_value, QString> PremiumGiftCodeOptions::request() {
MTP_flags(_peer->isChannel()
? MTPpayments_GetPremiumGiftCodeOptions::Flag::f_boost_peer
: MTPpayments_GetPremiumGiftCodeOptions::Flag(0)),
_peer->input
_peer->input()
)).done([=](const MTPVector<TLOption> &result) {
auto tlMapOptions = base::flat_map<Amount, QVector<TLOption>>();
for (const auto &tlOption : result.v) {
@@ -554,7 +554,7 @@ rpl::producer<rpl::no_value, QString> PremiumGiftCodeOptions::applyPrepaid(
}
_api.request(MTPpayments_LaunchPrepaidGiveaway(
_peer->input,
_peer->input(),
MTP_long(prepaidId),
invoice.giveawayCredits
? Payments::InvoiceCreditsGiveawayToTL(invoice)
@@ -848,8 +848,22 @@ std::optional<Data::StarGift> FromTL(
const auto releasedBy = releasedById
? session->data().peer(releasedById).get()
: nullptr;
const auto background = [&] {
if (!data.vbackground()) {
return std::shared_ptr<Data::StarGiftBackground>();
}
const auto &fields = data.vbackground()->data();
using namespace Ui;
return std::make_shared<Data::StarGiftBackground>(
Data::StarGiftBackground{
.center = ColorFromSerialized(fields.vcenter_color()),
.edge = ColorFromSerialized(fields.vedge_color()),
.text = ColorFromSerialized(fields.vtext_color()),
});
};
return std::optional<Data::StarGift>(Data::StarGift{
.id = uint64(data.vid().v),
.background = background(),
.stars = int64(data.vstars().v),
.starsConverted = int64(data.vconvert_stars().v),
.starsToUpgrade = int64(data.vupgrade_stars().value_or_empty()),
@@ -860,10 +874,12 @@ std::optional<Data::StarGift> FromTL(
.resellCount = int(data.vavailability_resale().value_or_empty()),
.auctionSlug = qs(data.vauction_slug().value_or_empty()),
.auctionGiftsPerRound = data.vgifts_per_round().value_or_empty(),
.auctionStartDate = data.vauction_start_date().value_or_empty(),
.limitedLeft = remaining.value_or_empty(),
.limitedCount = total.value_or_empty(),
.perUserTotal = data.vper_user_total().value_or_empty(),
.perUserRemains = data.vper_user_remains().value_or_empty(),
.upgradeVariants = data.vupgrade_variants().value_or_empty(),
.firstSaleDate = data.vfirst_sale_date().value_or_empty(),
.lastSaleDate = data.vlast_sale_date().value_or_empty(),
.lockedUntilDate = data.vlocked_until_date().value_or_empty(),
@@ -930,6 +946,7 @@ std::optional<Data::StarGift> FromTL(
.themeUser = themeUser,
.nanoTonForResale = FindTonForResale(data.vresell_amount()),
.starsForResale = FindStarsForResale(data.vresell_amount()),
.starsMinOffer = data.voffer_min_stars().value_or(-1),
.number = data.vnum().v,
.onlyAcceptTon = data.is_resale_ton_only(),
.canBeTheme = data.is_theme_available(),
@@ -942,6 +959,8 @@ std::optional<Data::StarGift> FromTL(
data.vvalue_currency().value_or_empty()),
.valuePrice = int64(
data.vvalue_amount().value_or_empty()),
.valuePriceUsd = int64(
data.vvalue_usd_amount().value_or_empty()),
})
: nullptr),
.peerColor = colorCollectible,
@@ -963,7 +982,7 @@ std::optional<Data::StarGift> FromTL(
unique->originalDetails = FromTL(session, data);
});
}
return std::make_optional(result);
return std::make_optional(std::move(result));
});
}
@@ -1009,6 +1028,7 @@ std::optional<Data::SavedStarGift> FromTL(
? peerFromMTP(*data.vfrom_id())
: PeerId()),
.date = data.vdate().v,
.giftNum = data.vgift_num().value_or_empty(),
.upgradeSeparate = data.is_upgrade_separate(),
.upgradable = data.is_can_upgrade(),
.anonymous = data.is_name_hidden(),

View File

@@ -47,7 +47,7 @@ void SendPhotoReport(
const QString &comment,
not_null<PhotoData*> photo) {
peer->session().api().request(MTPaccount_ReportProfilePhoto(
peer->input,
peer->input(),
photo->mtpInput(),
ReasonToTL(reason),
MTP_string(comment)
@@ -125,7 +125,7 @@ auto CreateReportMessagesOrStoriesCallback(
if (!reportInput.stories.empty()) {
state->requestId = peer->session().api().request(
MTPstories_Report(
peer->input,
peer->input(),
MTP_vector<MTPint>(apiIds),
MTP_bytes(reportInput.optionId),
MTP_string(reportInput.comment))
@@ -133,7 +133,7 @@ auto CreateReportMessagesOrStoriesCallback(
} else {
state->requestId = peer->session().api().request(
MTPmessages_Report(
peer->input,
peer->input(),
MTP_vector<MTPint>(apiIds),
MTP_bytes(reportInput.optionId),
MTP_string(reportInput.comment))

View File

@@ -66,7 +66,7 @@ Ringtones::Ringtones(not_null<ApiWrap*> api)
// You can't use _session->lifetime() in the constructor,
// only queued, because it is not constructed yet.
_session->uploader().documentReady(
) | rpl::start_with_next([=](const Storage::UploadedMedia &data) {
) | rpl::on_next([=](const Storage::UploadedMedia &data) {
ready(data.fullId, data.info.file);
}, _session->lifetime());
});

View File

@@ -137,7 +137,7 @@ void SendProgressManager::send(const Key &key, int progress) {
MTP_flags(key.topMsgId
? MTPmessages_SetTyping::Flag::f_top_msg_id
: MTPmessages_SetTyping::Flag(0)),
key.history->peer->input,
key.history->peer->input(),
MTP_int(key.topMsgId),
action
)).done([=](const MTPBool &result, mtpRequestId requestId) {

View File

@@ -131,7 +131,7 @@ void SendSimpleMedia(SendAction action, MTPInputMedia inputMedia) {
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
std::move(inputMedia),
MTPstring(),
@@ -140,7 +140,7 @@ void SendSimpleMedia(SendAction action, MTPInputMedia inputMedia) {
MTPvector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(session, action.options.shortcutId),
MTP_long(action.options.effectId),
MTP_long(starsPaid),
@@ -259,7 +259,7 @@ void SendExistingMedia(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
inputMedia(),
MTP_string(captionText),
@@ -268,7 +268,7 @@ void SendExistingMedia(
sentEntities,
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(session, action.options.shortcutId),
MTP_long(action.options.effectId),
MTP_long(starsPaid),
@@ -448,7 +448,7 @@ bool SendDice(MessageToSend &message) {
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
MTP_inputMediaDice(MTP_string(emoji)),
MTP_string(),
@@ -457,7 +457,7 @@ bool SendDice(MessageToSend &message) {
MTP_vector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(session, action.options.shortcutId),
MTP_long(action.options.effectId),
MTP_long(starsPaid),

View File

@@ -99,7 +99,7 @@ std::optional<HistoryItem*> SingleMessageSearch::performLookupByChannel(
ready();
};
_requestId = _session->api().request(MTPchannels_GetMessages(
channel->inputChannel,
channel->inputChannel(),
MTP_vector<MTPInputMessage>(1, MTP_inputMessageID(MTP_int(postId)))
)).done([=](const MTPmessages_Messages &result) {
const auto received = Api::ParseSearchResult(

View File

@@ -210,7 +210,7 @@ rpl::producer<rpl::no_value, QString> Statistics::request() {
if (!channel()->isMegagroup()) {
makeRequest(MTPstats_GetBroadcastStats(
MTP_flags(MTPstats_GetBroadcastStats::Flags(0)),
channel()->inputChannel
channel()->inputChannel()
)).done([=](const MTPstats_BroadcastStats &result) {
_channelStats = ChannelStatisticsFromTL(result.data());
consumer.put_done();
@@ -220,7 +220,7 @@ rpl::producer<rpl::no_value, QString> Statistics::request() {
} else {
makeRequest(MTPstats_GetMegagroupStats(
MTP_flags(MTPstats_GetMegagroupStats::Flags(0)),
channel()->inputChannel
channel()->inputChannel()
)).done([=](const MTPstats_MegagroupStats &result) {
const auto &data = result.data();
_supergroupStats = SupergroupStatisticsFromTL(data);
@@ -351,14 +351,14 @@ void PublicForwards::request(
constexpr auto kLimit = tl::make_int(100);
if (_fullId.messageId) {
_requestId = makeRequest(MTPstats_GetMessagePublicForwards(
channel->inputChannel,
channel->inputChannel(),
MTP_int(_fullId.messageId.msg),
MTP_string(token),
kLimit
)).done(processResult).fail(processFail).send();
} else if (_fullId.storyId) {
_requestId = makeRequest(MTPstats_GetStoryPublicForwards(
channel->input,
channel->input(),
MTP_int(_fullId.storyId.story),
MTP_string(token),
kLimit
@@ -413,7 +413,7 @@ void MessageStatistics::request(Fn<void(Data::MessageStatistics)> done) {
const Data::StatisticalGraph &messageGraph,
const Data::StatisticalGraph &reactionsGraph) {
api().request(MTPchannels_GetMessages(
channel()->inputChannel,
channel()->inputChannel(),
MTP_vector<MTPInputMessage>(
1,
MTP_inputMessageID(MTP_int(_fullId.msg))))
@@ -468,7 +468,7 @@ void MessageStatistics::request(Fn<void(Data::MessageStatistics)> done) {
const Data::StatisticalGraph &messageGraph,
const Data::StatisticalGraph &reactionsGraph) {
api().request(MTPstories_GetStoriesByID(
channel()->input,
channel()->input(),
MTP_vector<MTPint>(1, MTP_int(_storyId.story)))
).done([=](const MTPstories_Stories &result) {
const auto &storyItem = result.data().vstories().v.front();
@@ -499,7 +499,7 @@ void MessageStatistics::request(Fn<void(Data::MessageStatistics)> done) {
if (_storyId) {
makeRequest(MTPstats_GetStoryStats(
MTP_flags(MTPstats_GetStoryStats::Flags(0)),
channel()->input,
channel()->input(),
MTP_int(_storyId.story)
)).done([=](const MTPstats_StoryStats &result) {
const auto &data = result.data();
@@ -512,7 +512,7 @@ void MessageStatistics::request(Fn<void(Data::MessageStatistics)> done) {
} else {
makeRequest(MTPstats_GetMessageStats(
MTP_flags(MTPstats_GetMessageStats::Flags(0)),
channel()->inputChannel,
channel()->inputChannel(),
MTP_int(_fullId.msg.bare)
)).done([=](const MTPstats_MessageStats &result) {
const auto &data = result.data();
@@ -539,7 +539,7 @@ rpl::producer<rpl::no_value, QString> Boosts::request() {
}
_api.request(MTPpremium_GetBoostsStatus(
_peer->input
_peer->input()
)).done([=](const MTPpremium_BoostsStatus &result) {
const auto &data = result.data();
channel->updateLevelHint(data.vlevel().v);
@@ -625,7 +625,7 @@ void Boosts::requestBoosts(
gifts
? MTP_flags(MTPpremium_GetBoostsList::Flag::f_gifts)
: MTP_flags(0),
_peer->input,
_peer->input(),
MTP_string(token.next),
token.next.isEmpty() ? kTlFirstSlice : kTlLimit
)).done([=](const MTPpremium_BoostsList &result) {
@@ -698,7 +698,7 @@ rpl::producer<rpl::no_value, QString> EarnStatistics::request() {
api().request(MTPpayments_GetStarsRevenueStats(
MTP_flags(MTPpayments_getStarsRevenueStats::Flag::f_ton),
(_isUser ? user()->input : channel()->input)
(_isUser ? user()->input() : channel()->input())
)).done([=](const MTPpayments_StarsRevenueStats &result) {
const auto &data = result.data();
const auto &balances = data.vstatus().data();
@@ -721,7 +721,7 @@ rpl::producer<rpl::no_value, QString> EarnStatistics::request() {
if (!_isUser) {
api().request(
MTPchannels_GetFullChannel(channel()->inputChannel)
MTPchannels_GetFullChannel(channel()->inputChannel())
).done([=](const MTPmessages_ChatFull &result) {
result.data().vfull_chat().match([&](
const MTPDchannelFull &d) {
@@ -757,7 +757,7 @@ void EarnStatistics::requestHistory(
_requestId = api().request(MTPpayments_GetStarsTransactions(
MTP_flags(MTPpayments_getStarsTransactions::Flag::f_ton),
MTP_string(), // Subscription ID.
(_isUser ? user()->input : channel()->input),
(_isUser ? user()->input() : channel()->input()),
MTP_string(token),
token.isEmpty() ? kTlFirstSlice : kTlLimit
)).done([=](const MTPpayments_StarsStatus &result) {

View File

@@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "apiwrap.h"
#include "base/unixtime.h"
#include "boxes/transfer_gift_box.h"
#include "chat_helpers/message_field.h"
#include "core/click_handler_types.h"
#include "data/components/credits.h"
@@ -44,7 +45,7 @@ void SendApproval(
not_null<HistoryItem*> item,
TimeId scheduleDate = 0) {
using Flag = MTPmessages_ToggleSuggestedPostApproval::Flag;
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion
|| suggestion->accepted
|| suggestion->rejected
@@ -56,7 +57,7 @@ void SendApproval(
const auto session = &show->session();
const auto finish = [=] {
if (const auto item = session->data().message(id)) {
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (suggestion) {
suggestion->requestId = 0;
}
@@ -65,7 +66,7 @@ void SendApproval(
suggestion->requestId = session->api().request(
MTPmessages_ToggleSuggestedPostApproval(
MTP_flags(scheduleDate ? Flag::f_schedule_date : Flag()),
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id.bare),
MTP_int(scheduleDate),
MTPstring()) // reject_comment
@@ -83,7 +84,7 @@ void ConfirmApproval(
not_null<HistoryItem*> item,
TimeId scheduleDate = 0,
Fn<void()> accepted = nullptr) {
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion
|| suggestion->accepted
|| suggestion->rejected
@@ -153,13 +154,13 @@ void ConfirmApproval(
? tr::lng_suggest_accept_text(
tr::now,
lt_from,
Ui::Text::Bold(item->from()->shortName()),
Ui::Text::WithEntities)
tr::bold(item->from()->shortName()),
tr::marked)
: tr::lng_suggest_accept_text_to(
tr::now,
lt_channel,
Ui::Text::Bold(channelName),
Ui::Text::WithEntities);
tr::bold(channelName),
tr::marked);
if (price) {
text.append("\n\n").append(admin
? (scheduleDate
@@ -170,12 +171,12 @@ void ConfirmApproval(
lt_count_decimal,
amount.value(),
lt_channel,
Ui::Text::Bold(channelName),
tr::bold(channelName),
lt_percent,
TextWithEntities{ commission },
lt_date,
Ui::Text::Bold(date),
Ui::Text::RichLangValue)
tr::bold(date),
tr::rich)
: (amount.stars()
? tr::lng_suggest_accept_receive_now_stars
: tr::lng_suggest_accept_receive_now_ton)(
@@ -183,10 +184,10 @@ void ConfirmApproval(
lt_count_decimal,
amount.value(),
lt_channel,
Ui::Text::Bold(channelName),
tr::bold(channelName),
lt_percent,
TextWithEntities{ commission },
Ui::Text::RichLangValue))
tr::rich))
: (scheduleDate
? (amount.stars()
? tr::lng_suggest_accept_pay_stars
@@ -195,25 +196,25 @@ void ConfirmApproval(
lt_count_decimal,
amount.value(),
lt_date,
Ui::Text::Bold(date),
Ui::Text::RichLangValue)
tr::bold(date),
tr::rich)
: (amount.stars()
? tr::lng_suggest_accept_pay_now_stars
: tr::lng_suggest_accept_pay_now_ton)(
tr::now,
lt_count_decimal,
amount.value(),
Ui::Text::RichLangValue)));
tr::rich)));
if (admin) {
text.append(' ').append(
tr::lng_suggest_accept_receive_if(
tr::now,
Ui::Text::RichLangValue));
tr::rich));
if (price.stars()) {
text.append("\n\n").append(
tr::lng_suggest_options_stars_warning(
tr::now,
Ui::Text::RichLangValue));
tr::rich));
}
}
}
@@ -244,7 +245,7 @@ void SendDecline(
not_null<HistoryItem*> item,
const QString &comment) {
using Flag = MTPmessages_ToggleSuggestedPostApproval::Flag;
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion
|| suggestion->accepted
|| suggestion->rejected
@@ -256,7 +257,7 @@ void SendDecline(
const auto session = &show->session();
const auto finish = [=] {
if (const auto item = session->data().message(id)) {
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (suggestion) {
suggestion->requestId = 0;
}
@@ -266,7 +267,7 @@ void SendDecline(
MTPmessages_ToggleSuggestedPostApproval(
MTP_flags(Flag::f_reject
| (comment.isEmpty() ? Flag() : Flag::f_reject_comment)),
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id.bare),
MTPint(), // schedule_date
MTP_string(comment))
@@ -320,12 +321,12 @@ void RequestDeclineComment(
.text = (admin
? tr::lng_suggest_decline_text(
lt_from,
rpl::single(Ui::Text::Bold(item->from()->shortName())),
Ui::Text::WithEntities)
rpl::single(tr::bold(item->from()->shortName())),
tr::marked)
: tr::lng_suggest_decline_text_to(
lt_channel,
rpl::single(Ui::Text::Bold(channelName)),
Ui::Text::WithEntities)),
rpl::single(tr::bold(channelName)),
tr::marked)),
.confirmed = [=](Fn<void()> close) { (*callback)(); close(); },
.confirmText = tr::lng_suggest_action_decline(),
.confirmStyle = &st::attentionBoxButton,
@@ -350,7 +351,7 @@ void RequestDeclineComment(
}
};
reason->submits(
) | rpl::start_with_next([=](Qt::KeyboardModifiers modifiers) {
) | rpl::on_next([=](Qt::KeyboardModifiers modifiers) {
if (!(modifiers & Qt::ShiftModifier)) {
(*callback)();
}
@@ -365,10 +366,10 @@ void SendSuggest(
std::shared_ptr<Main::SessionShow> show,
not_null<HistoryItem*> item,
std::shared_ptr<SendSuggestState> state,
Fn<void(SuggestPostOptions&)> modify,
Fn<void(SuggestOptions&)> modify,
Fn<void()> done = nullptr,
int starsApproved = 0) {
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
const auto id = item->fullId();
const auto withPaymentApproved = [=](int stars) {
if (const auto item = show->session().data().message(id)) {
@@ -416,7 +417,7 @@ void SendSuggest(
void SuggestApprovalDate(
std::shared_ptr<Main::SessionShow> show,
not_null<HistoryItem*> item) {
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion) {
return;
}
@@ -437,7 +438,7 @@ void SuggestApprovalDate(
show,
item,
state,
[=](SuggestPostOptions &options) { options.date = result; },
[=](SuggestOptions &options) { options.date = result; },
close);
};
using namespace HistoryView;
@@ -454,12 +455,12 @@ void SuggestApprovalDate(
void SuggestOfferForMessage(
std::shared_ptr<Main::SessionShow> show,
not_null<HistoryItem*> item,
SuggestPostOptions values,
SuggestOptions values,
HistoryView::SuggestMode mode) {
const auto id = item->fullId();
const auto state = std::make_shared<SendSuggestState>();
const auto weak = std::make_shared<base::weak_qptr<Ui::BoxContent>>();
const auto done = [=](SuggestPostOptions result) {
const auto done = [=](SuggestOptions result) {
const auto item = show->session().data().message(id);
if (!item) {
return;
@@ -473,7 +474,7 @@ void SuggestOfferForMessage(
show,
item,
state,
[=](SuggestPostOptions &options) { options = result; },
[=](SuggestOptions &options) { options = result; },
close);
};
using namespace HistoryView;
@@ -490,7 +491,7 @@ void SuggestOfferForMessage(
void SuggestApprovalPrice(
std::shared_ptr<Main::SessionShow> show,
not_null<HistoryItem*> item) {
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion) {
return;
}
@@ -504,6 +505,20 @@ void SuggestApprovalPrice(
}, SuggestMode::Change);
}
void ConfirmGiftSaleAccept(
not_null<Window::SessionController*> window,
not_null<HistoryItem*> item,
not_null<HistoryMessageSuggestion*> suggestion) {
ShowGiftSaleAcceptBox(window, item, suggestion);
}
void ConfirmGiftSaleDecline(
not_null<Window::SessionController*> window,
not_null<HistoryItem*> item,
not_null<HistoryMessageSuggestion*> suggestion) {
ShowGiftSaleRejectBox(window, item, suggestion);
}
} // namespace
std::shared_ptr<ClickHandler> AcceptClickHandler(
@@ -521,9 +536,11 @@ std::shared_ptr<ClickHandler> AcceptClickHandler(
return;
}
const auto show = controller->uiShow();
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion) {
return;
} else if (suggestion->gift) {
ConfirmGiftSaleAccept(controller, item, suggestion);
} else if (!suggestion->date) {
RequestApprovalDate(show, item);
} else {
@@ -546,7 +563,12 @@ std::shared_ptr<ClickHandler> DeclineClickHandler(
if (!item) {
return;
}
RequestDeclineComment(controller->uiShow(), item);
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (suggestion && suggestion->gift) {
ConfirmGiftSaleDecline(controller, item, suggestion);
} else {
RequestDeclineComment(controller->uiShow(), item);
}
});
}
@@ -573,7 +595,7 @@ std::shared_ptr<ClickHandler> SuggestChangesClickHandler(
if (!item) {
return;
}
const auto suggestion = item->Get<HistoryMessageSuggestedPost>();
const auto suggestion = item->Get<HistoryMessageSuggestion>();
if (!suggestion) {
return;
}
@@ -594,7 +616,7 @@ std::shared_ptr<ClickHandler> SuggestChangesClickHandler(
.messageId = FullMsgId(history->peer->id, item->id),
.monoforumPeerId = monoforumPeerId,
},
SuggestPostOptions{
SuggestOptions{
.exists = uint32(1),
.priceWhole = uint32(suggestion->price.whole()),
.priceNano = uint32(suggestion->price.nano()),

View File

@@ -12,6 +12,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_user.h"
#include "data/stickers/data_custom_emoji.h"
#include "data/stickers/data_stickers_set.h"
#include "history/history.h"
#include "history/history_item.h"
#include "main/main_session.h"
namespace Api {
@@ -47,14 +49,23 @@ using namespace TextUtilities;
if (!parsed.userId || parsed.selfId != session->userId().bare) {
return {};
}
return MTP_inputMessageEntityMentionName(
offset,
length,
(parsed.userId == parsed.selfId
? MTP_inputUserSelf()
: MTP_inputUser(
MTP_long(parsed.userId),
MTP_long(parsed.accessHash))));
const auto user = session->data().user(UserId(parsed.userId));
const auto item = user->isLoaded()
? nullptr
: user->owner().messageWithPeer(user->id);
const auto input = item
? MTP_inputUserFromMessage(
item->history()->peer->input(),
MTP_int(item->id.bare),
MTP_long(parsed.userId))
: (parsed.userId == parsed.selfId)
? MTP_inputUserSelf()
: user->isLoaded()
? user->inputUser()
: MTP_inputUser(
MTP_long(parsed.userId),
MTP_long(parsed.accessHash));
return MTP_inputMessageEntityMentionName(offset, length, input);
}
} // namespace

View File

@@ -95,7 +95,7 @@ void TodoLists::create(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
TodoListDataToInputMedia(&data),
MTP_string(),
@@ -104,7 +104,7 @@ void TodoLists::create(
MTPVector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTP_long(action.options.effectId),
MTP_long(starsPaid),
@@ -164,7 +164,7 @@ void TodoLists::add(
}
const auto session = _session;
_session->api().request(MTPmessages_AppendTodoList(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id.bare),
TodoListItemsToMTP(&item->history()->session(), items)
)).done([=](const MTPUpdates &result) {
@@ -230,7 +230,7 @@ void TodoLists::send(FullMsgId itemId, Accumulated &entry) {
auto incompleted = entry.incompleted
| ranges::views::transform([](int id) { return MTP_int(id); });
entry.requestId = _api.request(MTPmessages_ToggleTodoCompleted(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id),
MTP_vector_from_range(completed),
MTP_vector_from_range(incompleted)

View File

@@ -24,7 +24,7 @@ void ToggleExistingMedia(
Data::FileOrigin origin,
ToggleRequestCallback toggleRequest,
DoneCallback &&done) {
const auto api = &document->owner().session().api();
const auto api = &document->session().api();
auto performRequest = [=](const auto &repeatRequest) -> void {
const auto usedFileReference = document->fileReference();

View File

@@ -41,7 +41,7 @@ void Transcribes::rate(not_null<HistoryItem*> item, bool isGood) {
for (const auto &[transcribeId, id] : _ids) {
if (id == fullId) {
_api.request(MTPmessages_RateTranscribedAudio(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id),
MTP_long(transcribeId),
MTP_bool(isGood))).send();
@@ -158,7 +158,7 @@ void Transcribes::load(not_null<HistoryItem*> item) {
};
const auto id = item->fullId();
const auto requestId = _api.request(MTPmessages_TranscribeAudio(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id)
)).done([=](const MTPmessages_TranscribedAudio &result) {
const auto &data = result.data();

View File

@@ -111,7 +111,7 @@ void UnreadThings::requestMentions(
using Flag = MTPmessages_GetUnreadMentions::Flag;
const auto requestId = _api->request(MTPmessages_GetUnreadMentions(
MTP_flags(topic ? Flag::f_top_msg_id : Flag()),
history->peer->input,
history->peer->input(),
MTP_int(topic ? topic->rootId() : 0),
MTP_int(offsetId),
MTP_int(addOffset),
@@ -147,9 +147,9 @@ void UnreadThings::requestReactions(
const auto requestId = _api->request(MTPmessages_GetUnreadReactions(
MTP_flags((topic ? Flag::f_top_msg_id : Flag())
| (sublist ? Flag::f_saved_peer_id : Flag())),
history->peer->input,
history->peer->input(),
MTP_int(topic ? topic->rootId() : 0),
(sublist ? sublist->sublistPeer()->input : MTPInputPeer()),
(sublist ? sublist->sublistPeer()->input() : MTPInputPeer()),
MTP_int(offsetId),
MTP_int(addOffset),
MTP_int(limit),

View File

@@ -137,100 +137,6 @@ bool HasForceLogoutNotification(const MTPUpdates &updates) {
return false;
}
bool ForwardedInfoDataLoaded(
not_null<Main::Session*> session,
const MTPMessageFwdHeader &header) {
return header.match([&](const MTPDmessageFwdHeader &data) {
if (const auto fromId = data.vfrom_id()) {
// Fully loaded is required in this case.
if (!session->data().peerLoaded(peerFromMTP(*fromId))) {
return false;
}
}
return true;
});
}
bool MentionUsersLoaded(
not_null<Main::Session*> session,
const MTPVector<MTPMessageEntity> &entities) {
for (const auto &entity : entities.v) {
auto type = entity.type();
if (type == mtpc_messageEntityMentionName) {
if (!session->data().userLoaded(entity.c_messageEntityMentionName().vuser_id())) {
return false;
}
} else if (type == mtpc_inputMessageEntityMentionName) {
auto &inputUser = entity.c_inputMessageEntityMentionName().vuser_id();
if (inputUser.type() == mtpc_inputUser) {
if (!session->data().userLoaded(inputUser.c_inputUser().vuser_id())) {
return false;
}
}
}
}
return true;
}
DataIsLoadedResult AllDataLoadedForMessage(
not_null<Main::Session*> session,
const MTPMessage &message) {
return message.match([&](const MTPDmessage &message) {
if (const auto fromId = message.vfrom_id()) {
if (!message.is_post()
&& !session->data().peerLoaded(peerFromMTP(*fromId))) {
return DataIsLoadedResult::FromNotLoaded;
}
}
if (const auto viaBotId = message.vvia_bot_id()) {
if (!session->data().userLoaded(*viaBotId)) {
return DataIsLoadedResult::NotLoaded;
}
}
if (const auto fwd = message.vfwd_from()) {
if (!ForwardedInfoDataLoaded(session, *fwd)) {
return DataIsLoadedResult::NotLoaded;
}
}
if (const auto entities = message.ventities()) {
if (!MentionUsersLoaded(session, *entities)) {
return DataIsLoadedResult::MentionNotLoaded;
}
}
return DataIsLoadedResult::Ok;
}, [&](const MTPDmessageService &message) {
if (const auto fromId = message.vfrom_id()) {
if (!message.is_post()
&& !session->data().peerLoaded(peerFromMTP(*fromId))) {
return DataIsLoadedResult::FromNotLoaded;
}
}
return message.vaction().match(
[&](const MTPDmessageActionChatAddUser &action) {
for (const auto &userId : action.vusers().v) {
if (!session->data().userLoaded(userId)) {
return DataIsLoadedResult::NotLoaded;
}
}
return DataIsLoadedResult::Ok;
}, [&](const MTPDmessageActionChatJoinedByLink &action) {
if (!session->data().userLoaded(action.vinviter_id())) {
return DataIsLoadedResult::NotLoaded;
}
return DataIsLoadedResult::Ok;
}, [&](const MTPDmessageActionChatDeleteUser &action) {
if (!session->data().userLoaded(action.vuser_id())) {
return DataIsLoadedResult::NotLoaded;
}
return DataIsLoadedResult::Ok;
}, [](const auto &) {
return DataIsLoadedResult::Ok;
});
}, [](const MTPDmessageEmpty &message) {
return DataIsLoadedResult::Ok;
});
}
} // namespace
Updates::Updates(not_null<Main::Session*> session)
@@ -246,12 +152,12 @@ Updates::Updates(not_null<Main::Session*> session)
_ptsWaiter.setRequesting(true);
session->account().mtpUpdates(
) | rpl::start_with_next([=](const MTPUpdates &updates) {
) | rpl::on_next([=](const MTPUpdates &updates) {
mtpUpdateReceived(updates);
}, _lifetime);
session->account().mtpNewSessionCreated(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
mtpNewSessionCreated();
}, _lifetime);
@@ -265,7 +171,7 @@ Updates::Updates(not_null<Main::Session*> session)
Data::PeerUpdate::Flag::FullInfo
) | rpl::filter([](const Data::PeerUpdate &update) {
return update.peer->isChat() || update.peer->isMegagroup();
}) | rpl::start_with_next([=](const Data::PeerUpdate &update) {
}) | rpl::on_next([=](const Data::PeerUpdate &update) {
const auto peer = update.peer;
if (const auto list = _pendingSpeakingCallParticipants.take(peer)) {
if (const auto call = peer->groupCall()) {
@@ -747,7 +653,7 @@ void Updates::getChannelDifference(
}
api().request(MTPupdates_GetChannelDifference(
MTP_flags(flags),
channel->inputChannel,
channel->inputChannel(),
filter,
MTP_int(channel->pts()),
MTP_int(kChannelGetDifferenceLimit)
@@ -766,7 +672,7 @@ void Updates::addActiveChat(rpl::producer<PeerData*> chat) {
const auto key = _activeChats.empty() ? 0 : _activeChats.back().first + 1;
std::move(
chat
) | rpl::start_with_next_done([=](PeerData *peer) {
) | rpl::on_next_done([=](PeerData *peer) {
auto &active = _activeChats[key];
const auto was = active.peer;
if (was != peer) {
@@ -826,7 +732,7 @@ void Updates::channelRangeDifferenceSend(
MTP_int(range.till - 1))));
const auto requestId = api().request(MTPupdates_GetChannelDifference(
MTP_flags(MTPupdates_GetChannelDifference::Flag::f_force),
channel->inputChannel,
channel->inputChannel(),
filter,
MTP_int(pts),
MTP_int(limit)
@@ -1513,18 +1419,13 @@ void Updates::applyUpdates(
case mtpc_updateShortMessage: {
auto &d = updates.c_updateShortMessage();
const auto viaBotId = d.vvia_bot_id();
const auto entities = d.ventities();
const auto fwd = d.vfwd_from();
if (!session().data().userLoaded(d.vuser_id())
|| (viaBotId && !session().data().userLoaded(*viaBotId))
|| (entities && !MentionUsersLoaded(&session(), *entities))
|| (fwd && !ForwardedInfoDataLoaded(&session(), *fwd))) {
if (!session().data().userLoaded(d.vuser_id())) {
MTP_LOG(0, ("getDifference "
"{ good - getting user for updateShortMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
return getDifference();
}
_session->data().fillMessagePeers(d);
if (updateAndApply(d.vpts().v, d.vpts_count().v, updates)) {
// Update date as well.
setState(0, d.vdate().v, _updatesQts, _updatesSeq);
@@ -1533,24 +1434,14 @@ void Updates::applyUpdates(
case mtpc_updateShortChatMessage: {
auto &d = updates.c_updateShortChatMessage();
const auto noFrom = !session().data().userLoaded(d.vfrom_id());
const auto chat = session().data().chatLoaded(d.vchat_id());
const auto viaBotId = d.vvia_bot_id();
const auto entities = d.ventities();
const auto fwd = d.vfwd_from();
if (!chat
|| noFrom
|| (viaBotId && !session().data().userLoaded(*viaBotId))
|| (entities && !MentionUsersLoaded(&session(), *entities))
|| (fwd && !ForwardedInfoDataLoaded(&session(), *fwd))) {
if (!chat) {
MTP_LOG(0, ("getDifference "
"{ good - getting user for updateShortChatMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
if (chat && noFrom) {
session().api().requestFullPeer(chat);
}
"{ good - getting chat for updateShortChatMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
return getDifference();
}
_session->data().fillMessagePeers(d);
if (updateAndApply(d.vpts().v, d.vpts_count().v, updates)) {
// Update date as well.
setState(0, d.vdate().v, _updatesQts, _updatesSeq);
@@ -1580,13 +1471,7 @@ void Updates::applyUpdates(
const auto wasAlready = (lookupMessage() != nullptr);
feedUpdate(MTP_updateMessageID(d.vid(), MTP_long(randomId))); // ignore real date
if (const auto item = lookupMessage()) {
const auto list = d.ventities();
if (list && !MentionUsersLoaded(&session(), *list)) {
session().api().requestMessageData(
item->history()->peer,
item->id,
nullptr);
}
_session->data().fillMessagePeers(item->fullId(), d);
item->applySentMessage(sent.text, d, wasAlready);
}
}
@@ -1613,25 +1498,22 @@ void Updates::feedUpdate(const MTPUpdate &update) {
// New messages.
case mtpc_updateNewMessage: {
auto &d = update.c_updateNewMessage();
const auto isDataLoaded = AllDataLoadedForMessage(&session(), d.vmessage());
if (!requestingDifference() && isDataLoaded != DataIsLoadedResult::Ok) {
MTP_LOG(0, ("getDifference "
"{ good - after not all data loaded in updateNewMessage }%1"
if (!requestingDifference()) {
const auto peerId = PeerFromMessage(d.vmessage());
const auto peer = session().data().peerLoaded(peerId);
if (peerId && !peer) {
MTP_LOG(0, ("getDifference "
"{ good - getting peer for updateNewMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
// This can be if this update was created by grouping
// some short message update into an updates vector.
return getDifference();
return getDifference();
}
}
updateAndApply(d.vpts().v, d.vpts_count().v, update);
} break;
case mtpc_updateNewChannelMessage: {
auto &d = update.c_updateNewChannelMessage();
auto channel = session().data().channelLoaded(peerToChannel(PeerFromMessage(d.vmessage())));
const auto isDataLoaded = AllDataLoadedForMessage(&session(), d.vmessage());
{
// Todo delete.
const auto messageId = IdFromMessage(d.vmessage());
@@ -1643,22 +1525,10 @@ void Updates::feedUpdate(const MTPUpdate &update) {
}
}
}
if (!requestingDifference() && (!channel || isDataLoaded != DataIsLoadedResult::Ok)) {
if (!requestingDifference() && !channel) {
MTP_LOG(0, ("getDifference "
"{ good - after not all data loaded in updateNewChannelMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
// Request last active supergroup participants if the 'from' user was not loaded yet.
// This will optimize similar getDifference() calls for almost all next messages.
if (isDataLoaded == DataIsLoadedResult::FromNotLoaded && channel && channel->isMegagroup()) {
if (channel->canViewMembers()
&& channel->mgInfo->lastParticipants.size() < _session->serverConfig().chatSizeMax
&& (channel->mgInfo->lastParticipants.empty()
|| channel->mgInfo->lastParticipants.size() < channel->membersCount())) {
session().api().chatParticipants().requestLast(channel);
}
}
if (!_byMinChannelTimer.isActive()) { // getDifference after timeout
_byMinChannelTimer.callOnce(PtsWaiter::kWaitForSkippedTimeout);
}

View File

@@ -28,7 +28,7 @@ namespace {
not_null<PeerData*> peer) {
const auto user = peer->asUser();
return (user && user->botInfo && user->botInfo->canEditInformation)
? std::make_optional<MTPInputUser>(user->inputUser)
? std::make_optional<MTPInputUser>(user->inputUser())
: std::nullopt;
}
@@ -98,9 +98,9 @@ rpl::producer<Data::Usernames> Usernames::loadUsernames(
if (peer->isSelf()) {
requestUser(MTP_inputUserSelf());
} else if (const auto user = peer->asUser()) {
requestUser(user->inputUser);
requestUser(user->inputUser());
} else if (const auto channel = peer->asChannel()) {
requestChannel(channel->inputChannel);
requestChannel(channel->inputChannel());
}
return lifetime;
};
@@ -163,7 +163,7 @@ rpl::producer<rpl::no_value, Usernames::Error> Usernames::toggle(
)).done(done).fail(fail).handleFloodErrors().send();
} else if (const auto channel = peer->asChannel()) {
_api.request(MTPchannels_ToggleUsername(
channel->inputChannel,
channel->inputChannel(),
MTP_string(username),
MTP_bool(active)
)).done(done).fail(fail).handleFloodErrors().send();
@@ -216,7 +216,7 @@ rpl::producer<> Usernames::reorder(
_reorderRequests.emplace(peerId, requestId);
} else if (const auto channel = peer->asChannel()) {
const auto requestId = _api.request(MTPchannels_ReorderUsernames(
channel->inputChannel,
channel->inputChannel(),
MTP_vector<MTPstring>(std::move(tlUsernames))
)).done(finish).fail(finish).send();
_reorderRequests.emplace(peerId, requestId);
@@ -251,7 +251,7 @@ void Usernames::requestToCache(not_null<PeerData*> peer) {
const auto lifetime = std::make_shared<rpl::lifetime>();
*lifetime = loadUsernames(
peer
) | rpl::start_with_next([=, id = peer->id](Data::Usernames usernames) {
) | rpl::on_next([=, id = peer->id](Data::Usernames usernames) {
_tinyCache = std::make_pair(id, std::move(usernames));
lifetime->destroy();
});

View File

@@ -33,7 +33,7 @@ TLInputRules RulesToTL(const UserPrivacy::Rule &rule) {
result.reserve(peers.size());
for (const auto &peer : peers) {
if (const auto user = peer->asUser()) {
result.push_back(user->inputUser);
result.push_back(user->inputUser());
}
}
return result;

View File

@@ -95,7 +95,7 @@ void ViewsManager::viewsIncrement() {
ids.push_back(MTP_int(msgId));
}
const auto requestId = _api.request(MTPmessages_GetMessagesViews(
i->first->input,
i->first->input(),
MTP_vector<MTPint>(ids),
MTP_bool(true)
)).done([=](
@@ -183,7 +183,7 @@ void ViewsManager::sendPollRequests(
}
};
const auto requestId = _api.request(MTPmessages_GetExtendedMedia(
peer->input,
peer->input(),
MTP_vector<MTPint>(list)
)).done([=](const MTPUpdates &result, mtpRequestId id) {
_session->api().applyUpdates(result);

View File

@@ -174,7 +174,7 @@ struct State {
}
session->changes().messageUpdates(
Data::MessageUpdate::Flag::Destroyed
) | rpl::start_with_next([=](const Data::MessageUpdate &update) {
) | rpl::on_next([=](const Data::MessageUpdate &update) {
const auto i = context->cachedRead.find(update.item);
if (i != end(context->cachedRead)) {
session->api().request(i->second.requestId).cancel();
@@ -192,7 +192,7 @@ struct State {
session
) | rpl::skip(1) | rpl::filter(
rpl::mappers::_1
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
for (auto &[item, cache] : context->cachedRead) {
if (cache.data.current().state == Ui::WhoReadState::MyHidden) {
cache.data = Peers{ .state = Ui::WhoReadState::Unknown };
@@ -202,7 +202,7 @@ struct State {
session->api().globalPrivacy().hideReadTime(
) | rpl::skip(1) | rpl::filter(
!rpl::mappers::_1
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
for (auto &[item, cache] : context->cachedRead) {
if (cache.data.current().state == Ui::WhoReadState::MyHidden) {
cache.data = Peers{ .state = Ui::WhoReadState::Unknown };
@@ -252,7 +252,7 @@ struct State {
} else if (const auto user = item->history()->peer->asUser()) {
entry.requestId = session->api().request(
MTPmessages_GetOutboxReadDate(
user->input,
user->input(),
MTP_int(item->id)
)
).done([=](const MTPOutboxReadDate &result) {
@@ -282,7 +282,7 @@ struct State {
} else {
entry.requestId = session->api().request(
MTPmessages_GetMessageReadParticipants(
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id)
)
).done([=](const MTPVector<MTPReadParticipantDate> &result) {
@@ -340,7 +340,7 @@ struct State {
MTP_flags(reaction.empty()
? Flag(0)
: Flag::f_reaction),
item->history()->peer->input,
item->history()->peer->input(),
MTP_int(item->id),
ReactionToMTP(reaction),
MTPstring(), // offset
@@ -590,7 +590,7 @@ rpl::producer<Ui::WhoReadContent> WhoReacted(
}
std::move(
idsWithReactions
) | rpl::start_with_next([=](PeersWithReactions &&peers) {
) | rpl::on_next([=](PeersWithReactions &&peers) {
if (peers.state == WhoReadState::Unknown) {
state->userpics.clear();
consumer.put_next(Ui::WhoReadContent{
@@ -624,7 +624,7 @@ rpl::producer<Ui::WhoReadContent> WhoReacted(
item->history()->session().downloaderTaskFinished(
) | rpl::filter([=] {
return state->someUserpicsNotLoaded && !state->scheduled;
}) | rpl::start_with_next([=] {
}) | rpl::on_next([=] {
for (const auto &userpic : state->userpics) {
if (userpic.peer->userpicUniqueKey(userpic.view)
!= userpic.uniqueKey) {

View File

@@ -199,7 +199,7 @@ ApiWrap::ApiWrap(not_null<Main::Session*> session)
_session->data().chatsFilters().changed(
) | rpl::filter([=] {
return _session->data().chatsFilters().archiveNeeded();
}) | rpl::start_with_next([=] {
}) | rpl::on_next([=] {
requestMoreDialogsIfNeeded();
}, _session->lifetime());
@@ -248,7 +248,7 @@ void ApiWrap::setupSupportMode() {
}
_session->settings().supportChatsTimeSliceValue(
) | rpl::start_with_next([=](int seconds) {
) | rpl::on_next([=](int seconds) {
_dialogsLoadTill = seconds ? std::max(base::unixtime::now() - seconds, 0) : 0;
refreshDialogsLoadBlocked();
}, _session->lifetime());
@@ -367,7 +367,7 @@ void ApiWrap::savePinnedOrder(Data::Folder *folder) {
const auto &order = _session->data().pinnedChatsOrder(folder);
const auto input = [](Dialogs::Key key) {
if (const auto history = key.history()) {
return MTP_inputDialogPeer(history->peer->input);
return MTP_inputDialogPeer(history->peer->input());
} else if (const auto folder = key.folder()) {
return MTP_inputDialogPeerFolder(MTP_int(folder->id()));
}
@@ -402,7 +402,7 @@ void ApiWrap::savePinnedOrder(not_null<Data::Forum*> forum) {
input);
request(MTPmessages_ReorderPinnedForumTopics(
MTP_flags(MTPmessages_ReorderPinnedForumTopics::Flag::f_force),
forum->peer()->input,
forum->peer()->input(),
MTP_vector(topics)
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
@@ -416,7 +416,7 @@ void ApiWrap::savePinnedOrder(not_null<Data::SavedMessages*> saved) {
const auto &order = _session->data().pinnedChatsOrder(saved);
const auto input = [](Dialogs::Key key) {
if (const auto sublist = key.sublist()) {
return MTP_inputDialogPeer(sublist->sublistPeer()->input);
return MTP_inputDialogPeer(sublist->sublistPeer()->input());
}
Unexpected("Key type in pinnedDialogsOrder().");
};
@@ -445,7 +445,7 @@ void ApiWrap::toggleHistoryArchived(
MTP_vector<MTPInputFolderPeer>(
1,
MTP_inputFolderPeer(
history->peer->input,
history->peer->input(),
MTP_int(archived ? archiveId : 0)))
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
@@ -487,7 +487,7 @@ void ApiWrap::sendMessageFail(
PeerFloodErrorText(&session(), PeerFloodType::Send)),
Ui::LayerOption::CloseOther);
} else if (show && error == u"USER_BANNED_IN_CHANNEL"_q) {
const auto link = Ui::Text::Link(
const auto link = tr::link(
tr::lng_cant_more_info(tr::now),
session().createInternalLinkFull(u"spambot"_q));
show->showBox(
@@ -496,7 +496,7 @@ void ApiWrap::sendMessageFail(
tr::now,
lt_more_info,
link,
Ui::Text::WithEntities)),
tr::marked)),
Ui::LayerOption::CloseOther);
} else if (error.startsWith(u"SLOWMODE_WAIT_"_q)) {
const auto chop = u"SLOWMODE_WAIT_"_q.size();
@@ -641,7 +641,7 @@ void ApiWrap::resolveMessageDatas() {
if (!ids.isEmpty()) {
const auto channel = j->first;
const auto requestId = request(MTPchannels_GetMessages(
channel->inputChannel,
channel->inputChannel(),
MTP_vector<MTPInputMessage>(ids)
)).done([=](
const MTPmessages_Messages &result,
@@ -764,7 +764,7 @@ QString ApiWrap::exportDirectMessageLink(
MTP_flags(inRepliesContext
? MTPchannels_ExportMessageLink::Flag::f_thread
: MTPchannels_ExportMessageLink::Flag(0)),
channel->inputChannel,
channel->inputChannel(),
MTP_int(item->id)
)).done([=](const MTPExportedMessageLink &result) {
const auto link = qs(result.data().vlink());
@@ -798,7 +798,7 @@ QString ApiWrap::exportDirectStoryLink(not_null<Data::Story*> story) {
? i->second
: fallback();
request(MTPstories_ExportStoryLink(
peer->input,
peer->input(),
MTP_int(story->id())
)).done([=](const MTPExportedStoryLink &result) {
const auto link = qs(result.data().vlink());
@@ -865,7 +865,7 @@ void ApiWrap::requestMoreDialogs(Data::Folder *folder) {
MTP_int(state->offsetDate),
MTP_int(state->offsetId),
(state->offsetPeer
? state->offsetPeer->input
? state->offsetPeer->input()
: MTP_inputPeerEmpty()),
MTP_int(loadCount),
MTP_long(hash)
@@ -1130,7 +1130,7 @@ void ApiWrap::requestFullPeer(not_null<PeerData*> peer) {
_session->supportHelper().refreshInfo(user);
}
return request(MTPusers_GetFullUser(
user->inputUser
user->inputUser()
)).done([=](const MTPusers_UserFull &result) {
result.match([&](const MTPDusers_userFull &data) {
_session->data().processUsers(data.vusers());
@@ -1140,13 +1140,13 @@ void ApiWrap::requestFullPeer(not_null<PeerData*> peer) {
}).fail(failHandler).send();
} else if (const auto chat = peer->asChat()) {
return request(MTPmessages_GetFullChat(
chat->inputChat
chat->inputChat()
)).done([=](const MTPmessages_ChatFull &result) {
gotChatFull(peer, result);
}).fail(failHandler).send();
} else if (const auto channel = peer->asChannel()) {
return request(MTPchannels_GetFullChannel(
channel->inputChannel
channel->inputChannel()
)).done([=](const MTPmessages_ChatFull &result) {
gotChatFull(peer, result);
migrateDone(channel, channel);
@@ -1224,7 +1224,7 @@ void ApiWrap::requestPeerSettings(not_null<PeerData*> peer) {
return;
}
request(MTPmessages_GetPeerSettings(
peer->input
peer->input()
)).done([=](const MTPmessages_PeerSettings &result) {
result.match([&](const MTPDmessages_peerSettings &data) {
_session->data().processUsers(data.vusers());
@@ -1279,7 +1279,7 @@ void ApiWrap::migrateChat(
}
request(MTPmessages_MigrateChat(
chat->inputChat
chat->inputChat()
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
session().changes().sendNotifications();
@@ -1351,7 +1351,7 @@ void ApiWrap::markContentsRead(
}
for (const auto &channelIds : channelMarkedIds) {
request(MTPchannels_ReadMessageContents(
channelIds.first->inputChannel,
channelIds.first->inputChannel(),
MTP_vector<MTPint>(channelIds.second)
)).send();
}
@@ -1364,7 +1364,7 @@ void ApiWrap::markContentsRead(not_null<HistoryItem*> item) {
const auto ids = MTP_vector<MTPint>(1, MTP_int(item->id));
if (const auto channel = item->history()->peer->asChannel()) {
request(MTPchannels_ReadMessageContents(
channel->inputChannel,
channel->inputChannel(),
ids
)).send();
} else {
@@ -1398,8 +1398,8 @@ void ApiWrap::deleteAllFromParticipantSend(
not_null<ChannelData*> channel,
not_null<PeerData*> from) {
request(MTPchannels_DeleteParticipantHistory(
channel->inputChannel,
from->input
channel->inputChannel(),
from->input()
)).done([=](const MTPmessages_AffectedHistory &result) {
const auto offset = applyAffectedHistory(channel, result);
if (offset > 0) {
@@ -1421,8 +1421,8 @@ void ApiWrap::deleteSublistHistorySend(
not_null<PeerData*> sublistPeer) {
request(MTPmessages_DeleteSavedHistory(
MTP_flags(MTPmessages_DeleteSavedHistory::Flag::f_parent_peer),
parentChat->input,
sublistPeer->input,
parentChat->input(),
sublistPeer->input(),
MTP_int(0), // max_id
MTP_int(0), // min_date
MTP_int(0) // max_date
@@ -1743,7 +1743,7 @@ void ApiWrap::joinChannel(not_null<ChannelData*> channel) {
Data::PeerUpdate::Flag::ChannelAmIn);
} else if (!_channelAmInRequests.contains(channel)) {
const auto requestId = request(MTPchannels_JoinChannel(
channel->inputChannel
channel->inputChannel()
)).done([=](const MTPUpdates &result) {
_channelAmInRequests.remove(channel);
applyUpdates(result);
@@ -1800,7 +1800,7 @@ void ApiWrap::leaveChannel(not_null<ChannelData*> channel) {
Data::PeerUpdate::Flag::ChannelAmIn);
} else if (!_channelAmInRequests.contains(channel)) {
auto requestId = request(MTPchannels_LeaveChannel(
channel->inputChannel
channel->inputChannel()
)).done([=](const MTPUpdates &result) {
_channelAmInRequests.remove(channel);
applyUpdates(result);
@@ -1902,7 +1902,7 @@ void ApiWrap::updateNotifySettingsDelayed(
}
if (_updateNotifyTopics.emplace(topic).second) {
topic->destroyed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_updateNotifyTopics.remove(topic);
}, _updateNotifyQueueLifetime);
_updateNotifyTimer.callOnce(kNotifySettingSaveTimeout);
@@ -1926,14 +1926,14 @@ void ApiWrap::sendNotifySettingsUpdates() {
for (const auto topic : base::take(_updateNotifyTopics)) {
request(MTPaccount_UpdateNotifySettings(
MTP_inputNotifyForumTopic(
topic->peer()->input,
topic->peer()->input(),
MTP_int(topic->rootId())),
topic->notify().serialize()
)).afterDelay(kSmallDelayMs).send();
}
for (const auto peer : base::take(_updateNotifyPeers)) {
request(MTPaccount_UpdateNotifySettings(
MTP_inputNotifyPeer(peer->input),
MTP_inputNotifyPeer(peer->input()),
peer->notify().serialize()
)).afterDelay(kSmallDelayMs).send();
}
@@ -2012,8 +2012,8 @@ void ApiWrap::deleteConversation(not_null<PeerData*> peer, bool revoke) {
if (const auto chat = peer->asChat()) {
request(MTPmessages_DeleteChatUser(
MTP_flags(0),
chat->inputChat,
_session->user()->inputUser
chat->inputChat(),
_session->user()->inputUser()
)).done([=](const MTPUpdates &result) {
applyUpdates(result);
deleteHistory(peer, false, revoke);
@@ -2206,7 +2206,7 @@ void ApiWrap::saveDraftsToCloud() {
cloudDraft->saveRequestId = request(MTPmessages_SaveDraft(
MTP_flags(flags),
ReplyToForMTP(history, cloudDraft->reply),
history->peer->input,
history->peer->input(),
MTP_string(textWithTags.text),
entities,
Data::WebPageForMTP(
@@ -2382,7 +2382,7 @@ void ApiWrap::resolveWebPages() {
QVector<mtpRequestId> reqsByIndex(idsByChannel.size(), 0);
for (auto i = idsByChannel.cbegin(), e = idsByChannel.cend(); i != e; ++i) {
reqsByIndex[i->second.first] = request(MTPchannels_GetMessages(
i->first->inputChannel,
i->first->inputChannel(),
MTP_vector<MTPInputMessage>(i->second.second)
)).done([=, channel = i->first](
const MTPmessages_Messages &result,
@@ -2511,13 +2511,13 @@ void ApiWrap::refreshFileReference(
};
if (storyId) {
request(MTPstories_GetStoriesByID(
_session->data().peer(storyId.peer)->input,
_session->data().peer(storyId.peer)->input(),
MTP_vector<MTPint>(1, MTP_int(storyId.story))));
} else if (item->isScheduled()) {
const auto realId = _session->scheduledMessages().lookupId(
item);
request(MTPmessages_GetScheduledMessages(
item->history()->peer->input,
item->history()->peer->input(),
MTP_vector<MTPint>(1, MTP_int(realId))));
} else if (item->isSavedMusicItem()) {
const auto user = item->history()->peer->asUser();
@@ -2525,7 +2525,7 @@ void ApiWrap::refreshFileReference(
const auto document = media ? media->document() : nullptr;
if (user && document) {
request(MTPusers_GetSavedMusicByID(
user->inputUser,
user->inputUser(),
MTP_vector<MTPInputDocument>(1, document->mtpInput())));
} else {
fail();
@@ -2540,7 +2540,7 @@ void ApiWrap::refreshFileReference(
MTP_long(0)));
} else if (const auto channel = item->history()->peer->asChannel()) {
request(MTPchannels_GetMessages(
channel->inputChannel,
channel->inputChannel(),
MTP_vector<MTPInputMessage>(
1,
MTP_inputMessageID(MTP_int(item->id)))));
@@ -2556,7 +2556,7 @@ void ApiWrap::refreshFileReference(
}, [&](Data::FileOriginUserPhoto data) {
if (const auto user = _session->data().user(data.userId)) {
request(MTPphotos_GetUserPhotos(
user->inputUser,
user->inputUser(),
MTP_int(-1),
MTP_long(data.photoId),
MTP_int(1)));
@@ -2565,7 +2565,7 @@ void ApiWrap::refreshFileReference(
}
}, [&](Data::FileOriginFullUser data) {
if (const auto user = _session->data().user(data.userId)) {
request(MTPusers_GetFullUser(user->inputUser));
request(MTPusers_GetFullUser(user->inputUser()));
} else {
fail();
}
@@ -2634,7 +2634,7 @@ void ApiWrap::refreshFileReference(
MTP_int(0)));
}, [&](Data::FileOriginStory data) {
request(MTPstories_GetStoriesByID(
_session->data().peer(data.peer)->input,
_session->data().peer(data.peer)->input(),
MTP_vector<MTPint>(1, MTP_int(data.story))));
}, [&](v::null_t) {
fail();
@@ -2704,7 +2704,7 @@ void ApiWrap::setGroupStickerSet(
megagroup->mgInfo->stickerSet = set;
request(MTPchannels_SetStickers(
megagroup->inputChannel,
megagroup->inputChannel(),
Data::InputStickerSet(set)
)).send();
_session->data().stickers().notifyUpdated(Data::StickersType::Stickers);
@@ -2717,7 +2717,7 @@ void ApiWrap::setGroupEmojiSet(
megagroup->mgInfo->emojiSet = set;
request(MTPchannels_SetEmojiStickers(
megagroup->inputChannel,
megagroup->inputChannel(),
Data::InputStickerSet(set)
)).send();
_session->changes().peerUpdated(
@@ -3127,7 +3127,7 @@ void ApiWrap::requestMessageAfterDate(
};
if (topicRootId) {
send(MTPmessages_GetReplies(
peer->input,
peer->input(),
MTP_int(topicRootId),
MTP_int(offsetId),
MTP_int(offsetDate),
@@ -3139,8 +3139,8 @@ void ApiWrap::requestMessageAfterDate(
} else if (monoforumPeerId) {
send(MTPmessages_GetSavedHistory(
MTP_flags(MTPmessages_GetSavedHistory::Flag::f_parent_peer),
peer->input,
session().data().peer(monoforumPeerId)->input,
peer->input(),
session().data().peer(monoforumPeerId)->input(),
MTP_int(offsetId),
MTP_int(offsetDate),
MTP_int(addOffset),
@@ -3150,7 +3150,7 @@ void ApiWrap::requestMessageAfterDate(
MTP_long(historyHash)));
} else {
send(MTPmessages_GetHistory(
peer->input,
peer->input(),
MTP_int(offsetId),
MTP_int(offsetDate),
MTP_int(addOffset),
@@ -3483,6 +3483,9 @@ void ApiWrap::forwardMessages(
flags |= MessageFlag::ShortcutMessage;
sendFlags |= SendFlag::f_quick_reply_shortcut;
}
if (action.options.effectId) {
sendFlags |= SendFlag::f_effect;
}
if (draft.options != Data::ForwardOptions::PreserveInfo) {
sendFlags |= SendFlag::f_drop_author;
}
@@ -3534,20 +3537,21 @@ void ApiWrap::forwardMessages(
histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
history->sendRequestId = request(MTPmessages_ForwardMessages(
MTP_flags(oneFlags),
forwardFrom->input,
forwardFrom->input(),
MTP_vector<MTPint>(ids),
MTP_vector<MTPlong>(randomIds),
peer->input,
peer->input(),
MTP_int(topMsgId),
(action.options.suggest
? ReplyToForMTP(history, action.replyTo)
: monoforumPeer
? MTP_inputReplyToMonoForum(monoforumPeer->input)
? MTP_inputReplyToMonoForum(monoforumPeer->input())
: MTPInputReplyTo()),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTP_long(action.options.effectId),
MTPint(), // video_timestamp
MTP_long(starsPaid),
Api::SuggestToMTP(action.options.suggest)
@@ -3921,7 +3925,7 @@ void ApiWrap::sendShortcutMessages(
auto ids = QVector<MTPint>();
auto randomIds = QVector<MTPlong>();
request(MTPmessages_SendQuickReplyMessages(
peer->input,
peer->input(),
MTP_int(id),
MTP_vector<MTPint>(ids),
MTP_vector<MTPlong>(randomIds)
@@ -4146,7 +4150,7 @@ void ApiWrap::sendMessage(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(mediaFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
Data::WebPageForMTP(message.webPage, true),
msgText,
@@ -4155,7 +4159,7 @@ void ApiWrap::sendMessage(
sentEntities,
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
mtpShortcut,
MTP_long(action.options.effectId),
MTP_long(starsPaid),
@@ -4168,7 +4172,7 @@ void ApiWrap::sendMessage(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMessage>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
msgText,
MTP_long(randomId),
@@ -4176,7 +4180,7 @@ void ApiWrap::sendMessage(
sentEntities,
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
mtpShortcut,
MTP_long(action.options.effectId),
MTP_long(starsPaid),
@@ -4220,8 +4224,8 @@ void ApiWrap::sendBotStart(
info->startToken = QString();
}
request(MTPmessages_StartBot(
bot->inputUser,
chat ? chat->input : MTP_inputPeerEmpty(),
bot->inputUser(),
chat ? chat->input() : MTP_inputPeerEmpty(),
MTP_long(randomId),
MTP_string(token)
)).done([=](const MTPUpdates &result) {
@@ -4316,13 +4320,13 @@ void ApiWrap::sendInlineResult(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendInlineBotResult>(
MTP_flags(sendFlags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
MTP_long(randomId),
MTP_long(data->getQueryId()),
MTP_string(data->getId()),
MTP_int(action.options.scheduled),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTP_long(starsPaid)
), [=](const MTPUpdates &result, const MTP::Response &response) {
@@ -4357,7 +4361,7 @@ void ApiWrap::uploadAlbumMedia(
request(MTPmessages_UploadMedia(
MTP_flags(0),
MTPstring(), // business_connection_id
item->history()->peer->input,
item->history()->peer->input(),
media
)).done([=](const MTPMessageMedia &result) {
const auto item = _session->data().message(localId);
@@ -4501,7 +4505,7 @@ void ApiWrap::sendMediaWithRandomId(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(flags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
(options.price
? MTPInputMedia(MTP_inputMediaPaidMedia(
@@ -4516,7 +4520,7 @@ void ApiWrap::sendMediaWithRandomId(
sentEntities,
MTP_int(options.scheduled),
MTP_int(options.scheduleRepeatPeriod),
(options.sendAs ? options.sendAs->input : MTP_inputPeerEmpty()),
(options.sendAs ? options.sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, options.shortcutId),
MTP_long(options.effectId),
MTP_long(starsPaid),
@@ -4591,7 +4595,7 @@ void ApiWrap::sendMultiPaidMedia(
randomId,
Data::Histories::PrepareMessage<MTPmessages_SendMedia>(
MTP_flags(flags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
MTP_inputMediaPaidMedia(
MTP_flags(0),
@@ -4604,7 +4608,7 @@ void ApiWrap::sendMultiPaidMedia(
sentEntities,
MTP_int(options.scheduled),
MTP_int(options.scheduleRepeatPeriod),
(options.sendAs ? options.sendAs->input : MTP_inputPeerEmpty()),
(options.sendAs ? options.sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, options.shortcutId),
MTP_long(options.effectId),
MTP_long(starsPaid),
@@ -4730,12 +4734,12 @@ void ApiWrap::sendAlbumIfReady(not_null<SendingAlbum*> album) {
uint64(0), // randomId
Data::Histories::PrepareMessage<MTPmessages_SendMultiMedia>(
MTP_flags(flags),
peer->input,
peer->input(),
Data::Histories::ReplyToPlaceholder(),
MTP_vector<MTPInputSingleMedia>(medias),
MTP_int(album->options.scheduled),
//MTP_int(album->options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
(sendAs ? sendAs->input() : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, album->options.shortcutId),
MTP_long(album->options.effectId),
MTP_long(starsPaid)
@@ -4772,7 +4776,7 @@ rpl::producer<bool> ApiWrap::contactSignupSilent() const {
return _contactSignupSilent
? _contactSignupSilentChanges.events_starting_with_copy(
*_contactSignupSilent)
: (_contactSignupSilentChanges.events() | rpl::type_erased());
: (_contactSignupSilentChanges.events() | rpl::type_erased);
}
std::optional<bool> ApiWrap::contactSignupSilentCurrent() const {
@@ -4817,7 +4821,7 @@ void ApiWrap::requestBotCommonGroups(
};
const auto limit = 100;
request(MTPmessages_GetCommonChats(
bot->inputUser,
bot->inputUser(),
MTP_long(0), // max_id
MTP_int(limit)
)).done([=](const MTPmessages_Chats &result) {

View File

@@ -36,29 +36,28 @@ namespace {
rpl::producer<TextWithEntities> Text1() {
return tr::lng_about_text1(
lt_api_link,
tr::lng_about_text1_api(
) | Ui::Text::ToLink("https://core.telegram.org/api"),
Ui::Text::WithEntities);
tr::lng_about_text1_api(tr::url(u"https://core.telegram.org/api"_q)),
tr::marked);
}
rpl::producer<TextWithEntities> Text2() {
return tr::lng_about_text2(
lt_gpl_link,
rpl::single(Ui::Text::Link(
rpl::single(tr::link(
"GNU GPL",
"https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE")),
lt_github_link,
rpl::single(Ui::Text::Link(
rpl::single(tr::link(
"GitHub",
"https://github.com/telegramdesktop/tdesktop")),
Ui::Text::WithEntities);
tr::marked);
}
rpl::producer<TextWithEntities> Text3() {
return tr::lng_about_text3(
lt_faq_link,
tr::lng_about_text3_faq() | Ui::Text::ToLink(telegramFaqLink()),
Ui::Text::WithEntities);
tr::lng_about_text3_faq(tr::url(telegramFaqLink())),
tr::marked);
}
} // namespace
@@ -186,7 +185,7 @@ void ArchiveHintBox(
owned->setNaturalWidth(rect.width());
const auto widget = box->addRow(std::move(owned), style::al_top);
widget->paintRequest(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
auto p = Painter(widget);
auto hq = PainterHighQualityEnabler(p);
p.setPen(Qt::NoPen);
@@ -217,11 +216,11 @@ void ArchiveHintBox(
lt_emoji,
rpl::single(
Ui::Text::IconEmoji(&st::textMoreIconEmoji)),
Ui::Text::RichLangValue
tr::rich
) | rpl::map([](TextWithEntities text) {
return Ui::Text::Link(std::move(text), 1);
return tr::link(std::move(text), 1);
}),
Ui::Text::RichLangValue),
tr::rich),
st::channelEarnHistoryRecipientLabel));
label->resizeToWidth(box->width()
- rect::m::sum::h(st::boxRowPadding));
@@ -263,13 +262,13 @@ void ArchiveHintBox(
const auto left = Ui::CreateChild<Ui::RpWidget>(
box->verticalLayout().get());
left->paintRequest(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
auto p = Painter(left);
icon.paint(p, 0, 0, left->width());
}, left->lifetime());
left->resize(icon.size());
top->geometryValue(
) | rpl::start_with_next([=](const QRect &g) {
) | rpl::on_next([=](const QRect &g) {
left->moveToLeft(
(g.left() - left->width()) / 2,
g.top() + st::channelEarnHistoryThreeSkip);

View File

@@ -42,7 +42,7 @@ void AboutSponsoredBox(not_null<Ui::GenericBox*> box) {
rpl::combine(
row->sizeValue(),
button->sizeValue()
) | rpl::start_with_next([=](
) | rpl::on_next([=](
const QSize &rowSize,
const QSize &buttonSize) {
button->moveToLeft(
@@ -61,9 +61,9 @@ void AboutSponsoredBox(not_null<Ui::GenericBox*> box) {
tr::lng_sponsored_info_description1_link(),
tr::lng_sponsored_info_description1_url()
) | rpl::map([](const QString &text, const QString &url) {
return Ui::Text::Link(text, url);
return tr::link(text, url);
}),
Ui::Text::RichLangValue);
tr::rich);
box->addRow(object_ptr<FlatLabel>(box, std::move(text1), stLabel));
box->addSkip(st::sponsoredUrlButtonSkip);

View File

@@ -126,7 +126,7 @@ void ChatCreateDone(
void MustBePublicDestroy(not_null<ChannelData*> channel) {
const auto session = &channel->session();
session->api().request(MTPchannels_DeleteChannel(
channel->inputChannel
channel->inputChannel()
)).done([=](const MTPUpdates &result) {
session->api().applyUpdates(result);
}).send();
@@ -160,7 +160,7 @@ void MustBePublicFailed(
TextWithEntities PeerFloodErrorText(
not_null<Main::Session*> session,
PeerFloodType type) {
const auto link = Ui::Text::Link(
const auto link = tr::link(
tr::lng_cant_more_info(tr::now),
session->createInternalLinkFull(u"spambot"_q));
return ((type == PeerFloodType::InviteGroup)
@@ -169,7 +169,7 @@ TextWithEntities PeerFloodErrorText(
tr::now,
lt_more_info,
link,
Ui::Text::WithEntities);
tr::marked);
}
void ShowAddParticipantsError(
@@ -324,9 +324,9 @@ void AddContactBox::prepare() {
const auto submitted = [=] { submit(); };
_first->submits(
) | rpl::start_with_next(submitted, _first->lifetime());
) | rpl::on_next(submitted, _first->lifetime());
_last->submits(
) | rpl::start_with_next(submitted, _last->lifetime());
) | rpl::on_next(submitted, _last->lifetime());
connect(_phone, &Ui::PhoneInput::submitted, [=] { submit(); });
setDimensions(
@@ -598,13 +598,13 @@ void GroupInfoBox::prepare() {
Core::App().settings().sendSubmitWay());
_description->heightChanges(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
descriptionResized();
}, _description->lifetime());
_description->submits(
) | rpl::start_with_next([=] { submit(); }, _description->lifetime());
) | rpl::on_next([=] { submit(); }, _description->lifetime());
_description->cancelled(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
closeBox();
}, _description->lifetime());
@@ -614,7 +614,7 @@ void GroupInfoBox::prepare() {
&_navigation->session());
}
_title->submits(
) | rpl::start_with_next([=] { submitName(); }, _title->lifetime());
) | rpl::on_next([=] { submitName(); }, _title->lifetime());
addButton(
((_type != Type::Group || _canAddBot)
@@ -735,7 +735,7 @@ void GroupInfoBox::createGroup(
auto user = peer->asUser();
Assert(user != nullptr);
if (!user->isSelf()) {
inputs.push_back(user->inputUser);
inputs.push_back(user->inputUser());
}
}
_creationRequestId = _api.request(MTPmessages_CreateChat(
@@ -920,7 +920,7 @@ void GroupInfoBox::checkInviteLink() {
_createdChannel->session().changes().peerUpdates(
_createdChannel,
Data::PeerUpdate::Flag::FullInfo
) | rpl::take(1) | rpl::start_with_next([=] {
) | rpl::take(1) | rpl::on_next([=] {
checkInviteLink();
}, lifetime());
}
@@ -1034,7 +1034,7 @@ void SetupChannelBox::prepare() {
setMouseTracking(true);
_checkRequestId = _api.request(MTPchannels_CheckUsername(
_channel->inputChannel,
_channel->inputChannel(),
MTP_string("preston")
)).fail([=](const MTP::Error &error) {
_checkRequestId = 0;
@@ -1063,11 +1063,11 @@ void SetupChannelBox::prepare() {
_channel->session().changes().peerUpdates(
_channel,
Data::PeerUpdate::Flag::InviteLinks
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
rtlupdate(_invitationLink);
}, lifetime());
boxClosing() | rpl::start_with_next([=] {
boxClosing() | rpl::on_next([=] {
if (!_mustBePublic) {
AddParticipantsBoxController::Start(_navigation, _channel);
}
@@ -1281,7 +1281,7 @@ void SetupChannelBox::save() {
const auto saveUsername = [&](const QString &link) {
_sentUsername = link;
_saveRequestId = _api.request(MTPchannels_UpdateUsername(
_channel->inputChannel,
_channel->inputChannel(),
MTP_string(_sentUsername)
)).done([=] {
const auto done = _done;
@@ -1365,7 +1365,7 @@ void SetupChannelBox::check() {
if (link.size() >= Ui::EditPeer::kMinUsernameLength) {
_checkUsername = link;
_checkRequestId = _api.request(MTPchannels_CheckUsername(
_channel->inputChannel,
_channel->inputChannel(),
MTP_string(link)
)).done([=](const MTPBool &result) {
_checkRequestId = 0;
@@ -1495,7 +1495,7 @@ void SetupChannelBox::showRevokePublicLinkBoxForEdit() {
Box(PublicLinksLimitBox, navigation, callback));
const auto session = &navigation->session();
revoker->boxClosing(
) | rpl::start_with_next(crl::guard(session, [=] {
) | rpl::on_next(crl::guard(session, [=] {
base::call_delayed(200, session, [=] {
if (*revoked) {
return;
@@ -1563,19 +1563,19 @@ void EditNameBox::prepare() {
_last->setMaxLength(Ui::EditPeer::kMaxUserFirstLastName);
_first->submits(
) | rpl::start_with_next([=] { submit(); }, _first->lifetime());
) | rpl::on_next([=] { submit(); }, _first->lifetime());
_last->submits(
) | rpl::start_with_next([=] { submit(); }, _last->lifetime());
) | rpl::on_next([=] { submit(); }, _last->lifetime());
_first->customTab(true);
_last->customTab(true);
_first->tabbed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_last->setFocus();
}, _first->lifetime());
_last->tabbed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_first->setFocus();
}, _last->lifetime());
}

View File

@@ -116,7 +116,7 @@ void AutoDownloadBox::setupContent() {
))->toggleOn(
rpl::single(value > 0)
)->toggledChanges(
) | rpl::start_with_next([=](bool enabled) {
) | rpl::on_next([=](bool enabled) {
(*values)[type] = enabled ? 1 : 0;
}, content->lifetime());
values->emplace(type, value);

View File

@@ -102,7 +102,7 @@ void AutoLockBox::prepare() {
};
timeInput->focuses(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
group->setValue(kCustom);
}, lifetime());
@@ -119,7 +119,7 @@ void AutoLockBox::prepare() {
[=] { return group->current() == kCustom; }
),
timeInput->submitRequests()
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
if (const auto result = collect()) {
durationChanged(result);
} else {

View File

@@ -211,12 +211,12 @@ void BackgroundBox::prepare() {
setInnerTopSkip(st::lineWidth);
_inner->chooseEvents(
) | rpl::start_with_next([=](const Data::WallPaper &paper) {
) | rpl::on_next([=](const Data::WallPaper &paper) {
chosen(paper);
}, _inner->lifetime());
_inner->removeRequests(
) | rpl::start_with_next([=](const Data::WallPaper &paper) {
) | rpl::on_next([=](const Data::WallPaper &paper) {
removePaper(paper);
}, _inner->lifetime());
}
@@ -337,7 +337,7 @@ void BackgroundBox::resetForPeer() {
const auto api = &_controller->session().api();
api->request(MTPmessages_SetChatWallPaper(
MTP_flags(0),
_forPeer->input,
_forPeer->input(),
MTPInputWallPaper(),
MTPWallPaperSettings(),
MTPint()
@@ -396,30 +396,30 @@ BackgroundBox::Inner::Inner(
+ st::backgroundPadding));
Window::Theme::IsNightModeValue(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
updatePapers();
}, lifetime());
requestPapers();
_session->downloaderTaskFinished(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
update();
}, lifetime());
style::PaletteChanged(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_check->invalidateCache();
}, lifetime());
if (forChannel()) {
_session->data().cloudThemes().chatThemesUpdated(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
updatePapers();
}, lifetime());
} else {
using Update = Window::Theme::BackgroundUpdate;
Window::Theme::Background()->updates(
) | rpl::start_with_next([=](const Update &update) {
) | rpl::on_next([=](const Update &update) {
if (update.type == Update::Type::New) {
sortPapers();
requestPapers();

View File

@@ -225,18 +225,18 @@ BackgroundPreviewBox::BackgroundPreviewBox(
}
generateBackground();
_controller->session().downloaderTaskFinished(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
update();
}, lifetime());
_appNightMode.changes(
) | rpl::start_with_next([=](bool night) {
) | rpl::on_next([=](bool night) {
_boxDarkMode = night;
update();
}, lifetime());
_boxDarkMode.changes(
) | rpl::start_with_next([=](bool dark) {
) | rpl::on_next([=](bool dark) {
applyDarkMode(dark);
}, lifetime());
@@ -373,7 +373,7 @@ void BackgroundPreviewBox::createDimmingSlider(bool dark) {
_dimmingContent->resize(inner->size());
_dimmingContent->paintRequest(
) | rpl::start_with_next([=](QRect clip) {
) | rpl::on_next([=](QRect clip) {
auto p = QPainter(_dimmingContent);
const auto palette = (dark ? _darkPalette : _lightPalette).get();
p.fillRect(clip, equals ? st::boxBg : palette->boxBg());
@@ -386,13 +386,13 @@ void BackgroundPreviewBox::createDimmingSlider(bool dark) {
heightValue(),
_dimmingWrap->heightValue(),
rpl::mappers::_1 - rpl::mappers::_2
) | rpl::start_with_next([=](int top) {
) | rpl::on_next([=](int top) {
_dimmingWrap->move(0, top);
}, _dimmingWrap->lifetime());
_dimmingWrap->toggle(dark, anim::type::instant);
_dimmingHeight = _dimmingWrap->heightValue();
_dimmingHeight.changes() | rpl::start_with_next([=] {
_dimmingHeight.changes() | rpl::on_next([=] {
update();
}, _dimmingWrap->lifetime());
}
@@ -554,7 +554,7 @@ void BackgroundPreviewBox::recreateBlurCheckbox() {
sizeValue(),
_blur->sizeValue(),
_dimmingHeight.value()
) | rpl::start_with_next([=](QSize outer, QSize inner, int dimming) {
) | rpl::on_next([=](QSize outer, QSize inner, int dimming) {
const auto bottom = st::historyPaddingBottom;
_blur->move(
(outer.width() - inner.width()) / 2,
@@ -562,7 +562,7 @@ void BackgroundPreviewBox::recreateBlurCheckbox() {
}, _blur->lifetime());
_blur->checkedChanges(
) | rpl::start_with_next([=](bool checked) {
) | rpl::on_next([=](bool checked) {
checkBlurAnimationStart();
update();
}, _blur->lifetime());
@@ -607,7 +607,7 @@ void BackgroundPreviewBox::uploadForPeer(bool both) {
document->size);
session->uploader().documentProgress(
) | rpl::start_with_next([=](const FullMsgId &fullId) {
) | rpl::on_next([=](const FullMsgId &fullId) {
if (fullId != _uploadId) {
return;
}
@@ -619,7 +619,7 @@ void BackgroundPreviewBox::uploadForPeer(bool both) {
}, _uploadLifetime);
session->uploader().documentReady(
) | rpl::start_with_next([=](const Storage::UploadedMedia &data) {
) | rpl::on_next([=](const Storage::UploadedMedia &data) {
if (data.fullId != _uploadId) {
return;
}
@@ -668,7 +668,7 @@ void BackgroundPreviewBox::setExistingForPeer(
| (_fromMessageId ? Flag() : Flag::f_wallpaper)
| (both ? Flag::f_for_both : Flag())
| Flag::f_settings),
_forPeer->input,
_forPeer->input(),
paper.mtpInput(&_controller->session()),
paper.mtpSettings(),
MTP_int(_fromMessageId.msg)
@@ -742,13 +742,13 @@ void BackgroundPreviewBox::applyForPeer() {
object_ptr<Ui::RpWidget>(this));
const auto overlay = _forBothOverlay->entity();
sizeValue() | rpl::start_with_next([=](QSize size) {
sizeValue() | rpl::on_next([=](QSize size) {
_forBothOverlay->setGeometry({ QPoint(), size });
overlay->setGeometry({ QPoint(), size });
}, _forBothOverlay->lifetime());
overlay->paintRequest(
) | rpl::start_with_next([=](QRect clip) {
) | rpl::on_next([=](QRect clip) {
auto p = QPainter(overlay);
p.drawImage(0, 0, bg);
p.fillRect(clip, QColor(0, 0, 0, 64));
@@ -787,7 +787,7 @@ void BackgroundPreviewBox::applyForPeer() {
const auto raw = _forBothOverlay.release();
raw->shownValue() | rpl::filter(
!rpl::mappers::_1
) | rpl::take(1) | rpl::start_with_next(crl::guard(raw, [=] {
) | rpl::take(1) | rpl::on_next(crl::guard(raw, [=] {
delete raw;
}), raw->lifetime());
raw->toggle(false, anim::type::normal);
@@ -797,7 +797,7 @@ void BackgroundPreviewBox::applyForPeer() {
cancel->setTextTransform(RoundButton::TextTransform::NoTransform);
overlay->sizeValue(
) | rpl::start_with_next([=](QSize size) {
) | rpl::on_next([=](QSize size) {
const auto padding = st::backgroundConfirmPadding;
const auto width = size.width()
- padding.left()
@@ -1063,7 +1063,7 @@ void BackgroundPreviewBox::updateServiceBg(const std::vector<QColor> &bg) {
}
_serviceBgLifetime = _paletteServiceBg.value(
) | rpl::start_with_next([=](QColor color) {
) | rpl::on_next([=](QColor color) {
_serviceBg = Ui::ThemeAdjustedColor(
color,
QColor(red / count, green / count, blue / count));

View File

@@ -22,7 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/filter_icons.h"
#include "ui/painter.h"
#include "ui/rect.h"
#include "ui/text/text_utilities.h" // Ui::Text::Bold
#include "ui/text/text_utilities.h" // tr::bold
#include "ui/toast/toast.h"
#include "ui/widgets/buttons.h"
#include "ui/widgets/menu/menu_action.h"
@@ -99,7 +99,8 @@ protected:
p.drawImage(
width()
- size.width()
- st::menuWithIcons.itemPadding.right(),
- st::menuWithIcons.itemPadding.right()
- st::popupMenuWithIcons.shadow.extend.right(),
(height() - size.height()) / 2,
_icon);
}
@@ -178,10 +179,10 @@ void ChangeFilterById(
: tr::lng_filters_toast_remove)(
tr::now,
lt_chat,
Ui::Text::Bold(chat),
tr::bold(chat),
lt_folder,
Ui::Text::Wrapped(name.text, EntityType::Bold),
Ui::Text::WithEntities),
tr::marked),
.textContext = Core::TextContext({
.session = &history->session(),
.customEmojiLoopLimit = isStatic ? -1 : 0,
@@ -344,7 +345,7 @@ void FillChooseFilterMenu(
}
history->owner().chatsFilters().changed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
menu->hideMenu();
}, menu->lifetime());
}

View File

@@ -485,7 +485,7 @@ void ProxyRow::updateFields(View &&view) {
TextWithEntities()
.append(_view.type)
.append(' ')
.append(Ui::Text::Link(endpoint, QString())),
.append(tr::link(endpoint, QString())),
Ui::ItemTextDefaultOptions());
const auto state = _view.state;
@@ -754,7 +754,7 @@ ProxiesBox::ProxiesBox(
, _settings(settings)
, _initialWrap(this) {
_controller->views(
) | rpl::start_with_next([=](View &&view) {
) | rpl::on_next([=](View &&view) {
applyView(std::move(view));
}, lifetime());
}
@@ -796,12 +796,14 @@ void ProxiesBox::setupTopButton() {
.handler = [=] { AddProxyFromClipboard(_controller, uiShow()); },
.icon = &st::menuIconImportTheme,
});
addAction({
.text = tr::lng_group_invite_context_delete_all(tr::now),
.handler = [=] { _controller->deleteItems(); },
.icon = &st::menuIconDeleteAttention,
.isAttention = true,
});
if (!_rows.empty()) {
addAction({
.text = tr::lng_group_invite_context_delete_all(tr::now),
.handler = [=] { _controller->deleteItems(); },
.icon = &st::menuIconDeleteAttention,
.isAttention = true,
});
}
(*menu)->popup(QCursor::pos());
return true;
});
@@ -881,17 +883,17 @@ void ProxiesBox::setupContent() {
refreshProxyForCalls();
});
_tryIPv6->checkedChanges(
) | rpl::start_with_next([=](bool checked) {
) | rpl::on_next([=](bool checked) {
_controller->setTryIPv6(checked);
}, _tryIPv6->lifetime());
_controller->proxySettingsValue(
) | rpl::start_with_next([=](ProxyData::Settings value) {
) | rpl::on_next([=](ProxyData::Settings value) {
_proxySettings->setValue(value);
}, inner->lifetime());
_proxyForCalls->entity()->checkedChanges(
) | rpl::start_with_next([=](bool checked) {
) | rpl::on_next([=](bool checked) {
_controller->setProxyForCalls(checked);
}, _proxyForCalls->lifetime());
@@ -928,7 +930,7 @@ void ProxiesBox::setupContent() {
+ 3 * rowHeight()),
st::boxMaxListHeight);
}) | rpl::distinct_until_changed(
) | rpl::start_with_next([=](int height) {
) | rpl::on_next([=](int height) {
setDimensions(st::boxWideWidth, height);
}, inner->lifetime());
}
@@ -1003,7 +1005,7 @@ void ProxiesBox::createNoRowsLabel() {
tr::lng_proxy_description(tr::now),
st::proxyEmptyListLabel);
_noRows->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
label->resizeToWidth(width);
label->moveToLeft(0, 0);
}, label->lifetime());
@@ -1011,29 +1013,29 @@ void ProxiesBox::createNoRowsLabel() {
void ProxiesBox::setupButtons(int id, not_null<ProxyRow*> button) {
button->deleteClicks(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_controller->deleteItem(id);
}, button->lifetime());
button->restoreClicks(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_controller->restoreItem(id);
}, button->lifetime());
button->editClicks(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
getDelegate()->show(_controller->editItemBox(id));
}, button->lifetime());
rpl::merge(
button->shareClicks() | rpl::map_to(false),
button->showQrClicks() | rpl::map_to(true)
) | rpl::start_with_next([=](bool qr) {
) | rpl::on_next([=](bool qr) {
_controller->shareItem(id, qr);
}, button->lifetime());
button->clicks(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_controller->applyItem(id);
}, button->lifetime());
}
@@ -1069,7 +1071,7 @@ void ProxyBox::prepare() {
});
});
_port.data()->events(
) | rpl::start_with_next([=](not_null<QEvent*> e) {
) | rpl::on_next([=](not_null<QEvent*> e) {
if (e->type() == QEvent::KeyPress
&& (static_cast<QKeyEvent*>(e.get())->key() == Qt::Key_Backspace)
&& _port->cursorPosition() == 0) {
@@ -1179,7 +1181,7 @@ void ProxyBox::setupSocketAddress(const ProxyData &data) {
data.port ? QString::number(data.port) : QString(),
65535);
address->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
_port->moveToRight(0, 0);
_host->resize(
width - _port->width() - st::proxyEditSkip,
@@ -1211,11 +1213,11 @@ void ProxyBox::setupCredentials(const ProxyData &data) {
(data.type == Type::Mtproto) ? QString() : data.password);
_password->move(0, 0);
_password->heightValue(
) | rpl::start_with_next([=, wrap = passwordWrap.data()](int height) {
) | rpl::on_next([=, wrap = passwordWrap.data()](int height) {
wrap->resize(wrap->width(), height);
}, _password->lifetime());
passwordWrap->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
_password->resize(width, _password->height());
}, _password->lifetime());
credentials->add(std::move(passwordWrap), st::proxyEditInputPadding);
@@ -1237,11 +1239,11 @@ void ProxyBox::setupMtprotoCredentials(const ProxyData &data) {
(data.type == Type::Mtproto) ? data.password : QString());
_secret->move(0, 0);
_secret->heightValue(
) | rpl::start_with_next([=, wrap = secretWrap.data()](int height) {
) | rpl::on_next([=, wrap = secretWrap.data()](int height) {
wrap->resize(wrap->width(), height);
}, _secret->lifetime());
secretWrap->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
_secret->resize(width, _secret->height());
}, _secret->lifetime());
mtproto->add(std::move(secretWrap), st::proxyEditInputPadding);
@@ -1303,7 +1305,7 @@ ProxiesBoxController::ProxiesBoxController(not_null<Main::Account*> account)
}) | ranges::to_vector;
_settings.connectionTypeChanges(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
_proxySettingsChanges.fire_copy(_settings.settings());
const auto i = findByProxy(_settings.selected());
if (i != end(_list)) {

View File

@@ -198,7 +198,7 @@ not_null<Ui::FlatLabel*> CreateWarningLabel(
st::createPollWarning);
result->setAttribute(Qt::WA_TransparentForMouseEvents);
field->changes(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
Ui::PostponeCall(crl::guard(field, [=] {
const auto length = field->getLastText().size();
const auto value = valueLimit - length;
@@ -251,17 +251,17 @@ Options::Option::Option(
_wrap->hide(anim::type::instant);
_content->widthValue(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
updateFieldGeometry();
}, _field->lifetime());
_field->heightValue(
) | rpl::start_with_next([=](int height) {
) | rpl::on_next([=](int height) {
_content->resize(_content->width(), height);
}, _field->lifetime());
_field->changes(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
Ui::PostponeCall(crl::guard(_field, [=] {
if (_hasCorrect) {
_correct->toggle(isGood(), anim::type::normal);
@@ -293,7 +293,7 @@ void Options::Option::createShadow() {
_shadow.reset(Ui::CreateChild<Ui::PlainShadow>(field().get()));
_shadow->show();
field()->sizeValue(
) | rpl::start_with_next([=](QSize size) {
) | rpl::on_next([=](QSize size) {
const auto left = st::createPollFieldPadding.left();
_shadow->setGeometry(
left,
@@ -322,7 +322,7 @@ void Options::Option::createRemove() {
_removeAlways = lifetime.make_state<rpl::variable<bool>>(false);
field->changes(
) | rpl::start_with_next([field, toggle] {
) | rpl::on_next([field, toggle] {
// Don't capture 'this'! Because Option is a value type.
*toggle = !field->getLastText().isEmpty();
}, field->lifetime());
@@ -331,13 +331,13 @@ void Options::Option::createRemove() {
toggle->value(),
_removeAlways->value(),
_1 || _2
) | rpl::start_with_next([=](bool shown) {
) | rpl::on_next([=](bool shown) {
remove->toggle(shown, anim::type::normal);
}, remove->lifetime());
#endif
field->widthValue(
) | rpl::start_with_next([=](int width) {
) | rpl::on_next([=](int width) {
remove->moveToRight(
st::createPollOptionRemovePosition.x(),
st::createPollOptionRemovePosition.y(),
@@ -359,7 +359,7 @@ void Options::Option::createWarning() {
rpl::combine(
field->sizeValue(),
warning->sizeValue()
) | rpl::start_with_next([=](QSize size, QSize label) {
) | rpl::on_next([=](QSize size, QSize label) {
warning->moveToLeft(
(size.width()
- label.width()
@@ -431,7 +431,7 @@ void Options::Option::enableChooseCorrect(
button->entity()->height());
button->hide(anim::type::instant);
_content->sizeValue(
) | rpl::start_with_next([=](QSize size) {
) | rpl::on_next([=](QSize size) {
const auto left = st::createPollFieldPadding.left();
button->moveToLeft(
left,
@@ -688,19 +688,19 @@ void Options::addEmptyOption() {
QPoint(
-st::createPollOptionFieldPremium.textMargins.right(),
st::createPollOptionEmojiPositionSkip));
emojiToggle->shownValue() | rpl::start_with_next([=](bool shown) {
emojiToggle->shownValue() | rpl::on_next([=](bool shown) {
if (!shown) {
return;
}
_emojiPanelLifetime.destroy();
emojiPanel->selector()->emojiChosen(
) | rpl::start_with_next([=](ChatHelpers::EmojiChosen data) {
) | rpl::on_next([=](ChatHelpers::EmojiChosen data) {
if (field->hasFocus()) {
Ui::InsertEmojiAtCursor(field->textCursor(), data.emoji);
}
}, _emojiPanelLifetime);
emojiPanel->selector()->customEmojiChosen(
) | rpl::start_with_next([=](ChatHelpers::FileChosen data) {
) | rpl::on_next([=](ChatHelpers::FileChosen data) {
if (field->hasFocus()) {
Data::InsertCustomEmoji(field, data.document);
}
@@ -708,24 +708,24 @@ void Options::addEmptyOption() {
}, emojiToggle->lifetime());
}
field->submits(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
const auto index = findField(field);
if (_list[index]->isGood() && index + 1 < _list.size()) {
_list[index + 1]->setFocus();
}
}, field->lifetime());
field->changes(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
Ui::PostponeCall(crl::guard(field, [=] {
validateState();
}));
}, field->lifetime());
field->focusedChanges(
) | rpl::filter(rpl::mappers::_1) | rpl::start_with_next([=] {
) | rpl::filter(rpl::mappers::_1) | rpl::on_next([=] {
_scrollToWidget.fire_copy(field);
}, field->lifetime());
field->tabbed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
const auto index = findField(field);
if (index + 1 < _list.size()) {
_list[index + 1]->setFocus();
@@ -753,7 +753,7 @@ void Options::addEmptyOption() {
});
_list.back()->removeClicks(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
Ui::PostponeCall(crl::guard(field, [=] {
Expects(!_list.empty());
@@ -891,13 +891,13 @@ not_null<Ui::InputField*> CreatePollBox::setupQuestion(
emojiPanel,
st::createPollOptionFieldPremiumEmojiPosition);
emojiPanel->selector()->emojiChosen(
) | rpl::start_with_next([=](ChatHelpers::EmojiChosen data) {
) | rpl::on_next([=](ChatHelpers::EmojiChosen data) {
if (question->hasFocus()) {
Ui::InsertEmojiAtCursor(question->textCursor(), data.emoji);
}
}, emojiToggle->lifetime());
emojiPanel->selector()->customEmojiChosen(
) | rpl::start_with_next([=](ChatHelpers::FileChosen data) {
) | rpl::on_next([=](ChatHelpers::FileChosen data) {
if (question->hasFocus()) {
Data::InsertCustomEmoji(question, data.document);
}
@@ -912,7 +912,7 @@ not_null<Ui::InputField*> CreatePollBox::setupQuestion(
rpl::combine(
question->geometryValue(),
warning->sizeValue()
) | rpl::start_with_next([=](QRect geometry, QSize label) {
) | rpl::on_next([=](QRect geometry, QSize label) {
warning->moveToLeft(
(container->width()
- label.width()
@@ -978,7 +978,7 @@ not_null<Ui::InputField*> CreatePollBox::setupSolution(
rpl::combine(
solution->geometryValue(),
warning->sizeValue()
) | rpl::start_with_next([=](QRect geometry, QSize label) {
) | rpl::on_next([=](QRect geometry, QSize label) {
warning->moveToLeft(
(inner->width()
- label.width()
@@ -1048,7 +1048,7 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
st::createPollLimitPadding));
question->tabbed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
options->focusFirst();
}, question->lifetime());
@@ -1088,7 +1088,7 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
rpl::single(quiz->checked()) | rpl::then(quiz->checkedChanges()));
options->tabbed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
if (quiz->checked()) {
solution->setFocus();
} else {
@@ -1097,7 +1097,7 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
}, question->lifetime());
solution->tabbed(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
question->setFocus();
}, solution->lifetime());
@@ -1109,14 +1109,14 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
) | rpl::filter([=](not_null<QEvent*> e) {
return (e->type() == QEvent::MouseButtonPress)
&& quiz->checked();
}) | rpl::start_with_next([show = uiShow()] {
}) | rpl::on_next([show = uiShow()] {
show->showToast(tr::lng_polls_create_one_answer(tr::now));
}, multiple->lifetime());
}
using namespace rpl::mappers;
quiz->checkedChanges(
) | rpl::start_with_next([=](bool checked) {
) | rpl::on_next([=](bool checked) {
if (multiple) {
if (checked && multiple->checked()) {
multiple->setChecked(false);
@@ -1132,7 +1132,7 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
return !text.isEmpty() && (text.size() <= kQuestionLimit);
};
question->submits(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
if (isValidQuestion()) {
options->focusFirst();
}
@@ -1216,12 +1216,12 @@ object_ptr<Ui::RpWidget> CreatePollBox::setupContent() {
crl::guard(this, send));
options->scrollToWidget(
) | rpl::start_with_next([=](not_null<QWidget*> widget) {
) | rpl::on_next([=](not_null<QWidget*> widget) {
scrollToWidget(widget);
}, lifetime());
options->backspaceInFront(
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
FocusAtEnd(question);
}, lifetime());

View File

@@ -99,7 +99,7 @@ void DeleteMessagesBox::prepare() {
lt_date,
TextWithEntities{
langDayOfMonthFull(_wipeHistoryFirstToDelete) },
Ui::Text::RichLangValue)
tr::rich)
: tr::lng_sure_delete_by_date_many(
tr::now,
lt_days,
@@ -108,8 +108,8 @@ void DeleteMessagesBox::prepare() {
lt_count,
_wipeHistoryFirstToDelete.daysTo(
_wipeHistoryLastToDelete) + 1,
Ui::Text::WithEntities),
Ui::Text::RichLangValue);
tr::marked),
tr::rich);
deleteStyle = &st::attentionBoxButton;
} else if (_wipeHistoryJustClear) {
const auto isChannel = peer->isChannel() && !peer->isMegagroup();
@@ -130,7 +130,7 @@ void DeleteMessagesBox::prepare() {
tr::now,
lt_group,
peer->name());
details = Ui::Text::RichLangValue(details.text);
details = tr::rich(details.text);
deleteStyle = &st::attentionBoxButton;
} else {
details.text = peer->isSelf()
@@ -148,7 +148,7 @@ void DeleteMessagesBox::prepare() {
: peer->isMegagroup()
? tr::lng_sure_leave_group(tr::now)
: tr::lng_sure_leave_channel(tr::now);
details = Ui::Text::RichLangValue(details.text);
details = tr::rich(details.text);
if (!peer->isUser()) {
*deleteText = tr::lng_box_leave();
}
@@ -164,7 +164,7 @@ void DeleteMessagesBox::prepare() {
appendDetails(std::move(revoke->description));
if (!peer->isUser() && !_wipeHistoryJustClear) {
_revoke->checkedValue(
) | rpl::start_with_next([=](bool revokeForAll) {
) | rpl::on_next([=](bool revokeForAll) {
*deleteText = revokeForAll
? tr::lng_box_delete()
: tr::lng_box_leave();
@@ -201,8 +201,8 @@ void DeleteMessagesBox::prepare() {
tr::lng_delete_all_from_user(
tr::now,
lt_user,
Ui::Text::Bold(_moderateFrom->name()),
Ui::Text::WithEntities),
tr::bold(_moderateFrom->name()),
tr::marked),
false,
st::defaultBoxCheckbox);
@@ -251,13 +251,13 @@ void DeleteMessagesBox::prepare() {
st::defaultBoxCheckbox));
_revokeRemember->hide(anim::type::instant);
_revoke->checkedValue(
) | rpl::start_with_next([=](bool checked) {
) | rpl::on_next([=](bool checked) {
_revokeRemember->toggle(
checked != revokeByDefault,
anim::type::normal);
}, _revokeRemember->lifetime());
_revokeRemember->heightValue(
) | rpl::start_with_next([=](int h) {
) | rpl::on_next([=](int h) {
setDimensions(st::boxWidth, _fullHeight + h);
}, lifetime());
appendDetails(std::move(revoke->description));
@@ -320,7 +320,7 @@ void DeleteMessagesBox::prepare() {
rpl::combine(
widthValue(),
_text->naturalWidthValue()
) | rpl::start_with_next([=](int full, int) {
) | rpl::on_next([=](int full, int) {
_text->resizeToNaturalWidth(full - padding.left() - padding.right());
auto fullHeight = st::boxPadding.top()
@@ -396,7 +396,7 @@ auto DeleteMessagesBox::revokeText(not_null<PeerData*> peer) const
tr::now,
lt_user,
{ user->firstName },
Ui::Text::RichLangValue);
tr::rich);
} else {
result.checkbox.text = tr::lng_delete_for_everyone_check(tr::now);
}
@@ -429,7 +429,7 @@ auto DeleteMessagesBox::revokeText(not_null<PeerData*> peer) const
tr::now,
lt_user,
{ user->firstName },
Ui::Text::RichLangValue);
tr::rich);
} else {
result.checkbox.text = tr::lng_delete_for_everyone_check(tr::now);
}
@@ -441,27 +441,27 @@ auto DeleteMessagesBox::revokeText(not_null<PeerData*> peer) const
result.description = tr::lng_selected_unsend_about_user_one(
tr::now,
lt_user,
Ui::Text::Bold(user->shortName()),
Ui::Text::WithEntities);
tr::bold(user->shortName()),
tr::marked);
} else {
result.description = tr::lng_selected_unsend_about_user(
tr::now,
lt_count,
canRevokeOutgoingCount,
lt_user,
Ui::Text::Bold(user->shortName()),
Ui::Text::WithEntities);
tr::bold(user->shortName()),
tr::marked);
}
} else if (canRevokeOutgoingCount == 1) {
result.description = tr::lng_selected_unsend_about_group_one(
tr::now,
Ui::Text::WithEntities);
tr::marked);
} else {
result.description = tr::lng_selected_unsend_about_group(
tr::now,
lt_count,
canRevokeOutgoingCount,
Ui::Text::WithEntities);
tr::marked);
}
return result;
}
@@ -557,7 +557,7 @@ void DeleteMessagesBox::deleteAndClear() {
? tr::lng_suggest_warn_text_ton
: tr::lng_suggest_warn_text_stars)(
tr::now,
Ui::Text::RichLangValue),
tr::rich),
.confirmed = callback,
.confirmText = tr::lng_suggest_warn_delete_anyway(tr::now),
.confirmStyle = &st::attentionBoxButton,
@@ -634,8 +634,8 @@ void DeleteMessagesBox::deleteAndClear() {
if (_reportSpam->checked()) {
_moderateInChannel->session().api().request(
MTPchannels_ReportSpam(
_moderateInChannel->inputChannel,
_moderateFrom->input,
_moderateInChannel->inputChannel(),
_moderateFrom->input(),
MTP_vector<MTPint>(1, MTP_int(_ids[0].msg)))
).send();
}

View File

@@ -143,7 +143,7 @@ auto AddButtonWithLoader(
std::move(
query
) | rpl::start_with_next([=](auto string) {
) | rpl::on_next([=](auto string) {
wrap->toggle(
ranges::any_of(indexList, [&](const QString &s) {
return s.startsWith(string, Qt::CaseInsensitive);
@@ -198,7 +198,7 @@ auto AddButtonWithLoader(
};
Spellchecker::GlobalLoaderChanged(
) | rpl::start_with_next([=](int langId) {
) | rpl::on_next([=](int langId) {
if (!langId && rawGlobalLoaderPtr()) {
setGlobalLoaderPtr(nullptr);
} else if (langId == id) {
@@ -215,14 +215,14 @@ auto AddButtonWithLoader(
rpl::combine(
button->widthValue(),
label->widthValue()
) | rpl::start_with_next([=] {
) | rpl::on_next([=] {
label->moveToLeft(
st::settingsUpdateStatePosition.x(),
st::settingsUpdateStatePosition.y());
}, label->lifetime());
buttonState->value(
) | rpl::start_with_next([=](const DictState &state) {
) | rpl::on_next([=](const DictState &state) {
const auto isToggledSet = v::is<Active>(state);
const auto toggled = isToggledSet ? 1. : 0.;
const auto over = !button->isDisabled()
@@ -279,7 +279,7 @@ auto AddButtonWithLoader(
});
button->toggledValue(
) | rpl::start_with_next([=](bool toggled) {
) | rpl::on_next([=](bool toggled) {
const auto &state = buttonState->current();
if (toggled && (v::is<Available>(state) || v::is<Failed>(state))) {
const auto weak = base::make_weak(button);
@@ -353,7 +353,7 @@ void Inner::setupContent(
ranges::contains(enabledDictionaries, id),
queryStream->events());
row->toggledValue(
) | rpl::start_with_next([=](auto enabled) {
) | rpl::on_next([=](auto enabled) {
if (enabled) {
_enabledRows.push_back(id);
} else {
@@ -420,7 +420,7 @@ void ManageDictionariesBox::prepare() {
});
addButton(tr::lng_close(), [=] { closeBox(); });
boxClosing() | rpl::start_with_next([=] {
boxClosing() | rpl::on_next([=] {
Core::App().settings().setDictionariesEnabled(
FilterEnabledDict(initialEnabledRows));
Core::App().saveSettingsDelayed();
@@ -434,7 +434,7 @@ void ManageDictionariesBox::prepare() {
inner->heightValue(),
multiSelect->heightValue(),
_1 + _2
) | rpl::start_with_next([=](int height) {
) | rpl::on_next([=](int height) {
using std::min;
accumulate_max(*max, height);
setDimensions(st::boxWidth, min(*max, st::boxMaxListHeight), true);

Some files were not shown because too many files have changed in this diff Show More