Compare commits

..

416 Commits

Author SHA1 Message Date
John Preston
887b6629f6 Version 2.3: Fix emoji fingerprint on Retina. 2020-08-15 00:02:26 +04:00
John Preston
b6a66bbf1b Version 2.3.
- Video Calls (alpha version).
2020-08-14 20:20:59 +04:00
John Preston
a0eb073728 Close call panel instead of hiding. 2020-08-14 19:59:24 +04:00
John Preston
34840766b2 Move fingerprint / signal bars to a separate widget. 2020-08-14 16:53:06 +04:00
John Preston
1aaf7df54a Add labels to call buttons. 2020-08-14 16:53:06 +04:00
John Preston
1b60829da8 Add top window controls shadow. 2020-08-14 16:53:06 +04:00
John Preston
fbe02dbb8d Add bottom shadow to the incoming video. 2020-08-14 16:53:06 +04:00
John Preston
cb18c9a9b3 Show remote audio muted tooltip. 2020-08-14 16:53:06 +04:00
John Preston
a106d80a41 Fix accept call button outer ripple. 2020-08-14 16:53:06 +04:00
John Preston
465c661c45 Show peer-s microphone mute state on userpic. 2020-08-14 16:53:06 +04:00
John Preston
8af40c22a4 Improve mute button styles. 2020-08-14 16:53:06 +04:00
John Preston
f1b6d1fdae Improve top controls design on Windows. 2020-08-14 16:53:06 +04:00
John Preston
476b9c44c1 Closed alpha version 2.2.0.2. 2020-08-13 15:42:23 +04:00
John Preston
377ff2f421 Use expanding incoming frame scale if aspect is good. 2020-08-13 15:37:00 +04:00
John Preston
cdc87086f3 Add some paddings. 2020-08-13 15:16:39 +04:00
John Preston
99f3173ae6 Use smaller emoji. 2020-08-13 14:39:55 +04:00
John Preston
7de5cabd79 Add window controls to call panel on Windows. 2020-08-13 14:32:11 +04:00
John Preston
925f6df06a Fix call panel behaviour on macOS. 2020-08-13 13:02:15 +04:00
John Preston
c93d3ae924 Toggle fullscreen by double click. 2020-08-12 20:58:24 +04:00
John Preston
537645c282 Hide window title for calls panel. 2020-08-12 20:58:05 +04:00
John Preston
38b9111bf5 Use Ui::Window for the Calls::Panel. 2020-08-12 17:35:31 +04:00
John Preston
79feb0c6d9 Show video icon in call bubble in history. 2020-08-12 12:47:19 +04:00
John Preston
97fe05c7ed Mirror outgoing video horizontally. 2020-08-12 12:47:07 +04:00
John Preston
e01bf8e1cd Closed alpha version 2.2.0.1. 2020-08-11 21:33:15 +04:00
John Preston
369ec46064 Allow building without WebRTC. 2020-08-11 21:33:15 +04:00
John Preston
13f2ceaf47 Update building docs. 2020-08-11 18:21:40 +04:00
John Preston
eda22b925f Fix build on Linux 64 bit. 2020-08-11 18:21:40 +04:00
John Preston
bd16708781 Update tgcalls library. 2020-08-11 18:21:40 +04:00
John Preston
38546c701a Round outgoing video preview. 2020-08-11 18:21:40 +04:00
John Preston
4971e281fa Improve design for all controls states. 2020-08-11 18:21:40 +04:00
John Preston
d4b8fa70a7 Extract Calls::Userpic and Calls::VideoBubble. 2020-08-11 18:21:40 +04:00
John Preston
95de762529 Support three-value VideoState. 2020-08-11 18:21:40 +04:00
John Preston
a89634b767 Start call panel redesign. 2020-08-11 18:21:40 +04:00
John Preston
4bf6550e24 Update API scheme to layer 117. 2020-08-11 18:21:40 +04:00
John Preston
83759adb5f Start video call from video call service message. 2020-08-11 18:21:40 +04:00
John Preston
6f90e57523 Support special video calls service messages. 2020-08-11 18:21:40 +04:00
John Preston
aba8f72c36 Fix camera start. 2020-08-11 18:21:40 +04:00
John Preston
35dfb9fab3 Show outgoing video stream. 2020-08-11 18:21:40 +04:00
John Preston
b692242012 Allow reference tgcalls implementation. 2020-08-11 18:21:40 +04:00
John Preston
c1f727bde9 Update tgcalls to use new protocol. 2020-08-11 18:21:40 +04:00
John Preston
f3808bdc24 Start using webrtc::VideoTrack. 2020-08-11 18:21:40 +04:00
John Preston
16177eae2b Simplify frame presentation. 2020-08-11 18:21:40 +04:00
John Preston
da3bbba497 Allow enable/disable video in a call. 2020-08-11 18:21:40 +04:00
John Preston
a4ee90e8c6 Remove webrtc test code usage on Windows. 2020-08-11 18:21:40 +04:00
John Preston
7fec49a752 Remove webrtc test code usage on macOS. 2020-08-11 18:21:40 +04:00
John Preston
78c9c1e7f8 Update tgcalls library. 2020-08-11 18:21:40 +04:00
John Preston
662424319c Fix build on Windows. 2020-08-11 18:21:40 +04:00
John Preston
5c55f31972 Use test capture from webrtc on macOS. 2020-08-11 18:21:40 +04:00
John Preston
29d42a6936 Fix runtime errors in macOS. 2020-08-11 18:21:40 +04:00
John Preston
46550381a4 Fix build on macOS. 2020-08-11 18:21:40 +04:00
John Preston
6c272e38ad Update tgcalls to support codecs negotiation. 2020-08-11 18:21:40 +04:00
John Preston
0a019411ee Use typed signaling messages. 2020-08-11 18:21:40 +04:00
John Preston
815300bffc Fix video between tdesktop instances. 2020-08-11 18:21:40 +04:00
John Preston
12e0399cf4 Add tgcalls library. 2020-08-11 18:21:40 +04:00
John Preston
b703f4e555 Fix build on Linux. 2020-08-11 18:21:40 +04:00
John Preston
71040464c5 Request camera permissions on macOS. 2020-08-11 18:21:40 +04:00
John Preston
6d36176a8d Add test implementation of webrtc calls. 2020-08-11 18:21:40 +04:00
John Preston
438a560a79 Link tdesktop with external_webrtc. 2020-08-11 18:21:40 +04:00
John Preston
145ace2fa0 Use external_webrtc in libtgvoip. 2020-08-11 18:21:40 +04:00
John Preston
4ba7de8df1 Fix build on Windows. 2020-08-11 18:21:40 +04:00
23rd
b6c70572a9 Fixed Github CI macOS build. 2020-08-11 18:20:43 +04:00
23rd
b12256f1ee Added ability to schedule polls from section of scheduled messages.
Fixed #7433.
2020-08-11 18:13:40 +04:00
23rd
14cda49db2 Moved code for send context menu to namespace. 2020-08-11 18:13:40 +04:00
23rd
af9440db38 Slightly refactored InlineBots::Layout::Widget. 2020-08-11 18:13:40 +04:00
23rd
1eea07d88a Added ability to schedule and send silently stickers from autocomplete. 2020-08-11 18:13:40 +04:00
23rd
cf56658664 Slightly refactored FieldAutocomplete. 2020-08-11 18:13:40 +04:00
23rd
2ac425f350 Moved default send callbacks to separate functions. 2020-08-11 18:13:40 +04:00
23rd
edceed28d7 Moved code for send context menu to separate file. 2020-08-11 18:13:40 +04:00
23rd
1fee7d1a41 Added ability to schedule and send silently media from inline bots. 2020-08-11 18:13:40 +04:00
23rd
d1d153e886 Added Api::SendOptions passing from TabbedSelector for inline results. 2020-08-11 18:13:40 +04:00
23rd
5b95585725 Added other items to TabbedPanel's context menu. 2020-08-11 18:13:40 +04:00
23rd
43056107fd Added ability to pass SendMenuType to TabbedSelector. 2020-08-11 18:13:40 +04:00
23rd
7db9843543 Added initial context menu to TabbedPanel.
Added ability to schedule and send silently stickers and GIFs.
2020-08-11 18:13:40 +04:00
23rd
a95a324401 Separated send menu filling to another method. 2020-08-11 18:13:40 +04:00
23rd
759e802eba Added ability to pass Api::SendOptions from TabbedSelector. 2020-08-11 18:13:40 +04:00
23rd
b71062561a Added ability to drag'n'drop videos in SendFilesBox. 2020-08-11 18:13:09 +04:00
23rd
2576312cd4 Fixed autodownloading of dictionaries at logout. 2020-08-11 18:13:09 +04:00
23rd
972bbbce6a Fixed online status stuck when switching between accounts one more time.
The first attempt to fix this bug is here: 8171ed6c12.
It caused crash so it was reverted here: 2ef47222f4.
2020-08-11 12:28:41 +03:00
Ilya Fedin
65e2bbee3e Override cursor only if no buttons pressed 2020-08-11 12:58:07 +04:00
ilya-fedin
bbe2adc44f Fix AppImage overwrite by updater 2020-08-11 10:58:17 +04:00
Ilya Fedin
449fa0ef2c Don't focus parent window after opening file dialog 2020-08-11 10:57:11 +04:00
Ilya Fedin
dc9d0aae54 Add support for showing window menu on Wayland 2020-08-11 10:56:29 +04:00
Ilya Fedin
08b67e383e Add -D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF to docs & actions 2020-08-11 10:55:50 +04:00
Ilya Fedin
4e5e30a8dd Update fcitx5-qt 2020-08-11 10:55:50 +04:00
Ilya Fedin
cbeaee24c9 Update submodules & patches commit 2020-08-11 10:55:50 +04:00
Ilya Fedin
26bedd95d7 DESKTOP_APP_USE_PACKAGED_FONTS respects DESKTOP_APP_USE_PACKAGED_LAZY now 2020-08-11 10:55:50 +04:00
Ilya Fedin
252bdd2353 TDESKTOP_DISABLE_DBUS_INTEGRATION -> DESKTOP_APP_DISABLE_DBUS_INTEGRATION 2020-08-11 10:55:50 +04:00
John Preston
361b99b0c9 Use threaded decoding in ffmpeg streaming. 2020-07-28 20:14:45 +04:00
John Preston
e293a26029 Fix crash in incorrect passcode input. 2020-07-28 20:14:45 +04:00
Magnus Groß
4f3f1e18a2 Export chats with ISO 8601 dates
Fixes #6020
2020-07-27 09:29:25 +04:00
John Preston
188b98b4d8 Update cmake_helpers submodule. 2020-07-27 09:28:12 +04:00
John Preston
fe639078a6 Version 2.2: Fix default-night mode. 2020-07-26 16:55:04 +04:00
John Preston
e5434ea491 Version 2.2.
- Quickly switch between different Telegram accounts
if you use multiple phone numbers.
- Share and store unlimited files of any type, now up to 2'000 MB each.
- Edit your scheduled messages.
- Use Auto-Night Mode to make Telegram night mode match
the system Dark Mode settings.
- Also added an option to switch to system window frame
in Windows and Linux.
2020-07-26 13:48:13 +04:00
John Preston
ce4338fae4 Closed alpha version 2.1.22.1. 2020-07-25 11:36:02 +04:00
John Preston
5a1a8af222 Suggest enabling archive and mute in settings. 2020-07-25 11:25:51 +04:00
John Preston
152b49c65c Reset notify settings on unarchive. 2020-07-25 11:25:22 +04:00
John Preston
5c5414b680 Improve video userpics in chat history. 2020-07-25 11:25:22 +04:00
John Preston
f99960e1f6 Play video userpics in photo change messages. 2020-07-25 11:25:22 +04:00
John Preston
e363b254f6 Add Unarchive button to ContactStatus bar. 2020-07-25 11:25:19 +04:00
John Preston
3aea9cb3ca Add archive and mute settings editing. 2020-07-25 11:24:37 +04:00
John Preston
060fe6a928 Play video userpics in profiles and settings. 2020-07-25 11:24:11 +04:00
John Preston
8c45b5e0f8 Show video userpics in media viewer. 2020-07-25 11:24:11 +04:00
John Preston
0126578dbd Allow to load video components of photos. 2020-07-25 11:24:11 +04:00
John Preston
1a9c241b96 Update API scheme to layer 116. 2020-07-25 11:24:11 +04:00
John Preston
638d4d63c5 Update API scheme to layer 115. 2020-07-25 11:24:11 +04:00
John Preston
9370e87c54 Beta version 2.1.22.
- Fix crash in web page preview display.
2020-07-24 20:00:08 +04:00
John Preston
59c38df5cc Fix crash in web page preview display. 2020-07-24 19:54:47 +04:00
John Preston
5655ad25b0 Beta version 2.1.21.
- Edit your scheduled messages.
- See the unread messages indicator for your additional accounts
on the main menu button.
- Use Auto-Night Mode to make Telegram night mode match
the system Dark Mode settings.
- Enjoy dark native window frame for Telegram night mode on Windows.
2020-07-24 17:07:54 +04:00
John Preston
c86ced8a1e Use dark Windows title bar for night mode. 2020-07-24 16:15:58 +04:00
John Preston
511067981d Forbid auto-night mode with theme editor. 2020-07-24 10:01:37 +04:00
John Preston
9a186cd8ce Indicate other accounts unread messages. 2020-07-24 09:41:51 +04:00
Ilya Fedin
385aa3eef7 Remove redudant library order hacks 2020-07-24 09:40:20 +04:00
John Preston
e065d32d28 Don't try building profile photos list by updates. 2020-07-23 17:47:04 +04:00
John Preston
d4feb16378 Don't mark as read when scheduling messages. 2020-07-23 17:46:52 +04:00
Ilya Fedin
79e6369e27 Move libatomic link to common_options 2020-07-23 14:29:56 +04:00
Ilya Fedin
e4bd89d33e Remove redudant hacks for missed dependencies
27f6c8ce62 and 3194d883d2 added missed pthread dependencies that allows to remove Threads::Threads dependency
2020-07-23 14:29:56 +04:00
Ilya Fedin
2b89700f66 libwayland headers are needed only with Qt < 5.13 2020-07-23 14:29:56 +04:00
Ilya Fedin
ab95751a66 Make gdk backend limit more permissive 2020-07-23 14:29:56 +04:00
Ilya Fedin
841908fe31 Read decoration layout property from gtk 2020-07-23 14:29:56 +04:00
23rd
9e0b046213 Fixed handling of language switch for connection type in intro settings. 2020-07-23 13:00:55 +03:00
23rd
d46b9d024e Fixed handling of language switch for theme names in intro settings. 2020-07-23 13:00:55 +03:00
23rd
52cd9f8cbf Fixed handling of language switch for checkboxes in intro settings. 2020-07-23 13:00:55 +03:00
John Preston
25d69434ec Support auto-night mode on macOS. 2020-07-23 12:30:20 +04:00
John Preston
8c4e8212cd Add 'respect system dark mode' checkbox. 2020-07-22 17:18:17 +04:00
Ilya Fedin
c24da4c3df Don't generate 64px tray icon since badge counter generator doesn't support it 2020-07-22 10:33:12 +04:00
Ilya Fedin
47a237c924 Implement system-based dark mode for Windows and Linux 2020-07-22 10:32:56 +04:00
23rd
fc3a9d98c0 Fixed phrase translate of option for native window frame. 2020-07-22 10:31:32 +04:00
23rd
acce671eb0 Added ability to jump to bottom in HistoryWidget with Ctrl key.
Fixed #7868.
2020-07-22 10:26:00 +04:00
John Preston
67b6023b32 Fix build on Windows. 2020-07-22 10:25:55 +04:00
23rd
5a46bb1770 Fixed stuck of FieldHeader when invalid link was provided. 2020-07-20 21:44:07 +03:00
23rd
01fd8aded1 Slightly refactored DragArea. 2020-07-20 21:44:07 +03:00
23rd
e0750f7b87 Added drag'n'drop area to SendFilesBox for images. 2020-07-20 21:44:07 +03:00
23rd
4eaba39a7c Added drag'n'drop area to EditCaptionBox. 2020-07-20 21:44:07 +03:00
23rd
6ac9ef34eb Moved ActivateWindow from HistoryWidget to single place. 2020-07-20 21:44:07 +03:00
23rd
42a2286230 Added implementation of drag'n'drop in section of scheduled messages. 2020-07-20 21:44:07 +03:00
23rd
24d02d5461 Replaced creating of drag'n'drop area in HistoryWidget with new way. 2020-07-20 21:44:07 +03:00
23rd
9bf2940375 Simplified setup of drag'n'drop area. 2020-07-20 21:44:07 +03:00
23rd
d98212e8b3 Fixed incorrect text in context menu item to cancel scheduled uploading. 2020-07-20 21:44:07 +03:00
23rd
3fe9c36d90 Added Esc shortcut to cancel edit in section of scheduled messages. 2020-07-20 21:44:07 +03:00
23rd
22f16caa89 Fixed multiple attempts to send request to edit message. 2020-07-20 21:44:07 +03:00
23rd
46cce57f6b Removed display post views for sent forwarded scheduled messages. 2020-07-20 21:44:07 +03:00
23rd
456244cdec Fixed blurred display of scheduled photos that were downloaded too fast. 2020-07-20 21:44:07 +03:00
23rd
69b2030c71 Added updating of WebPage preview image on download finish. 2020-07-20 21:44:07 +03:00
23rd
11018d76f1 Added Up arrow shortcut to edit scheduled messages. 2020-07-20 21:44:07 +03:00
23rd
e862215efb Added handling of group rights changes to scheduled WebPage preview.
Slightly refactored code.
2020-07-20 21:44:06 +03:00
23rd
129de6d87f Added ability to scroll to scheduled text message on edit header click. 2020-07-20 21:43:33 +03:00
23rd
3c3ce24675 Added ability to remove WebPage preview from scheduled messages section. 2020-07-20 21:43:33 +03:00
23rd
d98ac33425 Improved WebPage preview support in scheduled text messages. 2020-07-20 21:43:33 +03:00
23rd
76842792b8 Added initial support for WebPage cancelling of scheduled text messages. 2020-07-19 19:56:18 +03:00
23rd
4b01043b27 Added handling of deleting currently edited scheduled text messages. 2020-07-19 19:56:18 +03:00
23rd
0a4f3f310c Added initial implementation of editing of scheduled text messages. 2020-07-19 19:56:18 +03:00
23rd
8320feea10 Added saving local text before editing scheduled message. 2020-07-19 19:56:18 +03:00
23rd
58281023bc Moved drawing preview image from HistoryWidget to WebPageData. 2020-07-19 19:56:18 +03:00
23rd
0b655450bb Added text preview in edit header of scheduled messages section. 2020-07-19 19:56:18 +03:00
23rd
61292557bf Fixed top scroll of compose controls on change of height. 2020-07-19 19:56:18 +03:00
23rd
12ad1190ff Added initial edit message header to scheduled section. 2020-07-19 19:56:18 +03:00
23rd
42e0994581 Moved generating preview text from HistoryWidget to WebPageData. 2020-07-19 19:56:18 +03:00
23rd
69bc595e31 Fixed text loss when editing media content is canceled. 2020-07-17 18:22:38 +03:00
23rd
5c097887ef Added ability to edit media in scheduled messages. 2020-07-17 18:22:38 +03:00
23rd
b02b690747 Moved HistoryWidget::saveEditMsgDone/Fail to lambdas. 2020-07-17 18:22:38 +03:00
23rd
c52da743fd Fixed WebPageId removing from api_editing. 2020-07-17 18:22:38 +03:00
23rd
63dff9ff91 Moved edit text messages from HistoryWidget to api_editing. 2020-07-17 18:22:38 +03:00
23rd
1c41808042 Set Api::EditMessage as generic function. 2020-07-17 18:22:38 +03:00
23rd
2ebf44c166 Removed unused code from apiwrap. 2020-07-17 18:22:38 +03:00
23rd
c46b96f252 Moved edit captions from EditCaptionBox to api_editing. 2020-07-17 18:22:38 +03:00
23rd
6c89f60679 Added edit messages with uploaded file to api_editing. 2020-07-17 18:22:38 +03:00
23rd
bb73687fc5 Added api_editing as separate file of API code for edit messages. 2020-07-17 18:22:38 +03:00
23rd
31fa2d9355 Added ScheduledMessages::lookupItem for FullMsgId. 2020-07-17 18:22:37 +03:00
23rd
c350e33dd8 Moved preparing MTPInputMedia to separate file. 2020-07-17 18:22:37 +03:00
23rd
7dd9adb934 Added handling of updates for edited media in scheduled messages. 2020-07-17 18:22:37 +03:00
John Preston
01dc3b9382 Beta version 2.1.20.
- Fix animated emoji.
- Fix crash in bot callback sending.
2020-07-17 09:23:42 +04:00
John Preston
c62b39e287 Fix possible crash in call top bar hiding. 2020-07-17 08:32:51 +04:00
John Preston
04f95e905e Fix crash in bot callback sending. 2020-07-17 08:13:53 +04:00
John Preston
9463bbd266 Fix animated stickers with wrong dimensions. 2020-07-17 08:13:45 +04:00
John Preston
f64f1ea62e Build xz from git on macOS. 2020-07-16 12:52:05 +04:00
John Preston
55bd469b2d Beta version 2.1.19.
- File uploading in an inactive account correctly finishes.
- Stickers panel works correctly after switching between accounts.
- Large .webp files are not shown as stickers.
- MacBook TouchBar support was fully rewritten with fixes for multiple accounts.
- Custom window title bar works in all Linux versions.
- Passcode doesn't auto-lock while you're active in other apps on Linux X11.
2020-07-16 11:49:10 +04:00
Ilya Fedin
ba50393e86 Update icon theme on the fly 2020-07-16 07:07:33 +04:00
23rd
df155f6cb5 Added rotate button for doc images to touchbar for media view overlay. 2020-07-15 22:04:00 +03:00
John Preston
8aafe6ba0e Show only box(512,512) .webp as stickers. 2020-07-15 22:31:42 +04:00
23rd
9cf15da2b1 Fixed display of rotate button in media view overlay for theme previews. 2020-07-15 22:10:06 +04:00
23rd
d9c566ac44 Added touchbar to media view overlay.
Fixed #7795.
2020-07-15 22:10:06 +04:00
23rd
780b5555d7 Added missed OSX checking to touchbar's files. 2020-07-15 22:10:06 +04:00
23rd
87aa8a249f Reimplemented track position item for audio touchbar. 2020-07-15 22:10:06 +04:00
23rd
8de6d0b63b Moved creation of touchbar buttons and sliders to separate file. 2020-07-15 22:10:06 +04:00
23rd
8dceec5a9f Fixed memory leak in obtaining doNotDisturb value on macOS. 2020-07-15 22:10:06 +04:00
23rd
da690d2741 Removed source code of old touchbar. 2020-07-15 22:10:06 +04:00
23rd
b95f5071a4 Added new touchbar to MainWindow. 2020-07-15 22:10:06 +04:00
23rd
7cc55e24c0 Added touchbar manager. 2020-07-15 22:10:06 +04:00
23rd
199c746216 Added main touchbar. 2020-07-15 22:10:06 +04:00
23rd
2b9cce2f23 Moved touchbar item for text formatting to separate file. 2020-07-15 22:10:06 +04:00
23rd
ed4b90717a Added new rpl events to Media::Player::Instance for stop/start.
Removed unused playerWidgetToggled event.
2020-07-15 22:10:06 +04:00
23rd
c50df6a6bc Moved touchbar scrubber item for stickers and emoji to separate file. 2020-07-15 22:10:06 +04:00
23rd
54149fb156 Moved panel of pinned dialogs for touchbar to separate file. 2020-07-15 22:10:06 +04:00
23rd
2f964d0415 Refactored and moved to separate file audio player in touchbar. 2020-07-15 22:10:06 +04:00
23rd
0970728273 Added common touchbar utils. 2020-07-15 22:10:06 +04:00
23rd
b02dd889e0 Removed old touchbar from MainWindow. 2020-07-15 22:10:06 +04:00
23rd
f68e4d9d59 Fixed sending of PlayGame user action. 2020-07-14 19:24:36 +03:00
23rd
9445ce4b09 Moved sending of bot's CallbackData and CallbackGame to separate file. 2020-07-14 19:03:41 +04:00
John Preston
515d8e78da Show 'Open With' for files without extension. 2020-07-14 19:03:36 +04:00
John Preston
f316d951ae Fix stickers list display after account switch. 2020-07-14 19:03:27 +04:00
John Preston
52e780b065 Fix a memory leak using a recursive lambda. 2020-07-14 19:03:14 +04:00
John Preston
900f7e1304 Try recursive lambda without make_shared. 2020-07-14 19:02:45 +04:00
John Preston
2f5cb33bf2 Fix finalizing media in non-active account. 2020-07-14 19:02:27 +04:00
Ilya Fedin
000a7ae28b Choose output folder based on executable name and extension instead of generator name 2020-07-13 09:47:18 +04:00
Neurotoxin001
00460506b2 Update building-msvc.md 2020-07-13 09:46:41 +04:00
Neurotoxin001
0852e717c3 Update building-msvc.md
Add some more requirements because without them users will get errors
2020-07-13 09:46:41 +04:00
Ilya Fedin
a7f9b260de Update patches commit and cmake submodule 2020-07-13 09:46:15 +04:00
Ilya Fedin
7d81159ccf Move QTextItemInt symbols to lib_ui 2020-07-13 09:46:15 +04:00
Sean Wei
556aa28df6 Remove unused variable
The following are commits related to removed variables.

apiwrap.cpp
e050e27: kSaveDraftBeforeQuitTimeout

app.cpp
113f665: serviceImageCacheSize

boxes/auto_download_box.cpp
a0c6104: checked(Source source, Type type)

boxes/background_preview_box.cpp
b6edf45: resultBytesPerPixel
fe21b5a: ms

boxes/calendar_box.cpp
ae97704: yearIndex, monthIndex
99bb093: ms

boxes/connection_box.cpp
f794d8d: ping

boxes/dictionaries_manager.cpp
8353867: session

boxes/peer_list_box.cpp
2ce2a14: grayedWidth

boxes/peers/add_participants_box.cpp
07e010d: chat, channel

boxes/self_destruction_box.cpp
fe9f02e: count

chat_helpers/emoji_suggestions_widget.cpp
a12bc60: is(QLatin1String string)

chat_helpers/field_autocomplete.cpp
8c7a35c: atwidth, hashwidth

chat_helpers/gifs_list_widget.cpp
ff65734: inlineItems
3d846fc: newSelected
d1687ab: kSaveDraftBeforeQuitTimeout

chat_helpers/stickers_dice_pack.cpp
c83e297: kZeroDiceDocumentId

chat_helpers/stickers_emoji_pack.cpp
d298953: length

chat_helpers/stickers_list_widget.cpp
eb75859: index, x

core/crash_reports.cpp
5940ae6: LaunchedDateTimeStr, LaunchedBinaryName

data/data_changes.cpp
3c4e959:clearRealtime

data/data_cloud_file.cpp
4b354b0: fromCloud, cacheTag

data/data_document_media.cpp
7db5359: kMaxVideoFrameArea

data/data_messages.cpp
794e315: wasCount

data/data_photo_media.cpp
e27d2bc: index

data/data_wall_paper.cpp
b6edf45: resultBytesPerPixel

data/data_types.cpp
aa8f62d: kWebDocumentCacheTag, kStorageCacheMask

history/admin_log/history_admin_log_inner.cpp
794e315: canDelete, canForward

history/history_location_manager.cpp
60f45ab: kCoordPrecision
9f90d3a: kMaxHttpRedirects

history/history_message.cpp
cedf8a6: kPinnedMessageTextLimit

history/history_widget.cpp
b305924: serviceColor
efa5fc4: hasForward
5e7aa4f: kTabbedSelectorToggleTooltipTimeoutMs, kTabbedSelectorToggleTooltipCount

history/view/history_view_context_menu.cpp
fe1a90b: isVideoLink, isVoiceLink, isAudioLink

settings.cpp
e2f54eb: defaultRecent

settings/settings_folders.cpp
e8bf5bb: kRefreshSuggestedTimeout

ui/filter_icon_panel.cpp
c4a0bc1: kDelayedHideTimeoutMs

window/themes/window_theme_preview.cpp
ef927c8: mutedCounter

-----

Modified variables

boxes/stickers_box.cpp
554eb3a: _rows[pressedIndex] -> set

data/data_notify_settings.cpp
734c410: muteForSeconds -> muteUntil

history/view/history_view_list_widget.cpp
07528be: _items[index] -> view
e5f3bed: fromState, tillState

history/history.cpp
cd3c1c6: kStatusShowClientsideRecordVideo -> kStatusShowClientsideRecordVoice

storage/download_manager_mtproto.cpp
ae8fb14: _queues[dcId] -> queue

storage/localstorage.cpp
357caf8: MTP::Environment::Production -> production
2020-07-13 09:33:55 +04:00
Ilya Fedin
c61cabb075 Make qt_make_filter_list a part of file_utilities_linux.cpp 2020-07-13 06:53:45 +04:00
Ilya Fedin
a6fe5c08ad Add a method to get flatpak ID 2020-07-13 06:53:45 +04:00
Ilya Fedin
256e976167 Hide ProcessNameByPID and RealExecutablePath into a private namespace 2020-07-13 06:53:45 +04:00
Ilya Fedin
e081ed4b4a Follow device pixel ratio in TrayIconFile 2020-07-13 06:53:45 +04:00
Ilya Fedin
4623804123 Don't build OpenSSL tests
To decrease actions run time and fails
2020-07-13 06:50:55 +04:00
Ilya Fedin
93e78f1565 Make export window and PiP window movable on Wayland with Qt < 5.15 2020-07-12 23:19:05 +04:00
Ilya Fedin
b587328fed Add support for custom titlebar on Linux with Qt < 5.15 2020-07-12 23:19:05 +04:00
Ilya Fedin
2fd5771c3d Add support for org.gnome.Mutter.IdleMonitor 2020-07-12 22:19:44 +04:00
Ilya Fedin
59b521d666 Implement xcb-based LastUserInputTime method 2020-07-12 22:19:44 +04:00
John Preston
c3f5de30be Beta version 2.1.18: Update changelog. 2020-07-08 10:08:45 +04:00
John Preston
2df5972f68 Raise file size limit to 2000 MB. 2020-07-08 10:07:01 +04:00
John Preston
c9ebe28fc1 Beta version 2.1.18.
- Fix a possible crash in Picture-in-Picture video player.
- Fix copying links from message texts.
- Allow using system window frame in Windows and Linux.
2020-07-08 09:41:20 +04:00
John Preston
9997af1e8b Fix copying links in some cases. 2020-07-08 09:33:53 +04:00
John Preston
b13b4a6b5c Fix system window frame toggle on Linux. 2020-07-07 21:34:25 +04:00
John Preston
f10b2194e6 Add option for a native window frame.
Fixes #2958.
2020-07-07 21:34:25 +04:00
John Preston
d1050e6041 Use window shadow from lib_ui. 2020-07-07 21:34:25 +04:00
John Preston
326574ab7e Fix possible crash in PiP drag. 2020-07-03 07:45:08 +04:00
John Preston
3822845f86 Fix build for OS X 10.10-10.11. 2020-07-02 23:02:59 +04:00
John Preston
f887bf3b6a Beta version 2.1.17.
- Fix messages editing in a non-active account.
- Fix large animated emoji messages editing.
- Fix high definition GIF animations opening in media viewer.
- Multiple crash fixes.
2020-07-02 22:11:53 +04:00
John Preston
dfa4a9990d Show accounts in main menu when added. 2020-07-02 22:11:45 +04:00
John Preston
7f55fd2cad Use a safer way to load system libraries. 2020-07-02 21:01:25 +04:00
John Preston
822c0434e8 Fix editing animated emoji messages. 2020-07-02 14:44:12 +04:00
John Preston
76596f42c7 Open too large GIFs in fullscreen viewer. 2020-07-02 13:43:39 +04:00
John Preston
f2577265ee Refresh main message view for inactive accounts. 2020-07-02 13:35:07 +04:00
John Preston
895c65d518 Fix visual glitch on profile opening. 2020-07-02 12:15:21 +04:00
Ilya Fedin
d8cc7a9b50 Pass Qt::Edges to updateCursor and startResize 2020-07-02 11:33:58 +04:00
Sean Wei
212944d89c Fix format 2020-07-02 11:32:17 +04:00
Ilya Fedin
2b5df331bd Install Qt log handler 2020-07-02 11:31:51 +04:00
Ilya Fedin
7ebebc2bc3 Detect OpenAL effects at runtime 2020-07-02 11:30:13 +04:00
John Preston
120ce27894 Fix possible crash in global search requests. 2020-07-02 11:13:50 +04:00
John Preston
17312a1eec Fix possible crash in intro widget. 2020-07-02 10:42:09 +04:00
John Preston
f1b4a82015 Fix crash in password submit. 2020-07-02 10:25:12 +04:00
John Preston
a6c76382e3 Fix possible crash in top bar widget init. 2020-07-02 10:10:09 +04:00
John Preston
370ad0aa44 Fix critical memory leak on macOS. 2020-07-01 22:34:42 +04:00
John Preston
b1554782fb Add one more moderate hotkey. 2020-07-01 22:33:19 +04:00
John Preston
90c6ff3e41 Fix Settings layout. 2020-07-01 22:33:13 +04:00
John Preston
432ce4caa4 Fix crash in migration with corrupted settings. 2020-07-01 14:16:36 +04:00
John Preston
eb1845e33b Fix crash in session destruction.
Also use rpl::event_stream for downloaderTaskFinished.
2020-07-01 12:26:29 +04:00
John Preston
0981335ca7 Beta version 2.1.16.
- Crash fix.
2020-07-01 00:42:21 +04:00
John Preston
1a69627102 Fix crash in reading saved peers. 2020-07-01 00:41:21 +04:00
Nicholas Guriev
3c0694280f Fix -Wredundant-move 2020-07-01 00:17:05 +04:00
John Preston
e050055c1e Beta version 2.1.15.
- Receive notifications only from the active account
in Settings > Notifications.
- Fix saving chats list width between application relaunches.
- Multiple crash fixes.
2020-06-30 22:17:36 +04:00
Ilya Fedin
e7c598e533 Reset cursor on window leave 2020-06-30 22:14:15 +04:00
Ilya Fedin
dd76d54aeb Fix build with TDESKTOP_DISABLE_GTK_INTEGRATION 2020-06-30 22:13:36 +04:00
John Preston
1dc31c7f2f Allow turning off inactive accounts notifications. 2020-06-30 22:11:54 +04:00
John Preston
5cc7c2b6c6 Add account from settings three-dot menu. 2020-06-30 21:16:05 +04:00
John Preston
dd0e0a10cd Add Activate/Logout context menu in accounts list. 2020-06-30 21:15:35 +04:00
John Preston
9fb12b6093 Set correct username to crash annotations. 2020-06-30 20:41:25 +04:00
John Preston
5ea5d3c60d Fix empty web page preview removing. 2020-06-30 20:22:47 +04:00
John Preston
20ea3af2f0 Fix crash in edited and replied message destruction. 2020-06-30 20:01:17 +04:00
John Preston
41f2cc6d81 Fix crash in notifications clearing. 2020-06-30 19:33:22 +04:00
John Preston
d529c60081 Fix crash in MainMenu hiding on external logout. 2020-06-30 19:13:57 +04:00
John Preston
7d0eb3ba8e Fix crash in MainWidget setup with audio player. 2020-06-30 19:05:12 +04:00
John Preston
3c028590b1 Fix crash in StickersListWidget. 2020-06-30 19:04:52 +04:00
John Preston
47c8b852b8 Fix possible crash in Dialogs::Widget. 2020-06-30 18:34:38 +04:00
John Preston
c15019dee6 Fix crashes in MainWidget and ApiWrap. 2020-06-30 18:26:44 +04:00
John Preston
09aff23ac9 Fix crashes in HistoryWidget. 2020-06-30 18:14:05 +04:00
John Preston
b7707a8a89 Fix event loop tracking crash. 2020-06-30 17:41:58 +04:00
John Preston
10ced19841 Fix crash in redundant checkStartUrl call. 2020-06-30 17:23:21 +04:00
John Preston
2ef47222f4 Fix crash in update online on logout. 2020-06-30 17:17:07 +04:00
John Preston
a95b756111 Fix settings saving.
Regression was introduced in 5d6a494934.

Fixes #8168.
2020-06-30 13:49:22 +04:00
23rd
d2615dda63 Updated Github Actions Cache version. 2020-06-30 12:28:13 +03:00
John Preston
e6f3cd1d56 Refresh appconfig after login. 2020-06-30 13:01:59 +04:00
John Preston
5d32ba5867 Accept IPv4:port in proxy host input field. 2020-06-30 12:56:06 +04:00
John Preston
4b1e9e3b9d Fix proxies list box. 2020-06-30 12:25:06 +04:00
John Preston
06c9e55c26 Fix notification receiver name. 2020-06-30 12:03:42 +04:00
John Preston
613a2f358a Fix clearing session notifications. 2020-06-30 11:52:59 +04:00
John Preston
c3fa300b5c Create notifications manager after reading settings. 2020-06-30 11:44:32 +04:00
John Preston
0db6fc4ffb Toggle accounts by userpic in Main Menu. 2020-06-30 11:34:02 +04:00
John Preston
9211b4d421 Remove duplicate accounts toggle subscription. 2020-06-30 11:31:52 +04:00
John Preston
ab33af3f73 Save preloaded filters info. 2020-06-30 11:18:35 +04:00
John Preston
dfc1712043 Fix loading locally stored self data. 2020-06-30 11:16:47 +04:00
John Preston
87eaab15b5 Load filters before creating session on log in. 2020-06-30 11:02:44 +04:00
Ilya Fedin
90af3d295b Always fallback to gtk icon theme
To inherit icon theme even on WM-based environments
2020-06-30 10:23:07 +04:00
John Preston
107dea085c Fix build for OS X 10.10-10.11. 2020-06-30 00:05:27 +04:00
John Preston
a9eedf0024 Beta version 2.1.14: Fix nearest dc resolve. 2020-06-29 22:25:36 +04:00
John Preston
db435aa9b1 Fix language switch in not-authed window. 2020-06-29 22:25:35 +04:00
John Preston
711fcc2e11 Remove change language link for secondary account. 2020-06-29 22:25:35 +04:00
John Preston
90f7f482ee Take main DC and phone prefix from active account. 2020-06-29 22:14:24 +04:00
John Preston
eff340deaf Fix touchbar destruction with Window. 2020-06-29 22:12:40 +04:00
John Preston
a8d0b80baa Beta version 2.1.14.
- Support for multiple accounts.
2020-06-29 21:51:06 +04:00
John Preston
c777f51427 Fix new settings saving. 2020-06-29 21:49:58 +04:00
John Preston
1a07a388d0 Build window_title_qt only on Linux. 2020-06-29 21:37:56 +04:00
John Preston
cbad993bba Fix app start without data. 2020-06-29 21:37:56 +04:00
John Preston
40971d6da6 Fix quit-by-closing non-authed window. 2020-06-29 21:37:56 +04:00
John Preston
52eef22273 Fix build. 2020-06-29 21:37:55 +04:00
John Preston
44e81269a3 Fix assertion violation in event loop tracking. 2020-06-29 21:29:20 +04:00
Ilya Fedin
0ede4bba72 Unity doesn't support _NET_WM_MOVERESIZE 2020-06-29 19:17:06 +04:00
Ilya Fedin
5e8e654324 Add cross-platform TitleWidget implementation based on startSystemMove/startSystemResize 2020-06-29 17:04:05 +04:00
Ilya Fedin
916601a52c Don't request IsStatusNotifierHostRegistered when SNI become available
To avoid situations when StatusNotifierItem registers icon, but tdesktop assumes that there are still no SNI
2020-06-29 16:58:00 +04:00
Ilya Fedin
a726c6411b Don't use custom notificaions on Wayland even with TDESKTOP_DISABLE_DBUS_INTEGRATION 2020-06-29 16:53:50 +04:00
John Preston
a33c9479a5 Revert pausing in processQueuedPackets. 2020-06-29 16:44:48 +04:00
Ilya Fedin
73b0153a66 Use startSystemMove in export window 2020-06-29 16:44:02 +04:00
Ilya Fedin
bb8f9a1b7f Link to gtk3 without QLibrary if DESKTOP_APP_USE_PACKAGED is defined 2020-06-29 16:27:45 +04:00
Ilya Fedin
4922768086 Don't use QLibrary for glib 2020-06-29 16:27:45 +04:00
Ilya Fedin
806f2e0b50 Check for all needed gtk functions for gtk clipboard 2020-06-29 16:27:45 +04:00
Ilya Fedin
d319c85c57 Don't load another gtk version if gtk_init_check was called 2020-06-29 16:27:45 +04:00
Magnus Groß
f697abe9a1 Do not open non-images as image
QImageReader might report PDF as a viable image type, if Qt is
dynamically linked and QtWebEngine is installed.

Fixed by additionally checking the mime type.

Fixes #8102
2020-06-29 16:22:15 +04:00
RadRussianRus
ae31bdcd1b Fix patches revision 2020-06-29 16:20:01 +04:00
Ilya Fedin
aaf71b34b5 Find alsa and pulse for libtgvoip 2020-06-29 16:18:47 +04:00
John Preston
5f9dae1b72 Run main menu hide animation on account switch. 2020-06-29 16:11:38 +04:00
John Preston
1757dd856b Fix 125% scale active account check. 2020-06-29 15:07:42 +04:00
John Preston
5689154ec5 Clear MessageUpdate changes on item destruction. 2020-06-29 13:23:51 +04:00
John Preston
57249c6ea0 Fix a case of huge memory consumption in streaming. 2020-06-29 12:42:56 +04:00
John Preston
1bd0b03e8e Return Saved Messages button to the main menu. 2020-06-29 09:55:19 +04:00
23rd
0227b5f2fa Removed Notify::inlineKeyboardMoved as completely unused code. 2020-06-29 06:26:09 +04:00
23rd
b629e0c43a Replaced Notify::replyMarkupUpdated with Data::MessageUpdate. 2020-06-29 06:26:02 +04:00
23rd
6507007086 Added fade animation for total unread count badge in main menu. 2020-06-29 06:25:36 +04:00
John Preston
a389a1e468 Fix couple of crashes in main window. 2020-06-29 06:25:20 +04:00
John Preston
4e57ce8dbb Fix crash in filters update. 2020-06-26 21:50:36 +04:00
John Preston
b6ac4a0233 Closed alpha version 2.1.13.1: Multiaccount. 2020-06-26 17:09:39 +04:00
23rd
f8dca0ae88 Fixed couple of issues with passcode lock support in touchbar. 2020-06-26 15:57:09 +03:00
23rd
ef6fab7f2a Improved unread badges in touchbar. 2020-06-26 15:05:08 +03:00
23rd
c8c7497d75 Removed from touchbar unused code of old panel of pinned dialogs. 2020-06-26 15:05:08 +03:00
23rd
4f062788d2 Wrapped Pins in touchbar to shared_ptr. 2020-06-26 15:05:08 +03:00
23rd
25ab88d87a Added animated online dots to panel of pinned dialogs in touchbar. 2020-06-26 15:05:08 +03:00
23rd
e5732cba97 Added ability to reorder pins in new panel in touchbar. 2020-06-26 15:05:08 +03:00
23rd
0e794d53cd Reimplemented panel of pinned dialogs for touchbar. 2020-06-26 15:05:08 +03:00
23rd
68badc6682 Slightly optimized drawing stickers in touchbar. 2020-06-26 15:05:08 +03:00
23rd
27c799ce3d Fixed size ratios of stickers in touchbar. 2020-06-26 15:05:08 +03:00
John Preston
044c281cf7 Fix closing float player over Intro. 2020-06-26 16:01:37 +04:00
John Preston
3f0078cfbf Fix crash in float player over Intro. 2020-06-26 15:48:38 +04:00
John Preston
6068dc418d More auto-switching between accounts. 2020-06-26 15:48:28 +04:00
John Preston
6960e4808a Don't change dc after qr request / phone submit. 2020-06-26 15:28:06 +04:00
John Preston
793e8c102e Fix adjustable colors in default theme. 2020-06-26 14:37:07 +04:00
John Preston
31c745cb07 Destroy non-authed account on deactivate. 2020-06-26 14:36:52 +04:00
John Preston
c8efb77520 Fix local storage clearing on logout. 2020-06-26 14:36:22 +04:00
John Preston
76593b0f3d Fix migrating background image. 2020-06-26 13:23:10 +04:00
John Preston
9703f7460a Fix build on Linux. 2020-06-26 12:27:54 +04:00
John Preston
325840703e Fix launching with a passcode on macOS. 2020-06-26 11:51:05 +04:00
John Preston
70fdc4eb39 Improve quit prevent management. 2020-06-26 11:22:53 +04:00
John Preston
79a361ba43 Move call management to Core::App. 2020-06-25 21:57:36 +04:00
John Preston
8c4d3a86e7 Fix notifications on macOS. 2020-06-25 19:13:02 +04:00
John Preston
2b5d3b022d Fix player closing on logout. 2020-06-25 19:01:10 +04:00
John Preston
bf7aae5fc6 Allow float video player across accounts. 2020-06-25 18:17:37 +04:00
23rd
8171ed6c12 Fixed online status stuck when switching between accounts. 2020-06-25 16:06:02 +03:00
John Preston
5d6a494934 Move some more settings to Core::App. 2020-06-25 16:25:53 +04:00
John Preston
90a9cb4f8d Fix playing music from a different account. 2020-06-25 15:12:50 +04:00
John Preston
c60b9cfa4d Allow PiP from another account. 2020-06-25 14:28:02 +04:00
John Preston
8fec04ba7a Track session better in media viewer. 2020-06-25 13:42:30 +04:00
John Preston
c19c0afe60 Fix export bar in accounts toggle. 2020-06-25 13:02:02 +04:00
John Preston
8ad1e8aed9 Fix saving of main menu accounts state. 2020-06-25 13:01:17 +04:00
John Preston
65050bf9dd Move export management to Core::App. 2020-06-25 11:14:05 +04:00
John Preston
28cafb129e Load local stickers / gifs in Session(). 2020-06-24 16:52:06 +04:00
John Preston
0bc2bfe630 Don't allow two same accounts being logged in. 2020-06-24 13:32:07 +04:00
John Preston
d8a2b391a3 Use Main::Session::uniqueId in notifications. 2020-06-24 13:05:56 +04:00
John Preston
e38d39656d Activate account before showing a peer. 2020-06-24 12:28:46 +04:00
John Preston
99bf61ac8c Pass correct context to setMarkedText. 2020-06-24 12:22:27 +04:00
John Preston
e7b8a52278 Move terms lock from Core::App to Session. 2020-06-24 11:56:16 +04:00
John Preston
30c82bb2e0 Remove some MainWindow::sessionController() calls. 2020-06-23 21:53:44 +04:00
John Preston
4d65df6ca2 Remove legacy temp download folder. 2020-06-23 21:53:44 +04:00
John Preston
4add6234b6 Fix reading background before style init. 2020-06-23 21:53:44 +04:00
John Preston
55ec4ebf86 Allow returning from new account setup. 2020-06-23 21:53:44 +04:00
John Preston
c92c15883d Improve badges in accounts list. 2020-06-23 21:53:44 +04:00
John Preston
7b0a32b607 Add unread unmuted counter to main menu cover. 2020-06-23 21:53:44 +04:00
John Preston
34ef54e40b Display check on the active account. 2020-06-23 21:53:43 +04:00
John Preston
51c2bc7349 Create only one EmojiImageLoader to fix a crash. 2020-06-23 21:53:43 +04:00
23rd
2e7a89d9c4 Added support of switching accounts to touchbar. 2020-06-23 21:53:43 +04:00
John Preston
1248cef86b Add an arrow to the expand accounts button. 2020-06-23 21:53:43 +04:00
23rd
0696a2d5c0 Replaced mapping to rpl::empty_value with rpl::to_empty. 2020-06-23 21:53:43 +04:00
23rd
e318a7d65f Simplified ranges::find_if with ranges::any_of and ranges::none_of. 2020-06-23 21:53:43 +04:00
John Preston
5f238a71f9 Allow switching accounts from the main menu. 2020-06-23 21:53:43 +04:00
John Preston
f129b6b90d Fix invalid cache settings being read. 2020-06-23 21:53:43 +04:00
John Preston
bc3719038f Fix crash in session destruction. 2020-06-23 21:53:43 +04:00
John Preston
1705a1aa4a Fix filters in non-active accounts. 2020-06-23 21:53:43 +04:00
John Preston
a45d088ee4 Fix create group box. 2020-06-23 21:53:43 +04:00
John Preston
28570b45e3 Fix working with settings before Domain::started. 2020-06-23 21:53:43 +04:00
John Preston
4a8d297df3 Use username in notifications if available. 2020-06-23 21:53:43 +04:00
John Preston
3bb352e0e5 Fix build and working on macOS. 2020-06-23 21:53:42 +04:00
23rd
b49a8e6dc1 Fixed crash on pinning dialog from context menu.
Regression was introduced in 3a147305b7.
2020-06-23 21:53:42 +04:00
John Preston
0824d2da20 Reset some settings on full logout. 2020-06-23 21:53:42 +04:00
John Preston
2635ca33f8 Move background to global settings. 2020-06-23 21:53:42 +04:00
John Preston
5433c16244 Add target account name to notifications. 2020-06-23 21:53:42 +04:00
John Preston
997913be25 One Window::Notifications system for all sessions. 2020-06-23 21:53:42 +04:00
John Preston
83538675ce Move a lot of settings to Core::Settings. 2020-06-23 21:53:42 +04:00
John Preston
4d6cc58f0d Move session settings to main_session_settings. 2020-06-23 21:53:42 +04:00
John Preston
3a5ede534e Count all accounts in Core::App().unreadBadge. 2020-06-23 21:53:41 +04:00
John Preston
357caf8007 Keep separate MTP::Config's for separate accounts. 2020-06-23 21:53:41 +04:00
John Preston
63cdda2df7 Fix launching with autoupdates disabled. 2020-06-23 21:53:41 +04:00
23rd
3ef45f5431 Fixed starting with touchbar. 2020-06-23 21:53:41 +04:00
John Preston
c83659f0c7 Fix logouting from the passcode. 2020-06-23 21:53:41 +04:00
John Preston
ba103fdd40 Fix starting with a passcode. 2020-06-23 21:53:41 +04:00
John Preston
bc144377c0 Support logout of a secondary account. 2020-06-23 21:53:41 +04:00
John Preston
5e045ec02c Fix first main window appearance. 2020-06-23 21:53:41 +04:00
John Preston
ab5796c117 Several working accounts together. 2020-06-23 21:53:40 +04:00
John Preston
6fc5e22882 Allow several accounts in Core::App. 2020-06-23 21:53:40 +04:00
23rd
815e26eea5 Added missed handler for MTPupdates_GetState. 2020-06-23 21:53:40 +04:00
23rd
9faf15943a Fixed build for macOS. 2020-06-23 21:53:40 +04:00
John Preston
dddd355f6c Fix language and theme writing / reading. 2020-06-23 21:53:40 +04:00
John Preston
f450f81215 Remove non-UI calls to App::main. 2020-06-23 21:53:40 +04:00
John Preston
3c4e959468 Replace observer_peer with rpl interface. 2020-06-23 21:53:40 +04:00
John Preston
b0f9ad71dd Check some more App::main()s. 2020-06-23 21:53:40 +04:00
John Preston
0ad7dcaef9 Remove MTP::MainInstance() global access point. 2020-06-23 21:53:40 +04:00
John Preston
7f09da9e32 Use MTP::Sender in Intro. 2020-06-23 21:53:39 +04:00
John Preston
0b028b959b Move updates handling MainWidget -> Api::Updates. 2020-06-23 21:53:39 +04:00
John Preston
ee43027bea Remove some usages of App::main(). 2020-06-23 21:53:39 +04:00
John Preston
ea86433be5 Remove some activeAccount() calls. 2020-06-23 21:53:39 +04:00
John Preston
598fb67cdf Remove Session::Exists() global access point. 2020-06-23 21:53:39 +04:00
John Preston
5f8d22f1f2 Remove Auth() global access point. 2020-06-23 21:53:39 +04:00
John Preston
7892ba97e6 Fix clearing storage_account files on logout. 2020-06-23 21:53:39 +04:00
John Preston
ad4afe9293 Move session data localstorage -> storage_account. 2020-06-23 21:53:39 +04:00
23rd
739a3ebe97 Removed all Auth() calls from touchbar. 2020-06-23 21:53:39 +04:00
John Preston
03dec15e8e Pass Main::Session to click handler creators. 2020-06-23 21:53:38 +04:00
John Preston
fc174f742a Move stickers code to Data::Stickers class. 2020-06-23 21:53:38 +04:00
John Preston
27af83267e Move autolock checking to Core::Application. 2020-06-23 21:53:38 +04:00
John Preston
4b354b0928 Use Main::Session in download/upload. 2020-06-23 21:53:38 +04:00
John Preston
3878a1b212 Remove some more Auth() calls. 2020-06-23 21:53:38 +04:00
721 changed files with 38017 additions and 24128 deletions

View File

@@ -95,7 +95,7 @@ jobs:
libgtk2.0-dev libice-dev libsm-dev libicu-dev libdrm-dev dh-autoreconf \
autoconf automake build-essential libxml2-dev libass-dev libfreetype6-dev \
libgpac-dev libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev \
libvorbis-dev libxcb1-dev libxcb-image0-dev libxcb-shm0-dev \
libvorbis-dev libxcb1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-screensaver0-dev \
libxcb-xfixes0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libatspi2.0-dev \
libxcb-render-util0-dev libxcb-util0-dev libxcb-xkb-dev libxrender-dev \
libasound-dev libpulse-dev libxcb-sync0-dev libxcb-randr0-dev libegl1-mesa-dev \
@@ -157,7 +157,7 @@ jobs:
- name: Opus cache.
id: cache-opus
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/opus
key: ${{ runner.OS }}-opus-${{ env.CACHE_KEY }}
@@ -202,7 +202,7 @@ jobs:
- name: FFmpeg cache.
id: cache-ffmpeg
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/ffmpeg-cache
key: ${{ runner.OS }}-ffmpeg-${{ env.CACHE_KEY }}
@@ -356,7 +356,7 @@ jobs:
- name: OpenSSL cache.
id: cache-openssl
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/openssl-cache
key: ${{ runner.OS }}-${{ env.OPENSSL_VER }}-${{ env.CACHE_KEY }}
@@ -369,7 +369,7 @@ jobs:
git clone -b OpenSSL_${OPENSSL_VER}-stable --depth=1 \
$GIT/openssl/openssl $opensslDir
cd $opensslDir
./config --prefix="$OPENSSL_PREFIX"
./config --prefix="$OPENSSL_PREFIX" no-tests
make -j$(nproc)
sudo make DESTDIR="$LibrariesPath/openssl-cache" install_sw
cd ..
@@ -412,7 +412,7 @@ jobs:
- name: Qt 5.12.8 cache.
id: cache-qt
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/qt-cache
key: ${{ runner.OS }}-qt-${{ env.CACHE_KEY }}-${{ hashFiles('**/qt*_5_12_8/*') }}
@@ -423,8 +423,8 @@ jobs:
git clone -b v5.12.8 --depth=1 git://code.qt.io/qt/qt5.git qt_${QT}
cd qt_${QT}
perl init-repository --module-subset=qtbase,qtwayland,qtimageformats,qtsvg,qtx11extras
git submodule update qtbase qtwayland qtimageformats qtsvg qtx11extras
perl init-repository --module-subset=qtbase,qtwayland,qtimageformats,qtsvg
git submodule update qtbase qtwayland qtimageformats qtsvg
cd qtbase
find ../../patches/qtbase_${QT} -type f -print0 | sort -z | xargs -r0 git apply
cd ..
@@ -461,7 +461,7 @@ jobs:
- name: Breakpad cache.
id: cache-breakpad
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/breakpad-cache
key: ${{ runner.OS }}-breakpad-${{ env.CACHE_KEY }}
@@ -530,6 +530,7 @@ jobs:
-D CMAKE_CXX_FLAGS="-s" \
-D TDESKTOP_API_TEST=ON \
-D DESKTOP_APP_USE_PACKAGED=OFF \
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \
$DEFINE
cd ../out/Debug

View File

@@ -79,6 +79,7 @@ jobs:
- name: First set up.
run: |
sudo chown -R `whoami`:admin /usr/local/share
brew install automake fdk-aac lame libass libtool libvorbis libvpx \
ninja opus sdl shtool texi2html theora x264 xvid yasm pkg-config
@@ -133,7 +134,7 @@ jobs:
- name: OpenSSL cache.
id: cache-openssl
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/openssl_${{ env.OPENSSL_VER }}
key: ${{ runner.OS }}-${{ env.OPENSSL_VER }}-${{ env.CACHE_KEY }}
@@ -147,6 +148,7 @@ jobs:
git checkout OpenSSL_"$OPENSSL_VER"-stable
./Configure \
--prefix=$PREFIX \
no-tests \
darwin64-x86_64-cc \
-static \
$MIN_MAC
@@ -163,7 +165,7 @@ jobs:
- name: Opus cache.
id: cache-opus
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/opus
key: ${{ runner.OS }}-opus-${{ env.CACHE_KEY }}
@@ -185,7 +187,7 @@ jobs:
- name: Libiconv cache.
id: cache-libiconv
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/${{ env.LIBICONV_VER }}
key: ${{ runner.OS }}-${{ env.LIBICONV_VER }}-${{ env.CACHE_KEY }}
@@ -206,7 +208,7 @@ jobs:
- name: FFmpeg cache.
id: cache-ffmpeg
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/ffmpeg-cache
key: ${{ runner.OS }}-ffmpeg-${{ env.CACHE_KEY }}
@@ -362,7 +364,7 @@ jobs:
- name: Crashpad cache.
id: cache-crashpad
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/crashpad
key: ${{ runner.OS }}-crashpad-${{ env.CACHE_KEY }}-${{ hashFiles('**/crashpad.diff') }}-${{ hashFiles('**/mini_chromium.diff') }}
@@ -401,7 +403,7 @@ jobs:
- name: Qt 5.12.8 cache.
id: cache-qt
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/qt-cache
key: ${{ runner.OS }}-qt-${{ env.CACHE_KEY }}-${{ hashFiles('**/qtbase_5_12_8/*') }}
@@ -461,7 +463,11 @@ jobs:
echo ::set-env name=ARTIFACT_NAME::Telegram
fi
./configure.sh -D TDESKTOP_API_TEST=ON -D DESKTOP_APP_USE_PACKAGED=OFF $DEFINE
./configure.sh \
-D TDESKTOP_API_TEST=ON \
-D DESKTOP_APP_USE_PACKAGED=OFF \
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \
$DEFINE
cd ../out

View File

@@ -133,7 +133,7 @@ jobs:
- name: OpenSSL cache.
id: cache-openssl
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/openssl_${{ env.OPENSSL_VER }}
key: ${{ runner.OS }}-${{ env.CACHE_KEY }}-${{ env.OPENSSL_VER }}
@@ -146,7 +146,7 @@ jobs:
git clone %GIT%/openssl/openssl.git openssl_%OPENSSL_VER%
cd openssl_%OPENSSL_VER%
git checkout OpenSSL_%OPENSSL_VER%-stable
perl Configure no-shared debug-VC-WIN32
perl Configure no-shared no-tests debug-VC-WIN32
nmake
mkdir out32.dbg
move libcrypto.lib out32.dbg
@@ -177,7 +177,7 @@ jobs:
- name: OpenAL Soft cache.
id: cache-openal
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/openal-soft
key: ${{ runner.OS }}-openal-soft-${{ env.CACHE_KEY }}
@@ -201,7 +201,7 @@ jobs:
- name: Breakpad cache.
id: cache-breakpad
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/breakpad
key: ${{ runner.OS }}-breakpad-${{ env.CACHE_KEY }}-${{ hashFiles('**/breakpad.diff') }}
@@ -250,7 +250,7 @@ jobs:
- name: Opus cache.
id: cache-opus
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/opus
key: ${{ runner.OS }}-opus-${{ env.CACHE_KEY }}
@@ -269,7 +269,7 @@ jobs:
- name: FFmpeg cache.
id: cache-ffmpeg
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/ffmpeg
key: ${{ runner.OS }}-ffmpeg-${{ env.CACHE_KEY }}-2-${{ hashFiles('**/build_ffmpeg_win.sh') }}
@@ -291,7 +291,7 @@ jobs:
- name: Qt 5.12.8 cache.
id: cache-qt
uses: actions/cache@v1
uses: actions/cache@v2
with:
path: ${{ env.LibrariesPath }}/Qt-5.12.8
key: ${{ runner.OS }}-qt-${{ env.CACHE_KEY }}-${{ hashFiles('**/qtbase_5_12_8/*') }}
@@ -365,6 +365,7 @@ jobs:
call configure.bat ^
-D TDESKTOP_API_TEST=ON ^
-D DESKTOP_APP_USE_PACKAGED=OFF ^
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF ^
%TDESKTOP_BUILD_DEFINE% ^
-DCMAKE_SYSTEM_VERSION=%SDK%

6
.gitmodules vendored
View File

@@ -94,3 +94,9 @@
[submodule "Telegram/ThirdParty/fcitx5-qt"]
path = Telegram/ThirdParty/fcitx5-qt
url = https://github.com/fcitx/fcitx5-qt.git
[submodule "Telegram/lib_webrtc"]
path = Telegram/lib_webrtc
url = https://github.com/desktop-app/lib_webrtc.git
[submodule "Telegram/ThirdParty/tgcalls"]
path = Telegram/ThirdParty/tgcalls
url = https://github.com/TelegramMessenger/tgcalls.git

View File

@@ -18,6 +18,7 @@ endif()
add_subdirectory(lib_storage)
add_subdirectory(lib_lottie)
add_subdirectory(lib_qr)
add_subdirectory(lib_webrtc)
add_subdirectory(codegen)
include(CheckCXXSourceCompiles)
@@ -34,6 +35,7 @@ include(cmake/lib_ffmpeg.cmake)
include(cmake/lib_mtproto.cmake)
include(cmake/lib_scheme.cmake)
include(cmake/lib_tgvoip.cmake)
include(cmake/lib_tgcalls.cmake)
set(style_files
boxes/boxes.style
@@ -72,9 +74,7 @@ if (LINUX)
PRIVATE
desktop-app::external_materialdecoration
desktop-app::external_nimf_qt5
desktop-app::external_qt5ct
desktop-app::external_qt5ct_style
desktop-app::external_qt5ct_qtplugin
desktop-app::external_qt5ct_support
)
if (NOT DESKTOP_APP_DISABLE_DBUS_INTEGRATION)
@@ -103,9 +103,13 @@ endif()
target_link_libraries(Telegram
PRIVATE
tdesktop::lib_tgcalls_legacy
tdesktop::lib_tgcalls
tdesktop::lib_tgvoip
tdesktop::lib_mtproto
tdesktop::lib_scheme
tdesktop::lib_export
desktop-app::lib_webrtc
desktop-app::lib_base
desktop-app::lib_crl
desktop-app::lib_ui
@@ -122,29 +126,64 @@ PRIVATE
desktop-app::external_qr_code_generator
desktop-app::external_crash_reports
desktop-app::external_auto_updates
tdesktop::lib_tgvoip
desktop-app::external_openssl
desktop-app::external_openal
)
# Telegram uses long atomic types, so on some architectures libatomic is needed.
check_cxx_source_compiles("
#include <atomic>
std::atomic_int64_t foo;
int main() {return foo;}
" HAVE_LONG_ATOMIC_WITHOUT_LIB)
if (NOT HAVE_LONG_ATOMIC_WITHOUT_LIB)
target_link_libraries(Telegram PRIVATE atomic)
if (LINUX AND DESKTOP_APP_USE_PACKAGED AND Qt5WaylandClient_VERSION VERSION_LESS 5.13.0)
find_package(PkgConfig REQUIRED)
pkg_check_modules(WAYLAND_CLIENT REQUIRED wayland-client)
target_include_directories(Telegram
PRIVATE
${WAYLAND_CLIENT_INCLUDE_DIRS}
)
endif()
if (DESKTOP_APP_USE_PACKAGED)
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
if (LINUX)
if (DESKTOP_APP_USE_PACKAGED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(XCB_SCREENSAVER REQUIRED IMPORTED_TARGET xcb-screensaver)
pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb)
target_link_libraries(Telegram
PRIVATE
Threads::Threads
)
target_link_libraries(Telegram
PRIVATE
PkgConfig::XCB_SCREENSAVER
PkgConfig::XCB
)
else()
target_link_static_libraries(Telegram PRIVATE xcb-screensaver)
target_link_libraries(Telegram PRIVATE xcb)
endif()
endif()
if (LINUX AND NOT TDESKTOP_DISABLE_GTK_INTEGRATION)
find_package(PkgConfig REQUIRED)
target_compile_options(Telegram PRIVATE -Wno-register)
if (DESKTOP_APP_USE_PACKAGED AND NOT DESKTOP_APP_USE_PACKAGED_LAZY)
pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11)
pkg_check_modules(GOBJECT2 REQUIRED IMPORTED_TARGET gobject-2.0)
pkg_check_modules(GLIB2 REQUIRED IMPORTED_TARGET glib-2.0)
pkg_check_modules(GTK3 REQUIRED IMPORTED_TARGET gtk+-3.0)
target_link_libraries(Telegram
PRIVATE
PkgConfig::X11
PkgConfig::GOBJECT2
PkgConfig::GLIB2
PkgConfig::GTK3
)
else()
pkg_search_module(GTK REQUIRED gtk+-2.0 gtk+-3.0)
target_link_libraries(Telegram
PRIVATE
X11
gobject-2.0
glib-2.0
)
target_include_directories(Telegram PRIVATE ${GTK_INCLUDE_DIRS})
endif()
endif()
target_precompile_headers(Telegram PRIVATE ${src_loc}/stdafx.h)
@@ -152,12 +191,25 @@ nice_target_sources(Telegram ${src_loc}
PRIVATE
${style_files}
api/api_bot.cpp
api/api_bot.h
api/api_chat_filters.cpp
api/api_chat_filters.h
api/api_chat_invite.cpp
api/api_chat_invite.h
api/api_common.h
api/api_editing.cpp
api/api_editing.h
api/api_global_privacy.cpp
api/api_global_privacy.h
api/api_hash.cpp
api/api_hash.h
api/api_media.cpp
api/api_media.h
api/api_self_destruct.cpp
api/api_self_destruct.h
api/api_send_progress.cpp
api/api_send_progress.h
api/api_sending.cpp
api/api_sending.h
api/api_sensitive_content.cpp
@@ -166,6 +218,8 @@ PRIVATE
api/api_single_message_search.h
api/api_text_entities.cpp
api/api_text_entities.h
api/api_updates.cpp
api/api_updates.h
boxes/filters/edit_filter_box.cpp
boxes/filters/edit_filter_box.h
boxes/filters/edit_filter_chats_list.cpp
@@ -264,17 +318,20 @@ PRIVATE
calls/calls_box_controller.h
calls/calls_call.cpp
calls/calls_call.h
calls/calls_controller.cpp
calls/calls_controller.h
calls/calls_controller_tgvoip.h
calls/calls_emoji_fingerprint.cpp
calls/calls_emoji_fingerprint.h
calls/calls_instance.cpp
calls/calls_instance.h
calls/calls_panel.cpp
calls/calls_panel.h
calls/calls_signal_bars.cpp
calls/calls_signal_bars.h
calls/calls_top_bar.cpp
calls/calls_top_bar.h
calls/calls_userpic.cpp
calls/calls_userpic.h
calls/calls_video_bubble.cpp
calls/calls_video_bubble.h
chat_helpers/bot_keyboard.cpp
chat_helpers/bot_keyboard.h
chat_helpers/emoji_keywords.cpp
@@ -291,18 +348,20 @@ PRIVATE
chat_helpers/gifs_list_widget.h
chat_helpers/message_field.cpp
chat_helpers/message_field.h
chat_helpers/send_context_menu.cpp
chat_helpers/send_context_menu.h
chat_helpers/spellchecker_common.cpp
chat_helpers/spellchecker_common.h
chat_helpers/stickers.cpp
chat_helpers/stickers.h
chat_helpers/stickers_emoji_image_loader.cpp
chat_helpers/stickers_emoji_image_loader.h
chat_helpers/stickers_emoji_pack.cpp
chat_helpers/stickers_emoji_pack.h
chat_helpers/stickers_dice_pack.cpp
chat_helpers/stickers_dice_pack.h
chat_helpers/stickers_list_widget.cpp
chat_helpers/stickers_list_widget.h
chat_helpers/stickers_set.cpp
chat_helpers/stickers_set.h
chat_helpers/stickers_lottie.cpp
chat_helpers/stickers_lottie.h
chat_helpers/tabbed_panel.cpp
chat_helpers/tabbed_panel.h
chat_helpers/tabbed_section.cpp
@@ -344,6 +403,10 @@ PRIVATE
core/utils.cpp
core/utils.h
core/version.h
data/stickers/data_stickers_set.cpp
data/stickers/data_stickers_set.h
data/stickers/data_stickers.cpp
data/stickers/data_stickers.h
data/data_abstract_structure.cpp
data/data_abstract_structure.h
data/data_auto_download.cpp
@@ -352,6 +415,8 @@ PRIVATE
data/data_chat.h
data/data_chat_filters.cpp
data/data_chat_filters.h
data/data_changes.cpp
data/data_changes.h
data/data_channel.cpp
data/data_channel.h
data/data_channel_admins.cpp
@@ -448,6 +513,8 @@ PRIVATE
dialogs/dialogs_search_from_controllers.h
dialogs/dialogs_widget.cpp
dialogs/dialogs_widget.h
export/export_manager.cpp
export/export_manager.h
export/view/export_view_content.cpp
export/view/export_view_content.h
export/view/export_view_panel_controller.cpp
@@ -529,6 +596,8 @@ PRIVATE
history/view/history_view_service_message.h
history/view/history_view_top_bar_widget.cpp
history/view/history_view_top_bar_widget.h
history/view/history_view_webpage_preview.cpp
history/view/history_view_webpage_preview.h
history/history.cpp
history/history.h
history/history_drag_area.cpp
@@ -663,10 +732,12 @@ PRIVATE
main/main_account.h
main/main_app_config.cpp
main/main_app_config.h
main/main_domain.cpp
main/main_domain.h
main/main_session.cpp
main/main_session.h
main/main_settings.cpp
main/main_settings.h
main/main_session_settings.cpp
main/main_session_settings.h
media/audio/media_audio.cpp
media/audio/media_audio.h
media/audio/media_audio_capture.cpp
@@ -681,6 +752,8 @@ PRIVATE
media/audio/media_audio_track.h
media/audio/media_child_ffmpeg_loader.cpp
media/audio/media_child_ffmpeg_loader.h
media/audio/media_openal_functions.cpp
media/audio/media_openal_functions.h
media/clip/media_clip_check_streaming.cpp
media/clip/media_clip_check_streaming.h
media/clip/media_clip_ffmpeg.cpp
@@ -746,8 +819,6 @@ PRIVATE
mtproto/connection_tcp.cpp
mtproto/connection_tcp.h
mtproto/core_types.h
mtproto/dc_options.cpp
mtproto/dc_options.h
mtproto/dedicated_file_loader.cpp
mtproto/dedicated_file_loader.h
mtproto/facade.cpp
@@ -793,6 +864,8 @@ PRIVATE
platform/linux/linux_gdk_helper.h
platform/linux/linux_libs.cpp
platform/linux/linux_libs.h
platform/linux/linux_xlib_helper.cpp
platform/linux/linux_xlib_helper.h
platform/linux/file_utilities_linux.cpp
platform/linux/file_utilities_linux.h
platform/linux/launcher_linux.cpp
@@ -803,6 +876,7 @@ PRIVATE
platform/linux/notifications_manager_linux.h
platform/linux/specific_linux.cpp
platform/linux/specific_linux.h
platform/linux/window_title_linux.h
platform/mac/file_utilities_mac.mm
platform/mac/file_utilities_mac.h
platform/mac/launcher_mac.mm
@@ -817,8 +891,24 @@ PRIVATE
platform/mac/specific_mac_p.h
platform/mac/window_title_mac.mm
platform/mac/window_title_mac.h
platform/mac/mac_touchbar.h
platform/mac/mac_touchbar.mm
platform/mac/touchbar/items/mac_formatter_item.h
platform/mac/touchbar/items/mac_formatter_item.mm
platform/mac/touchbar/items/mac_pinned_chats_item.h
platform/mac/touchbar/items/mac_pinned_chats_item.mm
platform/mac/touchbar/items/mac_scrubber_item.h
platform/mac/touchbar/items/mac_scrubber_item.mm
platform/mac/touchbar/mac_touchbar_audio.h
platform/mac/touchbar/mac_touchbar_audio.mm
platform/mac/touchbar/mac_touchbar_common.h
platform/mac/touchbar/mac_touchbar_common.mm
platform/mac/touchbar/mac_touchbar_controls.h
platform/mac/touchbar/mac_touchbar_controls.mm
platform/mac/touchbar/mac_touchbar_main.h
platform/mac/touchbar/mac_touchbar_main.mm
platform/mac/touchbar/mac_touchbar_manager.h
platform/mac/touchbar/mac_touchbar_manager.mm
platform/mac/touchbar/mac_touchbar_media_view.h
platform/mac/touchbar/mac_touchbar_media_view.mm
platform/win/audio_win.cpp
platform/win/audio_win.h
platform/win/file_utilities_win.cpp
@@ -881,6 +971,10 @@ PRIVATE
settings/settings_privacy_controllers.h
settings/settings_privacy_security.cpp
settings/settings_privacy_security.h
storage/details/storage_file_utilities.cpp
storage/details/storage_file_utilities.h
storage/details/storage_settings_scheme.cpp
storage/details/storage_settings_scheme.h
storage/download_manager_mtproto.cpp
storage/download_manager_mtproto.h
storage/file_download.cpp
@@ -899,8 +993,14 @@ PRIVATE
storage/serialize_common.h
storage/serialize_document.cpp
storage/serialize_document.h
storage/serialize_peer.cpp
storage/serialize_peer.h
storage/storage_account.cpp
storage/storage_account.h
storage/storage_cloud_blob.cpp
storage/storage_cloud_blob.h
storage/storage_domain.cpp
storage/storage_domain.h
storage/storage_facade.cpp
storage/storage_facade.h
# storage/storage_feed_messages.cpp
@@ -981,6 +1081,7 @@ PRIVATE
window/window_connecting_widget.h
window/window_controller.cpp
window/window_controller.h
window/window_controls_layout.h
window/window_filters_menu.cpp
window/window_filters_menu.h
window/window_history_hider.cpp
@@ -999,6 +1100,8 @@ PRIVATE
window/window_session_controller.h
window/window_slide_animation.cpp
window/window_slide_animation.h
window/window_title_qt.cpp
window/window_title_qt.h
window/window_title.h
window/window_top_bar_wrap.h
window/themes/window_theme.cpp
@@ -1035,16 +1138,19 @@ PRIVATE
mainwidget.h
mainwindow.cpp
mainwindow.h
observer_peer.cpp
observer_peer.h
qt_static_plugins.cpp
settings.cpp
settings.h
)
if (DESKTOP_APP_USE_PACKAGED)
nice_target_sources(Telegram ${src_loc} PRIVATE qt_functions.cpp)
else()
if (NOT LINUX)
remove_target_sources(Telegram ${src_loc}
window/window_title_qt.cpp
window/window_title_qt.h
)
endif()
if (NOT DESKTOP_APP_USE_PACKAGED)
nice_target_sources(Telegram ${src_loc} PRIVATE platform/mac/mac_iconv_helper.c)
endif()
@@ -1130,7 +1236,6 @@ elseif (LINUX)
pkg_search_module(GTK REQUIRED gtk+-2.0 gtk+-3.0)
target_include_directories(Telegram PRIVATE ${GTK_INCLUDE_DIRS})
target_compile_options(Telegram PRIVATE -Wno-register)
if (DESKTOP_APP_USE_PACKAGED)
find_library(X11_LIBRARY X11)
@@ -1199,7 +1304,7 @@ PRIVATE
TDESKTOP_API_HASH=${TDESKTOP_API_HASH}
)
if (${CMAKE_GENERATOR} MATCHES "(Visual Studio|Xcode)")
if (APPLE OR NOT CMAKE_EXECUTABLE_SUFFIX STREQUAL "" OR NOT "${output_name}" STREQUAL "Telegram")
set(output_folder ${CMAKE_BINARY_DIR})
elseif (DESKTOP_APP_SPECIAL_TARGET STREQUAL "")
set(output_folder ${CMAKE_BINARY_DIR}/bin)

View File

@@ -13,6 +13,8 @@ pacman --noconfirm -S pkg-config
PKG_CONFIG_PATH="/mingw64/lib/pkgconfig:$PKG_CONFIG_PATH"
./configure --toolchain=msvc \
--extra-cflags="-DCONFIG_SAFE_BITSTREAM_READER=1" \
--extra-cxxflags="-DCONFIG_SAFE_BITSTREAM_READER=1" \
--extra-ldflags="-libpath:$FullExecPath/../opus/win32/VS2015/Win32/Release" \
--disable-programs \
--disable-doc \

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 B

After

Width:  |  Height:  |  Size: 460 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 736 B

After

Width:  |  Height:  |  Size: 970 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 412 B

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 800 B

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 945 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 744 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 B

After

Width:  |  Height:  |  Size: 128 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 B

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -15,6 +15,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_menu_update" = "Update";
"lng_menu_back" = "Back";
"lng_menu_night_mode" = "Night Mode";
"lng_menu_add_account" = "Add Account";
"lng_menu_activate" = "Activate";
"lng_disable_notifications_from_tray" = "Disable notifications";
"lng_enable_notifications_from_tray" = "Enable notifications";
@@ -290,6 +292,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_empty_bio" = "None";
"lng_settings_section_notify" = "Notifications";
"lng_settings_show_from" = "Show notifications from";
"lng_settings_notify_all" = "All accounts";
"lng_settings_notify_all_about" = "Turn this off if you want to receive notifications only from the account you are currently using.";
"lng_settings_notify_title" = "Notifications for chats";
"lng_settings_desktop_notify" = "Desktop notifications";
"lng_settings_show_name" = "Show sender's name";
@@ -333,6 +338,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_update_fail" = "Update check failed :(";
"lng_settings_workmode_tray" = "Show tray icon";
"lng_settings_workmode_window" = "Show taskbar icon";
"lng_settings_native_frame" = "Use system window frame";
"lng_settings_auto_start" = "Launch Telegram when system starts";
"lng_settings_start_min" = "Launch minimized";
"lng_settings_add_sendto" = "Place Telegram in \"Send to\" menu";
@@ -418,6 +424,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_passcode_title" = "Local passcode";
"lng_settings_password_title" = "Two-step verification";
"lng_settings_sessions_title" = "Active sessions";
"lng_settings_new_unknown" = "New chats from unknown users";
"lng_settings_auto_archive" = "Archive and Mute";
"lng_settings_auto_archive_about" = "Automatically archive and mute new chats, groups and channels from non-contacts.";
"lng_settings_destroy_title" = "Delete my account";
"lng_settings_network_proxy" = "Network and proxy";
"lng_settings_version_info" = "Version and updates";
@@ -428,6 +437,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_settings_sensitive_disable_filtering" = "Disable filtering";
"lng_settings_sensitive_about" = "Display sensitive media in public channels on all your Telegram devices.";
"lng_settings_auto_night_mode" = "Auto-Night mode";
"lng_settings_auto_night_enabled" = "Match the system settings";
"lng_settings_auto_night_warning" = "You have enabled auto-night mode. If you want to change the dark mode settings, you'll need to disable it first.";
"lng_settings_auto_night_disable" = "Disable";
"lng_suggest_hide_new_title" = "Hide new chats?";
"lng_suggest_hide_new_about" = "You are receiving lots of new chats from users who are not in your Contact List.\n\nDo you want to have such chats **automatically muted** and **archived**?";
"lng_suggest_hide_new_to_settings" = "Go to Settings";
"lng_settings_spellchecker" = "Spell checker";
"lng_settings_system_spellchecker" = "Use system spell checker";
"lng_settings_custom_spellchecker" = "Use spell checker";
@@ -1121,6 +1139,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_group_invite_members#one" = "{count} member, among them:";
"lng_group_invite_members#other" = "{count} members, among them:";
"lng_channel_invite_private" = "This channel is private.\nPlease join it to continue viewing its content.";
"lng_group_invite_create" = "Create an invite link";
"lng_group_invite_about" = "Telegram users will be able to join\nyour group by following this link.";
@@ -1275,6 +1294,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_new_contact_share_done" = "{user} can now see your phone number.";
"lng_new_contact_add_name" = "Add {user} to contacts";
"lng_new_contact_add_done" = "{user} is now in your contact list.";
"lng_new_contact_unarchive" = "Unarchive";
"lng_cant_send_to_not_contact" = "Sorry, you can only send messages to\nmutual contacts at the moment.\n{more_info}";
"lng_cant_invite_not_contact" = "Sorry, you can only add mutual contacts\nto groups at the moment.\n{more_info}";
"lng_cant_more_info" = "More info »";
@@ -1448,6 +1468,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_context_copy_text" = "Copy Text";
"lng_context_open_gif" = "Open GIF";
"lng_context_save_gif" = "Save GIF";
"lng_context_delete_gif" = "Delete GIF";
"lng_context_attached_stickers" = "Attached Stickers";
"lng_context_to_msg" = "Go To Message";
"lng_context_reply_msg" = "Reply";
@@ -1715,16 +1736,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"lng_call_box_status_group" = "({amount}) {status}";
"lng_call_outgoing" = "Outgoing call";
"lng_call_video_outgoing" = "Outgoing video call";
"lng_call_incoming" = "Incoming call";
"lng_call_video_incoming" = "Incoming video call";
"lng_call_missed" = "Missed call";
"lng_call_video_missed" = "Missed video call";
"lng_call_cancelled" = "Cancelled call";
"lng_call_video_cancelled" = "Cancelled video call";
"lng_call_declined" = "Declined call";
"lng_call_video_declined" = "Declined video call";
"lng_call_duration_info" = "{time}, {duration}";
"lng_call_type_and_duration" = "{type} ({duration})";
"lng_call_rate_label" = "Please rate the quality of your call";
"lng_call_rate_comment" = "Comment (optional)";
"lng_call_start_video" = "Start Video";
"lng_call_stop_video" = "Stop Video";
"lng_call_end_call" = "End Call";
"lng_call_mute_audio" = "Mute";
"lng_call_unmute_audio" = "Unmute";
"lng_call_accept" = "Accept";
"lng_call_decline" = "Decline";
"lng_call_redial" = "Redial";
"lng_call_cancel" = "Cancel";
"lng_call_microphone_off" = "{user}'s microphone is off";
"lng_no_mic_permission" = "Telegram needs access to your microphone so that you can make calls and record voice messages.";
"lng_player_message_today" = "Today at {time}";

View File

@@ -62,10 +62,9 @@ inputMediaUploadedPhoto#1e287d04 flags:# file:InputFile stickers:flags.0?Vector<
inputMediaPhoto#b3ba0635 flags:# id:InputPhoto ttl_seconds:flags.0?int = InputMedia;
inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
inputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia;
inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector<DocumentAttribute> stickers:flags.0?Vector<InputDocument> ttl_seconds:flags.1?int = InputMedia;
inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector<DocumentAttribute> stickers:flags.0?Vector<InputDocument> ttl_seconds:flags.1?int = InputMedia;
inputMediaDocument#23ab23d2 flags:# id:InputDocument ttl_seconds:flags.0?int = InputMedia;
inputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia;
inputMediaGifExternal#4843b0fd url:string q:string = InputMedia;
inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = InputMedia;
inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia;
inputMediaGame#d33f43f3 id:InputGame = InputMedia;
@@ -75,7 +74,7 @@ inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector<bytes> s
inputMediaDice#e66fbf7b emoticon:string = InputMedia;
inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
inputChatUploadedPhoto#927c55b4 file:InputFile = InputChatPhoto;
inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = InputChatPhoto;
inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto;
inputGeoPointEmpty#e4c123d6 = InputGeoPoint;
@@ -110,10 +109,10 @@ storage.fileMp4#b3cea0e4 = storage.FileType;
storage.fileWebp#1081464c = storage.FileType;
userEmpty#200250ba id:int = User;
user#938458c1 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector<RestrictionReason> bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User;
user#938458c1 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector<RestrictionReason> bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User;
userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
userProfilePhoto#ecd75d8c photo_id:long photo_small:FileLocation photo_big:FileLocation dc_id:int = UserProfilePhoto;
userProfilePhoto#69d3ab26 flags:# has_video:flags.0?true photo_id:long photo_small:FileLocation photo_big:FileLocation dc_id:int = UserProfilePhoto;
userStatusEmpty#9d05049 = UserStatus;
userStatusOnline#edb93949 expires:int = UserStatus;
@@ -129,7 +128,7 @@ channel#d31a961e flags:# creator:flags.0?true left:flags.2?true broadcast:flags.
channelForbidden#289da732 flags:# broadcast:flags.5?true megagroup:flags.8?true id:int access_hash:long title:string until_date:flags.16?int = Chat;
chatFull#1b7c9db3 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:int about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:flags.3?Vector<BotInfo> pinned_msg_id:flags.6?int folder_id:flags.11?int = ChatFull;
channelFull#f0e6672a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_view_stats:flags.12?true can_set_location:flags.16?true has_scheduled:flags.19?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int = ChatFull;
channelFull#f0e6672a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?int location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int = ChatFull;
chatParticipant#c8d7493e user_id:int inviter_id:int date:int = ChatParticipant;
chatParticipantCreator#da13538a user_id:int = ChatParticipant;
@@ -139,7 +138,7 @@ chatParticipantsForbidden#fc900c2b flags:# chat_id:int self_participant:flags.0?
chatParticipants#3f460fed chat_id:int participants:Vector<ChatParticipant> version:int = ChatParticipants;
chatPhotoEmpty#37c1011c = ChatPhoto;
chatPhoto#475cdbd5 photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto;
chatPhoto#d20b9f3c flags:# has_video:flags.0?true photo_small:FileLocation photo_big:FileLocation dc_id:int = ChatPhoto;
messageEmpty#83e5de54 id:int = Message;
message#452c0e65 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector<RestrictionReason> = Message;
@@ -187,7 +186,7 @@ dialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer t
dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;
photoEmpty#2331b22d id:long = Photo;
photo#d07504a5 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector<PhotoSize> dc_id:int = Photo;
photo#fb197a65 flags:# has_stickers:flags.0?true id:long access_hash:long file_reference:bytes date:int sizes:Vector<PhotoSize> video_sizes:flags.1?Vector<VideoSize> dc_id:int = Photo;
photoSizeEmpty#e17e23c type:string = PhotoSize;
photoSize#77bfb61b type:string location:FileLocation w:int h:int size:int = PhotoSize;
@@ -213,7 +212,7 @@ inputPeerNotifySettings#9c3d198e flags:# show_previews:flags.0?Bool silent:flags
peerNotifySettings#af509d20 flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int sound:flags.3?string = PeerNotifySettings;
peerSettings#818426cd flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true = PeerSettings;
peerSettings#733f2961 flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true geo_distance:flags.6?int = PeerSettings;
wallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper;
wallPaperNoFile#8af40b25 flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper;
@@ -226,7 +225,7 @@ inputReportReasonOther#e1746d0a text:string = ReportReason;
inputReportReasonCopyright#9b89f93a = ReportReason;
inputReportReasonGeoIrrelevant#dbd4feed = ReportReason;
userFull#edf17c12 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true user:User about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int = UserFull;
userFull#edf17c12 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true user:User about:flags.1?string settings:PeerSettings profile_photo:flags.2?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int = UserFull;
contact#f911c994 user_id:int mutual:Bool = Contact;
@@ -358,6 +357,7 @@ updateDialogFilter#26ffde7d flags:# id:int filter:flags.0?DialogFilter = Update;
updateDialogFilterOrder#a5d72105 order:Vector<int> = Update;
updateDialogFilters#3504914f = Update;
updatePhoneCallSignalingData#2661bf09 phone_call_id:long data:bytes = Update;
updateChannelParticipant#65d2b464 flags:# channel_id:int date:int user_id:int prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant qts:int = Update;
updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
@@ -395,7 +395,7 @@ help.inviteText#18cb9f78 message:string = help.InviteText;
encryptedChatEmpty#ab7ec0a0 id:int = EncryptedChat;
encryptedChatWaiting#3bf703dc id:int access_hash:long date:int admin_id:int participant_id:int = EncryptedChat;
encryptedChatRequested#c878527e id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
encryptedChatRequested#62718a82 flags:# folder_id:flags.0?int id:int access_hash:long date:int admin_id:int participant_id:int g_a:bytes = EncryptedChat;
encryptedChat#fa56ce36 id:int access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long = EncryptedChat;
encryptedChatDiscarded#13d6dd27 id:int = EncryptedChat;
@@ -529,6 +529,7 @@ chatInviteExported#fc2e05bc link:string = ExportedChatInvite;
chatInviteAlready#5a686d7c chat:Chat = ChatInvite;
chatInvite#dfc2f58e flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true title:string photo:Photo participants_count:int participants:flags.4?Vector<User> = ChatInvite;
chatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite;
inputStickerSetEmpty#ffb62b95 = InputStickerSet;
inputStickerSetID#9de7a269 id:long access_hash:long = InputStickerSet;
@@ -619,11 +620,6 @@ channels.channelParticipant#d0d9b163 participant:ChannelParticipant users:Vector
help.termsOfService#780a0310 flags:# popup:flags.0?true id:DataJSON text:string entities:Vector<MessageEntity> min_age_confirm:flags.1?int = help.TermsOfService;
foundGif#162ecc1f url:string thumb_url:string content_url:string content_type:string w:int h:int = FoundGif;
foundGifCached#9c750409 url:string photo:Photo document:Document = FoundGif;
messages.foundGifs#450a1c0a next_offset:int results:Vector<FoundGif> = messages.FoundGifs;
messages.savedGifsNotModified#e8025ca2 = messages.SavedGifs;
messages.savedGifs#2e0709a5 hash:int gifs:Vector<Document> = messages.SavedGifs;
@@ -822,13 +818,14 @@ inputStickerSetItem#ffa0a496 flags:# document:InputDocument emoji:string mask_co
inputPhoneCall#1e36fded id:long access_hash:long = InputPhoneCall;
phoneCallEmpty#5366c915 id:long = PhoneCall;
phoneCallWaiting#1b8f4ad1 flags:# video:flags.5?true id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;
phoneCallRequested#87eabb53 flags:# video:flags.5?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCallAccepted#997c454a flags:# video:flags.5?true id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCall#8742ae7f flags:# p2p_allowed:flags.5?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector<PhoneConnection> start_date:int = PhoneCall;
phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.5?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;
phoneCallWaiting#1b8f4ad1 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;
phoneCallRequested#87eabb53 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCallAccepted#997c454a flags:# video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_b:bytes protocol:PhoneCallProtocol = PhoneCall;
phoneCall#8742ae7f flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:int participant_id:int g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector<PhoneConnection> start_date:int = PhoneCall;
phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;
phoneConnection#9d4c17c0 id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;
phoneConnectionWebrtc#635fe375 flags:# turn:flags.0?true stun:flags.1?true id:long ip:string ipv6:string port:int username:string password:string = PhoneConnection;
phoneCallProtocol#fc878fc8 flags:# udp_p2p:flags.0?true udp_reflector:flags.1?true min_layer:int max_layer:int library_versions:Vector<string> = PhoneCallProtocol;
@@ -1141,7 +1138,17 @@ stats.broadcastStats#bdf78394 period:StatsDateRangeDays followers:StatsAbsValueA
help.promoDataEmpty#98f6ac75 expires:int = help.PromoData;
help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector<Chat> users:Vector<User> psa_type:flags.1?string psa_message:flags.2?string = help.PromoData;
videoSize#435bb987 type:string location:FileLocation w:int h:int size:int = VideoSize;
videoSize#e831c556 flags:# type:string location:FileLocation w:int h:int size:int video_start_ts:flags.0?double = VideoSize;
statsGroupTopPoster#18f3d0f7 user_id:int messages:int avg_chars:int = StatsGroupTopPoster;
statsGroupTopAdmin#6014f412 user_id:int deleted:int kicked:int banned:int = StatsGroupTopAdmin;
statsGroupTopInviter#31962a4c user_id:int invitations:int = StatsGroupTopInviter;
stats.megagroupStats#ef7ff916 period:StatsDateRangeDays members:StatsAbsValueAndPrev messages:StatsAbsValueAndPrev viewers:StatsAbsValueAndPrev posters:StatsAbsValueAndPrev growth_graph:StatsGraph members_graph:StatsGraph new_members_by_source_graph:StatsGraph languages_graph:StatsGraph messages_graph:StatsGraph actions_graph:StatsGraph top_hours_graph:StatsGraph weekdays_graph:StatsGraph top_posters:Vector<StatsGroupTopPoster> top_admins:Vector<StatsGroupTopAdmin> top_inviters:Vector<StatsGroupTopInviter> users:Vector<User> = stats.MegagroupStats;
globalPrivacySettings#bea2f424 flags:# archive_and_mute_new_noncontact_peers:flags.0?Bool = GlobalPrivacySettings;
---functions---
@@ -1237,6 +1244,8 @@ account.getThemes#285946f8 format:string hash:int = account.Themes;
account.setContentSettings#b574b16b flags:# sensitive_enabled:flags.0?true = Bool;
account.getContentSettings#8b9b4dae = account.ContentSettings;
account.getMultiWallPapers#65ad71dc wallpapers:Vector<InputWallPaper> = Vector<WallPaper>;
account.getGlobalPrivacySettings#eb2b4cf6 = GlobalPrivacySettings;
account.setGlobalPrivacySettings#1edaaac2 settings:GlobalPrivacySettings = GlobalPrivacySettings;
users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;
users.getFullUser#ca30a5b1 id:InputUser = UserFull;
@@ -1312,7 +1321,6 @@ messages.migrateChat#15a3b8e3 chat_id:int = Updates;
messages.searchGlobal#bf7225a4 flags:# folder_id:flags.0?int q:string offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
messages.reorderStickerSets#78337739 flags:# masks:flags.0?true order:Vector<long> = Bool;
messages.getDocumentByHash#338e2464 sha256:bytes size:int mime_type:string = Document;
messages.searchGifs#bf9a776b q:string offset:int = messages.FoundGifs;
messages.getSavedGifs#83bf3d52 hash:int = messages.SavedGifs;
messages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool;
messages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults;
@@ -1391,8 +1399,8 @@ updates.getState#edd4882a = updates.State;
updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference;
updates.getChannelDifference#3173d78 flags:# force:flags.0?true channel:InputChannel filter:ChannelMessagesFilter pts:int limit:int = updates.ChannelDifference;
photos.updateProfilePhoto#f0bb5152 id:InputPhoto = UserProfilePhoto;
photos.uploadProfilePhoto#4f32c098 file:InputFile = photos.Photo;
photos.updateProfilePhoto#72d4742c id:InputPhoto = photos.Photo;
photos.uploadProfilePhoto#89f30f69 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double = photos.Photo;
photos.deletePhotos#87cf7f2f id:Vector<InputPhoto> = Vector<long>;
photos.getUserPhotos#91cd32a8 user_id:InputUser offset:int max_id:long limit:int = photos.Photos;
@@ -1425,6 +1433,7 @@ help.getUserInfo#38a08d3 user_id:InputUser = help.UserInfo;
help.editUserInfo#66b91b70 user_id:InputUser message:string entities:Vector<MessageEntity> = help.UserInfo;
help.getPromoData#c0977421 = help.PromoData;
help.hidePromoData#1e251c95 peer:InputPeer = Bool;
help.dismissSuggestion#77fa99f suggestion:string = Bool;
channels.readHistory#cc104937 channel:InputChannel max_id:int = Bool;
channels.deleteMessages#84c1fd4e channel:InputChannel id:Vector<int> = messages.AffectedMessages;
@@ -1501,5 +1510,6 @@ folders.deleteFolder#1c295881 folder_id:int = Updates;
stats.getBroadcastStats#ab42441a flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastStats;
stats.loadAsyncGraph#621d5fa0 flags:# token:string x:flags.0?long = StatsGraph;
stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel = stats.MegagroupStats;
// LAYER 114
// LAYER 117

View File

@@ -9,7 +9,7 @@
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
ProcessorArchitecture="ARCHITECTURE"
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
Version="2.1.13.0" />
Version="2.3.0.0" />
<Properties>
<DisplayName>Telegram Desktop</DisplayName>
<PublisherDisplayName>Telegram FZ-LLC</PublisherDisplayName>

View File

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

View File

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

View File

@@ -298,6 +298,28 @@ bool update() {
for (size_t i = 0; i < from.size(); ++i) {
string fname = from[i], tofname = to[i];
// it is necessary to remove the old file to not to get an error if appimage file is used by fuse
struct stat statbuf;
writeLog("Trying to get stat() for '%s'", tofname.c_str());
if (!stat(tofname.c_str(), &statbuf)) {
if (S_ISDIR(statbuf.st_mode)) {
writeLog("Fully clearing path '%s'..", tofname.c_str());
if (!remove_directory(tofname.c_str())) {
writeLog("Error: failed to clear path '%s'", tofname.c_str());
delFolder();
return false;
}
} else {
writeLog("Unlinking file '%s'", tofname.c_str());
if (unlink(tofname.c_str())) {
writeLog("Error: failed to unlink '%s'", tofname.c_str());
delFolder();
return false;
}
}
}
writeLog("Copying file '%s' to '%s'..", fname.c_str(), tofname.c_str());
int copyTries = 0, triesLimit = 30;
do {

View File

@@ -0,0 +1,117 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_bot.h"
#include "apiwrap.h"
#include "api/api_send_progress.h"
#include "boxes/confirm_box.h"
#include "boxes/share_box.h"
#include "core/click_handler_types.h"
#include "data/data_changes.h"
#include "data/data_peer.h"
#include "data/data_session.h"
#include "history/history.h"
#include "history/history_item.h"
#include "history/history_item_components.h"
#include "main/main_session.h"
#include "ui/toast/toast.h"
namespace Api {
void SendBotCallbackData(
not_null<HistoryItem*> item,
int row,
int column) {
if (!IsServerMsgId(item->id)) {
return;
}
const auto history = item->history();
const auto session = &history->session();
const auto owner = &history->owner();
const auto api = &session->api();
const auto bot = item->getMessageBot();
const auto fullId = item->fullId();
const auto getButton = [=] {
return HistoryMessageMarkupButton::Get(
owner,
fullId,
row,
column);
};
const auto button = getButton();
if (!button) {
return;
}
using ButtonType = HistoryMessageMarkupButton::Type;
const auto isGame = (button->type == ButtonType::Game);
auto flags = MTPmessages_GetBotCallbackAnswer::Flags(0);
QByteArray sendData;
if (isGame) {
flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_game;
} else if (button->type == ButtonType::Callback) {
flags |= MTPmessages_GetBotCallbackAnswer::Flag::f_data;
sendData = button->data;
}
button->requestId = api->request(MTPmessages_GetBotCallbackAnswer(
MTP_flags(flags),
history->peer->input,
MTP_int(item->id),
MTP_bytes(sendData)
)).done([=](const MTPmessages_BotCallbackAnswer &result) {
const auto item = owner->message(fullId);
if (!item) {
return;
}
if (const auto button = getButton()) {
button->requestId = 0;
owner->requestItemRepaint(item);
}
result.match([&](const MTPDmessages_botCallbackAnswer &data) {
if (const auto message = data.vmessage()) {
if (data.is_alert()) {
Ui::show(Box<InformBox>(qs(*message)));
} else {
Ui::Toast::Show(qs(*message));
}
} else if (const auto url = data.vurl()) {
const auto link = qs(*url);
if (!isGame) {
UrlClickHandler::Open(link);
return;
}
const auto scoreLink = AppendShareGameScoreUrl(
session,
link,
item->fullId());
BotGameUrlClickHandler(bot, scoreLink).onClick({});
session->sendProgressManager().update(
history,
Api::SendProgressType::PlayGame);
}
});
}).fail([=](const RPCError &error) {
const auto item = owner->message(fullId);
if (!item) {
return;
}
// Show error?
if (const auto button = getButton()) {
button->requestId = 0;
owner->requestItemRepaint(item);
}
}).send();
session->changes().messageUpdated(
item,
Data::MessageUpdate::Flag::BotCallbackSent
);
}
} // namespace Api

View File

@@ -0,0 +1,19 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
class HistoryItem;
namespace Api {
void SendBotCallbackData(
not_null<HistoryItem*> item,
int row,
int column);
} // namespace Api

View File

@@ -0,0 +1,230 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_chat_invite.h"
#include "apiwrap.h"
#include "window/window_session_controller.h"
#include "main/main_session.h"
#include "ui/empty_userpic.h"
#include "core/application.h"
#include "data/data_session.h"
#include "data/data_photo.h"
#include "data/data_photo_media.h"
#include "data/data_channel.h"
#include "data/data_user.h"
#include "data/data_file_origin.h"
#include "boxes/confirm_box.h"
#include "boxes/abstract_box.h"
#include "styles/style_boxes.h"
#include "styles/style_layers.h"
namespace Api {
void CheckChatInvite(
not_null<Window::SessionController*> controller,
const QString &hash,
ChannelData *invitePeekChannel) {
const auto session = &controller->session();
const auto weak = base::make_weak(controller.get());
session->api().checkChatInvite(hash, [=](const MTPChatInvite &result) {
Core::App().hideMediaView();
result.match([=](const MTPDchatInvite &data) {
const auto box = Ui::show(Box<ConfirmInviteBox>(
session,
data,
invitePeekChannel,
[=] { session->api().importChatInvite(hash); }));
if (invitePeekChannel) {
box->boxClosing(
) | rpl::filter([=] {
return !invitePeekChannel->amIn();
}) | rpl::start_with_next([=] {
if (const auto strong = weak.get()) {
strong->clearSectionStack(Window::SectionShow(
Window::SectionShow::Way::ClearStack,
anim::type::normal,
anim::activation::background));
}
}, box->lifetime());
}
}, [=](const MTPDchatInviteAlready &data) {
if (const auto chat = session->data().processChat(data.vchat())) {
if (const auto channel = chat->asChannel()) {
channel->clearInvitePeek();
}
if (const auto strong = weak.get()) {
strong->showPeerHistory(
chat,
Window::SectionShow::Way::Forward);
}
}
}, [=](const MTPDchatInvitePeek &data) {
if (const auto chat = session->data().processChat(data.vchat())) {
if (const auto channel = chat->asChannel()) {
channel->setInvitePeek(hash, data.vexpires().v);
if (const auto strong = weak.get()) {
strong->showPeerHistory(
chat,
Window::SectionShow::Way::Forward);
}
}
}
});
}, [=](const RPCError &error) {
if (error.code() != 400) {
return;
}
Core::App().hideMediaView();
Ui::show(Box<InformBox>(tr::lng_group_invite_bad_link(tr::now)));
});
}
} // namespace Api
ConfirmInviteBox::ConfirmInviteBox(
QWidget*,
not_null<Main::Session*> session,
const MTPDchatInvite &data,
ChannelData *invitePeekChannel,
Fn<void()> submit)
: _session(session)
, _submit(std::move(submit))
, _title(this, st::confirmInviteTitle)
, _status(this, st::confirmInviteStatus)
, _participants(GetParticipants(_session, data))
, _isChannel(data.is_channel() && !data.is_megagroup()) {
const auto title = qs(data.vtitle());
const auto count = data.vparticipants_count().v;
const auto status = [&] {
return invitePeekChannel
? tr::lng_channel_invite_private(tr::now)
: (!_participants.empty() && _participants.size() < count)
? tr::lng_group_invite_members(tr::now, lt_count, count)
: (count > 0)
? tr::lng_chat_status_members(tr::now, lt_count_decimal, count)
: _isChannel
? tr::lng_channel_status(tr::now)
: tr::lng_group_status(tr::now);
}();
_title->setText(title);
_status->setText(status);
const auto photo = _session->data().processPhoto(data.vphoto());
if (!photo->isNull()) {
_photo = photo->createMediaView();
_photo->wanted(Data::PhotoSize::Small, Data::FileOrigin());
if (!_photo->image(Data::PhotoSize::Small)) {
_session->downloaderTaskFinished(
) | rpl::start_with_next([=] {
update();
}, lifetime());
}
} else {
_photoEmpty = std::make_unique<Ui::EmptyUserpic>(
Data::PeerUserpicColor(0),
title);
}
}
ConfirmInviteBox::~ConfirmInviteBox() = default;
auto ConfirmInviteBox::GetParticipants(
not_null<Main::Session*> session,
const MTPDchatInvite &data)
-> std::vector<Participant> {
const auto participants = data.vparticipants();
if (!participants) {
return {};
}
const auto &v = participants->v;
auto result = std::vector<Participant>();
result.reserve(v.size());
for (const auto &participant : v) {
if (const auto user = session->data().processUser(participant)) {
result.push_back(Participant{ user });
}
}
return result;
}
void ConfirmInviteBox::prepare() {
addButton(
(_isChannel
? tr::lng_profile_join_channel()
: tr::lng_profile_join_group()),
_submit);
addButton(tr::lng_cancel(), [=] { closeBox(); });
while (_participants.size() > 4) {
_participants.pop_back();
}
auto newHeight = st::confirmInviteStatusTop + _status->height() + st::boxPadding.bottom();
if (!_participants.empty()) {
int skip = (st::boxWideWidth - 4 * st::confirmInviteUserPhotoSize) / 5;
int padding = skip / 2;
_userWidth = (st::confirmInviteUserPhotoSize + 2 * padding);
int sumWidth = _participants.size() * _userWidth;
int left = (st::boxWideWidth - sumWidth) / 2;
for (const auto &participant : _participants) {
auto name = new Ui::FlatLabel(this, st::confirmInviteUserName);
name->resizeToWidth(st::confirmInviteUserPhotoSize + padding);
name->setText(participant.user->firstName.isEmpty()
? participant.user->name
: participant.user->firstName);
name->moveToLeft(left + (padding / 2), st::confirmInviteUserNameTop);
left += _userWidth;
}
newHeight += st::confirmInviteUserHeight;
}
setDimensions(st::boxWideWidth, newHeight);
}
void ConfirmInviteBox::resizeEvent(QResizeEvent *e) {
BoxContent::resizeEvent(e);
_title->move((width() - _title->width()) / 2, st::confirmInviteTitleTop);
_status->move((width() - _status->width()) / 2, st::confirmInviteStatusTop);
}
void ConfirmInviteBox::paintEvent(QPaintEvent *e) {
BoxContent::paintEvent(e);
Painter p(this);
if (_photo) {
if (const auto image = _photo->image(Data::PhotoSize::Small)) {
p.drawPixmap(
(width() - st::confirmInvitePhotoSize) / 2,
st::confirmInvitePhotoTop,
image->pixCircled(
st::confirmInvitePhotoSize,
st::confirmInvitePhotoSize));
}
} else if (_photoEmpty) {
_photoEmpty->paint(
p,
(width() - st::confirmInvitePhotoSize) / 2,
st::confirmInvitePhotoTop,
width(),
st::confirmInvitePhotoSize);
}
int sumWidth = _participants.size() * _userWidth;
int left = (width() - sumWidth) / 2;
for (auto &participant : _participants) {
participant.user->paintUserpicLeft(
p,
participant.userpic,
left + (_userWidth - st::confirmInviteUserPhotoSize) / 2,
st::confirmInviteUserPhotoTop,
width(),
st::confirmInviteUserPhotoSize);
left += _userWidth;
}
}

View File

@@ -0,0 +1,74 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "ui/layers/box_content.h"
class UserData;
class ChannelData;
namespace Window {
class SessionController;
} // namespace Window
namespace Data {
class CloudImageView;
class PhotoMedia;
} // namespace Data
namespace Ui {
class EmptyUserpic;
} // namespace Ui
namespace Api {
void CheckChatInvite(
not_null<Window::SessionController*> controller,
const QString &hash,
ChannelData *invitePeekChannel = nullptr);
} // namespace Api
class ConfirmInviteBox final : public Ui::BoxContent {
public:
ConfirmInviteBox(
QWidget*,
not_null<Main::Session*> session,
const MTPDchatInvite &data,
ChannelData *invitePeekChannel,
Fn<void()> submit);
~ConfirmInviteBox();
protected:
void prepare() override;
void resizeEvent(QResizeEvent *e) override;
void paintEvent(QPaintEvent *e) override;
private:
struct Participant {
not_null<UserData*> user;
std::shared_ptr<Data::CloudImageView> userpic;
};
static std::vector<Participant> GetParticipants(
not_null<Main::Session*> session,
const MTPDchatInvite &data);
const not_null<Main::Session*> _session;
Fn<void()> _submit;
object_ptr<Ui::FlatLabel> _title;
object_ptr<Ui::FlatLabel> _status;
std::shared_ptr<Data::PhotoMedia> _photo;
std::unique_ptr<Ui::EmptyUserpic> _photoEmpty;
std::vector<Participant> _participants;
bool _isChannel = false;
int _userWidth = 0;
};

View File

@@ -0,0 +1,213 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_editing.h"
#include "apiwrap.h"
#include "api/api_media.h"
#include "api/api_text_entities.h"
#include "boxes/confirm_box.h"
#include "data/data_scheduled_messages.h"
#include "data/data_session.h"
#include "history/history.h"
#include "history/history_item.h"
#include "lang/lang_keys.h"
#include "main/main_session.h"
#include "mtproto/mtproto_rpc_sender.h"
namespace Api {
namespace {
using namespace rpl::details;
template <typename T>
constexpr auto WithId =
is_callable_plain_v<T, const MTPUpdates &, Fn<void()>, mtpRequestId>;
template <typename T>
constexpr auto WithoutId =
is_callable_plain_v<T, const MTPUpdates &, Fn<void()>>;
template <typename T>
constexpr auto WithoutCallback =
is_callable_plain_v<T, const MTPUpdates &>;
template <typename DoneCallback, typename FailCallback>
mtpRequestId EditMessage(
not_null<HistoryItem*> item,
const TextWithEntities &textWithEntities,
SendOptions options,
DoneCallback &&done,
FailCallback &&fail,
std::optional<MTPInputMedia> inputMedia = std::nullopt) {
const auto session = &item->history()->session();
const auto api = &session->api();
const auto text = textWithEntities.text;
const auto sentEntities = EntitiesToMTP(
session,
textWithEntities.entities,
ConvertOption::SkipLocal);
const auto media = item->media();
const auto emptyFlag = MTPmessages_EditMessage::Flag(0);
const auto flags = emptyFlag
| (!text.isEmpty() || media
? MTPmessages_EditMessage::Flag::f_message
: emptyFlag)
| ((media && inputMedia.has_value())
? MTPmessages_EditMessage::Flag::f_media
: emptyFlag)
| (options.removeWebPageId
? MTPmessages_EditMessage::Flag::f_no_webpage
: emptyFlag)
| (!sentEntities.v.isEmpty()
? MTPmessages_EditMessage::Flag::f_entities
: emptyFlag)
| (options.scheduled
? MTPmessages_EditMessage::Flag::f_schedule_date
: emptyFlag);
const auto id = item->isScheduled()
? session->data().scheduledMessages().lookupId(item)
: item->id;
return api->request(MTPmessages_EditMessage(
MTP_flags(flags),
item->history()->peer->input,
MTP_int(id),
MTP_string(text),
inputMedia.value_or(MTPInputMedia()),
MTPReplyMarkup(),
sentEntities,
MTP_int(options.scheduled)
)).done([=](
const MTPUpdates &result,
[[maybe_unused]] mtpRequestId requestId) {
const auto apply = [=] { api->applyUpdates(result); };
if constexpr (WithId<DoneCallback>) {
done(result, apply, requestId);
} else if constexpr (WithoutId<DoneCallback>) {
done(result, apply);
} else if constexpr (WithoutCallback<DoneCallback>) {
done(result);
apply();
} else {
apply();
}
}).fail(
fail
).send();
}
template <typename DoneCallback, typename FailCallback>
mtpRequestId EditMessage(
not_null<HistoryItem*> item,
SendOptions options,
DoneCallback &&done,
FailCallback &&fail,
std::optional<MTPInputMedia> inputMedia = std::nullopt) {
const auto &text = item->originalText();
return EditMessage(
item,
text,
options,
std::forward<DoneCallback>(done),
std::forward<FailCallback>(fail),
inputMedia);
}
void EditMessageWithUploadedMedia(
not_null<HistoryItem*> item,
SendOptions options,
MTPInputMedia media) {
const auto done = [=](const auto &result, Fn<void()> applyUpdates) {
if (item) {
item->clearSavedMedia();
item->setIsLocalUpdateMedia(true);
applyUpdates();
item->setIsLocalUpdateMedia(false);
}
};
const auto fail = [=](const RPCError &error) {
const auto err = error.type();
const auto session = &item->history()->session();
const auto notModified = (err == u"MESSAGE_NOT_MODIFIED"_q);
const auto mediaInvalid = (err == u"MEDIA_NEW_INVALID"_q);
if (notModified || mediaInvalid) {
item->returnSavedMedia();
session->data().sendHistoryChangeNotifications();
if (mediaInvalid) {
Ui::show(
Box<InformBox>(tr::lng_edit_media_invalid_file(tr::now)),
Ui::LayerOption::KeepOther);
}
} else {
session->api().sendMessageFail(error, item->history()->peer);
}
};
EditMessage(item, options, done, fail, media);
}
} // namespace
void RescheduleMessage(
not_null<HistoryItem*> item,
SendOptions options) {
const auto empty = [](const auto &r) {};
EditMessage(item, options, empty, empty);
}
void EditMessageWithUploadedDocument(
HistoryItem *item,
const MTPInputFile &file,
const std::optional<MTPInputFile> &thumb,
SendOptions options) {
if (!item || !item->media() || !item->media()->document()) {
return;
}
const auto media = PrepareUploadedDocument(item, file, thumb);
EditMessageWithUploadedMedia(item, options, media);
}
void EditMessageWithUploadedPhoto(
HistoryItem *item,
const MTPInputFile &file,
SendOptions options) {
if (!item || !item->media() || !item->media()->photo()) {
return;
}
const auto media = PrepareUploadedPhoto(file);
EditMessageWithUploadedMedia(item, options, media);
}
mtpRequestId EditCaption(
not_null<HistoryItem*> item,
const TextWithEntities &caption,
SendOptions options,
Fn<void(const MTPUpdates &)> done,
Fn<void(const RPCError &)> fail) {
return EditMessage(item, caption, options, done, fail);
}
mtpRequestId EditTextMessage(
not_null<HistoryItem*> item,
const TextWithEntities &caption,
SendOptions options,
Fn<void(const MTPUpdates &, mtpRequestId requestId)> done,
Fn<void(const RPCError &, mtpRequestId requestId)> fail) {
const auto callback = [=](
const auto &result,
Fn<void()> applyUpdates,
auto id) {
applyUpdates();
done(result, id);
};
return EditMessage(item, caption, options, callback, fail);
}
} // namespace Api

View File

@@ -0,0 +1,52 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
class HistoryItem;
class RPCError;
namespace Api {
struct SendOptions;
const auto kDefaultEditMessagesErrors = {
u"MESSAGE_ID_INVALID"_q,
u"CHAT_ADMIN_REQUIRED"_q,
u"MESSAGE_EDIT_TIME_EXPIRED"_q,
};
void RescheduleMessage(
not_null<HistoryItem*> item,
SendOptions options);
void EditMessageWithUploadedDocument(
HistoryItem *item,
const MTPInputFile &file,
const std::optional<MTPInputFile> &thumb,
SendOptions options);
void EditMessageWithUploadedPhoto(
HistoryItem *item,
const MTPInputFile &file,
SendOptions options);
mtpRequestId EditCaption(
not_null<HistoryItem*> item,
const TextWithEntities &caption,
SendOptions options,
Fn<void(const MTPUpdates &)> done,
Fn<void(const RPCError &)> fail);
mtpRequestId EditTextMessage(
not_null<HistoryItem*> item,
const TextWithEntities &caption,
SendOptions options,
Fn<void(const MTPUpdates &, mtpRequestId requestId)> done,
Fn<void(const RPCError &, mtpRequestId requestId)> fail);
} // namespace Api

View File

@@ -0,0 +1,103 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_global_privacy.h"
#include "apiwrap.h"
#include "main/main_session.h"
#include "main/main_account.h"
#include "main/main_app_config.h"
namespace Api {
GlobalPrivacy::GlobalPrivacy(not_null<ApiWrap*> api)
: _session(&api->session())
, _api(&api->instance()) {
}
void GlobalPrivacy::reload(Fn<void()> callback) {
if (callback) {
_callbacks.push_back(std::move(callback));
}
if (_requestId) {
return;
}
_requestId = _api.request(MTPaccount_GetGlobalPrivacySettings(
)).done([=](const MTPGlobalPrivacySettings &result) {
_requestId = 0;
apply(result);
for (const auto &callback : base::take(_callbacks)) {
callback();
}
}).fail([=](const RPCError &error) {
_requestId = 0;
for (const auto &callback : base::take(_callbacks)) {
callback();
}
}).send();
_session->account().appConfig().value(
) | rpl::start_with_next([=] {
_showArchiveAndMute = _session->account().appConfig().get<bool>(
u"autoarchive_setting_available"_q,
false);
}, _session->lifetime());
}
bool GlobalPrivacy::archiveAndMuteCurrent() const {
return _archiveAndMute.current();
}
rpl::producer<bool> GlobalPrivacy::archiveAndMute() const {
return _archiveAndMute.value();
}
rpl::producer<bool> GlobalPrivacy::showArchiveAndMute() const {
using namespace rpl::mappers;
return rpl::combine(
archiveAndMute(),
_showArchiveAndMute.value(),
_1 || _2);
}
rpl::producer<> GlobalPrivacy::suggestArchiveAndMute() const {
return _session->account().appConfig().suggestionRequested(
u"AUTOARCHIVE_POPULAR"_q);
}
void GlobalPrivacy::dismissArchiveAndMuteSuggestion() {
_session->account().appConfig().dismissSuggestion(
u"AUTOARCHIVE_POPULAR"_q);
}
void GlobalPrivacy::update(bool archiveAndMute) {
using Flag = MTPDglobalPrivacySettings::Flag;
_api.request(_requestId).cancel();
_requestId = _api.request(MTPaccount_SetGlobalPrivacySettings(
MTP_globalPrivacySettings(
MTP_flags(Flag::f_archive_and_mute_new_noncontact_peers),
MTP_bool(archiveAndMute))
)).done([=](const MTPGlobalPrivacySettings &result) {
_requestId = 0;
apply(result);
}).fail([=](const RPCError &error) {
_requestId = 0;
}).send();
_archiveAndMute = archiveAndMute;
}
void GlobalPrivacy::apply(const MTPGlobalPrivacySettings &data) {
data.match([&](const MTPDglobalPrivacySettings &data) {
_archiveAndMute = data.varchive_and_mute_new_noncontact_peers()
? mtpIsTrue(*data.varchive_and_mute_new_noncontact_peers())
: false;
});
}
} // namespace Api

View File

@@ -0,0 +1,45 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "mtproto/sender.h"
class ApiWrap;
namespace Main {
class Session;
} // namespace Main
namespace Api {
class GlobalPrivacy final {
public:
explicit GlobalPrivacy(not_null<ApiWrap*> api);
void reload(Fn<void()> callback = nullptr);
void update(bool archiveAndMute);
[[nodiscard]] bool archiveAndMuteCurrent() const;
[[nodiscard]] rpl::producer<bool> archiveAndMute() const;
[[nodiscard]] rpl::producer<bool> showArchiveAndMute() const;
[[nodiscard]] rpl::producer<> suggestArchiveAndMute() const;
void dismissArchiveAndMuteSuggestion();
private:
void apply(const MTPGlobalPrivacySettings &data);
const not_null<Main::Session*> _session;
MTP::Sender _api;
mtpRequestId _requestId = 0;
rpl::variable<bool> _archiveAndMute = false;
rpl::variable<bool> _showArchiveAndMute = false;
std::vector<Fn<void()>> _callbacks;
};
} // namespace Api

View File

@@ -0,0 +1,94 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_hash.h"
#include "data/data_document.h"
#include "data/data_session.h"
#include "data/stickers/data_stickers.h"
#include "main/main_session.h"
namespace Api {
namespace {
[[nodiscard]] int32 CountDocumentVectorHash(
const QVector<DocumentData*> vector) {
auto result = HashInit();
for (const auto document : vector) {
HashUpdate(result, document->id);
}
return HashFinalize(result);
}
[[nodiscard]] int32 CountSpecialStickerSetHash(
not_null<Main::Session*> session,
uint64 setId) {
const auto &sets = session->data().stickers().sets();
const auto it = sets.find(setId);
if (it != sets.cend()) {
return CountDocumentVectorHash(it->second->stickers);
}
return 0;
}
} // namespace
int32 CountStickersHash(
not_null<Main::Session*> session,
bool checkOutdatedInfo) {
auto result = HashInit();
bool foundOutdated = false;
const auto &sets = session->data().stickers().sets();
const auto &order = session->data().stickers().setsOrder();
for (auto i = order.cbegin(), e = order.cend(); i != e; ++i) {
auto it = sets.find(*i);
if (it != sets.cend()) {
const auto set = it->second.get();
if (set->id == Data::Stickers::DefaultSetId) {
foundOutdated = true;
} else if (!(set->flags & MTPDstickerSet_ClientFlag::f_special)
&& !(set->flags & MTPDstickerSet::Flag::f_archived)) {
HashUpdate(result, set->hash);
}
}
}
return (!checkOutdatedInfo || !foundOutdated)
? HashFinalize(result)
: 0;
}
int32 CountRecentStickersHash(not_null<Main::Session*> session) {
return CountSpecialStickerSetHash(
session,
Data::Stickers::CloudRecentSetId);
}
int32 CountFavedStickersHash(not_null<Main::Session*> session) {
return CountSpecialStickerSetHash(session, Data::Stickers::FavedSetId);
}
int32 CountFeaturedStickersHash(not_null<Main::Session*> session) {
auto result = HashInit();
const auto &sets = session->data().stickers().sets();
const auto &featured = session->data().stickers().featuredSetsOrder();
for (const auto setId : featured) {
HashUpdate(result, setId);
const auto it = sets.find(setId);
if (it != sets.cend()
&& (it->second->flags & MTPDstickerSet_ClientFlag::f_unread)) {
HashUpdate(result, 1);
}
}
return HashFinalize(result);
}
int32 CountSavedGifsHash(not_null<Main::Session*> session) {
return CountDocumentVectorHash(session->data().stickers().savedGifs());
}
} // namespace Api

View File

@@ -7,8 +7,22 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
namespace Main {
class Session;
} // namespace Main
namespace Api {
[[nodiscard]] int32 CountStickersHash(
not_null<Main::Session*> session,
bool checkOutdatedInfo = false);
[[nodiscard]] int32 CountRecentStickersHash(
not_null<Main::Session*> session);
[[nodiscard]] int32 CountFavedStickersHash(not_null<Main::Session*> session);
[[nodiscard]] int32 CountFeaturedStickersHash(
not_null<Main::Session*> session);
[[nodiscard]] int32 CountSavedGifsHash(not_null<Main::Session*> session);
[[nodiscard]] inline uint32 HashInit() {
return 0;
}

View File

@@ -0,0 +1,107 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_media.h"
#include "data/data_document.h"
#include "history/history_item.h"
namespace Api {
namespace {
MTPVector<MTPDocumentAttribute> ComposeSendingDocumentAttributes(
not_null<DocumentData*> document) {
const auto filenameAttribute = MTP_documentAttributeFilename(
MTP_string(document->filename()));
const auto dimensions = document->dimensions;
auto attributes = QVector<MTPDocumentAttribute>(1, filenameAttribute);
if (dimensions.width() > 0 && dimensions.height() > 0) {
const auto duration = document->getDuration();
if (duration >= 0 && !document->hasMimeType(qstr("image/gif"))) {
auto flags = MTPDdocumentAttributeVideo::Flags(0);
using VideoFlag = MTPDdocumentAttributeVideo::Flag;
if (document->isVideoMessage()) {
flags |= VideoFlag::f_round_message;
}
if (document->supportsStreaming()) {
flags |= VideoFlag::f_supports_streaming;
}
attributes.push_back(MTP_documentAttributeVideo(
MTP_flags(flags),
MTP_int(duration),
MTP_int(dimensions.width()),
MTP_int(dimensions.height())));
} else {
attributes.push_back(MTP_documentAttributeImageSize(
MTP_int(dimensions.width()),
MTP_int(dimensions.height())));
}
}
if (document->type == AnimatedDocument) {
attributes.push_back(MTP_documentAttributeAnimated());
} else if (document->type == StickerDocument && document->sticker()) {
attributes.push_back(MTP_documentAttributeSticker(
MTP_flags(0),
MTP_string(document->sticker()->alt),
document->sticker()->set,
MTPMaskCoords()));
} else if (const auto song = document->song()) {
const auto flags = MTPDdocumentAttributeAudio::Flag::f_title
| MTPDdocumentAttributeAudio::Flag::f_performer;
attributes.push_back(MTP_documentAttributeAudio(
MTP_flags(flags),
MTP_int(song->duration),
MTP_string(song->title),
MTP_string(song->performer),
MTPstring()));
} else if (const auto voice = document->voice()) {
const auto flags = MTPDdocumentAttributeAudio::Flag::f_voice
| MTPDdocumentAttributeAudio::Flag::f_waveform;
attributes.push_back(MTP_documentAttributeAudio(
MTP_flags(flags),
MTP_int(voice->duration),
MTPstring(),
MTPstring(),
MTP_bytes(documentWaveformEncode5bit(voice->waveform))));
}
return MTP_vector<MTPDocumentAttribute>(attributes);
}
} // namespace
MTPInputMedia PrepareUploadedPhoto(const MTPInputFile &file) {
return MTP_inputMediaUploadedPhoto(
MTP_flags(0),
file,
MTPVector<MTPInputDocument>(),
MTP_int(0));
}
MTPInputMedia PrepareUploadedDocument(
not_null<HistoryItem*> item,
const MTPInputFile &file,
const std::optional<MTPInputFile> &thumb) {
if (!item || !item->media() || !item->media()->document()) {
return MTP_inputMediaEmpty();
}
const auto emptyFlag = MTPDinputMediaUploadedDocument::Flags(0);
using DocFlags = MTPDinputMediaUploadedDocument::Flag;
const auto flags = emptyFlag
| (thumb ? DocFlags::f_thumb : emptyFlag)
| (item->groupId() ? DocFlags::f_nosound_video : emptyFlag);
const auto document = item->media()->document();
return MTP_inputMediaUploadedDocument(
MTP_flags(flags),
file,
thumb.value_or(MTPInputFile()),
MTP_string(document->mimeString()),
ComposeSendingDocumentAttributes(document),
MTPVector<MTPInputDocument>(),
MTP_int(0));
}
} // namespace Api

View File

@@ -0,0 +1,21 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
class HistoryItem;
namespace Api {
MTPInputMedia PrepareUploadedPhoto(const MTPInputFile &file);
MTPInputMedia PrepareUploadedDocument(
not_null<HistoryItem*> item,
const MTPInputFile &file,
const std::optional<MTPInputFile> &thumb);
} // namespace Api

View File

@@ -12,7 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Api {
SelfDestruct::SelfDestruct(not_null<ApiWrap*> api)
: _api(api->instance()) {
: _api(&api->instance()) {
}
void SelfDestruct::reload() {

View File

@@ -0,0 +1,108 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "api/api_send_progress.h"
#include "main/main_session.h"
#include "history/history.h"
#include "data/data_peer.h"
#include "apiwrap.h"
namespace Api {
namespace {
constexpr auto kCancelTypingActionTimeout = crl::time(5000);
} // namespace
SendProgressManager::SendProgressManager(not_null<Main::Session*> session)
: _session(session)
, _stopTypingTimer([=] { cancelTyping(base::take(_stopTypingHistory)); }) {
}
void SendProgressManager::cancel(
not_null<History*> history,
SendProgressType type) {
const auto i = _requests.find({ history, type });
if (i != _requests.end()) {
_session->api().request(i->second).cancel();
_requests.erase(i);
}
}
void SendProgressManager::cancelTyping(not_null<History*> history) {
_stopTypingTimer.cancel();
cancel(history, SendProgressType::Typing);
}
void SendProgressManager::update(
not_null<History*> history,
SendProgressType type,
int32 progress) {
const auto peer = history->peer;
if (peer->isSelf() || (peer->isChannel() && !peer->isMegagroup())) {
return;
}
const auto doing = (progress >= 0);
if (history->mySendActionUpdated(type, doing)) {
cancel(history, type);
if (doing) {
send(history, type, progress);
}
}
}
void SendProgressManager::send(
not_null<History*> history,
SendProgressType type,
int32 progress) {
using Type = SendProgressType;
const auto action = [&]() -> MTPsendMessageAction {
const auto p = MTP_int(progress);
switch (type) {
case Type::Typing: return MTP_sendMessageTypingAction();
case Type::RecordVideo: return MTP_sendMessageRecordVideoAction();
case Type::UploadVideo: return MTP_sendMessageUploadVideoAction(p);
case Type::RecordVoice: return MTP_sendMessageRecordAudioAction();
case Type::UploadVoice: return MTP_sendMessageUploadAudioAction(p);
case Type::RecordRound: return MTP_sendMessageRecordRoundAction();
case Type::UploadRound: return MTP_sendMessageUploadRoundAction(p);
case Type::UploadPhoto: return MTP_sendMessageUploadPhotoAction(p);
case Type::UploadFile: return MTP_sendMessageUploadDocumentAction(p);
case Type::ChooseLocation: return MTP_sendMessageGeoLocationAction();
case Type::ChooseContact: return MTP_sendMessageChooseContactAction();
case Type::PlayGame: return MTP_sendMessageGamePlayAction();
default: return MTP_sendMessageTypingAction();
}
}();
const auto requestId = _session->api().request(MTPmessages_SetTyping(
history->peer->input,
action
)).done([=](const MTPBool &result, mtpRequestId requestId) {
done(result, requestId);
}).send();
_requests.emplace(Key{ history, type }, requestId);
if (type == Type::Typing) {
_stopTypingHistory = history;
_stopTypingTimer.callOnce(kCancelTypingActionTimeout);
}
}
void SendProgressManager::done(
const MTPBool &result,
mtpRequestId requestId) {
for (auto i = _requests.begin(), e = _requests.end(); i != e; ++i) {
if (i->second == requestId) {
_requests.erase(i);
break;
}
}
}
} // namespace Api

View File

@@ -0,0 +1,88 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
#include "api/api_common.h"
#include "base/timer.h"
class History;
namespace Main {
class Session;
} // namespace Main
namespace Api {
enum class SendProgressType {
Typing,
RecordVideo,
UploadVideo,
RecordVoice,
UploadVoice,
RecordRound,
UploadRound,
UploadPhoto,
UploadFile,
ChooseLocation,
ChooseContact,
PlayGame,
};
struct SendProgress {
SendProgress(
SendProgressType type,
crl::time until,
int progress = 0)
: type(type)
, until(until)
, progress(progress) {
}
SendProgressType type = SendProgressType::Typing;
crl::time until = 0;
int progress = 0;
};
class SendProgressManager final {
public:
SendProgressManager(not_null<Main::Session*> session);
void update(
not_null<History*> history,
SendProgressType type,
int32 progress = 0);
void cancel(
not_null<History*> history,
SendProgressType type);
void cancelTyping(not_null<History*> history);
private:
struct Key {
not_null<History*> history;
SendProgressType type = SendProgressType();
inline bool operator<(const Key &other) const {
return (history < other.history)
|| (history == other.history && type < other.type);
}
};
void send(
not_null<History*> history,
SendProgressType type,
int32 progress);
void done(const MTPBool &result, mtpRequestId requestId);
const not_null<Main::Session*> _session;
base::flat_map<Key, mtpRequestId> _requests;
base::Timer _stopTypingTimer;
History *_stopTypingHistory = nullptr;
};
} // namespace Api

View File

@@ -16,13 +16,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_session.h"
#include "data/data_file_origin.h"
#include "data/data_histories.h"
#include "data/data_changes.h"
#include "data/stickers/data_stickers.h"
#include "history/history.h"
#include "history/history_message.h" // NewMessageFlags.
#include "chat_helpers/message_field.h" // ConvertTextTagsToEntities.
#include "ui/text/text_entity.h" // TextWithEntities.
#include "ui/text_options.h" // Ui::ItemTextOptions.
#include "main/main_session.h"
#include "main/main_account.h"
#include "main/main_app_config.h"
#include "storage/localimageloader.h"
#include "storage/file_upload.h"
#include "mainwidget.h"
#include "apiwrap.h"
#include "app.h"
@@ -124,8 +129,7 @@ void SendExistingMedia(
caption,
MTPReplyMarkup());
auto failHandler = std::make_shared<Fn<void(const RPCError&, QByteArray)>>();
auto performRequest = [=] {
auto performRequest = [=](const auto &repeatRequest) -> void {
auto &histories = history->owner().histories();
const auto requestType = Data::Histories::RequestType::Send;
histories.sendRequest(history, requestType, [=](Fn<void()> finish) {
@@ -144,32 +148,27 @@ void SendExistingMedia(
api->applyUpdates(result, randomId);
finish();
}).fail([=](const RPCError &error) {
(*failHandler)(error, usedFileReference);
if (error.code() == 400
&& error.type().startsWith(qstr("FILE_REFERENCE_"))) {
api->refreshFileReference(origin, [=](const auto &result) {
if (media->fileReference() != usedFileReference) {
repeatRequest(repeatRequest);
} else {
api->sendMessageFail(error, peer, randomId, newId);
}
});
} else {
api->sendMessageFail(error, peer, randomId, newId);
}
finish();
}).afterRequest(history->sendRequestId
).send();
return history->sendRequestId;
});
};
*failHandler = [=](const RPCError &error, QByteArray usedFileReference) {
if (error.code() == 400
&& error.type().startsWith(qstr("FILE_REFERENCE_"))) {
api->refreshFileReference(origin, [=](const auto &result) {
if (media->fileReference() != usedFileReference) {
performRequest();
} else {
api->sendMessageFail(error, peer, randomId, newId);
}
});
} else {
api->sendMessageFail(error, peer, randomId, newId);
}
};
performRequest();
performRequest(performRequest);
if (const auto main = App::main()) {
main->finishForwarding(message.action);
}
api->finishForwarding(message.action);
}
} // namespace
@@ -190,10 +189,7 @@ void SendExistingDocument(
document->stickerOrGifOrigin());
if (document->sticker()) {
if (const auto main = App::main()) {
main->incrementSticker(document);
document->owner().notifyRecentStickersUpdated();
}
document->owner().stickers().incrementSticker(document);
}
}
@@ -322,6 +318,7 @@ bool SendDice(Api::MessageToSend &message) {
).send();
return history->sendRequestId;
});
api->finishForwarding(message.action);
return true;
}
@@ -332,4 +329,209 @@ void FillMessagePostFlags(
InnerFillMessagePostFlags(action.options, peer, flags);
}
void SendConfirmedFile(
not_null<Main::Session*> session,
const std::shared_ptr<FileLoadResult> &file,
const std::optional<FullMsgId> &oldId) {
const auto isEditing = oldId.has_value();
const auto channelId = peerToChannel(file->to.peer);
const auto newId = oldId.value_or(
FullMsgId(channelId, session->data().nextLocalMessageId()));
auto groupId = file->album ? file->album->groupId : uint64(0);
if (file->album) {
const auto proj = [](const SendingAlbum::Item &item) {
return item.taskId;
};
const auto it = ranges::find(file->album->items, file->taskId, proj);
Assert(it != file->album->items.end());
it->msgId = newId;
}
file->edit = isEditing;
session->uploader().upload(newId, file);
const auto itemToEdit = isEditing
? session->data().message(newId)
: nullptr;
const auto history = session->data().history(file->to.peer);
const auto peer = history->peer;
auto action = Api::SendAction(history);
action.options = file->to.options;
action.clearDraft = false;
action.replyTo = file->to.replyTo;
action.generateLocal = true;
session->api().sendAction(action);
auto caption = TextWithEntities{
file->caption.text,
TextUtilities::ConvertTextTagsToEntities(file->caption.tags)
};
const auto prepareFlags = Ui::ItemTextOptions(
history,
session->user()).flags;
TextUtilities::PrepareForSending(caption, prepareFlags);
TextUtilities::Trim(caption);
auto localEntities = Api::EntitiesToMTP(session, caption.entities);
if (itemToEdit) {
if (const auto id = itemToEdit->groupId()) {
groupId = id.value;
}
}
auto flags = (isEditing ? MTPDmessage::Flags() : NewMessageFlags(peer))
| MTPDmessage::Flag::f_entities
| MTPDmessage::Flag::f_media;
auto clientFlags = NewMessageClientFlags();
if (file->to.replyTo) {
flags |= MTPDmessage::Flag::f_reply_to_msg_id;
}
const auto channelPost = peer->isChannel() && !peer->isMegagroup();
const auto silentPost = file->to.options.silent;
Api::FillMessagePostFlags(action, peer, flags);
if (silentPost) {
flags |= MTPDmessage::Flag::f_silent;
}
if (groupId) {
flags |= MTPDmessage::Flag::f_grouped_id;
}
if (file->to.options.scheduled) {
flags |= MTPDmessage::Flag::f_from_scheduled;
// Scheduled messages have no the 'edited' badge.
flags |= MTPDmessage::Flag::f_edit_hide;
} else {
clientFlags |= MTPDmessage_ClientFlag::f_local_history_entry;
}
const auto messageFromId = channelPost ? 0 : session->userId();
const auto messagePostAuthor = channelPost
? session->user()->name
: QString();
if (file->type == SendMediaType::Photo) {
const auto photoFlags = MTPDmessageMediaPhoto::Flag::f_photo | 0;
const auto photo = MTP_messageMediaPhoto(
MTP_flags(photoFlags),
file->photo,
MTPint());
const auto mtpMessage = MTP_message(
MTP_flags(flags),
MTP_int(newId.msg),
MTP_int(messageFromId),
peerToMTP(file->to.peer),
MTPMessageFwdHeader(),
MTPint(),
MTP_int(file->to.replyTo),
MTP_int(HistoryItem::NewMessageDate(file->to.options.scheduled)),
MTP_string(caption.text),
photo,
MTPReplyMarkup(),
localEntities,
MTP_int(1),
MTPint(),
MTP_string(messagePostAuthor),
MTP_long(groupId),
//MTPMessageReactions(),
MTPVector<MTPRestrictionReason>());
if (itemToEdit) {
itemToEdit->savePreviousMedia();
itemToEdit->applyEdition(mtpMessage.c_message());
} else {
history->addNewMessage(
mtpMessage,
clientFlags,
NewMessageType::Unread);
}
} else if (file->type == SendMediaType::File) {
const auto documentFlags = MTPDmessageMediaDocument::Flag::f_document | 0;
const auto document = MTP_messageMediaDocument(
MTP_flags(documentFlags),
file->document,
MTPint());
const auto mtpMessage = MTP_message(
MTP_flags(flags),
MTP_int(newId.msg),
MTP_int(messageFromId),
peerToMTP(file->to.peer),
MTPMessageFwdHeader(),
MTPint(),
MTP_int(file->to.replyTo),
MTP_int(HistoryItem::NewMessageDate(file->to.options.scheduled)),
MTP_string(caption.text),
document,
MTPReplyMarkup(),
localEntities,
MTP_int(1),
MTPint(),
MTP_string(messagePostAuthor),
MTP_long(groupId),
//MTPMessageReactions(),
MTPVector<MTPRestrictionReason>());
if (itemToEdit) {
itemToEdit->savePreviousMedia();
itemToEdit->applyEdition(mtpMessage.c_message());
} else {
history->addNewMessage(
mtpMessage,
clientFlags,
NewMessageType::Unread);
}
} else if (file->type == SendMediaType::Audio) {
if (!peer->isChannel() || peer->isMegagroup()) {
flags |= MTPDmessage::Flag::f_media_unread;
}
const auto documentFlags = MTPDmessageMediaDocument::Flag::f_document | 0;
const auto document = MTP_messageMediaDocument(
MTP_flags(documentFlags),
file->document,
MTPint());
history->addNewMessage(
MTP_message(
MTP_flags(flags),
MTP_int(newId.msg),
MTP_int(messageFromId),
peerToMTP(file->to.peer),
MTPMessageFwdHeader(),
MTPint(),
MTP_int(file->to.replyTo),
MTP_int(
HistoryItem::NewMessageDate(file->to.options.scheduled)),
MTP_string(caption.text),
document,
MTPReplyMarkup(),
localEntities,
MTP_int(1),
MTPint(),
MTP_string(messagePostAuthor),
MTP_long(groupId),
//MTPMessageReactions(),
MTPVector<MTPRestrictionReason>()),
clientFlags,
NewMessageType::Unread);
// Voices can't be edited.
} else {
Unexpected("Type in sendFilesConfirmed.");
}
if (isEditing) {
return;
}
session->data().sendHistoryChangeNotifications();
if (!itemToEdit) {
session->changes().historyUpdated(
history,
(action.options.scheduled
? Data::HistoryUpdate::Flag::ScheduledSent
: Data::HistoryUpdate::Flag::MessageSent));
}
}
} // namespace Api

View File

@@ -10,10 +10,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
class History;
class PhotoData;
class DocumentData;
struct FileLoadResult;
namespace Api {
struct MessageToSend;
struct SendAction;
void SendExistingDocument(
Api::MessageToSend &&message,
@@ -30,4 +32,9 @@ void FillMessagePostFlags(
not_null<PeerData*> peer,
MTPDmessage::Flags &flags);
void SendConfirmedFile(
not_null<Main::Session*> session,
const std::shared_ptr<FileLoadResult> &file,
const std::optional<FullMsgId> &oldId);
} // namespace Api

View File

@@ -21,7 +21,7 @@ constexpr auto kRefreshAppConfigTimeout = 3 * crl::time(1000);
SensitiveContent::SensitiveContent(not_null<ApiWrap*> api)
: _session(&api->session())
, _api(api->instance())
, _api(&api->instance())
, _appConfigReloadTimer([=] { _session->account().appConfig().refresh(); }) {
}

File diff suppressed because it is too large Load Diff

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