// This is the source code of AyuGram for Desktop. // // We do not and cannot prevent the use of our code, // but be respectful and credit the original author. // // Copyright @Radolyn, 2025 #include "ayu/data/messages_storage.h" #include "ayu/ayu_constants.h" #include "ayu/data/ayu_database.h" #include "ayu/utils/ayu_mapper.h" #include "ayu/utils/telegram_helpers.h" #include "base/unixtime.h" #include "data/data_forum_topic.h" #include "data/data_session.h" #include "history/history.h" #include "history/history_item.h" #include "history/history_item_components.h" #include "main/main_session.h" namespace AyuMessages { template std::vector convertToBase(const std::vector &messages) { std::vector based; based.reserve(messages.size()); for (const auto &msg : messages) { based.push_back(static_cast(msg)); } return based; } void map(not_null item, AyuMessageBase &message) { const ID userId = item->history()->owner().session().userId().bare & PeerId::kChatTypeMask; message.userId = userId; message.dialogId = getDialogIdFromPeer(item->history()->peer); message.groupedId = item->groupId().raw(); message.peerId = item->history()->peer->id.value & PeerId::kChatTypeMask; message.fromId = item->from()->id.value & PeerId::kChatTypeMask; if (item->topic()) { message.topicId = item->topicRootId().bare; } message.messageId = item->id.bare; message.date = item->date(); message.flags = AyuMapper::mapItemFlagsToMTPFlags(item); if (const auto edited = item->Get()) { message.editDate = edited->date; } else { message.editDate = base::unixtime::now(); } message.views = item->viewsCount(); message.fwdFlags = 0; message.fwdFromId = 0; // message.fwdName message.fwdDate = 0; // message.fwdPostAuthor if (const auto msgsigned = item->Get()) { message.postAuthor = msgsigned->author.toStdString(); } message.replyFlags = 0; message.replyMessageId = 0; message.replyPeerId = 0; message.replyTopId = 0; message.replyForumTopic = false; // message.replySerialized // message.replyMarkupSerialized message.entityCreateDate = base::unixtime::now(); auto serializedText = AyuMapper::serializeTextWithEntities(item); message.text = serializedText.first; message.textEntities = serializedText.second; // todo: implement mapping message.mediaPath = "/"; // message.hqThumbPath message.documentType = DOCUMENT_TYPE_NONE; // message.documentSerialized // message.thumbsSerialized // message.documentAttributesSerialized // message.mimeType } void addEditedMessage(not_null item) { EditedMessage message; map(item, message); if (message.text.empty()) { return; } AyuDatabase::addEditedMessage(message); } std::vector getEditedMessages(not_null item, ID minId, ID maxId, int totalLimit) { const ID userId = item->history()->owner().session().userId().bare & PeerId::kChatTypeMask; const auto dialogId = getDialogIdFromPeer(item->history()->peer); const auto msgId = item->id.bare; return convertToBase(AyuDatabase::getEditedMessages(userId, dialogId, msgId, minId, maxId, totalLimit)); } bool hasRevisions(not_null item) { const ID userId = item->history()->owner().session().userId().bare & PeerId::kChatTypeMask; const auto dialogId = getDialogIdFromPeer(item->history()->peer); const auto msgId = item->id.bare; return AyuDatabase::hasRevisions(userId, dialogId, msgId); } void addDeletedMessage(not_null item) { DeletedMessage message; map(item, message); if (message.text.empty()) { return; } AyuDatabase::addDeletedMessage(message); } std::vector getDeletedMessages(not_null peer, ID topicId, ID minId, ID maxId, int totalLimit) { const ID userId = peer->session().userId().bare & PeerId::kChatTypeMask; return convertToBase( AyuDatabase::getDeletedMessages(userId, getDialogIdFromPeer(peer), topicId, minId, maxId, totalLimit)); } bool hasDeletedMessages(not_null peer, ID topicId) { const ID userId = peer->session().userId().bare & PeerId::kChatTypeMask; return AyuDatabase::hasDeletedMessages(userId, getDialogIdFromPeer(peer), topicId); } }