Compare commits

...

385 Commits

Author SHA1 Message Date
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
John Preston
7204c3c25d Version 6.3.2: Fix build with GCC. 2025-11-20 23:58:26 +04:00
23rd
b412241d25 Added minimal threshold to emoji preview for reaction selector. 2025-11-20 22:39:01 +04:00
23rd
f9883afd61 Removed assertion from stats point details widget to avoid crash. 2025-11-20 22:39:01 +04:00
GitHub Action
181f811f18 Update User-Agent for DNS to Chrome 142.0.0.0. 2025-11-20 22:25:19 +04:00
dependabot[bot]
2f0bd3c085 Bump endersonmenezes/free-disk-space from 2.1.1 to 3.0.0
Bumps [endersonmenezes/free-disk-space](https://github.com/endersonmenezes/free-disk-space) from 2.1.1 to 3.0.0.
- [Release notes](https://github.com/endersonmenezes/free-disk-space/releases)
- [Commits](713d134e24...6c4664f433)

---
updated-dependencies:
- dependency-name: endersonmenezes/free-disk-space
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-20 22:25:03 +04:00
Ilya Fedin
a9d8332766 macos-15-intel -> macos-latest 2025-11-20 22:24:51 +04:00
John Preston
f5036171cf Add actions menu (about/copy/share) for auctions. 2025-11-20 22:24:16 +04:00
John Preston
cdc8b8e473 Show nice userpics in change recipient. 2025-11-20 21:53:35 +04:00
John Preston
ab404c5452 Fix possible crash in sticker preview. 2025-11-20 21:48:30 +04:00
John Preston
0585f9d667 Show correct value of gifted auction gift. 2025-11-20 21:12:20 +04:00
John Preston
19225c7dd3 Rebuild slider when relevant values change. 2025-11-20 20:47:56 +04:00
23rd
8c1844b1c0 Improved unloading heavy part from MediaGeneric for gift's backgrounds. 2025-11-20 19:25:44 +03:00
23rd
af63d86e24 Replaced timer with single-shot updates in auction from view web page. 2025-11-20 19:02:55 +03:00
23rd
1f2fd3ad96 Added support of auctions to history view web page. 2025-11-20 18:22:43 +03:00
23rd
f41fdcdb98 Added saved music to data export. 2025-11-20 15:43:21 +03:00
23rd
f78a9b4220 Removed display of empty menu from userpic in profile top bar. 2025-11-20 15:43:21 +03:00
23rd
06b3ce58ed Fixed stories mouse interaction after album switch in My Profile.
When switching between cached albums with equal story counts,
stories become unresponsive until scrolling occurs. This happens
because the list is recreated with zero visible top/bottom values.

Added deferred visible range update after album switching.
2025-11-20 15:43:20 +03:00
John Preston
7c70d8b1c2 Show some rounds info on details page. 2025-11-20 15:01:26 +04:00
John Preston
2b1e032a9b Show by color if you'll be winning the round. 2025-11-20 14:34:19 +04:00
23rd
4f5d6a2fd5 Replaced dependence from scroll events in flexible scroll with custom. 2025-11-20 14:15:56 +04:00
23rd
c3b90aa492 Improved calculation of filler height for flexible scroll. 2025-11-20 14:15:56 +04:00
23rd
bb2daac007 Added support of text color from emoji status in profile top bar. 2025-11-20 14:15:56 +04:00
23rd
bc2449c3f9 Fixed update of local state after reorder stories in albums. 2025-11-20 14:15:56 +04:00
23rd
0bf50de77a Fixed display of menu for actions in profile top bar for sublists. 2025-11-20 14:15:56 +04:00
23rd
473bc32b71 Fixed peer in info profile opened from sublist. 2025-11-20 14:15:55 +04:00
23rd
e5e143dcf8 Extended behavior of manage button in profile top bar to edit topic. 2025-11-20 14:15:55 +04:00
23rd
2de08746ac Added toast to topic icon in profile top bar. 2025-11-20 14:15:55 +04:00
23rd
ae6833b4d5 Added width checks to profile top bar to prevent redundant calls. 2025-11-20 14:15:55 +04:00
23rd
f1fe5f6a71 Fixed width of very long go-to-forum button in profile top bar. 2025-11-20 14:15:55 +04:00
23rd
5054d0615e Fixed events handler of self forwards tagger.
Regression was introduced in e62a4b065a.
2025-11-20 14:15:55 +04:00
John Preston
4f5007ea64 Use a separate lang key for reset photo button. 2025-11-20 14:14:08 +04:00
John Preston
233f6ed13b Improve bid information display. 2025-11-20 14:13:43 +04:00
John Preston
f15b883471 Support subtext in Stars Bubble in bids. 2025-11-20 13:29:19 +04:00
John Preston
312d5f0121 Improve auction gift display. 2025-11-20 11:39:22 +04:00
Ilya Fedin
75a1657c49 Log Linux notification daemon startup errors 2025-11-20 10:42:13 +04:00
Ilya Fedin
667d92100e Switch Linux notification service watcher to std::optional 2025-11-20 10:42:13 +04:00
Ilya Fedin
8ff4bc8cff Port IconButton back to setAccessibleName 2025-11-19 16:06:56 +04:00
John Preston
656b262648 Allow setting custom auction bid. 2025-11-19 15:00:06 +04:00
John Preston
c1769b9ba2 Correctly show/hide price selection. 2025-11-18 20:30:43 +04:00
John Preston
04c9d92b4a Fix couple of comments layout bugs. 2025-11-18 20:11:22 +04:00
John Preston
0babef5a09 Always show comments, send stars if disabled. 2025-11-18 19:44:24 +04:00
John Preston
cd52407723 Fix back button restore in new profile cover. 2025-11-18 18:24:16 +04:00
John Preston
68c0aa7fb9 Fix quadratic loop on many same custom emoji. 2025-11-18 17:57:00 +04:00
John Preston
f1622c40a4 Fix possible crash from accessibility text insertion. 2025-11-18 17:56:33 +04:00
John Preston
688e7316eb Version 6.3.1.
- Reorder saved music in My Profile.
- Fix new cover overlapping information in My Profile.
- Fix opening stories from My Profile.
- Fix media viewer breaking after viewing Live Stories.
- Fix several possible crashes.
2025-11-17 20:45:32 +04:00
23rd
ef5ec47797 Slightly improved code style of info media list section. 2025-11-17 18:30:36 +03:00
23rd
147ad4a773 Slightly improved code style of info media list widget. 2025-11-17 18:30:36 +03:00
23rd
9752145b49 Fixed userpic paint on new self upload in profile top bar. 2025-11-17 18:30:36 +03:00
23rd
662b862d2f Fixed edge skips in list of actions from info profile. 2025-11-17 18:30:36 +03:00
23rd
6d469509a4 Added tooltip to userpic in profile top bar. 2025-11-17 18:30:36 +03:00
23rd
0dfbb8a5ae Added ability to set group or channel photo from profile top bar. 2025-11-17 18:30:36 +03:00
23rd
1e12ecda70 Extended story outline support to channels in profile top bar. 2025-11-17 18:30:36 +03:00
23rd
035087987c Added icon for reorder to media list section with one column mode. 2025-11-17 18:30:36 +03:00
23rd
18422c4193 Added ability to get both item and section by point in layout overview. 2025-11-17 18:30:36 +03:00
John Preston
f1f9fe27a9 Provide better error on specific bad proxy links.
There are a lot of incorrect MTProxy links with secret in base64
starting with "EE" in base64 encoded format.
2025-11-17 19:26:06 +04:00
John Preston
10667e14e2 Fix crash in ShareBox scheduling.
Fixes #30012.
2025-11-17 18:36:43 +04:00
John Preston
b04c7efdf4 Fix last server message tracking in sublist/forum.
Fixes #30011.
2025-11-17 18:15:16 +04:00
John Preston
0119731360 Fix style of username input for a proxy. 2025-11-17 18:15:00 +04:00
John Preston
8f337684d5 Add close buttons to AuctionGotGiftsBox. 2025-11-17 13:58:19 +04:00
John Preston
dae93552f0 Show correct months count in premium gifts. 2025-11-17 13:57:18 +04:00
John Preston
351bbb240f Shorten bid amount for huge bids. 2025-11-17 13:44:16 +04:00
John Preston
5716de2e6e Fix LIVE badge translations. 2025-11-17 13:03:53 +04:00
John Preston
14295d59d1 Add some debug logs on app startup timing. 2025-11-17 12:55:44 +04:00
John Preston
df0849473c Fix possible crash in button accessibility. 2025-11-17 12:22:54 +04:00
John Preston
9736706894 Fix initial loading of My Profile with stories. 2025-11-17 12:19:23 +04:00
John Preston
12343a5c31 Less templates in Info::FlexibleScroll. 2025-11-17 12:02:42 +04:00
John Preston
a7f046a617 Fix incorrect GL texture deletion. 2025-11-17 11:23:40 +04:00
Ilya Fedin
67bf796f1e Split scheme check code in Linux launch maps implementation 2025-11-17 10:48:01 +04:00
John Preston
22d632abc3 Update hidden gift icon. 2025-11-17 10:47:07 +04:00
John Preston
25094c1ee6 Support paddings in icon parts. 2025-11-17 10:47:07 +04:00
John Preston
5b71ad0456 Fix build with MSVC. 2025-11-17 10:47:07 +04:00
John Preston
9146ba996f Force v143 toolset on Windows for now (win7). 2025-11-17 09:39:25 +04:00
23rd
42900787e1 Added initial ability to filter layout items for reordering. 2025-11-16 23:52:56 +03:00
23rd
ba10c10a94 Added initial ability to reorder tracks in saved music section. 2025-11-16 23:52:56 +03:00
23rd
3f37e9ca6f Added initial ability to reorder stories in albums. 2025-11-16 23:52:56 +03:00
23rd
c5ea86b474 Added initial implementation of reorder items in media layouts.
Except mosaic.
2025-11-16 23:52:56 +03:00
23rd
76720092a5 Added api support to reorder track from saved music. 2025-11-16 23:52:56 +03:00
23rd
7a75c80b27 Attempted to improve status color with darkest gifts in profile top bar. 2025-11-16 13:01:57 +03:00
23rd
b2dcbebb5b Added proper visibility forwarding to flexible scroll content widget. 2025-11-16 12:54:15 +03:00
John Preston
aadc81279a Version 6.3: Fix build with GCC. 2025-11-15 21:51:15 +04:00
John Preston
febd6dd18f Version 6.3.
- Support for Gift auctions.
- Support for Live stories.
- New profile pages design.
2025-11-15 18:22:08 +04:00
John Preston
1236b35aaf Fix build with MSVC. 2025-11-15 18:22:08 +04:00
23rd
41a9a25823 Added collectible emoji status preview to chat settings. 2025-11-15 18:19:07 +04:00
23rd
55ae81524d Attempted to fix change color in preview while reset unique status. 2025-11-15 18:19:07 +04:00
John Preston
a9cf5dd6f2 Fix crash in "Copy Topic Link" action. 2025-11-15 17:54:16 +04:00
John Preston
1e45692ba4 Fix build with Xcode. 2025-11-15 17:48:00 +04:00
John Preston
997cff63a8 Update gyp to support Visual Studio 2026. 2025-11-15 17:39:37 +04:00
John Preston
5db513cc55 Fix build with Xcode. 2025-11-15 17:18:30 +04:00
John Preston
4a7280be5e Fix balance alignment in paid reactions box. 2025-11-15 14:28:56 +04:00
John Preston
59826d492f Show sold out instead of premium paywall. 2025-11-15 14:18:36 +04:00
John Preston
85c2a5fd75 Attempt to fix edit profile colors for self. 2025-11-15 14:02:23 +04:00
John Preston
33dd3342e8 Display correct pattern in edit color box. 2025-11-15 12:38:18 +04:00
John Preston
94fc50f793 Fix live story outline in profile cover. 2025-11-15 12:29:34 +04:00
John Preston
1e79f4a9a5 Don't suggest conversion for auction gifts. 2025-11-15 12:00:01 +04:00
John Preston
f56825c526 Replace newlines with spaces for non-admins. 2025-11-15 12:00:01 +04:00
John Preston
d7c0f9dee8 Set correct auction about icons. 2025-11-15 12:00:01 +04:00
John Preston
a71c59beae Disable newlines in stream comments. 2025-11-15 12:00:01 +04:00
John Preston
5f729433f6 Don't attach reactions menu to streams. 2025-11-15 12:00:01 +04:00
John Preston
a1d37475c9 Share just link for live stories. 2025-11-15 12:00:01 +04:00
John Preston
9275dfce70 Fix crash when no top winners yet. 2025-11-15 12:00:01 +04:00
John Preston
ff9afdae3e Simple auction position display. 2025-11-15 12:00:01 +04:00
John Preston
12a2dcf484 Fix custom emoji text badge with spaces. 2025-11-15 12:00:01 +04:00
John Preston
c3f5f69c2a Remove some debug code. 2025-11-15 12:00:01 +04:00
John Preston
1320e7ac2f Allow placing bid with message / anonymous. 2025-11-15 12:00:01 +04:00
John Preston
ae6b0dd753 Implement bought items box. 2025-11-15 12:00:01 +04:00
John Preston
e43830c08e Handle auction links. 2025-11-15 12:00:01 +04:00
John Preston
4a5cdbcfb2 Nice bidding information display. 2025-11-15 12:00:01 +04:00
John Preston
9b599644d9 Improve bidding logic. 2025-11-15 12:00:01 +04:00
John Preston
cab93600dd Add about auction box layout (no icons yet). 2025-11-15 12:00:01 +04:00
John Preston
0e5e4ca7ea Simple KV storage in session().local(). 2025-11-15 12:00:00 +04:00
John Preston
a293134b5e Implement auction info box (active/ended). 2025-11-15 12:00:00 +04:00
John Preston
3831860943 Extract resale star gift box code. 2025-11-15 12:00:00 +04:00
John Preston
1f8214e658 Specify auction phrases for sent auction gifts. 2025-11-15 12:00:00 +04:00
John Preston
58d2e2ece2 Add lang keys for the auctions. 2025-11-15 12:00:00 +04:00
John Preston
424f416fdd Update API scheme to layer 218. 2025-11-15 12:00:00 +04:00
23rd
95c12a0b8e Improved style of slider within paid reactions box for streams. 2025-11-15 12:00:00 +04:00
23rd
45d42c8c31 Added MediaSlider color overrides structure for customizable styling. 2025-11-15 12:00:00 +04:00
23rd
5b94095c78 Added badge to userpic from top bar profile for live stories. 2025-11-15 12:00:00 +04:00
John Preston
605ad0a01c Update API scheme on layer 217. 2025-11-15 12:00:00 +04:00
John Preston
10b8dc3595 Fix star reaction counter in streams. 2025-11-15 12:00:00 +04:00
John Preston
432f6aeae6 Support disallow_stargifts_from_channels right. 2025-11-15 12:00:00 +04:00
John Preston
6702ff3c55 Add SavedMusic privacy editions. 2025-11-15 12:00:00 +04:00
John Preston
8f205f13d8 Show schedule repeat info in BottomInfo. 2025-11-15 11:59:59 +04:00
John Preston
22a133b182 Always allow rescheduling. 2025-11-15 11:59:20 +04:00
23rd
bc61175e79 Changed display of widget for login email setup only for primary window. 2025-11-15 11:59:20 +04:00
23rd
874e344f91 Added accounts list menu to widget for login email setup. 2025-11-15 11:59:20 +04:00
23rd
f832e31c7b Added support of pending suggestion to set up login email. 2025-11-15 11:59:20 +04:00
John Preston
4cdd793e0c Show crowns in stream comments. 2025-11-15 11:59:20 +04:00
John Preston
0d11cb603f Add LIVE badge for outlined userpics. 2025-11-15 11:59:20 +04:00
John Preston
1e197ae66c Hide comments toggle button if no comments. 2025-11-15 11:59:20 +04:00
John Preston
2a88103b5f Support live stories links. 2025-11-15 11:59:20 +04:00
John Preston
49caea416b Close the viewer when call finishes / fails. 2025-11-15 11:59:20 +04:00
John Preston
5bfe270f24 Support story loading state. 2025-11-15 11:59:20 +04:00
John Preston
e8f10f2b45 Use colorings from appconfig. 2025-11-15 11:59:20 +04:00
John Preston
834986410c Update watchers count. 2025-11-15 11:59:20 +04:00
John Preston
deffbcf231 Skip showing cheap messages. 2025-11-15 11:59:20 +04:00
John Preston
2d720a8349 Show LIVE badge and watchers count. 2025-11-15 11:59:20 +04:00
John Preston
182d45b7ea Check limits when sending comments. 2025-11-15 11:59:20 +04:00
John Preston
3cd68842bf Use reaction color for send button. 2025-11-15 11:59:20 +04:00
John Preston
861ada351e Make sure you have enough stars for comment. 2025-11-15 11:59:20 +04:00
John Preston
e32d863daa Support layout of admin comments in streams. 2025-11-15 11:59:20 +04:00
John Preston
81fc652dc1 Ignore price for admins of live story. 2025-11-15 11:59:20 +04:00
John Preston
b72deb1a0e Update client hello algorithm. 2025-11-15 11:59:19 +04:00
John Preston
cab38f00c2 Support initial hidden state of comments. 2025-11-15 11:59:19 +04:00
John Preston
137594ccee Track stars stats by short poll / local updates. 2025-11-15 11:59:19 +04:00
23rd
449f7fb2a3 Added support settings/login_email link. 2025-11-15 11:59:19 +04:00
John Preston
2a5bea7e4e Support comments restriction. 2025-11-15 11:59:19 +04:00
John Preston
ea309caa22 Support min stars for comment. 2025-11-15 11:59:19 +04:00
John Preston
89bc58ab29 Allow moderation of video stream comments. 2025-11-15 11:59:19 +04:00
John Preston
2d754c93a7 Support choosing send_as in video streams. 2025-11-15 11:59:19 +04:00
John Preston
1017d4cda3 Fix build with Xcode. 2025-11-15 11:59:19 +04:00
John Preston
68dab26be5 New layout of star reaction button in streams. 2025-11-15 11:59:19 +04:00
John Preston
8eb0ec9f7a Send stars from star reaction right click. 2025-11-15 11:59:19 +04:00
John Preston
1da47f62fc Update API scheme on layer 217. 2025-11-15 11:59:19 +04:00
John Preston
70939c4b9c Correctly edit video stream comment price. 2025-11-15 11:59:19 +04:00
John Preston
491ad744ea Update API scheme on layer 217. 2025-11-15 11:59:19 +04:00
John Preston
a1565c7fff Allow highlighting pinned messagse. 2025-11-15 11:59:19 +04:00
John Preston
496dbfb2f0 Track mouse in pinned strip. 2025-11-15 11:59:19 +04:00
John Preston
0e44dac208 Use correct lifetime in call messages. 2025-11-15 11:59:19 +04:00
John Preston
2b808933d2 Add some logging to conference participants. 2025-11-15 11:59:19 +04:00
John Preston
ba0f682e3a Improve pinned comments design a bit. 2025-11-15 11:59:19 +04:00
John Preston
ef49652415 Remove old messages correctly. 2025-11-15 11:59:18 +04:00
John Preston
8e30ee1192 Animate pinned duration. 2025-11-15 11:59:18 +04:00
John Preston
74a676026f Show pinned messages. 2025-11-15 11:59:18 +04:00
John Preston
af93c2ee49 Set correct comments area. 2025-11-15 11:59:18 +04:00
John Preston
6b05d253a7 Support different backgrounds for paid comments. 2025-11-15 11:59:18 +04:00
John Preston
797b2a5085 Remove messages by count, not by date. 2025-11-15 11:59:18 +04:00
John Preston
b898cf4fde Integrate paid reaction logic to video streams. 2025-11-15 11:59:18 +04:00
John Preston
1c17432f70 Request and store top donors in video streams. 2025-11-15 11:59:18 +04:00
John Preston
a6c96df51f Update API scheme on layer 217. 2025-11-15 11:59:18 +04:00
John Preston
d7abe73753 Show unread comments dot in video streams. 2025-11-15 11:59:18 +04:00
John Preston
1b84063dd3 Force sending finalizing even without update. 2025-11-15 11:59:18 +04:00
John Preston
ed5b7fe3e6 Improve video stream comment placeholder. 2025-11-15 11:59:18 +04:00
John Preston
699ac83729 Support simple type of send stars reactions. 2025-11-15 11:59:18 +04:00
John Preston
1e1ce492e6 Update API scheme on layer 217. 2025-11-15 11:59:18 +04:00
John Preston
7afb9f1fc8 Make toggle comments button. 2025-11-15 11:59:18 +04:00
John Preston
7bfe418c3e Update API scheme on layer 217. 2025-11-15 11:59:18 +04:00
John Preston
94c1388b6a Start redesign of video stream comments. 2025-11-15 11:59:18 +04:00
John Preston
90f53cba31 Show video stream in borrowed renderer. 2025-11-15 11:59:18 +04:00
John Preston
a675fca607 Don't show story lines in video streams. 2025-11-15 11:59:18 +04:00
John Preston
bf58171f64 Paint video streams outlines in red. 2025-11-15 11:59:18 +04:00
John Preston
e619bd4acc Show progress correctly (empty). 2025-11-15 11:59:18 +04:00
John Preston
5f5b7ffb66 Support pin ttl for paid messages in streams. 2025-11-15 11:59:18 +04:00
John Preston
2216e75cab Initial choose stars in video stream box. 2025-11-15 11:59:18 +04:00
John Preston
a61d73f48a Allow selecting how many stars to send. 2025-11-15 11:59:17 +04:00
John Preston
ecdca38d9e Allow sending comments with stars. 2025-11-15 11:59:17 +04:00
John Preston
a34bc7cc89 Hide like button in video stream. 2025-11-15 11:59:17 +04:00
John Preston
d12a0be66c Support volume changing in video streams. 2025-11-15 11:59:17 +04:00
John Preston
890421e00e Show volume control in video streams. 2025-11-15 11:59:17 +04:00
John Preston
dc57886b68 Start messages layout changes for streams. 2025-11-15 11:59:17 +04:00
John Preston
832fb023e8 Update API scheme on layer 217. 2025-11-15 11:59:17 +04:00
John Preston
af8c171b1a Don't crash on media viewer call without stories. 2025-11-15 11:59:17 +04:00
John Preston
58264f8b57 Initial messages support in video streams. 2025-11-15 11:59:17 +04:00
John Preston
eb7d614566 Update API scheme on layer 217. 2025-11-15 11:59:17 +04:00
John Preston
c11cab858d Initial support for streamed stories. 2025-11-15 11:59:17 +04:00
John Preston
18438b17a5 Update API scheme on layer 217. 2025-11-15 11:59:17 +04:00
John Preston
f2464df96f Update API scheme on layer 217. 2025-11-15 11:59:17 +04:00
John Preston
5ee0a2fea2 Allow repeat scheduling in any chat. 2025-11-15 11:59:17 +04:00
John Preston
1296505d01 Add repeat Biweekly period. 2025-11-15 11:59:17 +04:00
John Preston
332b70a27d Repeated scheduled messages (reminders). 2025-11-15 11:59:17 +04:00
John Preston
c4d5d52b96 Update API scheme to layer 217. 2025-11-15 11:59:17 +04:00
John Preston
7a5554202e Fix build with latest Xcode. 2025-11-15 11:56:01 +04:00
John Preston
df2c426096 Disable fraudulent warning for IV / Location Picker. 2025-11-15 11:56:01 +04:00
23rd
b33cdc581b Slightly improved condition for handler of record voice shortcut. 2025-11-15 02:09:22 +03:00
23rd
3cd213b9bf Added dialog suggestions close on open dialog in new window. 2025-11-14 14:34:47 +03:00
23rd
aebb37b516 Replaced unknown member count with channel type labels in profiles. 2025-11-14 12:25:18 +03:00
23rd
d016c80ba5 Improved style of edit icon from profile top bar. 2025-11-14 12:25:18 +03:00
23rd
882f1c4d1a Improved fix of title width with emoji in profile top bar. 2025-11-14 12:25:18 +03:00
23rd
3ffdf8d281 Made calls check less restricted to avoid redundant repaint in profiles. 2025-11-14 12:25:18 +03:00
23rd
c183243711 Improved photo process on full receive in profile top bar. 2025-11-14 12:25:18 +03:00
23rd
eeb2c953ad Prioritized badge display by truncating title in profile top bar. 2025-11-14 12:25:18 +03:00
23rd
bfb2f3015a Added action button to profile top bar for direct messages. 2025-11-14 12:25:18 +03:00
23rd
9c54f53613 Fixed display of discuss action in discussion group in profile top bar. 2025-11-14 12:25:17 +03:00
23rd
257c7af2f3 Changed pin gifts to end of pinned list instead of begin. 2025-11-14 12:25:17 +03:00
23rd
4ed256814a Added spoiler to box for rtmp calls. 2025-11-14 12:25:17 +03:00
23rd
1f8ea32388 Fixed crash on zero-size resize in MultiSelect during focus animations. 2025-11-14 12:25:17 +03:00
23rd
69403e7967 Fixed display of verified icon in web view for bots.
Regression was introduced in e7fa330215.
2025-11-14 12:25:17 +03:00
23rd
7cc4c76c54 Fixed ripple of QR button in profile info. 2025-11-14 12:25:17 +03:00
23rd
cf74a81d07 Fixed display in reply view of specific replied media from group. 2025-11-10 19:37:18 +03:00
23rd
417d151f2c Added original date of forwarded messages to bottom message in self. 2025-11-10 19:37:18 +03:00
23rd
ff42b7f61a Fixed gift opening when mouse released on different gift than pressed. 2025-11-10 19:37:18 +03:00
23rd
658c2a0a78 Added ability to reorder pinned gifts to view with all peer gifts. 2025-11-10 19:37:18 +03:00
23rd
90d6899577 Removed menu item to pin / unpin gift from collections. 2025-11-10 19:37:18 +03:00
23rd
5db0e53c0c Added api method to reorder pinned gifts. 2025-11-10 19:37:18 +03:00
Ilya Fedin
7dea4f36fb Accept a list of URLs on Linux
It's supported not only via D-Bus but via command line too since 5fbf280e4a
2025-11-10 16:15:41 +04:00
John Preston
6fea6393c6 Beta version 6.2.6: Fix build with GCC. 2025-11-07 17:53:02 +04:00
John Preston
53f063fe16 Beta version 6.2.6: Fix build with Xcode. 2025-11-07 17:10:52 +04:00
John Preston
6ee72b9c32 Beta version 6.2.6.
- Bug fixes in the new profile page design.
2025-11-07 16:39:44 +04:00
John Preston
5faefa7997 Attempt to fix possible crash in quick action. 2025-11-07 16:38:03 +04:00
John Preston
b0726cd31a Don't show lock on sold out gifts. 2025-11-07 16:38:02 +04:00
John Preston
64f5fa8dc3 Revert "Improved focus widgets within chat when foreground box is presented."
This reverts commit 080ecece66.
2025-11-07 16:38:02 +04:00
John Preston
ad300f5eae Customize DividerBar/DividerLabel styles. 2025-11-07 16:38:02 +04:00
John Preston
7331160e22 Improve accessibility changes. 2025-11-07 16:38:02 +04:00
Reza Bakhshi Laktasaraei
6af82e5ae5 Update Telegram/SourceFiles/settings/settings_intro.cpp
Co-authored-by: ilya-fedin <fedin-ilja2010@ya.ru>
2025-11-07 16:10:36 +04:00
Reza Bakhshi Laktasaraei
9b2347171f Update Telegram/SourceFiles/settings/settings_chat.cpp
Co-authored-by: ilya-fedin <fedin-ilja2010@ya.ru>
2025-11-07 16:10:36 +04:00
Reza Bakhshi Laktasaraei
c60629c17d Update Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp
Co-authored-by: ilya-fedin <fedin-ilja2010@ya.ru>
2025-11-07 16:10:36 +04:00
Reza Bakhshi Laktasaraei
353e18e8e3 Update Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp
Co-authored-by: ilya-fedin <fedin-ilja2010@ya.ru>
2025-11-07 16:10:36 +04:00
Reza Bakhshi Laktasaraei
f069df285d Update Telegram/SourceFiles/ui/widgets/continuous_sliders.h
Co-authored-by: ilya-fedin <fedin-ilja2010@ya.ru>
2025-11-07 16:10:36 +04:00
Reza Bakhshi Laktasaraei
6c5f8dffa6 Add accessibility value API to RpWidget
Add keyboard controls and accessibility value reporting to ContinuousSlider
Remove redundant accessibilityRole overrides from intro pages; set Step role to Dialog
2025-11-07 16:10:36 +04:00
Ilya Fedin
4a77e23b54 Skip RpWindow's geometry handling for fullscreen media viewer 2025-11-07 08:51:47 +04:00
23rd
942e53b59b Added option to able revert flexible scroll to first version. 2025-11-06 23:47:03 +03:00
23rd
21a6a256b9 Attempted to fix scroll flickering to profiles. 2025-11-06 23:47:03 +03:00
23rd
99567d3a53 Added second implementation of flexible scroll with event filter. 2025-11-06 23:47:03 +03:00
John Preston
eddad6b690 Show correct price per year in 2year premium.
Fixes #29961.
2025-11-06 22:54:43 +04:00
John Preston
d02a8cbca1 Better handle group conversion and bar settings.
Fixes #29886.
2025-11-06 22:54:43 +04:00
John Preston
3b079aa29a Don't try requesting peer settings in monoforums. 2025-11-06 22:54:42 +04:00
John Preston
df5307dd32 Use "Saved Messages" in chat switcher.
Fixes #29896.
2025-11-06 22:54:42 +04:00
John Preston
65891508e0 Focus start button on launch. 2025-11-06 22:54:42 +04:00
John Preston
b5f4e40c3e Fix build with MSVC. 2025-11-06 22:54:42 +04:00
23rd
a427730acd Replaced static header icons with lottie animations in ShowOrPremiumBox. 2025-11-06 18:24:08 +03:00
23rd
d7639a1ab6 Slightly improved style of last seen button in profile top bar. 2025-11-06 17:34:36 +03:00
23rd
01a140ea29 Fixed crash on erasing peer search result with pressed sponsored button. 2025-11-06 17:27:10 +03:00
23rd
6e0ff9b6a0 Fixed Up key scrolling when no editable messages exist in chat history. 2025-11-06 17:27:10 +03:00
23rd
fb14eeeb1e Replaced full profile with short info on open from paid reactions box. 2025-11-06 17:27:10 +03:00
23rd
0c701d9d95 Added ministar particles to premium bubbles with Credits type. 2025-11-06 17:27:10 +03:00
23rd
f1ceb1c95a Added ministar particles to slider within paid reactions box. 2025-11-06 17:27:10 +03:00
23rd
6bd41a07a1 Added dedicated class for ministar particles effect. 2025-11-06 17:27:10 +03:00
23rd
2b78bb6e79 Added ability to provide width of outline to slider style. 2025-11-06 17:27:10 +03:00
23rd
7e5d5ddafe Added top senders badge only they are present to paid reactions box. 2025-11-06 16:39:37 +03:00
23rd
150c25c81a Added terms of service label and link to paid reaction box. 2025-11-06 16:39:37 +03:00
23rd
95319bdaca Fixed center position of checkbox in paid reactions box. 2025-11-06 16:39:37 +03:00
23rd
d982835b50 Added paid reaction details display on right click on it from message. 2025-11-06 16:39:37 +03:00
23rd
6f040aa0b5 Added empty button for paid reaction to messages with other reactions. 2025-11-06 16:39:37 +03:00
23rd
080ecece66 Improved focus widgets within chat when foreground box is presented. 2025-11-06 16:39:37 +03:00
23rd
31ece2c26e Improved position of video in full screen mode in overlay media viewer. 2025-11-06 16:39:37 +03:00
23rd
9a20f4b935 Fixed display amount of available balance in withdrawal widget. 2025-11-06 16:39:37 +03:00
23rd
ea61fd22f5 Added ability to copy url to second button from withdrawal widget. 2025-11-06 16:39:37 +03:00
23rd
c77f8f9f41 Added external link indicator to second button from withdrawal widget. 2025-11-06 16:39:36 +03:00
23rd
ad758c51c2 Fixed display of url from withdrawal widget when withdrawal disabled. 2025-11-06 16:39:36 +03:00
23rd
8ac7fd14ec Renamed changePhoneIconSize with normalBoxLottieSize. 2025-11-06 16:39:36 +03:00
23rd
ed7c5e97cb Added lottie icon to rtmp box. 2025-11-06 16:39:36 +03:00
23rd
fb928a15a6 Fixed display of unread badges in filters strip after remote reorder. 2025-11-06 16:39:36 +03:00
23rd
f60155e7b8 Slightly improved position of stars rating in profile top bar. 2025-11-06 16:39:36 +03:00
23rd
7c28b1a6a6 Slightly improved pattern color in some cases in profile top bar. 2025-11-06 16:39:36 +03:00
23rd
a300f4662e Fixed width of title with emoji in profile top bar. 2025-11-06 16:39:36 +03:00
23rd
3ff376774f Added emoji selector to name input field in filter edit box. 2025-11-02 18:35:18 +03:00
23rd
e16c05385f Improved length limit for title of filter edit box. 2025-11-02 18:35:18 +03:00
23rd
6e8825cdd5 Added ability to add newly created chat to folder. 2025-11-01 18:50:01 +03:00
23rd
1c19895ce7 Paused emoji in top bar suggestion when window inactive. 2025-11-01 18:50:00 +03:00
23rd
e62a4b065a Extracted common toast timer logic to recent self forwards tagger. 2025-11-01 18:50:00 +03:00
23rd
ba363285a7 Added ability to add newly joined chat to folder. 2025-11-01 18:50:00 +03:00
23rd
679c932697 Added local event for recent joined chats. 2025-11-01 18:50:00 +03:00
23rd
581ec70bf3 Fixed dividers below shared media section in profile info. 2025-11-01 18:50:00 +03:00
23rd
4d2700ab1c Added special tracker to allow override dividers below in profile info. 2025-11-01 18:50:00 +03:00
23rd
b365136639 Added special at least one shown button tracker to profile info. 2025-11-01 18:50:00 +03:00
23rd
f23153e1ac Fixed skip for view channel button in profile info. 2025-11-01 18:50:00 +03:00
23rd
26cb931dcf Fixed skip for report reaction button in profile info. 2025-11-01 18:50:00 +03:00
23rd
42d2190d17 Moved out "add to contact" button from info above in hierarchy. 2025-11-01 18:50:00 +03:00
23rd
63ad80200e Fixed display of join action button in profile top bar on channel join. 2025-11-01 18:50:00 +03:00
23rd
68e9c63693 Slightly improved style of badges in boost box. 2025-11-01 18:50:00 +03:00
23rd
542ff88d3b Fixed order of features in boost box. 2025-11-01 18:50:00 +03:00
23rd
bf7f73e472 Fixed repaint of action buttons in profile top bar on palette changed. 2025-11-01 18:50:00 +03:00
23rd
c9f195be90 Improved color for verified inner check in profile top bar. 2025-11-01 18:50:00 +03:00
23rd
715da30a72 Added peer colors as feature to boost box. 2025-11-01 18:50:00 +03:00
23rd
4e9f2aaadd Removed redundant button for chat management from info actions list. 2025-11-01 18:50:00 +03:00
23rd
71cbb037ce Added new action button for chat management to profile top bar. 2025-11-01 18:50:00 +03:00
23rd
9e43972313 Added item about peer colors to summary of premium features. 2025-10-31 15:42:24 +03:00
23rd
4a8bb75851 Added new badge to entry point for edit peer color box. 2025-10-31 15:04:17 +03:00
23rd
80dce3b65a Added profile color sample to button in settings and manage sections. 2025-10-31 14:41:25 +03:00
23rd
056534fb41 Fixed api requests for edit colors in edit peer color box. 2025-10-31 14:39:06 +03:00
23rd
e444b82683 Fixed display of pattern emoji in button without color in edit color. 2025-10-31 12:12:00 +03:00
23rd
d9e4f686fb Added menu items for contacts to profile top bar. 2025-10-31 11:57:30 +03:00
23rd
2cd224af98 Fixed centered position of icons in action buttons from profile top bar. 2025-10-31 10:26:35 +03:00
23rd
a50141ac8a Added one line for private topic links to profile info. 2025-10-31 01:21:14 +03:00
23rd
f11b36cdb1 Improved track of sliders to avoid empty dividers in profile top bar. 2025-10-31 01:20:55 +03:00
23rd
f30af1c4ed Added go to forum button instead of status for topic in profile top bar. 2025-10-30 22:25:06 +03:00
23rd
45def31826 Returned button to view channel to profile top bar.
Regression was introduced 6147b0eec0.
2025-10-30 21:28:34 +03:00
23rd
a22afce820 Added music button to stories section. 2025-10-30 21:15:59 +03:00
23rd
af874bebfd Moved out music button creation to single place. 2025-10-30 21:15:59 +03:00
23rd
7cdb651538 Slightly optimized repaint for userpic and gifts in profile top bar. 2025-10-30 20:43:07 +03:00
23rd
5e1752bcbc Fixed useless repaint for bot verified badges. 2025-10-30 20:31:54 +03:00
23rd
eb295cb19c Simplified foreground color of badges in profile top bar. 2025-10-30 20:31:54 +03:00
23rd
ace42226b6 Fix rounding in preview of settings for quick dialog actions. 2025-10-30 18:49:41 +03:00
23rd
5e1b4b4e6a Added ability to report userpic from profile top bar. 2025-10-30 18:05:27 +03:00
23rd
f009fa9e47 Fixed callback of back button in profile top bar. 2025-10-30 18:05:27 +03:00
23rd
f08c00557d Fixed display of back button in profile top bar. 2025-10-30 18:05:27 +03:00
23rd
a0e0d95775 Added ability to click on emoji status in profile top bar. 2025-10-30 18:05:05 +03:00
23rd
a4acab983d Fixed width of title with bot verified badge in profile top bar. 2025-10-30 18:05:05 +03:00
23rd
5237a7977d Fixed ability to select and copy peer name in profile top bar. 2025-10-30 18:05:05 +03:00
23rd
eb285bc1ac Fixed width of title on peer name changes in profile top bar. 2025-10-30 18:05:05 +03:00
23rd
7d97cd25ab Fixed bg position of pinned gift in profile top bar on non-retina. 2025-10-30 14:54:52 +03:00
23rd
55f4a99824 Fixed quality of pinned gift in profile top bar on non-retina. 2025-10-30 14:02:31 +03:00
23rd
34373836b9 Fixed position of pattern emoji in profile top bar on different scales. 2025-10-30 14:02:31 +03:00
23rd
1509891ec0 Fixed size of pattern emoji in profile top bar on non-retina. 2025-10-30 14:02:31 +03:00
dependabot[bot]
877ef7d78f Bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-29 17:41:11 +04:00
498 changed files with 21560 additions and 4524 deletions

View File

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

View File

@@ -59,7 +59,7 @@ jobs:
steps:
- name: Clone.
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
submodules: recursive
@@ -148,7 +148,7 @@ jobs:
cd out/Debug
mkdir artifact
mv {Telegram,Updater} artifact/
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
with:

View File

@@ -40,7 +40,7 @@ jobs:
macos:
name: MacOS
runs-on: macos-15-intel
runs-on: macos-latest
strategy:
matrix:
@@ -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 }}
@@ -131,7 +131,7 @@ jobs:
mkdir artifact
mv Telegram.app artifact/
mv Updater artifact/
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
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 }}
@@ -187,7 +187,7 @@ jobs:
cd $REPO_NAME/build
mkdir artifact
mv Telegram.dmg artifact/
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
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,7 +61,7 @@ jobs:
sudo lxd waitready
- name: Free up some disk space.
uses: endersonmenezes/free-disk-space@713d134e243b926eba4a5cce0cf608bfd1efb89a
uses: endersonmenezes/free-disk-space@6c4664f43348c8c7011b53488d5ca65e9fc5cd1a
with:
remove_android: true
remove_dotnet: true
@@ -84,7 +84,7 @@ jobs:
mkdir artifact
mv $artifact_name artifact
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
if: env.UPLOAD_ARTIFACT == 'true'
name: Upload artifact.
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 }}
@@ -203,7 +203,7 @@ jobs:
mkdir artifact
move %OUT%\Telegram.exe artifact/
move %OUT%\Updater.exe artifact/
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v5
name: Upload artifact.
if: (env.UPLOAD_ARTIFACT == 'true') || (github.ref == 'refs/heads/nightly')
with:

View File

@@ -333,8 +333,12 @@ PRIVATE
boxes/send_files_box.h
boxes/share_box.cpp
boxes/share_box.h
boxes/star_gift_auction_box.cpp
boxes/star_gift_auction_box.h
boxes/star_gift_box.cpp
boxes/star_gift_box.h
boxes/star_gift_resale_box.cpp
boxes/star_gift_resale_box.h
boxes/sticker_set_box.cpp
boxes/sticker_set_box.h
boxes/stickers_box.cpp
@@ -377,6 +381,8 @@ PRIVATE
calls/group/calls_group_rtmp.h
calls/group/calls_group_settings.cpp
calls/group/calls_group_settings.h
calls/group/calls_group_stars_box.cpp
calls/group/calls_group_stars_box.h
calls/group/calls_group_toasts.cpp
calls/group/calls_group_toasts.h
calls/group/calls_group_viewport.cpp
@@ -513,6 +519,8 @@ PRIVATE
data/components/credits.h
data/components/factchecks.cpp
data/components/factchecks.h
data/components/gift_auctions.cpp
data/components/gift_auctions.h
data/components/location_pickers.cpp
data/components/location_pickers.h
data/components/promo_suggestions.cpp
@@ -1072,6 +1080,7 @@ PRIVATE
info/reactions_list/info_reactions_list_widget.h
info/requests_list/info_requests_list_widget.cpp
info/requests_list/info_requests_list_widget.h
info/saved/info_saved_music_common.cpp
info/saved/info_saved_music_common.h
info/saved/info_saved_music_provider.cpp
info/saved/info_saved_music_provider.h
@@ -1301,6 +1310,8 @@ PRIVATE
media/view/media_view_playback_progress.h
media/view/media_view_playback_sponsored.cpp
media/view/media_view_playback_sponsored.h
media/view/media_view_video_stream.cpp
media/view/media_view_video_stream.h
media/system_media_controls_manager.h
media/system_media_controls_manager.cpp
menu/menu_antispam_validator.cpp
@@ -1635,6 +1646,8 @@ PRIVATE
ui/controls/location_picker.h
ui/controls/silent_toggle.cpp
ui/controls/silent_toggle.h
ui/controls/table_rows.cpp
ui/controls/table_rows.h
ui/controls/userpic_button.cpp
ui/controls/userpic_button.h
ui/effects/credits_graphics.cpp
@@ -1720,6 +1733,8 @@ PRIVATE
window/window_session_controller.cpp
window/window_session_controller.h
window/window_session_controller_link_info.h
window/window_setup_email.cpp
window/window_setup_email.h
window/window_top_bar_wrap.h
window/themes/window_theme.cpp
window/themes/window_theme.h

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

@@ -440,6 +440,9 @@ div.toast_shown {
.section.stories {
background-image: url(../images/section_stories.png);
}
.section.music {
background-image: url(../images/section_music.png);
}
.section.web {
background-image: url(../images/section_web.png);
}
@@ -481,6 +484,16 @@ div.toast_shown {
.media_video .fill {
background-image: url(../images/media_video.png)
}
.audio_icon {
width: 48px;
height: 48px;
border-radius: 50%;
background-color: #4f9cd9;
background-image: url(../images/media_music.png);
background-repeat: no-repeat;
background-position: 12px 12px;
background-size: 24px 24px;
}
@media only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2) {
.section.calls {
@@ -504,6 +517,9 @@ div.toast_shown {
.section.stories {
background-image: url(../images/section_stories@2x.png);
}
.section.music {
background-image: url(../images/section_music@2x.png);
}
.section.web {
background-image: url(../images/section_web@2x.png);
}
@@ -545,6 +561,9 @@ div.toast_shown {
.media_video .fill {
background-image: url(../images/media_video@2x.png)
}
.audio_icon {
background-image: url(../images/media_music@2x.png);
}
}
.spoiler {
@@ -633,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: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 B

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Filled / filled_stream_crown</title>
<g id="Filled-/-filled_stream_crown" stroke="none" fill="none" fill-rule="evenodd">
<path d="M10.5793798,21.3515408 L22.4461242,27.5065085 C23.3919447,27.6775566 24.3643369,27.4213643 25.1079413,26.8052098 L34.6112236,12.5021245 C35.4192073,11.8326252 36.5811617,11.8326252 37.3891453,12.5021245 L46.8924276,26.8052098 C47.6360321,27.4213643 48.6084242,27.6775566 49.5542448,27.5065085 L61.4209891,21.3515408 C62.613521,21.1358757 63.7528909,21.9400986 63.965843,23.1478228 C64.0112154,23.4051449 64.0113863,23.6685576 63.9663481,23.9259399 L57.0245486,49.6650027 C56.2820716,53.9080693 48.2297454,57 36.0001845,57 C23.7706236,57 15.7182973,53.9080693 14.9758203,49.6650027 L8.03402089,23.9259399 C7.8226367,22.7179332 8.61824017,21.5651064 9.81105098,21.3510293 C10.0651955,21.3054173 10.3252947,21.3055904 10.5793798,21.3515408 Z" id="Path" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 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: 839 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: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 938 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 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: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 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: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Icon / Filled / premium_themes</title>
<g id="Icon-/-Filled-/-premium_themes" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<path d="M8.65381112,10.7516786 L14.600547,16.5507975 C14.7950866,16.740508 14.7950866,17.0480895 14.600547,17.2378 L13.8655201,17.9545811 C13.6709805,18.1442916 13.3555695,18.1442916 13.1610299,17.9545811 C12.1129217,17.0843554 11.3456336,16.4119807 10.8591655,15.937457 C10.7682049,15.8487297 10.5422415,15.7847321 10.4567355,15.904017 L10.201902,16.2497487 L10.0193453,16.4884401 L9.83300263,16.7270352 L9.02218186,17.7460428 L8.75587192,18.0918034 L8.59549123,18.3121046 C7.91167738,19.2768629 6.91083947,19.1001271 6.35158932,18.5547593 C5.80232578,18.0191302 5.85863289,17.1049913 6.79138874,16.4035319 L6.85891507,16.3573404 C6.99427087,16.2669684 7.14265185,16.157786 7.30037755,16.0361677 L7.68363141,15.7328223 L8.38962036,15.1596258 L8.6312678,14.9665056 C8.79873654,14.8340204 8.96615336,14.7048192 9.13062469,14.5839136 C9.24335825,14.5010414 9.22165977,14.3680769 9.1319646,14.280627 L8.89532907,14.0428177 C8.55768805,13.6947027 8.13153904,13.2224438 7.61688206,12.6260412 L7.21429408,12.1554622 C7.01975448,11.9657517 7.01975448,11.6581702 7.21429408,11.4684597 L7.9493209,10.7516786 C8.1438605,10.5619681 8.45927152,10.5619681 8.65381112,10.7516786 Z M14.0750341,4.02554926 C14.1700659,4.05313428 14.2562711,4.10500261 14.3244531,4.17672529 L17.4193876,7.36611999 C17.5229412,7.47283414 17.5525486,7.63117292 17.4945519,7.76809496 L16.3521671,10.465106 C16.3075918,10.570342 16.3567671,10.6917881 16.4620031,10.7363634 C16.5226789,10.7620641 16.5919675,10.7573313 16.648585,10.7236188 L18.8014275,9.44172252 C18.9580015,9.3484915 19.1591462,9.38314731 19.2754925,9.52340059 L19.824657,10.1854078 C20.080453,10.493765 20.0450803,10.9495406 19.7447707,11.2147384 L15.2419116,15.19113 L10.0408804,10.1008505 C10.8928945,9.23732408 11.6272327,8.25187058 12.2438948,7.14448999 C12.7106069,6.30638457 13.08566,5.39611751 13.3690539,4.41368881 C13.456971,4.1116676 13.7729463,3.93786178 14.0750341,4.02554926 Z" id="Shape" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 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

@@ -328,6 +328,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_proxy_box_password" = "Password";
"lng_proxy_invalid" = "The proxy link is invalid.";
"lng_proxy_unsupported" = "Your Telegram Desktop version doesn't support this proxy type or the proxy link is invalid. Please update Telegram Desktop to the latest version.";
"lng_proxy_incorrect_secret" = "This proxy link uses invalid **secret** parameter. Please contact the proxy provider and ask him to update MTProxy source code and configure it with a correct **secret** value. Then let him provide a new link.";
"lng_edit_deleted" = "This message was deleted";
"lng_edit_limit_reached#one" = "You've reached the message text limit. Please make the text shorter by {count} character.";
@@ -742,6 +743,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_language" = "Language";
"lng_settings_default_scale" = "Default interface scale";
"lng_settings_scale" = "Interface scale";
"lng_settings_connection_type" = "Connection type";
"lng_settings_downloading_update" = "Downloading update {progress}...";
"lng_settings_privacy_title" = "Privacy";
@@ -758,6 +760,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_bio_privacy" = "Bio";
"lng_settings_gifts_privacy" = "Gifts";
"lng_settings_birthday_privacy" = "Date of Birth";
"lng_settings_saved_music_privacy" = "Saved Music";
"lng_settings_privacy_premium" = "Only subscribers of {link} can restrict receiving voice messages.";
"lng_settings_privacy_premium_link" = "Telegram Premium";
"lng_settings_passcode_disable" = "Disable passcode";
@@ -928,6 +931,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_cloud_login_email_code_title" = "Check Your New Email";
"lng_settings_cloud_login_email_code_about" = "Please enter the code we have sent to your new email {email}";
"lng_settings_cloud_login_email_success" = "Your email has been changed.";
"lng_settings_cloud_login_email_set_success" = "Your login email has been set successfully.";
"lng_settings_cloud_login_email_busy" = "Please set up login email in another window.";
"lng_settings_error_email_not_alowed" = "Sorry, this email is not allowed";
"lng_settings_ttl_title" = "Auto-Delete Messages";
@@ -997,6 +1002,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_color_changed_profile" = "Your profile style has been updated!";
"lng_settings_color_changed_profile_channel" = "Your channel profile style has been updated!";
"lng_settings_color_apply" = "Apply Style";
"lng_settings_color_wear" = "Wear Collectible";
"lng_settings_color_profile_emoji" = "Add icons to Profile";
"lng_settings_color_profile_emoji_channel" = "Profile Logo";
"lng_settings_color_reset" = "Reset Profile Color";
@@ -1405,6 +1411,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_edit_privacy_gifts_unlimited" = "Unlimited";
"lng_edit_privacy_gifts_limited" = "Limited-Edition";
"lng_edit_privacy_gifts_unique" = "Unique";
"lng_edit_privacy_gifts_channels" = "From Channels";
"lng_edit_privacy_gifts_types_about" = "Choose the types of gifts that you accept.";
"lng_edit_privacy_gifts_show_icon" = "Show Gift Icon in Chats";
"lng_edit_privacy_gifts_show_icon_about" = "Display the {emoji}Gift icon in the message input field for both participants in all chats.";
@@ -1464,6 +1471,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_edit_privacy_voices_always_title" = "Always allow";
"lng_edit_privacy_voices_never_title" = "Never Allow";
"lng_edit_privacy_saved_music_title" = "Saved Music";
"lng_edit_privacy_saved_music_header" = "Who can see my saved music in profile";
"lng_edit_privacy_saved_music_always_empty" = "Always allow";
"lng_edit_privacy_saved_music_never_empty" = "Never allow";
"lng_edit_privacy_saved_music_exceptions" = "These users will or will not be able to see your saved music regardless of the settings above.";
"lng_edit_privacy_saved_music_always_title" = "Always allow";
"lng_edit_privacy_saved_music_never_title" = "Never allow";
"lng_messages_privacy_title" = "Messages";
"lng_messages_privacy_subtitle" = "Who can send me messages";
"lng_messages_privacy_everyone" = "Everybody";
@@ -1577,6 +1592,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_profile_administrators#one" = "{count} administrator";
"lng_profile_administrators#other" = "{count} administrators";
"lng_profile_manage" = "Channel settings";
"lng_profile_topic_toast" = "This topic contains {name}";
"lng_invite_upgrade_title" = "Upgrade to Premium";
"lng_invite_upgrade_group_invite#one" = "{users} only accepts invitations to groups from Contacts and **Premium** users.";
@@ -1631,6 +1647,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_delete_note" = "Delete Note";
"lng_info_bio_label" = "Bio";
"lng_info_link_label" = "Link";
"lng_info_link_topic_label" = "This topic link will only work for group members";
"lng_info_location_label" = "Location";
"lng_info_about_label" = "Description";
"lng_info_work_open" = "Open";
@@ -1667,9 +1684,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_profile_suggest_photo" = "Suggest Profile Photo";
"lng_profile_suggest_photo_from_clipboard" = "Suggest From Clipboard";
"lng_profile_set_photo_for" = "Set Profile Photo";
"lng_profile_set_photo_for_group" = "Set Group Photo";
"lng_profile_set_photo_for_channel" = "Set Channel Photo";
"lng_profile_set_photo_for_from_clipboard" = "Set From Clipboard";
"lng_profile_set_photo_for_about" = "You can replace {user}'s photo with another photo that only you will see.";
"lng_profile_photo_reset" = "Reset to Original";
"lng_profile_photo_reset_button" = "Reset";
"lng_profile_photo_reset_sure" = "Are you sure you want to reset {user}'s photo to the original?";
"lng_profile_photo_from_clipboard" = "From clipboard";
"lng_profile_suggest_sure" = "You can suggest {user} to set this photo for their Telegram profile.";
@@ -1684,6 +1704,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_profile_changed_photo_link" = "Settings";
"lng_profile_action_short_message" = "Message";
"lng_profile_action_short_channel" = "Channel";
"lng_profile_action_short_mute" = "Mute";
"lng_profile_action_short_unmute" = "Unmute";
"lng_profile_action_short_call" = "Call";
@@ -1693,6 +1714,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_profile_action_short_report" = "Report";
"lng_profile_action_short_leave" = "Leave";
"lng_profile_action_short_more" = "More";
"lng_profile_action_short_manage" = "Manage";
"lng_media_type_photos" = "Photos";
"lng_media_type_gifs" = "GIFs";
@@ -1713,6 +1735,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";
@@ -2272,6 +2295,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_action_gift_sent_channel" = "{user} sent a gift to {name} for {cost}";
"lng_action_gift_sent_self_channel" = "You sent a gift to {name} for {cost}";
"lng_action_gift_self_bought" = "You bought a gift for {cost}";
"lng_action_gift_self_auction" = "You've successfully bought a gift in the auction for {cost}.";
"lng_action_gift_auction_won" = "You won the auction with a bid of {cost}.";
"lng_action_gift_self_subtitle" = "Saved Gift";
"lng_action_gift_self_about#one" = "Display this gift on your page or convert it to **{count}** Star.";
"lng_action_gift_self_about#other" = "Display this gift on your page or convert it to **{count}** Stars.";
@@ -2427,6 +2452,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_peer_gifts_filter_saved" = "Displayed";
"lng_peer_gifts_filter_unsaved" = "Hidden";
"lng_premium_gift_duration_days#one" = "for {count} day";
"lng_premium_gift_duration_days#other" = "for {count} days";
"lng_premium_gift_duration_months#one" = "for {count} month";
"lng_premium_gift_duration_months#other" = "for {count} months";
"lng_premium_gift_duration_years#one" = "for {count} year";
@@ -2604,6 +2631,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_edited" = "edited";
"lng_commented" = "commented";
"lng_approximate" = "appx.";
"lng_repeated_daily" = "daily";
"lng_repeated_weekly" = "weekly";
"lng_repeated_biweekly" = "biweekly";
"lng_repeated_monthly" = "monthly";
"lng_repeated_every_month#one" = "{count}-monthly";
"lng_repeated_every_month#other" = "{count}-monthly";
"lng_repeated_yearly" = "yearly";
"lng_edited_date" = "Edited: {date}";
"lng_sent_date" = "Sent: {date}";
"lng_approximate_about" = "Estimated date of video publishing.";
@@ -2722,8 +2756,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_premium_summary_title_subscribed" = "You are all set!";
"lng_premium_summary_subtitle_gift#one" = "{user} has gifted you a {count}-month subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift#other" = "{user} has gifted you a {count}-months subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift_days#one" = "{user} has gifted you a {count}-day subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift_days#other" = "{user} has gifted you a {count}-days subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift_me#one" = "You gifted {user} a {count}-month subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift_me#other" = "You gifted {user} a {count}-months subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift_days_me#one" = "You gifted {user} a {count}-month subscription to Telegram Premium.";
"lng_premium_summary_subtitle_gift_days_me#other" = "You gifted {user} a {count}-months subscription to Telegram Premium.";
"lng_premium_summary_subtitle_wallpapers" = "Wallpapers for Both Sides";
"lng_premium_summary_about_wallpapers" = "Set custom wallpapers for you and your chat partner.";
"lng_premium_summary_subtitle_stories" = "Stories";
@@ -2920,6 +2958,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}";
@@ -3051,6 +3090,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_credits_small_balance_title#other" = "{count} Stars Needed";
"lng_credits_small_balance_about" = "Buy **Stars** and use them on **{bot}** and other miniapps.";
"lng_credits_small_balance_reaction" = "Buy **Stars** and send them to {channel} to support their posts.";
"lng_credits_small_balance_video_stream" = "Buy **Stars** to send them to {name} to support their stream.";
"lng_credits_small_balance_subscribe" = "Buy **Stars** and subscribe to **{channel}** and other channels.";
"lng_credits_small_balance_star_gift" = "Buy **Stars** to send gifts to {user} and other contacts.";
"lng_credits_small_balance_for_message" = "Buy **Stars** to send messages to {user}.";
@@ -3379,6 +3419,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_feature_custom_emoji_pack" = "Custom Emoji Pack";
"lng_feature_transcribe" = "Voice-to-Text Conversion";
"lng_feature_autotranslate" = "Autotranslation of Messages";
"lng_feature_profile_color_channel#one" = "**{count}** Color for Channel Cover";
"lng_feature_profile_color_channel#other" = "**{count}** Colors for Channel Cover";
"lng_feature_profile_color_group#one" = "**{count}** Color for Group Cover";
"lng_feature_profile_color_group#other" = "**{count}** Colors for Group Cover";
"lng_feature_profile_icon_channel" = "Custom Logo for Channel Cover";
"lng_feature_profile_icon_group" = "Custom Logo for Group Cover";
"lng_edit_topics_enable" = "Enable Topics";
"lng_edit_topics_about" = "The group chat will be divided into topics created by admins or users.";
@@ -3644,6 +3690,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_stars_resale" = "resale";
"lng_gift_stars_on_sale" = "on sale";
"lng_gift_stars_premium" = "premium";
"lng_gift_stars_auction" = "auction";
"lng_gift_stars_auction_join" = "Join";
"lng_gift_stars_your_left#one" = "{count} left";
"lng_gift_stars_your_left#other" = "{count} left";
"lng_gift_stars_your_finished" = "none left";
@@ -3947,6 +3995,102 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_gift_collection_remove_from" = "Remove from Collection";
"lng_gift_locked_title" = "Gift Locked";
"lng_auction_about_title" = "Auction";
"lng_auction_about_subtitle" = "Join the battle for exclusive gifts.";
"lng_auction_about_top_title#one" = "Top {count} Bidder";
"lng_auction_about_top_title#other" = "Top {count} Bidders";
"lng_auction_about_top_rounds#one" = "{count} round";
"lng_auction_about_top_rounds#other" = "{count} rounds";
"lng_auction_about_top_bidders#one" = "top {count} bidder";
"lng_auction_about_top_bidders#other" = "top {count} bidders";
"lng_auction_about_top_about#one" = "{count} gift is dropped in {rounds} to the {bidders} by bid amount.";
"lng_auction_about_top_about#other" = "{count} gifts are dropped in {rounds} to the {bidders} by bid amount.";
"lng_auction_about_top_short#one" = "{count} gift is dropped to the {bidders} by bid amount. {link}";
"lng_auction_about_top_short#other" = "{count} gifts are dropped to the {bidders} by bid amount. {link}";
"lng_auction_about_bid_title" = "Bid Carryover";
"lng_auction_about_bid_about#one" = "If your bid leaves the top {count}, it will automatically join the next round.";
"lng_auction_about_bid_about#other" = "If your bid leaves the top {count}, it will automatically join the next round.";
"lng_auction_about_missed_title" = "Missed Bidders";
"lng_auction_about_missed_about" = "If your bid doesn't win after the final round, your Stars will be fully refunded.";
"lng_auction_about_understood" = "Understood";
"lng_auction_text#one" = "Top **{count}** bidder will get {name} gifts this round. {link}";
"lng_auction_text#other" = "Top **{count}** bidders will get {name} gifts this round. {link}";
"lng_auction_text_link" = "Learn more {arrow}";
"lng_auction_text_ended" = "Auction ended.";
"lng_auction_start_label" = "Started";
"lng_auction_end_label" = "Ends";
"lng_auction_round_label" = "Current Round";
"lng_auction_round_value" = "{n} of {amount}";
"lng_auction_average_label" = "Average Price";
"lng_auction_average_tooltip" = "{amount} is the average sale price for {gift} gifts.";
"lng_auction_availability_label" = "Availability";
"lng_auction_availability_value" = "{n} of {amount} left";
"lng_auction_bought#one" = "{count} {emoji} item bought {arrow}";
"lng_auction_bought#other" = "{count} {emoji} items bought {arrow}";
"lng_auction_join_button" = "Join Auction";
"lng_auction_join_bid" = "Place a Bid";
"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_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_subtitle#one" = "Top {count} bidder will win";
"lng_auction_bid_subtitle#other" = "Top {count} bidders will win";
"lng_auction_bid_your" = "your bid";
"lng_auction_bid_custom" = "click to bid more";
"lng_auction_bid_threshold#one" = "TOP {count}";
"lng_auction_bid_threshold#other" = "TOP {count}";
"lng_auction_bid_minimal#one" = "minimum bid";
"lng_auction_bid_minimal#other" = "minimum bid";
"lng_auction_bid_until" = "until next round";
"lng_auction_bid_left#one" = "left";
"lng_auction_bid_left#other" = "left";
"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";
"lng_auction_bid_winners_title" = "Top winners";
"lng_auction_bid_place" = "Place a {stars} Bid";
"lng_auction_bid_increase" = "Add {stars} to Your Bid";
"lng_auction_bid_placed_title" = "Your bid has been placed";
"lng_auction_bid_increased_title" = "Your bid has been increased";
"lng_auction_bid_done_text#one" = "If you fall below the **top {count}**, your bid will roll over to the next round.";
"lng_auction_bid_done_text#other" = "If you fall below the **top {count}**, your bid will roll over to the next round.";
"lng_auction_bid_custom_title" = "Custom Amount";
"lng_auction_preview_left#one" = "{count} left";
"lng_auction_preview_left#other" = "{count} left";
"lng_auction_preview_join" = "Join";
"lng_auctino_preview_finished" = "Finished";
"lng_auction_preview_sold_out" = "Sold Out";
"lng_auction_preview_view_results" = "View Results";
"lng_auction_bar_active" = "Active Auction";
"lng_auction_bar_active_many#one" = "{count} Active Auction";
"lng_auction_bar_active_many#other" = "{count} Active Auctions";
"lng_auction_bar_winning#one" = "You're winning ({count}st place).";
"lng_auction_bar_winning#other" = "You're winning ({count}th place).";
"lng_auction_bar_outbid" = "You've been outbid.";
"lng_auction_bar_winning_all" = "You're winning in all of them.";
"lng_auction_bar_outbid_some#one" = "You've been outbid in {count} of them.";
"lng_auction_bar_outbid_some#other" = "You've been outbid in {count} of them.";
"lng_auction_bar_outbid_all" = "You've been outbid in all of them.";
"lng_auction_bar_view" = "View";
"lng_auction_bar_round" = "Round {n} of {amount}";
"lng_auction_bar_bid_ranked" = "Your bid **{stars}** is ranked **#{n}**";
"lng_auction_bar_bid_outbid" = "Your bid **{stars}** is outbid";
"lng_auction_bar_raise_bid" = "Raise Bid";
"lng_auction_bought_title#one" = "{count} Item Bought";
"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_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_accounts_limit_title" = "Limit Reached";
"lng_accounts_limit1#one" = "You have reached the limit of **{count}** connected account.";
"lng_accounts_limit1#other" = "You have reached the limit of **{count}** connected accounts.";
@@ -4127,6 +4271,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_reminder_message" = "Set a reminder";
"lng_schedule_title" = "Send this message on...";
"lng_remind_title" = "Remind me on...";
"lng_schedule_repeat_label" = "Repeat:";
"lng_schedule_repeat_never" = "Never";
"lng_schedule_repeat_daily" = "Daily";
"lng_schedule_repeat_weekly" = "Weekly";
"lng_schedule_repeat_biweekly" = "Biweekly";
"lng_schedule_repeat_monthly" = "Monthly";
"lng_schedule_repeat_every_month#one" = "Every {count} month";
"lng_schedule_repeat_every_month#other" = "Every {count} month";
"lng_schedule_repeat_yearly" = "Yearly";
"lng_schedule_repeat_promo" = "Subscribe to {link} to schedule repeating messages.";
"lng_schedule_repeat_promo_link" = "Telegram Premium";
"lng_schedule_at" = "at";
"lng_message_ph" = "Write a message...";
"lng_broadcast_ph" = "Broadcast a message...";
@@ -4134,6 +4289,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_send_anonymous_ph" = "Send anonymously...";
"lng_story_reply_ph" = "Reply privately...";
"lng_story_comment_ph" = "Comment story...";
"lng_video_stream_comment_ph" = "Comment";
"lng_video_stream_comment_paid_ph#one" = "Comment for {count} Star";
"lng_video_stream_comment_paid_ph#other" = "Comment for {count} Stars";
"lng_video_stream_comments_disabled" = "Comments disabled.";
"lng_video_stream_stars" = "Add Stars to highlight your comment";
"lng_video_stream_live" = "LIVE";
"lng_video_stream_watched#one" = "{count} watching";
"lng_video_stream_watched#other" = "{count} watching";
"lng_video_stream_edit_stars" = "Edit Stars";
"lng_video_stream_remove_stars" = "Remove Stars";
"lng_message_stars_ph#one" = "Message for {count} Star";
"lng_message_stars_ph#other" = "Message for {count} Stars";
"lng_send_text_no" = "Text not allowed.";
@@ -4538,6 +4703,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_context_seen_reacted_none" = "Nobody Reacted";
"lng_context_seen_reacted_all" = "Show All Reactions";
"lng_context_sent_by" = "Sent by {user}";
"lng_context_sent_today" = "Sent today at {time}";
"lng_context_sent_yesterday" = "Sent yesterday at {time}";
"lng_context_sent_date" = "Sent {date} at {time}";
"lng_context_set_as_quick" = "Set As Quick";
"lng_context_filter_by_tag" = "Filter by Tag";
"lng_context_tag_add_name" = "Add Name";
@@ -4572,6 +4740,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_message_tagged_with" = "Message tagged with {emoji}";
"lng_tagged_view_saved" = "View";
"lng_add_channel_to_filter_selector" = "You can add a channel to your folder";
"lng_add_group_to_filter_selector" = "You can add a group to your folder";
"lng_context_animated_emoji" = "This message contains emoji from **{name} pack**.";
"lng_context_animated_emoji_many#one" = "This message contains emoji from **{count} pack**.";
"lng_context_animated_emoji_many#other" = "This message contains emoji from **{count} packs**.";
@@ -4621,6 +4792,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!";
@@ -4631,6 +4803,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_paid_react_show_in_top" = "Show me in Top Senders";
"lng_paid_react_anonymous" = "Anonymous";
"lng_paid_comment_title" = "Highlight and Pin";
"lng_paid_comment_about" = "Highlight and pin your message by adding Stars for {name}.";
"lng_paid_comment_button" = "Add {stars}";
"lng_paid_comment_pin_about" = "pin in chat";
"lng_paid_comment_limit_about#one" = "character";
"lng_paid_comment_limit_about#other" = "characters";
"lng_paid_comment_emoji_about#one" = "emoji";
"lng_paid_comment_emoji_about#other" = "emoji";
"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+";
"lng_sensitive_text" = "This media may contain sensitive content suitable only for adults. Do you still want to view it?";
@@ -6123,12 +6309,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_export_option_contacts_about" = "If you allow access, contacts are continuously synced with Telegram. You can adjust this in Settings > Privacy & Security on mobile devices.";
"lng_export_option_stories" = "Story archive";
"lng_export_option_stories_about" = "All stories you posted from Telegram mobile apps.";
"lng_export_option_profile_music" = "Music on Profiles";
"lng_export_option_profile_music_about" = "All tracks you saved to your playlist.";
"lng_export_option_sessions" = "Active sessions";
"lng_export_option_sessions_about" = "We may store this to display your connected devices in Settings > Privacy & Security > Show all sessions.";
"lng_export_header_other" = "Other";
"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";
@@ -6623,6 +6812,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";
@@ -6717,6 +6907,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";
@@ -6726,6 +6917,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_stealth_mode_already_about" = "The creators of stories you view in the next **{left}** won't see you in the viewers' lists.";
"lng_stories_link_invalid" = "This link is broken or has expired.";
"lng_stories_live_finished" = "The live story has ended.";
"lng_stats_title" = "Statistics";
"lng_stats_message_title" = "Message Statistic";

View File

@@ -46,6 +46,10 @@
<file alias="toast/saved_messages.tgs">../../animations/toast/saved_messages.tgs</file>
<file alias="toast/tagged.tgs">../../animations/toast/tagged.tgs</file>
<file alias="my_gifts_empty.tgs">../../animations/my_gifts_empty.tgs</file>
<file alias="toast/chats_filter_in.tgs">../../animations/toast/chats_filter_in.tgs</file>
<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="profile_muting.tgs">../../animations/profile/profile_muting.tgs</file>
<file alias="profile_unmuting.tgs">../../animations/profile/profile_unmuting.tgs</file>

View File

@@ -31,6 +31,8 @@
<file alias="images/section_contacts@2x.png">../../export_html/images/section_contacts@2x.png</file>
<file alias="images/section_frequent.png">../../export_html/images/section_frequent.png</file>
<file alias="images/section_frequent@2x.png">../../export_html/images/section_frequent@2x.png</file>
<file alias="images/section_music.png">../../export_html/images/section_music.png</file>
<file alias="images/section_music@2x.png">../../export_html/images/section_music@2x.png</file>
<file alias="images/section_other.png">../../export_html/images/section_other.png</file>
<file alias="images/section_other@2x.png">../../export_html/images/section_other@2x.png</file>
<file alias="images/section_photos.png">../../export_html/images/section_photos.png</file>

View File

@@ -10,7 +10,7 @@
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
ProcessorArchitecture="ARCHITECTURE"
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
Version="6.2.5.0" />
Version="6.3.4.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,2,5,0
PRODUCTVERSION 6,2,5,0
FILEVERSION 6,3,4,0
PRODUCTVERSION 6,3,4,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.2.5.0"
VALUE "FileVersion", "6.3.4.0"
VALUE "LegalCopyright", "Copyright (C) 2014-2025"
VALUE "ProductName", "Telegram Desktop"
VALUE "ProductVersion", "6.2.5.0"
VALUE "ProductVersion", "6.3.4.0"
END
END
BLOCK "VarFileInfo"

View File

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

View File

@@ -25,6 +25,7 @@ struct SendOptions {
uint64 price = 0;
PeerData *sendAs = nullptr;
TimeId scheduled = 0;
TimeId scheduleRepeatPeriod = 0;
BusinessShortcutId shortcutId = 0;
EffectId effectId = 0;
int starsApproved = 0;

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

@@ -154,6 +154,7 @@ mtpRequestId SuggestMedia(
MTPReplyMarkup(),
sentEntities,
MTPint(), // schedule_date
MTPint(), // schedule_repeat_period
MTPInputPeer(), // send_as
MTPInputQuickReplyShortcut(), // quick_reply_shortcut
MTPlong(), // effect
@@ -295,6 +296,9 @@ mtpRequestId EditMessage(
| (options.scheduled
? MTPmessages_EditMessage::Flag::f_schedule_date
: emptyFlag)
| ((options.scheduled && options.scheduleRepeatPeriod)
? MTPmessages_EditMessage::Flag::f_schedule_repeat_period
: emptyFlag)
| (item->isBusinessShortcut()
? MTPmessages_EditMessage::Flag::f_quick_reply_shortcut_id
: emptyFlag);
@@ -313,6 +317,7 @@ mtpRequestId EditMessage(
MTPReplyMarkup(),
sentEntities,
MTP_int(options.scheduled),
MTP_int(options.scheduleRepeatPeriod),
MTP_int(item->shortcutId())
)).done([=](
const MTPUpdates &result,

View File

@@ -262,6 +262,9 @@ void GlobalPrivacy::update(
: DisallowedFlag())
| ((disallowedGiftTypes & DisallowedGiftType::Unique)
? DisallowedFlag::f_disallow_unique_stargifts
: DisallowedFlag())
| ((disallowedGiftTypes & DisallowedGiftType::FromChannels)
? DisallowedFlag::f_disallow_stargifts_from_channels
: DisallowedFlag());
const auto typesWas = _disallowedGiftTypes.current();
const auto typesChanged = (typesWas != disallowedGiftTypes);
@@ -322,6 +325,9 @@ void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &settings) {
| (disallow.is_disallow_premium_gifts()
? DisallowedGiftType::Premium
: DisallowedGiftType())
| (disallow.is_disallow_stargifts_from_channels()
? DisallowedGiftType::FromChannels
: DisallowedGiftType())
| (data.is_display_gifts_button()
? DisallowedGiftType::SendHide
: DisallowedGiftType());

View File

@@ -25,11 +25,12 @@ enum class UnarchiveOnNewMessage {
};
enum class DisallowedGiftType : uchar {
Limited = 0x01,
Unlimited = 0x02,
Unique = 0x04,
Premium = 0x08,
SendHide = 0x10,
Limited = 0x01,
Unlimited = 0x02,
Unique = 0x04,
FromChannels = 0x08,
Premium = 0x10,
SendHide = 0x20,
};
inline constexpr bool is_flag_type(DisallowedGiftType) { return true; }

View File

@@ -61,6 +61,9 @@ void Polls::create(
}
if (action.options.scheduled) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
sendFlags |= MTPmessages_SendMedia::Flag::f_quick_reply_shortcut;
@@ -95,6 +98,7 @@ void Polls::create(
MTPReplyMarkup(),
MTPVector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTP_long(action.options.effectId),
@@ -191,6 +195,7 @@ void Polls::close(not_null<HistoryItem*> item) {
MTPReplyMarkup(),
MTPVector<MTPMessageEntity>(),
MTP_int(0), // schedule_date
MTP_int(0), // schedule_repeat_period
MTPint() // quick_reply_shortcut_id
)).done([=](const MTPUpdates &result) {
_pollCloseRequestIds.erase(itemId);

View File

@@ -36,7 +36,7 @@ namespace {
.giveawayId = data.vgiveaway_msg_id().value_or_empty(),
.date = data.vdate().v,
.used = data.vused_date().value_or_empty(),
.months = data.vmonths().v,
.days = data.vdays().v,
.giveaway = data.is_via_giveaway(),
};
}
@@ -858,6 +858,8 @@ std::optional<Data::StarGift> FromTL(
.releasedBy = releasedBy,
.resellTitle = qs(data.vtitle().value_or_empty()),
.resellCount = int(data.vavailability_resale().value_or_empty()),
.auctionSlug = qs(data.vauction_slug().value_or_empty()),
.auctionGiftsPerRound = data.vgifts_per_round().value_or_empty(),
.limitedLeft = remaining.value_or_empty(),
.limitedCount = total.value_or_empty(),
.perUserTotal = data.vper_user_total().value_or_empty(),

View File

@@ -30,11 +30,11 @@ struct GiftCode {
MsgId giveawayId = 0;
TimeId date = 0;
TimeId used = 0; // 0 if not used.
int months = 0;
int days = 0;
bool giveaway = false;
explicit operator bool() const {
return months != 0;
return days != 0;
}
friend inline bool operator==(

View File

@@ -36,7 +36,9 @@ Data::PremiumSubscriptionOption CreateSubscriptionOption(
.costNoDiscount = Ui::FillAmountAndCurrency(
monthlyAmount * months,
currency),
.costTotal = Ui::FillAmountAndCurrency(amount, currency),
.costPerYear = Ui::FillAmountAndCurrency(
amount / float64(months / 12.),
currency),
.botUrl = botUrl,
};
}

View File

@@ -101,6 +101,9 @@ void SendSimpleMedia(SendAction action, MTPInputMedia inputMedia) {
if (action.options.scheduled) {
flags |= MessageFlag::IsOrWasScheduled;
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
flags |= MessageFlag::ShortcutMessage;
@@ -136,6 +139,7 @@ void SendSimpleMedia(SendAction action, MTPInputMedia inputMedia) {
MTPReplyMarkup(),
MTPvector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(session, action.options.shortcutId),
MTP_long(action.options.effectId),
@@ -207,6 +211,9 @@ void SendExistingMedia(
if (action.options.scheduled) {
flags |= MessageFlag::IsOrWasScheduled;
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
flags |= MessageFlag::ShortcutMessage;
@@ -260,6 +267,7 @@ void SendExistingMedia(
MTPReplyMarkup(),
sentEntities,
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(session, action.options.shortcutId),
MTP_long(action.options.effectId),
@@ -392,6 +400,9 @@ bool SendDice(MessageToSend &message) {
if (action.options.scheduled) {
flags |= MessageFlag::IsOrWasScheduled;
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
flags |= MessageFlag::ShortcutMessage;
@@ -445,6 +456,7 @@ bool SendDice(MessageToSend &message) {
MTPReplyMarkup(),
MTP_vector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(session, action.options.shortcutId),
MTP_long(action.options.effectId),

View File

@@ -66,6 +66,9 @@ void TodoLists::create(
}
if (action.options.scheduled) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= MTPmessages_SendMedia::Flag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
sendFlags |= MTPmessages_SendMedia::Flag::f_quick_reply_shortcut;
@@ -100,6 +103,7 @@ void TodoLists::create(
MTPReplyMarkup(),
MTPVector<MTPMessageEntity>(),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTP_long(action.options.effectId),

View File

@@ -23,12 +23,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "mtproto/mtproto_dc_options.h"
#include "data/business/data_shortcut_messages.h"
#include "data/components/credits.h"
#include "data/components/gift_auctions.h"
#include "data/components/promo_suggestions.h"
#include "data/components/scheduled_messages.h"
#include "data/components/top_peers.h"
#include "data/notify/data_notify_settings.h"
#include "data/stickers/data_stickers.h"
#include "data/data_saved_messages.h"
#include "data/data_saved_sublist.h"
#include "data/data_session.h"
#include "data/data_user.h"
#include "data/data_chat.h"
@@ -42,6 +44,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_histories.h"
#include "data/data_folder.h"
#include "data/data_forum.h"
#include "data/data_forum_topic.h"
#include "data/data_send_action.h"
#include "data/data_stories.h"
#include "data/data_message_reactions.h"
@@ -1234,7 +1237,8 @@ void Updates::applyUpdatesNoPtsCheck(const MTPUpdates &updates) {
MTPFactCheck(),
MTPint(), // report_delivery_until_date
MTPlong(), // paid_message_stars
MTPSuggestedPost()),
MTPSuggestedPost(),
MTPint()), // schedule_repeat_period
MessageFlags(),
NewMessageType::Unread);
} break;
@@ -1274,7 +1278,8 @@ void Updates::applyUpdatesNoPtsCheck(const MTPUpdates &updates) {
MTPFactCheck(),
MTPint(), // report_delivery_until_date
MTPlong(), // paid_message_stars
MTPSuggestedPost()),
MTPSuggestedPost(),
MTPint()), // schedule_repeat_period
MessageFlags(),
NewMessageType::Unread);
} break;
@@ -1698,13 +1703,21 @@ void Updates::feedUpdate(const MTPUpdate &update) {
local->history()->peer,
local->date());
}
local->setRealId(d.vid().v);
local->setRealId(newId);
if (const auto topic = local->topic()) {
topic->applyMaybeLast(local);
}
if (const auto sublist = local->savedSublist()) {
sublist->applyMaybeLast(local);
}
}
}
} else {
owner.histories().checkTopicCreated(id, newId);
}
session().data().unregisterMessageRandomId(randomId);
} else {
Core::App().calls().handleUpdate(&session(), update);
}
session().data().unregisterMessageSentData(randomId);
} break;
@@ -2141,7 +2154,8 @@ void Updates::feedUpdate(const MTPUpdate &update) {
case mtpc_updateGroupCallConnection:
case mtpc_updateGroupCall:
case mtpc_updateGroupCallMessage:
case mtpc_updateGroupCallEncryptedMessage: {
case mtpc_updateGroupCallEncryptedMessage:
case mtpc_updateDeleteGroupCallMessages: {
Core::App().calls().handleUpdate(&session(), update);
} break;
@@ -2784,6 +2798,15 @@ void Updates::feedUpdate(const MTPUpdate &update) {
Api::ParsePaidReactionShownPeer(_session, data.vprivate()));
} break;
case mtpc_updateStarGiftAuctionState: {
const auto &data = update.c_updateStarGiftAuctionState();
_session->giftAuctions().apply(data);
} break;
case mtpc_updateStarGiftAuctionUserState: {
const auto &data = update.c_updateStarGiftAuctionUserState();
_session->giftAuctions().apply(data);
} break;
}
}

View File

@@ -211,6 +211,7 @@ MTPInputPrivacyKey KeyToTL(UserPrivacy::Key key) {
case Key::Birthday: return MTP_inputPrivacyKeyBirthday();
case Key::GiftsAutoSave: return MTP_inputPrivacyKeyStarGiftsAutoSave();
case Key::NoPaidMessages: return MTP_inputPrivacyKeyNoPaidMessages();
case Key::SavedMusic: return MTP_inputPrivacyKeySavedMusic();
}
Unexpected("Key in Api::UserPrivacy::KetToTL.");
}
@@ -244,6 +245,8 @@ std::optional<UserPrivacy::Key> TLToKey(mtpTypeId type) {
case mtpc_inputPrivacyKeyStarGiftsAutoSave: return Key::GiftsAutoSave;
case mtpc_privacyKeyNoPaidMessages:
case mtpc_inputPrivacyKeyNoPaidMessages: return Key::NoPaidMessages;
case mtpc_privacyKeySavedMusic:
case mtpc_inputPrivacyKeySavedMusic: return Key::SavedMusic;
}
return std::nullopt;
}

View File

@@ -33,6 +33,7 @@ public:
Birthday,
GiftsAutoSave,
NoPaidMessages,
SavedMusic,
};
enum class Option {
Everyone,

View File

@@ -787,8 +787,10 @@ QString ApiWrap::exportDirectStoryLink(not_null<Data::Story*> story) {
const auto peer = story->peer();
const auto fallback = [&] {
const auto base = peer->username();
const auto story = QString::number(storyId.story);
const auto query = base + "/s/" + story;
const auto id = story->call()
? u"live"_q
: QString::number(storyId.story);
const auto query = base + "/s/" + id;
return session().createInternalLinkFull(query);
};
const auto i = _unlikelyStoryLinks.find(storyId);
@@ -1216,6 +1218,10 @@ void ApiWrap::gotUserFull(
void ApiWrap::requestPeerSettings(not_null<PeerData*> peer) {
if (!_requestedPeerSettings.emplace(peer).second) {
return;
} else if (peer->isMonoforum()) {
peer->setBarSettings(PeerBarSettings());
_requestedPeerSettings.erase(peer);
return;
}
request(MTPmessages_GetPeerSettings(
peer->input
@@ -1227,6 +1233,7 @@ void ApiWrap::requestPeerSettings(not_null<PeerData*> peer) {
_requestedPeerSettings.erase(peer);
});
}).fail([=] {
peer->setBarSettings(PeerBarSettings());
_requestedPeerSettings.erase(peer);
}).send();
}
@@ -1740,6 +1747,11 @@ void ApiWrap::joinChannel(not_null<ChannelData*> channel) {
)).done([=](const MTPUpdates &result) {
_channelAmInRequests.remove(channel);
applyUpdates(result);
session().data().addRecentJoinChat({
.fromPeerId = channel->id,
.joinedPeerId = channel->id,
});
}).fail([=](const MTP::Error &error) {
const auto &type = error.type();
@@ -3463,6 +3475,9 @@ void ApiWrap::forwardMessages(
if (action.options.scheduled) {
flags |= MessageFlag::IsOrWasScheduled;
sendFlags |= SendFlag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= SendFlag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
flags |= MessageFlag::ShortcutMessage;
@@ -3530,6 +3545,7 @@ void ApiWrap::forwardMessages(
? MTP_inputReplyToMonoForum(monoforumPeer->input)
: MTPInputReplyTo()),
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, action.options.shortcutId),
MTPint(), // video_timestamp
@@ -4054,6 +4070,10 @@ void ApiWrap::sendMessage(
flags |= MessageFlag::IsOrWasScheduled;
sendFlags |= MTPmessages_SendMessage::Flag::f_schedule_date;
mediaFlags |= MTPmessages_SendMedia::Flag::f_schedule_date;
if (action.options.scheduleRepeatPeriod) {
sendFlags |= MTPmessages_SendMessage::Flag::f_schedule_repeat_period;
mediaFlags |= MTPmessages_SendMedia::Flag::f_schedule_repeat_period;
}
}
if (action.options.shortcutId) {
flags |= MessageFlag::ShortcutMessage;
@@ -4082,6 +4102,7 @@ void ApiWrap::sendMessage(
.from = NewMessageFromId(action),
.replyTo = action.replyTo,
.date = NewMessageDate(action.options),
.scheduleRepeatPeriod = action.options.scheduleRepeatPeriod,
.shortcutId = action.options.shortcutId,
.starsPaid = starsPaid,
.postAuthor = NewMessagePostAuthor(action),
@@ -4133,6 +4154,7 @@ void ApiWrap::sendMessage(
MTPReplyMarkup(),
sentEntities,
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
mtpShortcut,
MTP_long(action.options.effectId),
@@ -4153,6 +4175,7 @@ void ApiWrap::sendMessage(
MTPReplyMarkup(),
sentEntities,
MTP_int(action.options.scheduled),
MTP_int(action.options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
mtpShortcut,
MTP_long(action.options.effectId),
@@ -4460,6 +4483,9 @@ void ApiWrap::sendMediaWithRandomId(
: Flag(0))
| (!sentEntities.v.isEmpty() ? Flag::f_entities : Flag(0))
| (options.scheduled ? Flag::f_schedule_date : Flag(0))
| ((options.scheduled && options.scheduleRepeatPeriod)
? Flag::f_schedule_repeat_period
: Flag(0))
| (options.sendAs ? Flag::f_send_as : Flag(0))
| (options.shortcutId ? Flag::f_quick_reply_shortcut : Flag(0))
| (options.effectId ? Flag::f_effect : Flag(0))
@@ -4489,6 +4515,7 @@ void ApiWrap::sendMediaWithRandomId(
MTPReplyMarkup(),
sentEntities,
MTP_int(options.scheduled),
MTP_int(options.scheduleRepeatPeriod),
(options.sendAs ? options.sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, options.shortcutId),
MTP_long(options.effectId),
@@ -4545,6 +4572,9 @@ void ApiWrap::sendMultiPaidMedia(
: Flag(0))
| (!sentEntities.v.isEmpty() ? Flag::f_entities : Flag(0))
| (options.scheduled ? Flag::f_schedule_date : Flag(0))
| (options.scheduleRepeatPeriod
? Flag::f_schedule_repeat_period
: Flag(0))
| (options.sendAs ? Flag::f_send_as : Flag(0))
| (options.shortcutId ? Flag::f_quick_reply_shortcut : Flag(0))
| (options.effectId ? Flag::f_effect : Flag(0))
@@ -4573,6 +4603,7 @@ void ApiWrap::sendMultiPaidMedia(
MTPReplyMarkup(),
sentEntities,
MTP_int(options.scheduled),
MTP_int(options.scheduleRepeatPeriod),
(options.sendAs ? options.sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, options.shortcutId),
MTP_long(options.effectId),
@@ -4680,6 +4711,9 @@ void ApiWrap::sendAlbumIfReady(not_null<SendingAlbum*> album) {
? Flag::f_silent
: Flag(0))
| (album->options.scheduled ? Flag::f_schedule_date : Flag(0))
//| (album->options.scheduleRepeatPeriod
// ? Flag::f_schedule_repeat_period
// : Flag(0))
| (sendAs ? Flag::f_send_as : Flag(0))
| (album->options.shortcutId
? Flag::f_quick_reply_shortcut
@@ -4700,6 +4734,7 @@ void ApiWrap::sendAlbumIfReady(not_null<SendingAlbum*> album) {
Data::Histories::ReplyToPlaceholder(),
MTP_vector<MTPInputSingleMedia>(medias),
MTP_int(album->options.scheduled),
//MTP_int(album->options.scheduleRepeatPeriod),
(sendAs ? sendAs->input : MTP_inputPeerEmpty()),
Data::ShortcutIdToMTP(_session, album->options.shortcutId),
MTP_long(album->options.effectId),

View File

@@ -111,6 +111,10 @@ void ChatCreateDone(
show,
chat,
CollectForbiddenUsers(&chat->session(), result));
chat->owner().addRecentJoinChat({
.fromPeerId = chat->id,
.joinedPeerId = chat->id,
});
}
};
if (!success) {
@@ -454,10 +458,12 @@ void AddContactBox::save() {
MTP_vector<MTPInputContact>(
1,
MTP_inputPhoneContact(
MTP_flags(0),
MTP_long(_contactId),
MTP_string(phone),
MTP_string(firstName),
MTP_string(lastName)))
MTP_string(lastName),
MTPTextWithEntities())) // note
)).done(crl::guard(weak, [=](
const MTPcontacts_ImportedContacts &result) {
const auto &data = result.data();

View File

@@ -378,10 +378,8 @@ connectionPortInputField: InputField(defaultInputField) {
width: 55px;
}
connectionUserInputField: InputField(defaultInputField) {
width: 95px;
}
connectionPasswordInputField: InputField(defaultInputField) {
width: 120px;
}
connectionIPv6Skip: 11px;
@@ -537,7 +535,6 @@ changePhoneDescription: FlatLabel(defaultFlatLabel) {
}
changePhoneDescriptionPadding: margins(0px, 1px, 0px, 8px);
changePhoneIconPadding: margins(0px, 39px, 0px, 5px);
changePhoneIconSize: 120px;
changePhoneLabel: FlatLabel(defaultFlatLabel) {
minWidth: 275px;
textFg: windowSubTextFg;
@@ -546,6 +543,8 @@ changePhoneError: FlatLabel(changePhoneLabel) {
textFg: boxTextFgError;
}
normalBoxLottieSize: size(120px, 120px);
adminLogFilterUserpicLeft: 15px;
adminLogFilterLittleSkip: 16px;
adminLogFilterCheckbox: Checkbox(defaultBoxCheckbox) {
@@ -928,6 +927,14 @@ scheduleTimeSeparator: FlatLabel(defaultFlatLabel) {
}
}
scheduleTimeSeparatorPadding: margins(2px, 0px, 2px, 0px);
scheduleRepeatDropdownLock: IconEmoji {
icon: icon {{ "emoji/premium_lock", windowActiveTextFg }};
padding: margins(-2px, 1px, 0px, 0px);
}
scheduleRepeatDropdownArrow: IconEmoji {
icon: icon {{ "intro_country_dropdown", windowActiveTextFg }};
padding: margins(3px, 6px, 3px, 0px);
}
muteBoxTimeField: InputField(scheduleDateField) {
textMargins: margins(0px, 0px, 0px, 0px);
@@ -997,9 +1004,8 @@ contactsWithStories: PeerList(peerListBox) {
statusPosition: point(70px, 27px);
checkbox: RoundImageCheckbox(defaultPeerListCheckbox) {
selectExtendTwice: 1px;
imageRadius: 21px;
imageSmallRadius: 19px;
imageSmallRadius: 18px;
check: RoundCheckbox(defaultPeerListCheck) {
size: 0px;
}

View File

@@ -115,6 +115,7 @@ void AddProxyFromClipboard(
Success,
Failed,
Unsupported,
IncorrectSecret,
Invalid,
};
@@ -154,8 +155,11 @@ void AddProxyFromClipboard(
qthelp::UrlParamNameTransform::ToLower);
const auto proxy = ProxyDataFromFields(type, fields);
if (!proxy) {
return (proxy.status() == ProxyData::Status::Unsupported)
const auto status = proxy.status();
return (status == ProxyData::Status::Unsupported)
? Result::Unsupported
: (status == ProxyData::Status::IncorrectSecret)
? Result::IncorrectSecret
: Result::Invalid;
}
const auto contains = controller->contains(proxy);
@@ -189,9 +193,11 @@ void AddProxyFromClipboard(
tr::lng_proxy_add_from_clipboard_failed_toast(tr::now));
} else {
show->showBox(Ui::MakeInformBox(
(success == Result::Unsupported
? tr::lng_proxy_unsupported(tr::now)
: tr::lng_proxy_invalid(tr::now))));
((success == Result::IncorrectSecret)
? tr::lng_proxy_incorrect_secret(tr::now, tr::rich)
: (success == Result::Unsupported)
? tr::lng_proxy_unsupported(tr::now, tr::rich)
: tr::lng_proxy_invalid(tr::now, tr::rich))));
}
}
}
@@ -1183,7 +1189,7 @@ void ProxyBox::setupSocketAddress(const ProxyData &data) {
}
void ProxyBox::setupCredentials(const ProxyData &data) {
_credentials = _content->add(
_credentials = _content->add(
object_ptr<Ui::SlideWrap<Ui::VerticalLayout>>(
_content,
object_ptr<Ui::VerticalLayout>(_content)));
@@ -1316,10 +1322,13 @@ void ProxiesBoxController::ShowApplyConfirmation(
const QMap<QString, QString> &fields) {
const auto proxy = ProxyDataFromFields(type, fields);
if (!proxy) {
const auto status = proxy.status();
auto box = Ui::MakeInformBox(
(proxy.status() == ProxyData::Status::Unsupported
? tr::lng_proxy_unsupported(tr::now)
: tr::lng_proxy_invalid(tr::now)));
((status == ProxyData::Status::Unsupported)
? tr::lng_proxy_unsupported(tr::now, tr::rich)
: (status == ProxyData::Status::IncorrectSecret)
? tr::lng_proxy_incorrect_secret(tr::now, tr::rich)
: tr::lng_proxy_invalid(tr::now, tr::rich)));
if (controller) {
controller->uiShow()->showBox(std::move(box));
} else {

View File

@@ -16,11 +16,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/premium_preview_box.h"
#include "chat_helpers/emoji_suggestions_widget.h"
#include "chat_helpers/message_field.h"
#include "chat_helpers/tabbed_panel.h"
#include "chat_helpers/tabbed_selector.h"
#include "core/application.h"
#include "core/core_settings.h"
#include "core/ui_integration.h"
#include "data/stickers/data_custom_emoji.h"
#include "data/stickers/data_stickers.h"
#include "data/data_channel.h"
#include "data/data_chat_filters.h"
#include "data/data_document.h"
#include "data/data_peer.h"
#include "data/data_peer_values.h" // Data::AmPremiumValue.
#include "data/data_premium_limits.h"
@@ -32,6 +37,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "main/main_session.h"
#include "settings/settings_common.h"
#include "ui/chat/chats_filter_tag.h"
#include "ui/controls/emoji_button_factory.h"
#include "ui/controls/emoji_button.h"
#include "ui/effects/animation_value_f.h"
#include "ui/effects/animations.h"
#include "ui/effects/panel_animation.h"
@@ -54,6 +61,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "styles/style_layers.h"
#include "styles/style_window.h"
#include "styles/style_chat.h"
#include "styles/style_chat_helpers.h"
#include "styles/style_info_userpic_builder.h"
namespace {
@@ -357,6 +365,7 @@ void EditFilterBox(
rpl::variable<TextWithEntities> title;
rpl::variable<bool> staticTitle;
rpl::variable<int> colorIndex;
base::unique_qptr<ChatHelpers::TabbedPanel> emojiPanel;
};
const auto owner = &window->session().data();
const auto state = box->lifetime().make_state<State>(State{
@@ -423,7 +432,22 @@ void EditFilterBox(
current.text,
TextUtilities::ConvertEntitiesToTextTags(current.entities),
}, Ui::InputField::HistoryAction::Clear);
name->setMaxLength(kMaxFilterTitleLength);
Ui::AddLengthLimitLabel(
name,
kMaxFilterTitleLength,
Ui::LengthLimitLabelOptions{
.customThreshold = 0,
.customUpdatePosition = [=](QSize parent, QSize label) {
return QPoint(
parent.width()
- st::windowFilterNameCharsLimitRightPosition.x()
- label.width() / 2,
st::windowFilterNameCharsLimitRightPosition.y());
},
.customCharactersCount = [=] {
return Ui::ComputeFieldCharacterCount(name);
},
});
const auto nameEditing = box->lifetime().make_state<NameEditing>(
NameEditing{ name });
@@ -468,6 +492,47 @@ void EditFilterBox(
nameEditing->custom = true;
}, box->lifetime());
using Selector = ChatHelpers::TabbedSelector;
state->emojiPanel = base::make_unique_q<ChatHelpers::TabbedPanel>(
box->getDelegate()->outerContainer(),
window,
object_ptr<Selector>(
nullptr,
window->uiShow(),
Window::GifPauseReason::Layer,
Selector::Mode::EmojiOnly));
state->emojiPanel->setDesiredHeightValues(
1.,
st::emojiPanMinHeight / 2,
st::emojiPanMinHeight);
state->emojiPanel->hide();
state->emojiPanel->selector()->setCurrentPeer(window->session().user());
state->emojiPanel->selector()->emojiChosen(
) | rpl::start_with_next([=](ChatHelpers::EmojiChosen data) {
Ui::InsertEmojiAtCursor(name->textCursor(), data.emoji);
}, name->lifetime());
state->emojiPanel->selector()->customEmojiChosen(
) | rpl::start_with_next([=](ChatHelpers::FileChosen data) {
const auto info = data.document->sticker();
if (info
&& info->setType == Data::StickersType::Emoji
&& !window->session().premium()) {
ShowPremiumPreviewBox(
window,
PremiumFeature::AnimatedEmoji);
} else {
Data::InsertCustomEmoji(name, data.document);
}
}, name->lifetime());
const auto emojiButton = Ui::AddEmojiToggleToField(
name,
box,
window,
state->emojiPanel.get(),
st::windowFilterNameEmojiPosition);
emojiButton->show();
name->changes(
) | rpl::start_with_next([=] {
if (!nameEditing->settingDefault) {
@@ -585,18 +650,31 @@ void EditFilterBox(
}),
anim::type::instant);
const auto &padding = st::defaultSubsectionTitlePadding;
const auto isPremium = session->premium();
const auto title = Ui::AddSubsectionTitle(
colors,
tr::lng_filters_tag_color_subtitle());
const auto preview = Ui::CreateChild<Ui::RpWidget>(colors);
title->geometryValue(
) | rpl::start_with_next([=](const QRect &r) {
const auto titleWrap = colors->add(
object_ptr<Ui::FixedHeightWidget>(
colors,
rect::m::sum::v(padding)
+ st::defaultSubsectionTitle.style.font->height));
const auto title = Ui::CreateChild<Ui::FlatLabel>(
titleWrap,
tr::lng_filters_tag_color_subtitle(),
st::defaultSubsectionTitle);
title->move(rect::m::pos::tl(padding));
const auto preview = Ui::CreateChild<Ui::RpWidget>(titleWrap);
rpl::combine(
title->sizeValue(),
titleWrap->widthValue()
) | rpl::start_with_next([=](const QSize &s, int w) {
const auto h = st::normalFont->height;
const auto left = padding.left()
+ s.width()
+ st::settingsFilterTagPreviewSkip;
preview->setGeometry(
rect::right(colors) - st::settingsFilterTagPreviewSkip,
r.y() + (r.height() - h) / 2 + st::lineWidth,
colors->width(),
left,
padding.top() + (s.height() - h) / 2,
w - left,
h);
}, preview->lifetime());
@@ -608,12 +686,16 @@ void EditFilterBox(
};
const auto tag = preview->lifetime().make_state<TagState>();
tag->context.textContext = Core::TextContext({ .session = session });
const auto shift = st::settingsFilterTagPreviewSkip / 2;
preview->paintRequest() | rpl::start_with_next([=] {
auto p = QPainter(preview);
p.setOpacity(tag->alpha);
const auto size = tag->frame.size() / style::DevicePixelRatio();
const auto rect = QRect(
preview->width() - size.width() - st::boxRowPadding.right(),
preview->width()
- size.width()
- st::boxRowPadding.right()
- shift,
(st::normalFont->height - size.height()) / 2,
size.width(),
size.height());
@@ -623,7 +705,7 @@ void EditFilterBox(
p.setFont(st::normalFont);
p.setPen(st::windowSubTextFg);
p.drawText(
preview->rect() - st::boxRowPadding,
preview->rect().translated(-shift, 0) - st::boxRowPadding,
tr::lng_filters_tag_color_no(tr::now),
style::al_right);
}
@@ -741,7 +823,8 @@ void EditFilterBox(
const auto staticTitle = !title.entities.isEmpty()
&& state->staticTitle.current();
const auto rules = data->current();
if (title.empty()) {
if (Ui::ComputeFieldCharacterCount(name) > kMaxFilterTitleLength
|| title.empty()) {
name->showError();
box->scrollToY(0);
return {};

View File

@@ -31,10 +31,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_premium_subscription_option.h"
#include "data/data_user.h"
#include "data/stickers/data_custom_emoji.h"
#include "info/channel_statistics/boosts/giveaway/boost_badge.h" // InfiniteRadialAnimationWidget.
//#include "info/channel_statistics/boosts/giveaway/boost_badge.h" // InfiniteRadialAnimationWidget.
#include "info/channel_statistics/earn/earn_icons.h"
#include "info/profile/info_profile_badge.h"
#include "info/profile/info_profile_values.h"
//#include "info/profile/info_profile_badge.h"
//#include "info/profile/info_profile_values.h"
#include "lang/lang_keys.h"
#include "main/main_app_config.h"
#include "main/main_session.h"
@@ -47,6 +47,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/boxes/boost_box.h" // StartFireworks.
#include "ui/boxes/confirm_box.h"
#include "ui/controls/userpic_button.h"
#include "ui/controls/table_rows.h"
#include "ui/effects/credits_graphics.h"
#include "ui/effects/premium_graphics.h"
#include "ui/effects/premium_stars_colored.h"
@@ -81,79 +82,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace {
constexpr auto kTooltipDuration = 3 * crl::time(1000);
constexpr auto kPriceTooltipDuration = 6 * crl::time(1000);
constexpr auto kHorizontalBar = QChar(0x2015);
struct InfoTooltipData {
not_null<Ui::RpWidget*> parent;
Ui::ImportantTooltip *raw = nullptr;
};
void ShowInfoTooltip(
std::shared_ptr<InfoTooltipData> data,
not_null<QWidget*> target,
rpl::producer<TextWithEntities> text,
int duration) {
if (data->raw) {
data->raw->toggleAnimated(false);
}
const auto parent = data->parent;
const auto tooltip = Ui::CreateChild<Ui::ImportantTooltip>(
parent,
Ui::MakeNiceTooltipLabel(
parent,
std::move(text),
st::boxWideWidth,
st::defaultImportantTooltipLabel),
st::defaultImportantTooltip);
tooltip->toggleFast(false);
base::install_event_filter(tooltip, qApp, [=](not_null<QEvent*> e) {
if (e->type() == QEvent::MouseButtonPress) {
tooltip->toggleAnimated(false);
}
return base::EventFilterResult::Continue;
});
const auto update = [=] {
const auto geometry = Ui::MapFrom(parent, target, target->rect());
const auto countPosition = [=](QSize size) {
const auto left = geometry.x()
+ (geometry.width() - size.width()) / 2;
const auto right = parent->width()
- st::normalFont->spacew;
return QPoint(
std::max(std::min(left, right - size.width()), 0),
geometry.y() - size.height() - st::normalFont->descent);
};
tooltip->pointAt(geometry, RectPart::Top, countPosition);
};
parent->widthValue(
) | rpl::start_with_next(update, tooltip->lifetime());
update();
tooltip->toggleAnimated(true);
data->raw = tooltip;
tooltip->shownValue() | rpl::filter(
!rpl::mappers::_1
) | rpl::start_with_next([=] {
crl::on_main(tooltip, [=] {
if (tooltip->isHidden()) {
if (data->raw == tooltip) {
data->raw = nullptr;
}
delete tooltip;
}
});
}, tooltip->lifetime());
base::timer_once(
duration
) | rpl::start_with_next([=] {
tooltip->toggleAnimated(false);
}, tooltip->lifetime());
}
using Ui::AddTableRow;
using Ui::TableRowTooltipData;
[[nodiscard]] QString CreateMessageLink(
not_null<Main::Session*> session,
@@ -236,8 +168,10 @@ void ShowInfoTooltip(
return result;
}
[[nodiscard]] tr::phrase<lngtag_count> GiftDurationPhrase(int months) {
return (months < 12)
[[nodiscard]] tr::phrase<lngtag_count> GiftDurationPhrase(int days) {
return (days < 30)
? tr::lng_premium_gift_duration_days
: (days < 30 * 12)
? tr::lng_premium_gift_duration_months
: tr::lng_premium_gift_duration_years;
}
@@ -260,230 +194,6 @@ void ShowInfoTooltip(
: st::giveawayGiftCodeValueMultiline));
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakeValueWithSmallButton(
not_null<Ui::TableLayout*> table,
not_null<Ui::RpWidget*> value,
rpl::producer<QString> buttonText,
Fn<void(not_null<Ui::RpWidget*> button)> handler = nullptr,
int topSkip = 0) {
class MarginedWidget final : public Ui::RpWidget {
public:
using RpWidget::RpWidget;
QMargins getMargins() const override {
return { 0, 0, 0, st::giveawayGiftCodePeerMargin.bottom() };
}
};
auto result = object_ptr<MarginedWidget>(table);
const auto raw = result.data();
value->setParent(raw);
value->show();
const auto button = Ui::CreateChild<Ui::RoundButton>(
raw,
std::move(buttonText),
table->st().smallButton);
button->setTextTransform(Ui::RoundButton::TextTransform::NoTransform);
if (handler) {
button->setClickedCallback([button, handler = std::move(handler)] {
handler(button);
});
} else {
button->setAttribute(Qt::WA_TransparentForMouseEvents);
}
rpl::combine(
raw->widthValue(),
button->widthValue(),
value->naturalWidthValue()
) | rpl::start_with_next([=](int width, int buttonWidth, int) {
const auto buttonSkip = st::normalFont->spacew + buttonWidth;
value->resizeToNaturalWidth(width - buttonSkip);
value->moveToLeft(0, 0, width);
button->moveToLeft(
rect::right(value) + st::normalFont->spacew,
(topSkip
+ (table->st().defaultValue.style.font->ascent
- table->st().smallButton.style.font->ascent)),
width);
}, value->lifetime());
value->heightValue() | rpl::start_with_next([=](int height) {
const auto bottom = st::giveawayGiftCodePeerMargin.bottom();
raw->resize(raw->width(), height + bottom);
}, raw->lifetime());
return result;
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakePeerTableValue(
not_null<Ui::TableLayout*> table,
std::shared_ptr<ChatHelpers::Show> show,
PeerId id,
rpl::producer<QString> button = nullptr,
Fn<void()> handler = nullptr) {
auto result = object_ptr<Ui::AbstractButton>(table);
const auto raw = result.data();
const auto &st = st::giveawayGiftCodeUserpic;
raw->resize(raw->width(), st.photoSize);
const auto peer = show->session().data().peer(id);
const auto userpic = Ui::CreateChild<Ui::UserpicButton>(raw, peer, st);
const auto label = Ui::CreateChild<Ui::FlatLabel>(
raw,
(button && handler) ? peer->shortName() : peer->name(),
table->st().defaultValue);
raw->widthValue() | rpl::start_with_next([=](int width) {
const auto position = st::giveawayGiftCodeNamePosition;
label->resizeToNaturalWidth(width - position.x());
label->moveToLeft(position.x(), position.y(), width);
const auto top = (raw->height() - userpic->height()) / 2;
userpic->moveToLeft(0, top, width);
}, label->lifetime());
label->naturalWidthValue() | rpl::start_with_next([=](int width) {
raw->setNaturalWidth(st::giveawayGiftCodeNamePosition.x() + width);
}, label->lifetime());
userpic->setAttribute(Qt::WA_TransparentForMouseEvents);
label->setAttribute(Qt::WA_TransparentForMouseEvents);
label->setTextColorOverride(table->st().defaultValue.palette.linkFg->c);
raw->setClickedCallback([=] {
show->showBox(PrepareShortInfoBox(peer, show));
});
if (!button || !handler) {
return result;
}
return MakeValueWithSmallButton(
table,
result.release(),
std::move(button),
[=](not_null<Ui::RpWidget*> button) { handler(); },
st::giveawayGiftCodeNamePosition.y());
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakePeerWithStatusValue(
not_null<Ui::TableLayout*> table,
std::shared_ptr<ChatHelpers::Show> show,
PeerId id,
Fn<void(not_null<Ui::RpWidget*>, EmojiStatusId)> pushStatusId) {
auto result = object_ptr<Ui::RpWidget>(table);
const auto raw = result.data();
const auto peerLabel = MakePeerTableValue(table, show, id).release();
peerLabel->setParent(raw);
peerLabel->show();
raw->resize(raw->width(), peerLabel->height());
using namespace Info::Profile;
struct State {
rpl::variable<Badge::Content> content;
};
const auto peer = show->session().data().peer(id);
const auto state = peerLabel->lifetime().make_state<State>();
state->content = EmojiStatusIdValue(
peer
) | rpl::map([=](EmojiStatusId emojiStatusId) {
if (!peer->session().premium()
|| (!peer->isSelf() && !emojiStatusId)) {
return Badge::Content();
}
return Badge::Content{
.badge = BadgeType::Premium,
.emojiStatusId = emojiStatusId,
};
});
const auto badge = peerLabel->lifetime().make_state<Badge>(
raw,
st::infoPeerBadge,
&peer->session(),
state->content.value(),
nullptr,
[=] { return show->paused(ChatHelpers::PauseReason::Layer); });
state->content.value(
) | rpl::start_with_next([=](const Badge::Content &content) {
if (const auto widget = badge->widget()) {
pushStatusId(widget, content.emojiStatusId);
}
}, raw->lifetime());
rpl::combine(
raw->widthValue(),
rpl::single(rpl::empty) | rpl::then(badge->updated())
) | rpl::start_with_next([=](int width, const auto &) {
const auto badgeWidget = badge->widget();
const auto badgeSkip = badgeWidget
? (st::normalFont->spacew + badgeWidget->width())
: 0;
peerLabel->resizeToNaturalWidth(width - badgeSkip);
peerLabel->moveToLeft(0, 0, width);
if (badgeWidget) {
badgeWidget->moveToLeft(
peerLabel->width() + st::normalFont->spacew,
st::giftBoxByStarsStarTop,
width);
}
}, raw->lifetime());
return result;
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakeHiddenPeerTableValue(
not_null<Ui::TableLayout*> table) {
auto result = object_ptr<Ui::RpWidget>(table);
const auto raw = result.data();
const auto &st = st::giveawayGiftCodeUserpic;
raw->resize(raw->width(), st.photoSize);
const auto userpic = Ui::CreateChild<Ui::RpWidget>(raw);
const auto usize = st.photoSize;
userpic->resize(usize, usize);
userpic->paintRequest() | rpl::start_with_next([=] {
auto p = QPainter(userpic);
Ui::EmptyUserpic::PaintHiddenAuthor(p, 0, 0, usize, usize);
}, userpic->lifetime());
const auto label = Ui::CreateChild<Ui::FlatLabel>(
raw,
tr::lng_gift_from_hidden(),
table->st().defaultValue);
raw->widthValue(
) | rpl::start_with_next([=](int width) {
const auto position = st::giveawayGiftCodeNamePosition;
label->resizeToNaturalWidth(width - position.x());
label->moveToLeft(position.x(), position.y(), width);
const auto top = (raw->height() - userpic->height()) / 2;
userpic->moveToLeft(0, top, width);
}, label->lifetime());
userpic->setAttribute(Qt::WA_TransparentForMouseEvents);
label->setAttribute(Qt::WA_TransparentForMouseEvents);
label->setTextColorOverride(st::windowFg->c);
return result;
}
void AddTableRow(
not_null<Ui::TableLayout*> table,
rpl::producer<QString> label,
object_ptr<Ui::RpWidget> value,
style::margins valueMargins = st::giveawayGiftCodeValueMargin) {
table->addRow(
(label
? object_ptr<Ui::FlatLabel>(
table,
std::move(label),
table->st().defaultLabel)
: object_ptr<Ui::FlatLabel>(nullptr)),
std::move(value),
st::giveawayGiftCodeLabelMargin,
valueMargins);
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakePriceWithChangePercentValue(
not_null<Ui::TableLayout*> table,
const std::shared_ptr<Data::UniqueGiftValue> &value) {
@@ -509,35 +219,13 @@ void AddTableRow(
return MakeValueWithSmallButton(table, label, std::move(text));
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakePriceValueWithTooltip(
not_null<Ui::TableLayout*> table,
std::shared_ptr<InfoTooltipData> data,
TextWithEntities price,
TextWithEntities tooltip) {
const auto label = Ui::CreateChild<Ui::FlatLabel>(
table,
rpl::single(price),
table->st().defaultValue);
label->setAttribute(Qt::WA_TransparentForMouseEvents);
const auto handler = [=](not_null<Ui::RpWidget*> button) {
ShowInfoTooltip(
data,
button,
rpl::single(tooltip),
kPriceTooltipDuration);
};
auto text = rpl::single(u"?"_q);
return MakeValueWithSmallButton(table, label, std::move(text), handler);
}
[[nodiscard]] object_ptr<Ui::RpWidget> MakeMinimumPriceValue(
not_null<Ui::TableLayout*> table,
std::shared_ptr<InfoTooltipData> tooltip,
std::shared_ptr<TableRowTooltipData> tooltip,
const std::shared_ptr<Data::UniqueGift> &unique) {
const auto &value = unique->value;
const auto text = FormatValuePrice(value->minimumPrice, value->currency);
return MakePriceValueWithTooltip(
return Ui::MakeTableValueWithTooltip(
table,
std::move(tooltip),
text,
@@ -552,11 +240,11 @@ void AddTableRow(
[[nodiscard]] object_ptr<Ui::RpWidget> MakeAveragePriceValue(
not_null<Ui::TableLayout*> table,
std::shared_ptr<InfoTooltipData> tooltip,
std::shared_ptr<TableRowTooltipData> tooltip,
const std::shared_ptr<Data::UniqueGift> &unique) {
const auto &value = unique->value;
const auto text = FormatValuePrice(value->averagePrice, value->currency);
return MakePriceValueWithTooltip(
return Ui::MakeTableValueWithTooltip(
table,
std::move(tooltip),
text,
@@ -592,13 +280,12 @@ void AddUniqueGiftPropertyRows(
not_null<Ui::RpWidget*> container,
not_null<Ui::TableLayout*> table,
not_null<Data::UniqueGift*> unique) {
const auto tooltip = std::make_shared<InfoTooltipData>(InfoTooltipData{
.parent = container,
});
const auto tooltip = std::make_shared<TableRowTooltipData>(
TableRowTooltipData{ .parent = container });
const auto showTooltip = [=](
not_null<Ui::RpWidget*> widget,
rpl::producer<TextWithEntities> text) {
ShowInfoTooltip(tooltip, widget, std::move(text), kTooltipDuration);
ShowTableRowTooltip(tooltip, widget, std::move(text), kTooltipDuration);
};
const auto showRarity = [=](
not_null<Ui::RpWidget*> widget,
@@ -629,8 +316,17 @@ void AddUniqueGiftPropertyRows(
const Data::CreditsHistoryEntry &entry,
Fn<void()> convertToStars) {
auto helper = Ui::Text::CustomEmojiHelper();
const auto addUpgradeToValue = !entry.credits.ton()
&& !entry.giftUpgradeGifted
&& !entry.giftUpgradeSeparate
&& entry.starsUpgradedBySender;
const auto amount = addUpgradeToValue
? CreditsAmount(
entry.credits.whole() + entry.starsUpgradedBySender,
entry.credits.nano())
: entry.credits;
const auto price = helper.paletteDependent(Ui::Earn::IconCreditsEmoji(
)).append(' ').append(Lang::FormatCreditsAmountDecimal(entry.credits));
)).append(' ').append(Lang::FormatCreditsAmountDecimal(amount));
auto label = object_ptr<Ui::FlatLabel>(
table,
rpl::single(price),
@@ -712,37 +408,6 @@ void AddUniqueGiftPropertyRows(
handler);
}
not_null<Ui::FlatLabel*> AddTableRow(
not_null<Ui::TableLayout*> table,
rpl::producer<QString> label,
rpl::producer<TextWithEntities> value,
const Ui::Text::MarkedContext &context = {}) {
auto widget = object_ptr<Ui::FlatLabel>(
table,
std::move(value),
table->st().defaultValue,
st::defaultPopupMenu,
context);
const auto result = widget.data();
AddTableRow(table, std::move(label), std::move(widget));
return result;
}
void AddTableRow(
not_null<Ui::TableLayout*> table,
rpl::producer<QString> label,
std::shared_ptr<ChatHelpers::Show> show,
PeerId id) {
if (!id) {
return;
}
AddTableRow(
table,
std::move(label),
MakePeerTableValue(table, show, id),
st::giveawayGiftCodePeerMargin);
}
void AddTable(
not_null<Ui::VerticalLayout*> container,
std::shared_ptr<ChatHelpers::Show> show,
@@ -778,7 +443,7 @@ void AddTable(
tr::lng_gift_link_label_gift(),
tr::lng_gift_link_gift_premium(
lt_duration,
GiftDurationValue(current.months) | Ui::Text::ToWithEntities(),
GiftDurationValue(current.days) | Ui::Text::ToWithEntities(),
Ui::Text::WithEntities));
if (!skipReason && current.from) {
const auto reason = AddTableRow(
@@ -863,17 +528,22 @@ void ShowAlreadyPremiumToast(
} // namespace
rpl::producer<QString> GiftDurationValue(int months) {
return GiftDurationPhrase(months)(
rpl::producer<QString> GiftDurationValue(int days) {
return GiftDurationPhrase(days)(
lt_count,
rpl::single(float64((months < 12) ? months : (months / 12))));
rpl::single(float64((days < 30)
? days
: (days < 30 * 12)
? (days / 30)
: (days / (30 * 12)))));
}
QString GiftDuration(int months) {
return GiftDurationPhrase(months)(
tr::now,
lt_count,
(months < 12) ? months : (months / 12));
QString GiftDuration(int days) {
return GiftDurationPhrase(days)(tr::now, lt_count, (days < 30)
? days
: (days < 30 * 12)
? (days / 30)
: (days / (30 * 12)));
}
void GiftCodeBox(
@@ -1121,9 +791,9 @@ void ResolveGiftCode(
code.to = toId;
const auto self = (fromId == selfId);
const auto peer = session->data().peer(self ? toId : fromId);
const auto months = code.months;
const auto days = code.days;
const auto parent = controller->parentController();
Settings::ShowGiftPremium(parent, peer, months, self);
Settings::ShowGiftPremium(parent, peer, days, self);
} else {
controller->uiShow()->showBox(Box(GiftCodeBox, controller, slug));
}
@@ -1242,7 +912,7 @@ void GiveawayInfoBox(
lt_channel,
Ui::Text::Bold(first),
lt_duration,
TextWithEntities{ GiftDuration(months) },
TextWithEntities{ GiftDuration(months * 30) },
Ui::Text::RichLangValue),
Ui::Text::RichLangValue));
const auto many = start
@@ -1550,13 +1220,12 @@ void AddStarGiftTable(
const auto giftToChannel = entry.giftChannelSavedId
&& peerIsChannel(PeerId(entry.bareEntryOwnerId));
const auto tooltip = std::make_shared<InfoTooltipData>(InfoTooltipData{
.parent = container,
});
const auto tooltip = std::make_shared<TableRowTooltipData>(
TableRowTooltipData{ .parent = container });
const auto showTooltip = [=](
not_null<Ui::RpWidget*> widget,
rpl::producer<TextWithEntities> text) {
ShowInfoTooltip(tooltip, widget, std::move(text), kTooltipDuration);
ShowTableRowTooltip(tooltip, widget, std::move(text), kTooltipDuration);
};
if (unique && entry.bareGiftResaleRecipientId) {
@@ -1668,6 +1337,15 @@ void AddStarGiftTable(
PeerId(entry.bareEntryOwnerId)),
st::giveawayGiftCodePeerMargin);
}
} else if (entry.auction && entry.bareGiftOwnerId) {
AddTableRow(
table,
tr::lng_credits_box_history_entry_peer(),
MakePeerTableValue(
table,
show,
PeerId(entry.bareGiftOwnerId)),
st::giveawayGiftCodePeerMargin);
} else if (peerId && !giftToSelf) {
const auto user = session->data().peer(peerId)->asUser();
const auto withSendButton = entry.in && user && !user->isBot();
@@ -1938,11 +1616,30 @@ void AddCreditsHistoryEntryTable(
: entry.giftUpgraded
? tr::lng_credits_box_history_entry_gift_from()
: tr::lng_credits_box_history_entry_peer();
const auto targetId = actorId ? actorId : peerId;
const auto isPeerDefault = !entry.starrefCommission
&& !entry.in
&& !entry.giftResale
&& !entry.giftUpgraded;
const auto user = isPeerDefault
? session->data().peer(targetId)->asUser()
: nullptr;
const auto withSendButton = user
&& !user->isInaccessible()
&& !user->isBot();
auto send = withSendButton ? tr::lng_gift_send_small() : nullptr;
auto handler = send
? Fn<void()>([=] {
if (const auto window = show->resolveWindow()) {
Ui::ShowStarGiftBox(window, user);
}
})
: nullptr;
AddTableRow(
table,
std::move(text),
show,
actorId ? actorId : peerId);
MakePeerTableValue(table, show, targetId, send, handler),
st::giveawayGiftCodePeerMargin);
}
if (const auto msgId = MsgId(peerId ? entry.bareMsgId : 0)) {
const auto peer = session->data().peer(peerId);
@@ -2102,6 +1799,19 @@ void AddCreditsHistoryEntryTable(
rpl::single(
Ui::Text::Link(entry.successLink, entry.successLink)));
}
if (entry.limitedCount > 0 && entry.limitedLeft >= 0) {
AddTableRow(
table,
tr::lng_gift_availability(),
tr::lng_gift_availability_left(
lt_count_decimal,
rpl::single(entry.limitedLeft) | tr::to_count(),
lt_amount,
rpl::single(TextWithEntities{
Lang::FormatCountDecimal(entry.limitedCount)
}),
Ui::Text::WithEntities));
}
}
void AddSubscriptionEntryTable(
@@ -2313,9 +2023,8 @@ void AddUniqueGiftValueTable(
MakePriceWithChangePercentValue(table, value));
}
const auto tooltip = std::make_shared<InfoTooltipData>(InfoTooltipData{
.parent = container,
});
const auto tooltip = std::make_shared<TableRowTooltipData>(
TableRowTooltipData{ .parent = container });
if (value->minimumPrice) {
AddTableRow(
table,

View File

@@ -44,8 +44,8 @@ namespace Window {
class SessionNavigation;
} // namespace Window
[[nodiscard]] rpl::producer<QString> GiftDurationValue(int months);
[[nodiscard]] QString GiftDuration(int months);
[[nodiscard]] rpl::producer<QString> GiftDurationValue(int days);
[[nodiscard]] QString GiftDuration(int days);
void GiftCodeBox(
not_null<Ui::GenericBox*> box,

View File

@@ -466,8 +466,7 @@ void CreateModerateMessagesBox(
inner->add(object_ptr<Ui::DividerLabel>(
inner,
std::move(label),
st::defaultBoxDividerLabelPadding,
RectPart::Top | RectPart::Bottom));
st::defaultBoxDividerLabelPadding));
using Flag = ChatRestriction;
using Flags = ChatRestrictions;

View File

@@ -983,10 +983,11 @@ void PeerListRow::setCheckedInternal(bool checked, anim::type animated) {
}
void PeerListRow::setCustomizedCheckSegments(
std::vector<Ui::OutlineSegment> segments) {
std::vector<Ui::OutlineSegment> segments,
bool liveBadge) {
Expects(_checkbox != nullptr);
_checkbox->setCustomizedSegments(std::move(segments));
_checkbox->setCustomizedSegments(std::move(segments), liveBadge);
}
void PeerListRow::finishCheckedAnimation() {

View File

@@ -223,7 +223,8 @@ public:
setCheckedInternal(checked, animated);
}
void setCustomizedCheckSegments(
std::vector<Ui::OutlineSegment> segments);
std::vector<Ui::OutlineSegment> segments,
bool liveBadge);
void setHidden(bool hidden) {
_hidden = hidden;
}

View File

@@ -132,27 +132,36 @@ QBrush PeerListStoriesGradient(const style::PeerList &st) {
}
std::vector<Ui::OutlineSegment> PeerListStoriesSegments(
int count,
int unread,
PeerListStoriesCounts counts,
const QBrush &unreadBrush) {
Expects(unread <= count);
Expects(count > 0);
Expects(counts.unread <= counts.count);
Expects(counts.count > 0);
auto result = std::vector<Ui::OutlineSegment>();
const auto add = [&](bool unread) {
result.push_back({
.brush = unread ? unreadBrush : st::dialogsUnreadBgMuted->b,
.brush = (counts.videoStream
? st::attentionButtonFg->b
: unread
? unreadBrush
: st::dialogsUnreadBgMuted->b),
.width = (unread
? st::dialogsStoriesFull.lineTwice / 2.
: st::dialogsStoriesFull.lineReadTwice / 2.),
});
};
result.reserve(count);
for (auto i = 0, till = count - unread; i != till; ++i) {
add(false);
}
for (auto i = 0; i != unread; ++i) {
if (counts.videoStream) {
add(true);
} else {
const auto count = counts.count;
const auto unread = counts.unread;
result.reserve(count);
for (auto i = 0, till = count - unread; i != till; ++i) {
add(false);
}
for (auto i = 0; i != unread; ++i) {
add(true);
}
}
return result;
}
@@ -521,18 +530,15 @@ void PeerListStories::updateColors() {
for (auto i = begin(_counts); i != end(_counts); ++i) {
if (const auto row = _delegate->peerListFindRow(i->first)) {
if (i->second.count >= 0 && i->second.unread >= 0) {
applyForRow(row, i->second.count, i->second.unread, true);
applyForRow(row, i->second, true);
}
}
}
}
void PeerListStories::updateFor(
uint64 id,
int count,
int unread) {
void PeerListStories::updateFor(uint64 id, Counts counts) {
if (const auto row = _delegate->peerListFindRow(id)) {
applyForRow(row, count, unread);
applyForRow(row, counts);
_delegate->peerListUpdateRow(row);
}
}
@@ -550,11 +556,14 @@ void PeerListStories::process(not_null<PeerListRow*> row) {
? 1
: 0;
const auto unread = source
? source->info().unreadCount
? int(source->info().unreadCount)
: user->hasUnreadStories()
? 1
: 0;
applyForRow(row, count, unread, true);
const auto videoStream = source
? bool(source->info().hasVideoStream)
: user->hasActiveVideoStream();
applyForRow(row, { count, unread, videoStream }, true);
}
bool PeerListStories::handleClick(not_null<PeerData*> peer) {
@@ -597,25 +606,28 @@ void PeerListStories::prepare(not_null<PeerListDelegate*> delegate) {
const auto info = source
? source->info()
: Data::StoriesSourceInfo();
updateFor(id.value, info.count, info.unreadCount);
updateFor(id.value, {
int(info.count),
int(info.unreadCount),
bool(info.hasVideoStream),
});
}, _lifetime);
}
void PeerListStories::applyForRow(
not_null<PeerListRow*> row,
int count,
int unread,
Counts counts,
bool force) {
auto &counts = _counts[row->id()];
if (!force && counts.count == count && counts.unread == unread) {
auto &existing = _counts[row->id()];
if (!force && existing == counts) {
return;
}
counts.count = count;
counts.unread = unread;
_delegate->peerListSetRowChecked(row, count > 0);
if (count > 0) {
existing = counts;
_delegate->peerListSetRowChecked(row, counts.count > 0);
if (counts.count > 0) {
row->setCustomizedCheckSegments(
PeerListStoriesSegments(count, unread, _unreadBrush));
PeerListStoriesSegments(counts, _unreadBrush),
counts.videoStream);
}
}

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