diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index ce2e3b0b7e..06f21cc28a 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -69,7 +69,7 @@ inputMediaPhotoExternal#e5bbfe1a flags:# url:string ttl_seconds:flags.0?int = In inputMediaDocumentExternal#fb52dc99 flags:# url:string ttl_seconds:flags.0?int = InputMedia; inputMediaGame#d33f43f3 id:InputGame = InputMedia; inputMediaInvoice#f4e096c3 flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:string provider_data:DataJSON start_param:string = InputMedia; -inputMediaGeoLive#ce4e82fd flags:# stopped:flags.0?true geo_point:InputGeoPoint period:flags.1?int = InputMedia; +inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia; inputMediaPoll#f94e5f1 flags:# poll:Poll correct_answers:flags.0?Vector solution:flags.1?string solution_entities:flags.1?Vector = InputMedia; inputMediaDice#e66fbf7b emoticon:string = InputMedia; @@ -78,7 +78,7 @@ inputChatUploadedPhoto#c642724e flags:# file:flags.0?InputFile video:flags.1?Inp inputChatPhoto#8953ad37 id:InputPhoto = InputChatPhoto; inputGeoPointEmpty#e4c123d6 = InputGeoPoint; -inputGeoPoint#f3b7acc9 lat:double long:double = InputGeoPoint; +inputGeoPoint#48222faf flags:# lat:double long:double accuracy_radius:flags.0?int = InputGeoPoint; inputPhotoEmpty#1cd7bf0d = InputPhoto; inputPhoto#3bb3b94a id:long access_hash:long file_reference:bytes = InputPhoto; @@ -141,7 +141,7 @@ chatPhotoEmpty#37c1011c = 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#58ae39c9 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?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; +message#58ae39c9 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 pinned:flags.24?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector = Message; messageService#286fa604 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction = Message; messageMediaEmpty#3ded6320 = MessageMedia; @@ -154,7 +154,7 @@ messageMediaWebPage#a32dd600 webpage:WebPage = MessageMedia; messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia; messageMediaGame#fdb19008 game:Game = MessageMedia; messageMediaInvoice#84551347 flags:# shipping_address_requested:flags.1?true test:flags.3?true title:string description:string photo:flags.0?WebDocument receipt_msg_id:flags.2?int currency:string total_amount:long start_param:string = MessageMedia; -messageMediaGeoLive#7c3c2609 geo:GeoPoint period:int = MessageMedia; +messageMediaGeoLive#b940c666 flags:# geo:GeoPoint heading:flags.0?int period:int proximity_notification_radius:flags.1?int = MessageMedia; messageMediaPoll#4bd6e798 poll:Poll results:PollResults = MessageMedia; messageMediaDice#3f7ee58b value:int emoticon:string = MessageMedia; @@ -181,6 +181,7 @@ messageActionBotAllowed#abe9affe domain:string = MessageAction; messageActionSecureValuesSentMe#1b287353 values:Vector credentials:SecureCredentialsEncrypted = MessageAction; messageActionSecureValuesSent#d95c6154 types:Vector = MessageAction; messageActionContactSignUp#f3f25f76 = MessageAction; +messageActionGeoProximityReached#98e0d697 from_id:Peer to_id:Peer distance:int = MessageAction; dialog#2c171f72 flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int = Dialog; 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; @@ -195,7 +196,7 @@ photoStrippedSize#e0b0bc2e type:string bytes:bytes = PhotoSize; photoSizeProgressive#5aa86a51 type:string location:FileLocation w:int h:int sizes:Vector = PhotoSize; geoPointEmpty#1117dd5f = GeoPoint; -geoPoint#296f104 long:double lat:double access_hash:long = GeoPoint; +geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radius:flags.0?int = GeoPoint; auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode; @@ -247,8 +248,8 @@ messages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector< messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs; messages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages; -messages.messagesSlice#c8edce1e flags:# inexact:flags.1?true count:int next_rate:flags.0?int messages:Vector chats:Vector users:Vector = messages.Messages; -messages.channelMessages#99262e37 flags:# inexact:flags.1?true pts:int count:int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; +messages.channelMessages#64479808 flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages; messages.messagesNotModified#74535f21 count:int = messages.Messages; messages.chats#64ff9fd5 chats:Vector = messages.Chats; @@ -274,6 +275,7 @@ inputMessagesFilterRoundVideo#b549da53 = MessagesFilter; inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter; inputMessagesFilterGeo#e7026d0d = MessagesFilter; inputMessagesFilterContacts#e062db83 = MessagesFilter; +inputMessagesFilterPinned#1bb00451 = MessagesFilter; updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update; updateMessageID#4e90bfd6 id:int random_id:long = Update; @@ -313,7 +315,6 @@ updateSavedGifs#9375341e = Update; updateBotInlineQuery#54826690 flags:# query_id:long user_id:int query:string geo:flags.0?GeoPoint offset:string = Update; updateBotInlineSend#e48f964 flags:# user_id:int query:string geo:flags.0?GeoPoint id:string msg_id:flags.1?InputBotInlineMessageID = Update; updateEditChannelMessage#1b3f4df7 message:Message pts:int pts_count:int = Update; -updateChannelPinnedMessage#98592475 channel_id:int id:int = Update; updateBotCallbackQuery#e73547e1 flags:# query_id:long user_id:int peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update; updateInlineBotCallbackQuery#f9d27a5a flags:# query_id:long user_id:int msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update; @@ -338,8 +339,6 @@ updateChannelReadMessagesContents#89893b45 channel_id:int messages:Vector = updateContactsReset#7084a7be = Update; updateChannelAvailableMessages#70db6837 channel_id:int available_min_id:int = Update; updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update; -updateUserPinnedMessage#4c43da18 user_id:int id:int = Update; -updateChatPinnedMessage#e10db349 chat_id:int id:int version:int = Update; updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update; updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update; updateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update; @@ -361,6 +360,8 @@ updateReadChannelDiscussionInbox#1cc7de54 flags:# channel_id:int top_msg_id:int updateReadChannelDiscussionOutbox#4638a26c channel_id:int top_msg_id:int read_max_id:int = Update; updatePeerBlocked#246a4b22 peer_id:Peer blocked:Bool = Update; updateChannelUserTyping#ff2abe9f flags:# channel_id:int top_msg_id:flags.0?int user_id:int action:SendMessageAction = Update; +updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vector pts:int pts_count:int = Update; +updatePinnedChannelMessages#8588878b flags:# pinned:flags.0?true channel_id:int messages:Vector pts:int pts_count:int = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -607,6 +608,7 @@ channelParticipantSelf#a3289a6d user_id:int inviter_id:int date:int = ChannelPar channelParticipantCreator#447dca4b flags:# user_id:int admin_rights:ChatAdminRights rank:flags.0?string = ChannelParticipant; channelParticipantAdmin#ccbebbaf flags:# can_edit:flags.0?true self:flags.1?true user_id:int inviter_id:flags.1?int promoted_by:int date:int admin_rights:ChatAdminRights rank:flags.2?string = ChannelParticipant; channelParticipantBanned#1c0facaf flags:# left:flags.0?true user_id:int kicked_by:int date:int banned_rights:ChatBannedRights = ChannelParticipant; +channelParticipantLeft#c3c6796b user_id:int = ChannelParticipant; channelParticipantsRecent#de3f3c79 = ChannelParticipantsFilter; channelParticipantsAdmins#b4608969 = ChannelParticipantsFilter; @@ -615,6 +617,7 @@ channelParticipantsBots#b0d1865b = ChannelParticipantsFilter; channelParticipantsBanned#1427a5e1 q:string = ChannelParticipantsFilter; channelParticipantsSearch#656ac4b q:string = ChannelParticipantsFilter; channelParticipantsContacts#bb6ae88d q:string = ChannelParticipantsFilter; +channelParticipantsMentions#e04b5ceb flags:# q:flags.0?string top_msg_id:flags.1?int = ChannelParticipantsFilter; channels.channelParticipants#f56ee2a8 count:int participants:Vector users:Vector = channels.ChannelParticipants; channels.channelParticipantsNotModified#f0173fe9 = channels.ChannelParticipants; @@ -628,7 +631,7 @@ messages.savedGifs#2e0709a5 hash:int gifs:Vector = messages.SavedGifs; inputBotInlineMessageMediaAuto#3380c786 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; inputBotInlineMessageText#3dcd7a87 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; -inputBotInlineMessageMediaGeo#c1b15d65 flags:# geo_point:InputGeoPoint period:int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; +inputBotInlineMessageMediaGeo#96929a85 flags:# geo_point:InputGeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; inputBotInlineMessageMediaVenue#417bbf11 flags:# geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; inputBotInlineMessageMediaContact#a6edbffd flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; inputBotInlineMessageGame#4b425864 flags:# reply_markup:flags.2?ReplyMarkup = InputBotInlineMessage; @@ -640,7 +643,7 @@ inputBotInlineResultGame#4fa417f2 id:string short_name:string send_message:Input botInlineMessageMediaAuto#764cf810 flags:# message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; botInlineMessageText#8c7f65e2 flags:# no_webpage:flags.0?true message:string entities:flags.1?Vector reply_markup:flags.2?ReplyMarkup = BotInlineMessage; -botInlineMessageMediaGeo#b722de65 flags:# geo:GeoPoint period:int reply_markup:flags.2?ReplyMarkup = BotInlineMessage; +botInlineMessageMediaGeo#51846fd flags:# geo:GeoPoint heading:flags.0?int period:flags.1?int proximity_notification_radius:flags.3?int reply_markup:flags.2?ReplyMarkup = BotInlineMessage; botInlineMessageMediaVenue#8a86659c flags:# geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; botInlineMessageMediaContact#18d1cdc2 flags:# phone_number:string first_name:string last_name:string vcard:string reply_markup:flags.2?ReplyMarkup = BotInlineMessage; @@ -1164,8 +1167,6 @@ messageViews#455b853d flags:# views:flags.0?int forwards:flags.1?int replies:fla messages.messageViews#b6c4f543 views:Vector chats:Vector users:Vector = messages.MessageViews; -stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats; - messages.discussionMessage#f5dd8f9d flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int chats:Vector users:Vector = messages.DiscussionMessage; messageReplyHeader#a6d57763 flags:# reply_to_msg_id:int reply_to_peer_id:flags.0?Peer reply_to_top_id:flags.1?int = MessageReplyHeader; @@ -1174,6 +1175,8 @@ messageReplies#4128faac flags:# comments:flags.0?true replies:int replies_pts:in peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked; +stats.messageStats#8999f295 views_graph:StatsGraph = stats.MessageStats; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1299,7 +1302,7 @@ contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_hi messages.getMessages#63c66506 id:Vector = messages.Messages; messages.getDialogs#a0ee3b73 flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs; messages.getHistory#dcbb8260 peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; -messages.search#4e17810b flags:# peer:InputPeer q:string from_id:flags.0?InputUser top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; +messages.search#c352eec flags:# peer:InputPeer q:string from_id:flags.0?InputPeer top_msg_id:flags.1?int filter:MessagesFilter min_date:int max_date:int offset_id:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; messages.readHistory#e306d3a peer:InputPeer max_id:int = messages.AffectedMessages; messages.deleteHistory#1c015b09 flags:# just_clear:flags.0?true revoke:flags.1?true peer:InputPeer max_id:int = messages.AffectedHistory; messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; @@ -1393,7 +1396,7 @@ messages.getSplitRanges#1cff7e08 = Vector; messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool; messages.getDialogUnreadMarks#22e24e22 = Vector; messages.clearAllDrafts#7e58ee9c = Bool; -messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true peer:InputPeer id:int = Updates; +messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates; messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates; messages.getPollResults#73bb643b peer:InputPeer msg_id:int = Updates; messages.getOnlines#6e2be050 peer:InputPeer = ChatOnlines; @@ -1422,6 +1425,7 @@ messages.getOldFeaturedStickers#5fe7025b offset:int limit:int hash:int = message messages.getReplies#24b581ba peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:int = messages.Messages; messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage; messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool; +messages.unpinAllMessages#f025bc8b peer:InputPeer = messages.AffectedHistory; updates.getState#edd4882a = updates.State; updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; @@ -1543,4 +1547,4 @@ stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel stats.getMessagePublicForwards#5630281b channel:InputChannel msg_id:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats; -// LAYER 119 +// LAYER 120 diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index 28673ceacb..7865403d6b 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1998,31 +1998,6 @@ void Updates::feedUpdate(const MTPUpdate &update) { } } break; - // Pinned message. - case mtpc_updateUserPinnedMessage: { - const auto &d = update.c_updateUserPinnedMessage(); - if (const auto user = session().data().userLoaded(d.vuser_id().v)) { - user->setPinnedMessageId(d.vid().v); - } - } break; - - case mtpc_updateChatPinnedMessage: { - const auto &d = update.c_updateChatPinnedMessage(); - if (const auto chat = session().data().chatLoaded(d.vchat_id().v)) { - const auto status = chat->applyUpdateVersion(d.vversion().v); - if (status == ChatData::UpdateStatus::Good) { - chat->setPinnedMessageId(d.vid().v); - } - } - } break; - - case mtpc_updateChannelPinnedMessage: { - const auto &d = update.c_updateChannelPinnedMessage(); - if (const auto channel = session().data().channelLoaded(d.vchannel_id().v)) { - channel->setPinnedMessageId(d.vid().v); - } - } break; - ////// Cloud sticker sets case mtpc_updateNewStickerSet: { const auto &d = update.c_updateNewStickerSet(); diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index a082d9b88a..5c4cd1225f 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -1692,6 +1692,9 @@ void ApiWrap::requestSelfParticipant(not_null channel) { }, [&](const MTPDchannelParticipant &data) { LOG(("API Error: Got self regular participant.")); finalize(-1, 0); + }, [&](const MTPDchannelParticipantLeft &data) { + LOG(("API Error: Got self left participant.")); + finalize(-1, 0); }); }); }).fail([=](const RPCError &error) { diff --git a/Telegram/SourceFiles/boxes/peers/add_participants_box.h b/Telegram/SourceFiles/boxes/peers/add_participants_box.h index 2761d172d7..122491c6d3 100644 --- a/Telegram/SourceFiles/boxes/peers/add_participants_box.h +++ b/Telegram/SourceFiles/boxes/peers/add_participants_box.h @@ -86,6 +86,9 @@ public: AdminDoneCallback adminDoneCallback, BannedDoneCallback bannedDoneCallback); + [[nodiscard]] not_null peer() const { + return _peer; + } [[nodiscard]] Main::Session &session() const override; void prepare() override; void rowClicked(not_null row) override; diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index 9fb27894ae..3cc3aca221 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -557,6 +557,8 @@ UserData *ParticipantsAdditionalData::applyParticipant( return logBad(); } return applyBanned(data); + }, [&](const MTPDchannelParticipantLeft &data) { + return logBad(); }); } diff --git a/Telegram/SourceFiles/calls/calls_box_controller.cpp b/Telegram/SourceFiles/calls/calls_box_controller.cpp index 1e03fa1531..f671469aa7 100644 --- a/Telegram/SourceFiles/calls/calls_box_controller.cpp +++ b/Telegram/SourceFiles/calls/calls_box_controller.cpp @@ -296,7 +296,7 @@ void BoxController::loadMoreRows() { MTP_flags(0), MTP_inputPeerEmpty(), MTP_string(), - MTP_inputUserEmpty(), + MTP_inputPeerEmpty(), MTPint(), // top_msg_id MTP_inputMessagesFilterPhoneCalls(MTP_flags(0)), MTP_int(0), diff --git a/Telegram/SourceFiles/data/data_location.cpp b/Telegram/SourceFiles/data/data_location.cpp index c26e50e712..c08c6688fd 100644 --- a/Telegram/SourceFiles/data/data_location.cpp +++ b/Telegram/SourceFiles/data/data_location.cpp @@ -36,9 +36,11 @@ QString LocationPoint::lonAsString() const { MTPGeoPoint LocationPoint::toMTP() const { return MTP_geoPoint( + MTP_flags(0), MTP_double(_lon), MTP_double(_lat), - MTP_long(_access)); + MTP_long(_access), + MTP_int(0)); // accuracy_radius } float64 LocationPoint::lat() const { diff --git a/Telegram/SourceFiles/data/data_search_controller.cpp b/Telegram/SourceFiles/data/data_search_controller.cpp index 7de8f2fc08..367ed2e979 100644 --- a/Telegram/SourceFiles/data/data_search_controller.cpp +++ b/Telegram/SourceFiles/data/data_search_controller.cpp @@ -87,7 +87,7 @@ std::optional PrepareSearchRequest( MTP_flags(0), peer->input, MTP_string(query), - MTP_inputUserEmpty(), + MTP_inputPeerEmpty(), MTPint(), // top_msg_id filter, MTP_int(0), diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 5f4e323355..d7b03c4b85 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -380,7 +380,7 @@ int InnerWidget::searchedOffset() const { int InnerWidget::searchInChatSkip() const { auto result = st::searchedBarHeight + st::dialogsSearchInHeight; - if (_searchFromUser) { + if (_searchFromPeer) { result += st::lineWidth + st::dialogsSearchInHeight; } return result; @@ -811,7 +811,7 @@ void InnerWidget::paintSearchInChat(Painter &p) const { auto fullRect = QRect(0, top, width(), height - top); p.fillRect(fullRect, st::dialogsBg); - if (_searchFromUser) { + if (_searchFromPeer) { p.fillRect(QRect(0, top + st::dialogsSearchInHeight, width(), st::lineWidth), st::shadowFg); } @@ -829,7 +829,7 @@ void InnerWidget::paintSearchInChat(Painter &p) const { } else { Unexpected("Empty Key in paintSearchInChat."); } - if (const auto from = _searchFromUser) { + if (const auto from = _searchFromPeer) { top += st::dialogsSearchInHeight + st::lineWidth; p.setPen(st::dialogsTextFg); p.setTextPalette(st::dialogsSearchFromPalette); @@ -1868,7 +1868,7 @@ void InnerWidget::applyFilterUpdate(QString newFilter, bool force) { newFilter = words.isEmpty() ? QString() : words.join(' '); if (newFilter != _filter || force) { _filter = newFilter; - if (_filter.isEmpty() && !_searchFromUser) { + if (_filter.isEmpty() && !_searchFromPeer) { clearFilter(); } else { _state = WidgetState::Filtered; @@ -2328,7 +2328,7 @@ bool InnerWidget::hasFilteredResults() const { return !_filterResults.empty() && _hashtagResults.empty(); } -void InnerWidget::searchInChat(Key key, UserData *from) { +void InnerWidget::searchInChat(Key key, PeerData *from) { _searchInMigrated = nullptr; if (const auto peer = key.peer()) { if (const auto migrateTo = peer->migrateTo()) { @@ -2338,7 +2338,7 @@ void InnerWidget::searchInChat(Key key, UserData *from) { } } _searchInChat = key; - _searchFromUser = from; + _searchFromPeer = from; if (_searchInChat) { _controller->closeFolder(); onHashtagFilterUpdate(QStringRef()); @@ -2347,9 +2347,9 @@ void InnerWidget::searchInChat(Key key, UserData *from) { } else { _cancelSearchInChat->hide(); } - if (_searchFromUser) { + if (_searchFromPeer) { _cancelSearchFromUser->show(); - _searchFromUserUserpic = _searchFromUser->createUserpicView(); + _searchFromUserUserpic = _searchFromPeer->createUserpicView(); } else { _cancelSearchFromUser->hide(); _searchFromUserUserpic = nullptr; @@ -2386,7 +2386,7 @@ void InnerWidget::refreshSearchInChatLabel() { dialog, Ui::DialogTextOptions()); } - const auto from = _searchFromUser ? _searchFromUser->name : QString(); + const auto from = _searchFromPeer ? _searchFromPeer->name : QString(); if (!from.isEmpty()) { const auto fromUserText = tr::lng_dlg_search_from( tr::now, diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h index e6a245d1f2..ea3a59fa25 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.h @@ -109,7 +109,7 @@ public: } bool hasFilteredResults() const; - void searchInChat(Key key, UserData *from); + void searchInChat(Key key, PeerData *from); void applyFilterUpdate(QString newFilter, bool force = false); void onHashtagFilterUpdate(QStringRef newFilter); @@ -119,7 +119,7 @@ public: void setLoadMoreCallback(Fn callback); [[nodiscard]] rpl::producer<> listBottomReached() const; - base::Observable searchFromUserChanged; + base::Observable searchFromUserChanged; [[nodiscard]] rpl::producer chosenRow() const; [[nodiscard]] rpl::producer<> updated() const; @@ -395,7 +395,7 @@ private: Key _searchInChat; History *_searchInMigrated = nullptr; - UserData *_searchFromUser = nullptr; + PeerData *_searchFromPeer = nullptr; mutable std::shared_ptr _searchInChatUserpic; mutable std::shared_ptr _searchFromUserUserpic; Ui::Text::String _searchInChatText; diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp b/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp index 770b6d7591..6ff20477c8 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.cpp @@ -19,7 +19,7 @@ namespace Dialogs { void ShowSearchFromBox( not_null peer, - Fn)> callback, + Fn)> callback, Fn closedCallback) { auto createController = [ peer, @@ -47,33 +47,33 @@ void ShowSearchFromBox( SearchFromController::SearchFromController( not_null peer, - Fn)> callback) + Fn)> callback) : AddSpecialBoxController( peer, ParticipantsBoxController::Role::Members, AdminDoneCallback(), BannedDoneCallback()) -, _callback(std::move(callback)) -{ +, _callback(std::move(callback)) { _excludeSelf = false; } void SearchFromController::prepare() { AddSpecialBoxController::prepare(); delegate()->peerListSetTitle(tr::lng_search_messages_from()); -} - -void SearchFromController::rowClicked(not_null row) { - Expects(row->peer()->isUser()); - - if (const auto onstack = base::duplicate(_callback)) { - onstack(row->peer()->asUser()); + if (const auto megagroup = peer()->asMegagroup()) { + if (!delegate()->peerListFindRow(megagroup->id)) { + delegate()->peerListAppendRow( + std::make_unique(megagroup)); + setDescriptionText({}); + delegate()->peerListRefreshRows(); + } } } -std::unique_ptr SearchFromController::createRow( - not_null user) const { - return std::make_unique(user); +void SearchFromController::rowClicked(not_null row) { + if (const auto onstack = base::duplicate(_callback)) { + onstack(row->peer()); + } } } // namespace Dialogs diff --git a/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.h b/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.h index 709353bb5f..f095ae566d 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.h +++ b/Telegram/SourceFiles/dialogs/dialogs_search_from_controllers.h @@ -14,23 +14,20 @@ namespace Dialogs { void ShowSearchFromBox( not_null peer, - Fn)> callback, + Fn)> callback, Fn closedCallback); class SearchFromController : public AddSpecialBoxController { public: SearchFromController( not_null peer, - Fn)> callback); + Fn)> callback); void prepare() override; void rowClicked(not_null row) override; -protected: - std::unique_ptr createRow(not_null user) const; - private: - Fn)> _callback; + Fn)> _callback; }; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 3e00d4b877..731a4f9578 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -208,8 +208,8 @@ Widget::Widget( connect(_inner, SIGNAL(completeHashtag(QString)), this, SLOT(onCompleteHashtag(QString))); connect(_inner, SIGNAL(refreshHashtags()), this, SLOT(onFilterCursorMoved())); connect(_inner, SIGNAL(cancelSearchInChat()), this, SLOT(onCancelSearchInChat())); - subscribe(_inner->searchFromUserChanged, [this](UserData *user) { - setSearchInChat(_searchInChat, user); + subscribe(_inner->searchFromUserChanged, [this](PeerData *from) { + setSearchInChat(_searchInChat, from); applyFilterUpdate(true); }); _inner->chosenRow( @@ -789,7 +789,7 @@ void Widget::onDraggingScrollTimer() { bool Widget::onSearchMessages(bool searchCache) { auto result = false; auto q = _filter->getLastText().trimmed(); - if (q.isEmpty() && !_searchFromUser) { + if (q.isEmpty() && !_searchFromAuthor) { cancelSearchRequest(); _api.request(base::take(_peerSearchRequest)).cancel(); return true; @@ -804,7 +804,7 @@ bool Widget::onSearchMessages(bool searchCache) { const auto i = _searchCache.find(q); if (i != _searchCache.end()) { _searchQuery = q; - _searchQueryFrom = _searchFromUser; + _searchQueryFrom = _searchFromAuthor; _searchNextRate = 0; _searchFull = _searchFullMigrated = false; cancelSearchRequest(); @@ -816,9 +816,9 @@ bool Widget::onSearchMessages(bool searchCache) { 0); result = true; } - } else if (_searchQuery != q || _searchQueryFrom != _searchFromUser) { + } else if (_searchQuery != q || _searchQueryFrom != _searchFromAuthor) { _searchQuery = q; - _searchQueryFrom = _searchFromUser; + _searchQueryFrom = _searchFromAuthor; _searchNextRate = 0; _searchFull = _searchFullMigrated = false; cancelSearchRequest(); @@ -836,8 +836,8 @@ bool Widget::onSearchMessages(bool searchCache) { peer->input, MTP_string(_searchQuery), (_searchQueryFrom - ? _searchQueryFrom->inputUser - : MTP_inputUserEmpty()), + ? _searchQueryFrom->input + : MTP_inputPeerEmpty()), MTPint(), // top_msg_id MTP_inputMessagesFilterEmpty(), MTP_int(0), @@ -1009,8 +1009,8 @@ void Widget::onSearchMore() { peer->input, MTP_string(_searchQuery), (_searchQueryFrom - ? _searchQueryFrom->inputUser - : MTP_inputUserEmpty()), + ? _searchQueryFrom->input + : MTP_inputPeerEmpty()), MTPint(), // top_msg_id MTP_inputMessagesFilterEmpty(), MTP_int(0), @@ -1103,8 +1103,8 @@ void Widget::onSearchMore() { _searchInMigrated->peer->input, MTP_string(_searchQuery), (_searchQueryFrom - ? _searchQueryFrom->inputUser - : MTP_inputUserEmpty()), + ? _searchQueryFrom->input + : MTP_inputPeerEmpty()), MTPint(), // top_msg_id MTP_inputMessagesFilterEmpty(), MTP_int(0), @@ -1380,7 +1380,7 @@ void Widget::applyFilterUpdate(bool force) { auto filterText = _filter->getLastText(); _inner->applyFilterUpdate(filterText, force); - if (filterText.isEmpty() && !_searchFromUser) { + if (filterText.isEmpty() && !_searchFromAuthor) { clearSearchCache(); } _cancelSearch->toggle(!filterText.isEmpty(), anim::type::normal); @@ -1395,7 +1395,7 @@ void Widget::applyFilterUpdate(bool force) { _peerSearchQuery = QString(); } - if (_chooseFromUser->toggled() || _searchFromUser) { + if (_chooseFromUser->toggled() || _searchFromAuthor) { auto switchToChooseFrom = SwitchToChooseFromQuery(); if (_lastFilterText != switchToChooseFrom && switchToChooseFrom.startsWith(_lastFilterText) @@ -1412,7 +1412,7 @@ void Widget::searchInChat(Key chat) { applyFilterUpdate(true); } -void Widget::setSearchInChat(Key chat, UserData *from) { +void Widget::setSearchInChat(Key chat, PeerData *from) { if (chat.folder()) { chat = Key(); } @@ -1433,13 +1433,13 @@ void Widget::setSearchInChat(Key chat, UserData *from) { } else if (!_searchInChat) { from = nullptr; } - if (_searchFromUser != from || searchInPeerUpdated) { - _searchFromUser = from; + if (_searchFromAuthor != from || searchInPeerUpdated) { + _searchFromAuthor = from; updateSearchFromVisibility(); clearSearchCache(); } - _inner->searchInChat(_searchInChat, _searchFromUser); - if (_searchFromUser && _lastFilterText == SwitchToChooseFromQuery()) { + _inner->searchInChat(_searchInChat, _searchFromAuthor); + if (_searchFromAuthor && _lastFilterText == SwitchToChooseFromQuery()) { onCancelSearch(); } _filter->setFocus(); @@ -1467,9 +1467,9 @@ void Widget::showSearchFrom() { const auto chat = _searchInChat; ShowSearchFromBox( peer, - crl::guard(this, [=](not_null user) { + crl::guard(this, [=](not_null from) { Ui::hideLayer(); - setSearchInChat(chat, user); + setSearchInChat(chat, from); applyFilterUpdate(true); }), crl::guard(this, [=] { _filter->setFocus(); })); @@ -1558,7 +1558,7 @@ void Widget::updateSearchFromVisibility(bool fast) { auto visible = [&] { if (const auto peer = _searchInChat.peer()) { if (peer->isChat() || peer->isMegagroup()) { - return !_searchFromUser; + return !_searchFromAuthor; } } return false; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index f50b5b9e2b..271754f095 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -141,7 +141,7 @@ private: void setupConnectingWidget(); void setupMainMenuToggle(); bool searchForPeersRequired(const QString &query) const; - void setSearchInChat(Key chat, UserData *from = nullptr); + void setSearchInChat(Key chat, PeerData *from = nullptr); void showJumpToDate(); void showSearchFrom(); void showMainMenu(); @@ -212,7 +212,7 @@ private: Data::Folder *_openedFolder = nullptr; Dialogs::Key _searchInChat; History *_searchInMigrated = nullptr; - UserData *_searchFromUser = nullptr; + PeerData *_searchFromAuthor = nullptr; QString _lastFilterText; QTimer _searchTimer; @@ -222,7 +222,7 @@ private: mtpRequestId _peerSearchRequest = 0; QString _searchQuery; - UserData *_searchQueryFrom = nullptr; + PeerData *_searchQueryFrom = nullptr; int32 _searchNextRate = 0; bool _searchFull = false; bool _searchFullMigrated = false; diff --git a/Telegram/SourceFiles/export/data/export_data_types.cpp b/Telegram/SourceFiles/export/data/export_data_types.cpp index 260865f3c9..3819cbec11 100644 --- a/Telegram/SourceFiles/export/data/export_data_types.cpp +++ b/Telegram/SourceFiles/export/data/export_data_types.cpp @@ -1094,6 +1094,12 @@ ServiceAction ParseServiceAction( result.content = content; }, [&](const MTPDmessageActionContactSignUp &data) { result.content = ActionContactSignUp(); + }, [&](const MTPDmessageActionGeoProximityReached &data) { + auto content = ActionGeoProximityReached(); + content.fromId = ParsePeerId(data.vfrom_id()); + content.toId = ParsePeerId(data.vto_id()); + content.distance = data.vdistance().v; + result.content = content; }, [](const MTPDmessageActionEmpty &data) {}); return result; } diff --git a/Telegram/SourceFiles/export/data/export_data_types.h b/Telegram/SourceFiles/export/data/export_data_types.h index 06fc860ba6..70fbf56afd 100644 --- a/Telegram/SourceFiles/export/data/export_data_types.h +++ b/Telegram/SourceFiles/export/data/export_data_types.h @@ -450,6 +450,12 @@ struct ActionContactSignUp { struct ActionPhoneNumberRequest { }; +struct ActionGeoProximityReached { + PeerId fromId = 0; + PeerId toId = 0; + int distance = 0; +}; + struct ServiceAction { std::variant< v::null_t, @@ -473,7 +479,8 @@ struct ServiceAction { ActionBotAllowed, ActionSecureValuesSent, ActionContactSignUp, - ActionPhoneNumberRequest> content; + ActionPhoneNumberRequest, + ActionGeoProximityReached> content; }; ServiceAction ParseServiceAction( diff --git a/Telegram/SourceFiles/export/export_api_wrap.cpp b/Telegram/SourceFiles/export/export_api_wrap.cpp index 88caefa004..b317617e02 100644 --- a/Telegram/SourceFiles/export/export_api_wrap.cpp +++ b/Telegram/SourceFiles/export/export_api_wrap.cpp @@ -1429,7 +1429,7 @@ void ApiWrap::requestChatMessages( MTP_flags(MTPmessages_Search::Flag::f_from_id), realPeerInput, MTP_string(), // query - _user, + MTP_inputPeerSelf(), MTPint(), // top_msg_id MTP_inputMessagesFilterEmpty(), MTP_int(0), // min_date diff --git a/Telegram/SourceFiles/export/output/export_output_html.cpp b/Telegram/SourceFiles/export/output/export_output_html.cpp index 61b692d35a..c527decca8 100644 --- a/Telegram/SourceFiles/export/output/export_output_html.cpp +++ b/Telegram/SourceFiles/export/output/export_output_html.cpp @@ -1092,6 +1092,8 @@ auto HtmlWriter::Wrap::pushMessage( + SerializeList(list); }, [&](const ActionContactSignUp &data) { return serviceFrom + " joined Telegram"; + }, [&](const ActionGeoProximityReached &data) { + return serviceFrom + " reached"; // #TODO files distance from to }, [&](const ActionPhoneNumberRequest &data) { return serviceFrom + " requested your phone number"; }, [](v::null_t) { return QByteArray(); }); diff --git a/Telegram/SourceFiles/export/output/export_output_json.cpp b/Telegram/SourceFiles/export/output/export_output_json.cpp index 4989e16086..20d6169b51 100644 --- a/Telegram/SourceFiles/export/output/export_output_json.cpp +++ b/Telegram/SourceFiles/export/output/export_output_json.cpp @@ -473,6 +473,9 @@ QByteArray SerializeMessage( }, [&](const ActionContactSignUp &data) { pushActor(); pushAction("joined_telegram"); + }, [&](const ActionGeoProximityReached &data) { + pushActor(); + pushAction("proximity_reached"); // #TODO files distance from to }, [&](const ActionPhoneNumberRequest &data) { pushActor(); pushAction("requested_phone_number"); diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index 1ea514dfee..b3e61a7cfc 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -260,6 +260,8 @@ void HistoryService::setMessageByAction(const MTPmessageAction &action) { return prepareSecureValuesSent(data); }, [&](const MTPDmessageActionContactSignUp &data) { return prepareContactSignUp(); + }, [&](const MTPDmessageActionGeoProximityReached &data) { + return PreparedText{ tr::lng_message_empty(tr::now) }; // #TODO files }, [](const MTPDmessageActionPaymentSentMe &) { LOG(("API Error: messageActionPaymentSentMe received.")); return PreparedText{ tr::lng_message_empty(tr::now) }; diff --git a/Telegram/SourceFiles/storage/download_manager_mtproto.cpp b/Telegram/SourceFiles/storage/download_manager_mtproto.cpp index 093d4c01e2..4ba4a9ce92 100644 --- a/Telegram/SourceFiles/storage/download_manager_mtproto.cpp +++ b/Telegram/SourceFiles/storage/download_manager_mtproto.cpp @@ -541,8 +541,10 @@ mtpRequestId DownloadMtprotoTask::sendRequest( return api().request(MTPupload_GetWebFile( MTP_inputWebFileGeoPointLocation( MTP_inputGeoPoint( + MTP_flags(0), MTP_double(location.lat), - MTP_double(location.lon)), + MTP_double(location.lon), + MTP_int(0)), // accuracy_radius MTP_long(location.access), MTP_int(location.width), MTP_int(location.height),