/* 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 "history/history_item.h" namespace HistoryView { class Service; } // namespace HistoryView struct HistoryServiceDependentData { PeerId peerId = 0; MsgId msgId = 0; HistoryItem *msg = nullptr; ClickHandlerPtr lnk; }; struct HistoryServicePinned : public RuntimeComponent , public HistoryServiceDependentData { }; struct HistoryServiceGameScore : public RuntimeComponent , public HistoryServiceDependentData { int score = 0; }; struct HistoryServicePayment : public RuntimeComponent , public HistoryServiceDependentData { QString amount; ClickHandlerPtr invoiceLink; }; struct HistoryServiceSelfDestruct : public RuntimeComponent { enum class Type { Photo, Video, }; Type type = Type::Photo; crl::time timeToLive = 0; crl::time destructAt = 0; }; struct HistoryServiceOngoingCall : public RuntimeComponent { uint64 id = 0; ClickHandlerPtr link; rpl::lifetime lifetime; }; namespace HistoryView { class ServiceMessagePainter; } // namespace HistoryView class HistoryService : public HistoryItem { public: struct PreparedText { QString text; QList links; }; HistoryService( not_null history, const MTPDmessage &data, MTPDmessage_ClientFlags clientFlags); HistoryService( not_null history, const MTPDmessageService &data, MTPDmessage_ClientFlags clientFlags); HistoryService( not_null history, MsgId id, MTPDmessage_ClientFlags clientFlags, TimeId date, const PreparedText &message, MTPDmessage::Flags flags = 0, PeerId from = 0, PhotoData *photo = nullptr); bool updateDependencyItem() override; MsgId dependencyMsgId() const override { if (auto dependent = GetDependentData()) { return dependent->msgId; } return 0; } bool notificationReady() const override { if (auto dependent = GetDependentData()) { return (dependent->msg || !dependent->msgId); } return true; } void applyEdition(const MTPDmessageService &message) override; crl::time getSelfDestructIn(crl::time now) override; Storage::SharedMediaTypesMask sharedMediaTypes() const override; void dependencyItemRemoved(HistoryItem *dependency) override; bool needCheck() const override; bool serviceMsg() const override { return true; } QString inDialogsText(DrawInDialog way) const override; QString inReplyText() const override; std::unique_ptr createView( not_null delegate, HistoryView::Element *replacing = nullptr) override; void setServiceText(const PreparedText &prepared); ~HistoryService(); protected: friend class HistoryView::ServiceMessagePainter; void markMediaAsReadHook() override; QString fromLinkText() const; ClickHandlerPtr fromLink() const; void removeMedia(); private: HistoryServiceDependentData *GetDependentData() { if (auto pinned = Get()) { return pinned; } else if (auto gamescore = Get()) { return gamescore; } else if (auto payment = Get()) { return payment; } return nullptr; } const HistoryServiceDependentData *GetDependentData() const { return const_cast(this)->GetDependentData(); } bool updateDependent(bool force = false); void updateDependentText(); void updateText(PreparedText &&text); void clearDependency(); void createFromMtp(const MTPDmessage &message); void createFromMtp(const MTPDmessageService &message); void setMessageByAction(const MTPmessageAction &action); void setSelfDestruct( HistoryServiceSelfDestruct::Type type, int ttlSeconds); void applyAction(const MTPMessageAction &action); PreparedText preparePinnedText(); PreparedText prepareGameScoreText(); PreparedText preparePaymentSentText(); PreparedText prepareInvitedToCallText( const QVector &users, uint64 linkCallId); PreparedText prepareCallScheduledText( TimeId scheduleDate); friend class HistoryView::Service; }; [[nodiscard]] not_null GenerateJoinedMessage( not_null history, TimeId inviteDate, not_null inviter, MTPDmessage::Flags flags); [[nodiscard]] std::optional PeerHasThisCall( not_null peer, uint64 id);