TimeId DateFromMessage(const MTPmessage &message) { return message.match([](const MTPDmessageEmpty &) { return TimeId(0); }, [](const auto &message) { return message.vdate.v; }); }
not_null<HistoryItem*> HistoryItem::Create( not_null<History*> history, const MTPMessage &message) { return message.match([&](const MTPDmessage &data) -> HistoryItem* { const auto checked = data.has_media() ? CheckMessageMedia(data.vmedia) : MediaCheckResult::Good; if (checked == MediaCheckResult::Unsupported) { return CreateUnsupportedMessage( history, data.vid.v, data.vflags.v, data.vreply_to_msg_id.v, data.vvia_bot_id.v, data.vdate.v, data.vfrom_id.v); } else if (checked == MediaCheckResult::Empty) { const auto text = HistoryService::PreparedText { lang(lng_message_empty) }; return new HistoryService( history, data.vid.v, data.vdate.v, text, data.vflags.v, data.has_from_id() ? data.vfrom_id.v : UserId(0)); } else if (checked == MediaCheckResult::HasTimeToLive) { return new HistoryService(history, data); } return new HistoryMessage(history, data); }, [&](const MTPDmessageService &data) -> HistoryItem* { if (data.vaction.type() == mtpc_messageActionPhoneCall) { return new HistoryMessage(history, data); } return new HistoryService(history, data); }, [&](const MTPDmessageEmpty &data) -> HistoryItem* { const auto text = HistoryService::PreparedText{ lang(lng_message_empty) }; return new HistoryService(history, data.vid.v, TimeId(0), text); }); }
void HistoryMessage::createComponents(const CreateConfig &config) { uint64 mask = 0; if (config.replyTo) { mask |= HistoryMessageReply::Bit(); } if (config.viaBotId) { mask |= HistoryMessageVia::Bit(); } if (config.viewsCount >= 0) { mask |= HistoryMessageViews::Bit(); } if (!config.author.isEmpty()) { mask |= HistoryMessageSigned::Bit(); } auto hasViaBot = (config.viaBotId != 0); auto hasInlineMarkup = [&config] { if (config.mtpMarkup) { return (config.mtpMarkup->type() == mtpc_replyInlineMarkup); } return (config.inlineMarkup != nullptr); }; if (config.editDate != TimeId(0)) { mask |= HistoryMessageEdited::Bit(); } if (config.senderOriginal) { mask |= HistoryMessageForwarded::Bit(); } if (config.mtpMarkup) { // optimization: don't create markup component for the case // MTPDreplyKeyboardHide with flags = 0, assume it has f_zero flag if (config.mtpMarkup->type() != mtpc_replyKeyboardHide || config.mtpMarkup->c_replyKeyboardHide().vflags.v != 0) { mask |= HistoryMessageReplyMarkup::Bit(); } } else if (config.inlineMarkup) { mask |= HistoryMessageReplyMarkup::Bit(); } UpdateComponents(mask); if (const auto reply = Get<HistoryMessageReply>()) { reply->replyToMsgId = config.replyTo; if (!reply->updateData(this)) { Auth().api().requestMessageData( history()->peer->asChannel(), reply->replyToMsgId, HistoryDependentItemCallback(fullId())); } } if (const auto via = Get<HistoryMessageVia>()) { via->create(config.viaBotId); } if (const auto views = Get<HistoryMessageViews>()) { views->_views = config.viewsCount; } if (const auto edited = Get<HistoryMessageEdited>()) { edited->date = config.editDate; } if (const auto msgsigned = Get<HistoryMessageSigned>()) { msgsigned->author = config.author; } if (const auto forwarded = Get<HistoryMessageForwarded>()) { forwarded->originalDate = config.originalDate; forwarded->originalSender = App::peer(config.senderOriginal); forwarded->originalId = config.originalId; forwarded->originalAuthor = config.authorOriginal; forwarded->savedFromPeer = App::peerLoaded(config.savedFromPeer); forwarded->savedFromMsgId = config.savedFromMsgId; } if (const auto markup = Get<HistoryMessageReplyMarkup>()) { if (config.mtpMarkup) { markup->create(*config.mtpMarkup); } else if (config.inlineMarkup) { markup->create(*config.inlineMarkup); } if (markup->flags & MTPDreplyKeyboardMarkup_ClientFlag::f_has_switch_inline_button) { _flags |= MTPDmessage_ClientFlag::f_has_switch_inline_button; } } _fromNameVersion = displayFrom()->nameVersion; }
TimeId Element::displayedEditDate() const { return TimeId(0); }