/* 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 { 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; }; struct HistoryServiceSelfDestruct : public RuntimeComponent { enum class Type { Photo, Video, }; Type type = Type::Photo; crl::time timeToLive = 0; crl::time destructAt = 0; }; 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; bool needCheck() const override { return false; } 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 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(); friend class HistoryView::Service; }; not_null GenerateJoinedMessage( not_null history, TimeId inviteDate, not_null inviter, MTPDmessage::Flags flags);