/* 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 "base/object_ptr.h" class History; namespace style { struct FlatLabel; struct Checkbox; } // namespace style namespace Api { struct SendOptions; struct SendAction; } // namespace Api namespace ChatHelpers { class Show; } // namespace ChatHelpers namespace Data { class Story; class Thread; struct SendError; struct SendErrorWithThread; } // namespace Data namespace Main { class Session; class SessionShow; } // namespace Main namespace Ui { class BoxContent; } // namespace Ui namespace Window { class SessionNavigation; } // namespace Window struct PreparedServiceText { TextWithEntities text; std::vector links; }; [[nodiscard]] MessageFlags FlagsFromMTP( MsgId id, MTPDmessage::Flags flags, MessageFlags localFlags); [[nodiscard]] MessageFlags FlagsFromMTP( MsgId id, MTPDmessageService::Flags flags, MessageFlags localFlags); [[nodiscard]] MTPMessageReplyHeader NewMessageReplyHeader( const Api::SendAction &action); enum class MediaCheckResult { Good, Unsupported, Empty, HasExpiredMediaTimeToLive, HasUnsupportedTimeToLive, HasStoryMention, }; [[nodiscard]] MediaCheckResult CheckMessageMedia( const MTPMessageMedia &media); [[nodiscard]] CallId CallIdFromInput(const MTPInputGroupCall &data); [[nodiscard]] std::vector> ParseInvitedToCallUsers( not_null item, const QVector &users); inline constexpr auto kMaxUnreadReactions = 5; // Now 3, but just in case. using OnStackUsers = std::array; [[nodiscard]] OnStackUsers LookupRecentUnreadReactedUsers( not_null item); void CheckReactionNotificationSchedule( not_null item, const OnStackUsers &wasUsers); [[nodiscard]] MessageFlags NewForwardedFlags( not_null peer, PeerId from, not_null fwd); [[nodiscard]] MessageFlags FinalizeMessageFlags( not_null history, MessageFlags flags); [[nodiscard]] bool CopyMarkupToForward(not_null item); [[nodiscard]] TextWithEntities EnsureNonEmpty( const TextWithEntities &text = TextWithEntities()); [[nodiscard]] TextWithEntities UnsupportedMessageText(); void RequestDependentMessageItem( not_null item, PeerId peerId, MsgId msgId); void RequestDependentMessageStory( not_null item, PeerId peerId, StoryId storyId); [[nodiscard]] MessageFlags NewMessageFlags(not_null peer); [[nodiscard]] TimeId NewMessageDate(TimeId scheduled); [[nodiscard]] TimeId NewMessageDate(const Api::SendOptions &options); [[nodiscard]] PeerId NewMessageFromId(const Api::SendAction &action); [[nodiscard]] QString NewMessagePostAuthor(const Api::SendAction &action); [[nodiscard]] bool ShouldSendSilent( not_null peer, const Api::SendOptions &options); [[nodiscard]] HistoryItem *LookupReplyTo( not_null history, FullMsgId replyToId); [[nodiscard]] MsgId LookupReplyToTop( not_null history, HistoryItem *replyTo); [[nodiscard]] MsgId LookupReplyToTop( not_null history, FullReplyTo replyTo); [[nodiscard]] bool LookupReplyIsTopicPost(HistoryItem *replyTo); struct SendingErrorRequest { MsgId topicRootId = 0; const HistoryItemsList *forward = nullptr; const Data::Story *story = nullptr; const TextWithTags *text = nullptr; int messagesCount = 0; bool ignoreSlowmodeCountdown = false; }; [[nodiscard]] int ComputeSendingMessagesCount( not_null history, const SendingErrorRequest &request); [[nodiscard]] Data::SendError GetErrorForSending( not_null peer, SendingErrorRequest request); [[nodiscard]] Data::SendError GetErrorForSending( not_null thread, SendingErrorRequest request); struct SendPaymentDetails { int messages = 0; int stars = 0; }; [[nodiscard]] std::optional ComputePaymentDetails( not_null peer, int messagesCount); struct PaidConfirmStyles { const style::FlatLabel *label = nullptr; const style::Checkbox *checkbox = nullptr; }; void ShowSendPaidConfirm( not_null navigation, not_null peer, SendPaymentDetails details, Fn confirmed, PaidConfirmStyles styles = {}); void ShowSendPaidConfirm( std::shared_ptr show, not_null peer, SendPaymentDetails details, Fn confirmed, PaidConfirmStyles styles = {}); void ShowSendPaidConfirm( std::shared_ptr show, const std::vector> &peers, SendPaymentDetails details, Fn confirmed, PaidConfirmStyles styles = {}); class SendPaymentHelper final { public: [[nodiscard]] bool check( not_null navigation, not_null peer, int messagesCount, int starsApproved, Fn resend, PaidConfirmStyles styles = {}); [[nodiscard]] bool check( std::shared_ptr show, not_null peer, int messagesCount, int starsApproved, Fn resend, PaidConfirmStyles styles = {}); void clear(); private: Fn _resend; rpl::lifetime _lifetime; }; [[nodiscard]] Data::SendErrorWithThread GetErrorForSending( const std::vector> &threads, SendingErrorRequest request); [[nodiscard]] object_ptr MakeSendErrorBox( const Data::SendErrorWithThread &error, bool withTitle); [[nodiscard]] TextWithEntities DropDisallowedCustomEmoji( not_null to, TextWithEntities text); [[nodiscard]] Main::Session *SessionByUniqueId(uint64 sessionUniqueId); [[nodiscard]] HistoryItem *MessageByGlobalId(GlobalMsgId globalId); [[nodiscard]] QDateTime ItemDateTime(not_null item); [[nodiscard]] QString ItemDateText( not_null item, bool isUntilOnline); [[nodiscard]] bool IsItemScheduledUntilOnline( not_null item); [[nodiscard]] ClickHandlerPtr JumpToMessageClickHandler( not_null peer, MsgId msgId, FullMsgId returnToId = FullMsgId(), TextWithEntities highlightPart = {}, int highlightPartOffsetHint = 0); [[nodiscard]] ClickHandlerPtr JumpToMessageClickHandler( not_null item, FullMsgId returnToId = FullMsgId(), TextWithEntities highlightPart = {}, int highlightPartOffsetHint = 0); [[nodiscard]] ClickHandlerPtr JumpToStoryClickHandler( not_null story); ClickHandlerPtr JumpToStoryClickHandler( not_null peer, StoryId storyId); [[nodiscard]] ClickHandlerPtr HideSponsoredClickHandler(); [[nodiscard]] ClickHandlerPtr ReportSponsoredClickHandler( not_null item); [[nodiscard]] ClickHandlerPtr AboutSponsoredClickHandler(); [[nodiscard]] not_null GenerateJoinedMessage( not_null history, TimeId inviteDate, not_null inviter, bool viaRequest); [[nodiscard]] std::optional PeerHasThisCall( not_null peer, CallId id); [[nodiscard]] rpl::producer PeerHasThisCallValue( not_null peer, CallId id); [[nodiscard]] ClickHandlerPtr GroupCallClickHandler( not_null peer, CallId callId); void ShowTrialTranscribesToast(int left, TimeId until); void ClearMediaAsExpired(not_null item); [[nodiscard]] int ItemsForwardSendersCount(const HistoryItemsList &list); [[nodiscard]] int ItemsForwardCaptionsCount(const HistoryItemsList &list);