diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index c2559975d..648980508 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -101,6 +101,7 @@ PRIVATE ayu/ayu_settings.h ayu/ayu_lang.cpp ayu/ayu_lang.h + ayu/ayu_constants.h ayu/ui/utils/ayu_profile_values.cpp ayu/ui/utils/ayu_profile_values.h ayu/ui/settings/settings_ayu.cpp @@ -125,6 +126,8 @@ PRIVATE ayu/sync/utils/process_utils.hpp ayu/sync/utils/telegram_helpers.cpp ayu/sync/utils/telegram_helpers.h + ayu/messages/ayu_messages_controller.cpp + ayu/messages/ayu_messages_controller.h ayu/libs/pipe.hpp ayu/libs/json.hpp ayu/libs/json_ext.hpp diff --git a/Telegram/SourceFiles/ayu/ayu_constants.h b/Telegram/SourceFiles/ayu/ayu_constants.h new file mode 100644 index 000000000..9db48d847 --- /dev/null +++ b/Telegram/SourceFiles/ayu/ayu_constants.h @@ -0,0 +1,14 @@ +// 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, 2023 + +#pragma once + +// https://github.com/AyuGram/AyuGram4A/blob/rewrite/TMessagesProj/src/main/java/com/radolyn/ayugram/AyuConstants.java +constexpr int DOCUMENT_TYPE_NONE = 0; +constexpr int DOCUMENT_TYPE_PHOTO = 1; +constexpr int DOCUMENT_TYPE_STICKER = 2; +constexpr int DOCUMENT_TYPE_FILE = 3; diff --git a/Telegram/SourceFiles/ayu/database/ayu_database.cpp b/Telegram/SourceFiles/ayu/database/ayu_database.cpp index 9c5631d84..0a1f2d1c6 100644 --- a/Telegram/SourceFiles/ayu/database/ayu_database.cpp +++ b/Telegram/SourceFiles/ayu/database/ayu_database.cpp @@ -7,79 +7,104 @@ #include "ayu_database.h" -#include - #include "entities.h" #include "ayu/libs/sqlite/sqlite_orm.h" -#include "main/main_session.h" +#include "ayu/sync/utils/telegram_helpers.h" using namespace sqlite_orm; -auto storage = make_storage("ayugram.db", - make_table("editedmessage", - make_column("userId", &EditedMessage::userId), - make_column("dialogId", &EditedMessage::dialogId), - make_column("messageId", &EditedMessage::messageId), - make_column("text", &EditedMessage::text), - make_column("isDocument", &EditedMessage::isDocument), - make_column("path", &EditedMessage::path), - make_column("date", &EditedMessage::date) - ) +auto storage = make_storage( + "ayugram.db", + make_table( + "editedmessage", + make_column("userId", &EditedMessage::get_user_id, &EditedMessage::set_user_id), + make_column("dialogId", &EditedMessage::get_dialog_id, &EditedMessage::set_dialog_id), + make_column("groupedId", &EditedMessage::get_grouped_id, &EditedMessage::set_grouped_id), + make_column("peerId", &EditedMessage::get_peer_id, &EditedMessage::set_peer_id), + make_column("fromId", &EditedMessage::get_from_id, &EditedMessage::set_from_id), + make_column("topicId", &EditedMessage::get_topic_id, &EditedMessage::set_topic_id), + make_column("messageId", &EditedMessage::get_message_id, &EditedMessage::set_message_id), + make_column("date", &EditedMessage::get_date, &EditedMessage::set_date), + make_column("flags", &EditedMessage::get_flags, &EditedMessage::set_flags), + make_column("editDate", &EditedMessage::get_edit_date, &EditedMessage::set_edit_date), + make_column("editHide", &EditedMessage::is_edit_hide, &EditedMessage::set_edit_hide), + make_column("out", &EditedMessage::is_out, &EditedMessage::set_out), + make_column("entityCreateDate", &EditedMessage::get_entity_create_date, &EditedMessage::set_entity_create_date), + make_column("text", &EditedMessage::get_text, &EditedMessage::set_text), + make_column("textEntities", &EditedMessage::get_text_entities, &EditedMessage::set_text_entities), + make_column("mediaPath", &EditedMessage::get_media_path, &EditedMessage::set_media_path), + make_column("documentType", &EditedMessage::get_document_type, &EditedMessage::set_document_type), + make_column("documentSerialized", &EditedMessage::get_document_serialized, + &EditedMessage::set_document_serialized), + make_column("thumbsSerialized", &EditedMessage::get_thumbs_serialized, &EditedMessage::set_thumbs_serialized), + make_column("documentAttributesSerialized", &EditedMessage::get_document_attributes_serialized, + &EditedMessage::set_document_attributes_serialized), + make_column("mimeType", &EditedMessage::get_mime_type, &EditedMessage::set_mime_type) + ), + make_table( + "deletedmessage", + make_column("userId", &DeletedMessage::get_user_id, &DeletedMessage::set_user_id), + make_column("dialogId", &DeletedMessage::get_dialog_id, &DeletedMessage::set_dialog_id), + make_column("groupedId", &DeletedMessage::get_grouped_id, &DeletedMessage::set_grouped_id), + make_column("peerId", &DeletedMessage::get_peer_id, &DeletedMessage::set_peer_id), + make_column("fromId", &DeletedMessage::get_from_id, &DeletedMessage::set_from_id), + make_column("topicId", &DeletedMessage::get_topic_id, &DeletedMessage::set_topic_id), + make_column("messageId", &DeletedMessage::get_message_id, &DeletedMessage::set_message_id), + make_column("date", &DeletedMessage::get_date, &DeletedMessage::set_date), + make_column("flags", &DeletedMessage::get_flags, &DeletedMessage::set_flags), + make_column("editDate", &DeletedMessage::get_edit_date, &DeletedMessage::set_edit_date), + make_column("editHide", &DeletedMessage::is_edit_hide, &DeletedMessage::set_edit_hide), + make_column("out", &DeletedMessage::is_out, &DeletedMessage::set_out), + make_column("entityCreateDate", &DeletedMessage::get_entity_create_date, + &DeletedMessage::set_entity_create_date), + make_column("text", &DeletedMessage::get_text, &DeletedMessage::set_text), + make_column("textEntities", &DeletedMessage::get_text_entities, &DeletedMessage::set_text_entities), + make_column("mediaPath", &DeletedMessage::get_media_path, &DeletedMessage::set_media_path), + make_column("documentType", &DeletedMessage::get_document_type, &DeletedMessage::set_document_type), + make_column("documentSerialized", &DeletedMessage::get_document_serialized, + &DeletedMessage::set_document_serialized), + make_column("thumbsSerialized", &DeletedMessage::get_thumbs_serialized, &DeletedMessage::set_thumbs_serialized), + make_column("documentAttributesSerialized", &DeletedMessage::get_document_attributes_serialized, + &DeletedMessage::set_document_attributes_serialized), + make_column("mimeType", &DeletedMessage::get_mime_type, &DeletedMessage::set_mime_type) + ) ); - namespace AyuDatabase { - void addEditedMessage( - long userId, - long dialogId, - long messageId, - const QString& text, - bool isDocument, - QString path, - long date) + void initialize() { - EditedMessage entity; - entity.userId = userId; - entity.dialogId = dialogId; - entity.messageId = messageId; - entity.text = text.toStdString(); - entity.isDocument = isDocument; - entity.path = path.toStdString(); - entity.date = date; - storage.sync_schema(); storage.begin_transaction(); - storage.insert(entity); storage.commit(); } - std::vector getEditedMessages( - long userId, - long dialogId, - long messageId - ) + void addEditedMessage(const EditedMessage& message) + { + storage.begin_transaction(); + storage.insert(message); + storage.commit(); + } + + std::vector getEditedMessages(ID userId, ID dialogId, ID messageId) { return storage.get_all( where( - c(&EditedMessage::userId) == userId and - c(&EditedMessage::dialogId) == dialogId and - c(&EditedMessage::messageId) == messageId) + c(&EditedMessage::get_user_id) == userId and + c(&EditedMessage::get_dialog_id) == dialogId and + c(&EditedMessage::get_message_id) == messageId + ) ); } - std::vector getEditedMessages(HistoryItem* item) + bool hasRevisions(ID userId, ID dialogId, ID messageId) { - auto userId = item->displayFrom()->id.value; - auto dialogId = item->history()->peer->id.value; - auto msgId = item->id.bare; - // auto some = &item->history()->session().account(); - - return getEditedMessages(static_cast(userId), static_cast(dialogId), static_cast(msgId)); - } - - bool editedMessagesTableExists() - { - return storage.table_exists("editedmessage"); + return storage.count( + where( + c(&EditedMessage::get_user_id) == userId and + c(&EditedMessage::get_dialog_id) == dialogId and + c(&EditedMessage::get_message_id) == messageId + ) + ) > 0; } } diff --git a/Telegram/SourceFiles/ayu/database/ayu_database.h b/Telegram/SourceFiles/ayu/database/ayu_database.h index 6bc48667e..7878beb45 100644 --- a/Telegram/SourceFiles/ayu/database/ayu_database.h +++ b/Telegram/SourceFiles/ayu/database/ayu_database.h @@ -13,22 +13,9 @@ namespace AyuDatabase { - void addEditedMessage( - long userId, - long dialogId, - long messageId, - const QString& text, - bool isDocument, - QString path, - long date); + void initialize(); - std::vector getEditedMessages( - long userId, - long dialogId, - long messageId - ); - - std::vector getEditedMessages(HistoryItem* item); - - bool editedMessagesTableExists(); + void addEditedMessage(const EditedMessage& message); + std::vector getEditedMessages(ID userId, ID dialogId, ID messageId); + bool hasRevisions(ID userId, ID dialogId, ID messageId); } diff --git a/Telegram/SourceFiles/ayu/database/entities.h b/Telegram/SourceFiles/ayu/database/entities.h index 4631555b4..d0941bd08 100644 --- a/Telegram/SourceFiles/ayu/database/entities.h +++ b/Telegram/SourceFiles/ayu/database/entities.h @@ -10,16 +10,463 @@ #include -// https://github.com/AyuGram/AyuGram4A/blob/main/TMessagesProj/src/main/java/com/radolyn/ayugram/database/entities/EditedMessage.java -class EditedMessage +#define ID long long + +// https://github.com/AyuGram/AyuGram4A/blob/rewrite/TMessagesProj/src/main/java/com/radolyn/ayugram/database/entities/AyuMessageBase.java +class AyuMessageBase { public: - long userId; - long dialogId; - long messageId; + ID userId; + ID dialogId; + ID groupedId; + ID peerId; + ID fromId; + ID topicId; + int messageId; + int date; - std::string text; - bool isDocument; - std::string path; - long date; + int flags; + + int editDate; + bool editHide; + bool out; + + int entityCreateDate; + + std::string text; // plain text + std::string textEntities; // TL serialized + std::string mediaPath; // full path + int documentType; // see DOCUMENT_TYPE_* + std::string documentSerialized; // for sticker; TL serialized + std::string thumbsSerialized; // for video/etc.; TL serialized + std::string documentAttributesSerialized; // for video/voice/etc.; TL serialized + std::string mimeType; +}; + +class DeletedMessage : public AyuMessageBase +{ +public: + [[nodiscard]] long long get_user_id() const + { + return userId; + } + + void set_user_id(long long user_id) + { + userId = user_id; + } + + [[nodiscard]] long long get_dialog_id() const + { + return dialogId; + } + + void set_dialog_id(long long dialog_id) + { + dialogId = dialog_id; + } + + [[nodiscard]] long long get_grouped_id() const + { + return groupedId; + } + + void set_grouped_id(long long grouped_id) + { + groupedId = grouped_id; + } + + [[nodiscard]] long long get_peer_id() const + { + return peerId; + } + + void set_peer_id(long long peer_id) + { + peerId = peer_id; + } + + [[nodiscard]] long long get_from_id() const + { + return fromId; + } + + void set_from_id(long long from_id) + { + fromId = from_id; + } + + [[nodiscard]] long long get_topic_id() const + { + return topicId; + } + + void set_topic_id(long long topic_id) + { + topicId = topic_id; + } + + [[nodiscard]] int get_message_id() const + { + return messageId; + } + + void set_message_id(int message_id) + { + messageId = message_id; + } + + [[nodiscard]] int get_date() const + { + return date; + } + + void set_date(int date) + { + this->date = date; + } + + [[nodiscard]] int get_flags() const + { + return flags; + } + + void set_flags(int flags) + { + this->flags = flags; + } + + [[nodiscard]] int get_edit_date() const + { + return editDate; + } + + void set_edit_date(int edit_date) + { + editDate = edit_date; + } + + [[nodiscard]] bool is_edit_hide() const + { + return editHide; + } + + void set_edit_hide(bool edit_hide) + { + editHide = edit_hide; + } + + [[nodiscard]] bool is_out() const + { + return out; + } + + void set_out(bool out) + { + this->out = out; + } + + [[nodiscard]] int get_entity_create_date() const + { + return entityCreateDate; + } + + void set_entity_create_date(int entity_create_date) + { + entityCreateDate = entity_create_date; + } + + [[nodiscard]] std::string get_text() const + { + return text; + } + + void set_text(const std::string& text) + { + this->text = text; + } + + [[nodiscard]] std::string get_text_entities() const + { + return textEntities; + } + + void set_text_entities(const std::string& text_entities) + { + textEntities = text_entities; + } + + [[nodiscard]] std::string get_media_path() const + { + return mediaPath; + } + + void set_media_path(const std::string& media_path) + { + mediaPath = media_path; + } + + [[nodiscard]] int get_document_type() const + { + return documentType; + } + + void set_document_type(int document_type) + { + documentType = document_type; + } + + [[nodiscard]] std::string get_document_serialized() const + { + return documentSerialized; + } + + void set_document_serialized(const std::string& document_serialized) + { + documentSerialized = document_serialized; + } + + [[nodiscard]] std::string get_thumbs_serialized() const + { + return thumbsSerialized; + } + + void set_thumbs_serialized(const std::string& thumbs_serialized) + { + thumbsSerialized = thumbs_serialized; + } + + [[nodiscard]] std::string get_document_attributes_serialized() const + { + return documentAttributesSerialized; + } + + void set_document_attributes_serialized(const std::string& document_attributes_serialized) + { + documentAttributesSerialized = document_attributes_serialized; + } + + [[nodiscard]] std::string get_mime_type() const + { + return mimeType; + } + + void set_mime_type(const std::string& mime_type) + { + mimeType = mime_type; + } +}; + +class EditedMessage : public AyuMessageBase +{ +public: + [[nodiscard]] long long get_user_id() const + { + return userId; + } + + void set_user_id(long long user_id) + { + userId = user_id; + } + + [[nodiscard]] long long get_dialog_id() const + { + return dialogId; + } + + void set_dialog_id(long long dialog_id) + { + dialogId = dialog_id; + } + + [[nodiscard]] long long get_grouped_id() const + { + return groupedId; + } + + void set_grouped_id(long long grouped_id) + { + groupedId = grouped_id; + } + + [[nodiscard]] long long get_peer_id() const + { + return peerId; + } + + void set_peer_id(long long peer_id) + { + peerId = peer_id; + } + + [[nodiscard]] long long get_from_id() const + { + return fromId; + } + + void set_from_id(long long from_id) + { + fromId = from_id; + } + + [[nodiscard]] long long get_topic_id() const + { + return topicId; + } + + void set_topic_id(long long topic_id) + { + topicId = topic_id; + } + + [[nodiscard]] int get_message_id() const + { + return messageId; + } + + void set_message_id(int message_id) + { + messageId = message_id; + } + + [[nodiscard]] int get_date() const + { + return date; + } + + void set_date(int date) + { + this->date = date; + } + + [[nodiscard]] int get_flags() const + { + return flags; + } + + void set_flags(int flags) + { + this->flags = flags; + } + + [[nodiscard]] int get_edit_date() const + { + return editDate; + } + + void set_edit_date(int edit_date) + { + editDate = edit_date; + } + + [[nodiscard]] bool is_edit_hide() const + { + return editHide; + } + + void set_edit_hide(bool edit_hide) + { + editHide = edit_hide; + } + + [[nodiscard]] bool is_out() const + { + return out; + } + + void set_out(bool out) + { + this->out = out; + } + + [[nodiscard]] int get_entity_create_date() const + { + return entityCreateDate; + } + + void set_entity_create_date(int entity_create_date) + { + entityCreateDate = entity_create_date; + } + + [[nodiscard]] std::string get_text() const + { + return text; + } + + void set_text(const std::string& text) + { + this->text = text; + } + + [[nodiscard]] std::string get_text_entities() const + { + return textEntities; + } + + void set_text_entities(const std::string& text_entities) + { + textEntities = text_entities; + } + + [[nodiscard]] std::string get_media_path() const + { + return mediaPath; + } + + void set_media_path(const std::string& media_path) + { + mediaPath = media_path; + } + + [[nodiscard]] int get_document_type() const + { + return documentType; + } + + void set_document_type(int document_type) + { + documentType = document_type; + } + + [[nodiscard]] std::string get_document_serialized() const + { + return documentSerialized; + } + + void set_document_serialized(const std::string& document_serialized) + { + documentSerialized = document_serialized; + } + + [[nodiscard]] std::string get_thumbs_serialized() const + { + return thumbsSerialized; + } + + void set_thumbs_serialized(const std::string& thumbs_serialized) + { + thumbsSerialized = thumbs_serialized; + } + + [[nodiscard]] std::string get_document_attributes_serialized() const + { + return documentAttributesSerialized; + } + + void set_document_attributes_serialized(const std::string& document_attributes_serialized) + { + documentAttributesSerialized = document_attributes_serialized; + } + + [[nodiscard]] std::string get_mime_type() const + { + return mimeType; + } + + void set_mime_type(const std::string& mime_type) + { + mimeType = mime_type; + } }; diff --git a/Telegram/SourceFiles/ayu/messages/ayu_messages_controller.cpp b/Telegram/SourceFiles/ayu/messages/ayu_messages_controller.cpp new file mode 100644 index 000000000..4ba415245 --- /dev/null +++ b/Telegram/SourceFiles/ayu/messages/ayu_messages_controller.cpp @@ -0,0 +1,104 @@ +// 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, 2023 + +#include "ayu_messages_controller.h" + +#include "ayu/ayu_constants.h" +#include "ayu/database/ayu_database.h" +#include "ayu/sync/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 "main/main_session.h" + +namespace AyuMessages +{ + std::optional controller = std::nullopt; + + void initialize() + { + if (controller.has_value()) + { + return; + } + + controller = ayu_messages_controller(); + } + + ayu_messages_controller& getInstance() + { + initialize(); + return controller.value(); + } + + void map(HistoryMessageEdition& edition, not_null item, AyuMessageBase& message) + { + message.userId = item->history()->owner().session().userId().bare; + message.dialogId = getDialogIdFromPeer(item->history()->peer); + message.groupedId = item->groupId().value; + message.peerId = item->from()->id.value; // todo: ??? + message.fromId = item->from()->id.value; + if (auto topic = item->history()->asTopic()) + { + message.topicId = topic->rootId().bare; + } + message.messageId = item->id.bare; + message.date = item->date(); + + // message.flags = todo: + + message.editDate = edition.editDate; + message.editHide = item->hideEditedBadge(); + message.out = item->out(); + message.entityCreateDate = base::unixtime::now(); // todo: rework + + auto serializedText = serializeTextWithEntities(item); + message.text = serializedText.first; + message.textEntities = serializedText.second; + + // todo: + message.mediaPath = "/"; + message.documentType = DOCUMENT_TYPE_NONE; + + // message.documentSerialized; + // message.thumbsSerialized; + // message.documentAttributesSerialized; + // message.mimeType; + } + + void ayu_messages_controller::addEditedMessage(HistoryMessageEdition& edition, not_null item) + { + EditedMessage message; + map(edition, item, message); + + AyuDatabase::addEditedMessage(message); + } + + std::vector ayu_messages_controller::getEditedMessages(HistoryItem* item) + { + auto userId = item->history()->owner().session().userId().bare; + auto dialogId = getDialogIdFromPeer(item->history()->peer); + auto msgId = item->id.bare; + + return AyuDatabase::getEditedMessages(userId, dialogId, msgId); + } + + bool ayu_messages_controller::hasRevisions(not_null item) + { + auto userId = item->history()->owner().session().userId().bare; + auto dialogId = getDialogIdFromPeer(item->history()->peer); + auto msgId = item->id.bare; + + return AyuDatabase::hasRevisions(userId, dialogId, msgId); + } +} diff --git a/Telegram/SourceFiles/ayu/messages/ayu_messages_controller.h b/Telegram/SourceFiles/ayu/messages/ayu_messages_controller.h new file mode 100644 index 000000000..94ec4b5a1 --- /dev/null +++ b/Telegram/SourceFiles/ayu/messages/ayu_messages_controller.h @@ -0,0 +1,25 @@ +// 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, 2023 + +#pragma once + +#include "ayu/database/entities.h" + +#include "history/history_item_edition.h" + +namespace AyuMessages +{ + class ayu_messages_controller + { + public: + void addEditedMessage(HistoryMessageEdition& edition, not_null item); + std::vector getEditedMessages(HistoryItem* item); + bool hasRevisions(not_null item); + }; + + ayu_messages_controller& getInstance(); +} diff --git a/Telegram/SourceFiles/ayu/sync/models.h b/Telegram/SourceFiles/ayu/sync/models.h index b5d9153fa..024262a6f 100644 --- a/Telegram/SourceFiles/ayu/sync/models.h +++ b/Telegram/SourceFiles/ayu/sync/models.h @@ -5,7 +5,7 @@ #include #include -#define ID long long +#include "ayu/database/entities.h" using json = nlohmann::json; diff --git a/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.cpp b/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.cpp index 374b86296..ea1220c7f 100644 --- a/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.cpp +++ b/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.cpp @@ -8,12 +8,16 @@ #include "telegram_helpers.h" #include #include + +#include "api/api_text_entities.h" + #include "data/data_peer_id.h" #include "ayu/sync/models.h" #include "data/data_session.h" #include "history/history.h" +#include "history/history_item.h" Main::Session* getSession(ID userId) @@ -83,3 +87,29 @@ ID getDialogIdFromPeer(not_null peer) return peerId; } + +std::pair serializeTextWithEntities(not_null item) +{ + if (item->emptyText()) + { + return std::make_pair("", ""); + } + + auto textWithEntities = item->originalText(); + auto text = textWithEntities.text.toStdString(); + auto entities = EntitiesToMTP(&item->history()->owner().session(), textWithEntities.entities, + Api::ConvertOption::SkipLocal); + + if (entities.v.isEmpty()) + { + return std::make_pair(text, ""); + } + + auto buff = mtpBuffer(); + for (auto entity : entities.v) + { + entity.write(buff); + } + + return std::make_pair(text, std::string(reinterpret_cast(buff.data()), buff.size())); +} diff --git a/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.h b/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.h index e1b508bfd..9b18b4f22 100644 --- a/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.h +++ b/Telegram/SourceFiles/ayu/sync/utils/telegram_helpers.h @@ -19,3 +19,4 @@ bool accountExists(ID userId); void dispatchToMainThread(std::function callback); not_null getHistoryFromDialogId(ID dialogId, Main::Session* session); ID getDialogIdFromPeer(not_null peer); +std::pair serializeTextWithEntities(not_null item); diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp index 65d850e64..03c8c3e87 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp @@ -10,7 +10,8 @@ #include "message_history_box.h" #include "ayu/ayu_state.h" #include "ayu/database/ayu_database.h" -#include "base/unixtime.h" +#include "ayu/messages/ayu_messages_controller.h" + #include "history/history_inner_widget.h" #include "settings/settings_common.h" #include "styles/style_chat.h" @@ -25,7 +26,7 @@ namespace AyuUi void AyuPopupMenu::addHistoryAction(HistoryItem* item) { - if (AyuDatabase::editedMessagesTableExists() && !((AyuDatabase::getEditedMessages(item)).empty())) + if (AyuMessages::getInstance().hasRevisions(item)) { _ayuSubMenu->addAction(tr::ayu_EditsHistoryMenuText(tr::now), [=] { @@ -41,11 +42,11 @@ namespace AyuUi const auto history = item->history(); _ayuSubMenu->addAction(tr::ayu_ContextHideMessage(tr::now), [=]() { - const auto initKeepDeleted = settings->saveDeletedMessages; + const auto initSaveDeleted = settings->saveDeletedMessages; settings->set_keepDeletedMessages(false); history->destroyMessage(item); - settings->set_keepDeletedMessages(initKeepDeleted); + settings->set_keepDeletedMessages(initSaveDeleted); }, &st::menuIconClear); } diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.cpp b/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.cpp index cf11d2ae9..abb088a28 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.cpp +++ b/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.cpp @@ -6,14 +6,15 @@ // Copyright @Radolyn, 2023 #include "message_history_box.h" -#include -#include -#include -#include #include "ayu/ayu_settings.h" #include "ayu/database/ayu_database.h" +#include "ayu/messages/ayu_messages_controller.h" + #include "history/history.h" #include "settings/settings_common.h" +#include "styles/style_boxes.h" +#include "styles/style_layers.h" +#include "ui/effects/scroll_content_shadow.h" using namespace Settings; @@ -61,7 +62,7 @@ namespace AyuUi void MessageHistoryBox::addEditedMessagesToLayout(HistoryItem* item) { - auto messages = AyuDatabase::getEditedMessages(item); + auto messages = AyuMessages::getInstance().getEditedMessages(item); if (messages.empty()) { return; diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.h b/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.h index 0bebb9082..772da1fe7 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.h +++ b/Telegram/SourceFiles/ayu/ui/context_menu/message_history_box.h @@ -5,8 +5,10 @@ // // Copyright @Radolyn, 2023 -#include +#pragma once + #include "history/history_item.h" +#include "ui/layers/box_content.h" #include "ui/widgets/scroll_area.h" #include "ui/wrap/vertical_layout.h" diff --git a/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.cpp b/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.cpp index 8eb2f60e2..464b8a985 100644 --- a/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.cpp +++ b/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.cpp @@ -53,7 +53,7 @@ rpl::producer IDValue(not_null peer) return rpl::single(IDString(peer)) | Ui::Text::ToWithEntities(); } -rpl::producer IDValue(MsgId topic_root_id) +rpl::producer IDValue(MsgId topicRootId) { - return rpl::single(IDString(topic_root_id)) | Ui::Text::ToWithEntities(); + return rpl::single(IDString(topicRootId)) | Ui::Text::ToWithEntities(); } diff --git a/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.h b/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.h index bdf91d415..7d5c4e19a 100644 --- a/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.h +++ b/Telegram/SourceFiles/ayu/ui/utils/ayu_profile_values.h @@ -12,4 +12,4 @@ QString IDString(not_null peer); QString IDString(MsgId topic_root_id); rpl::producer IDValue(not_null peer); -rpl::producer IDValue(MsgId topic_root_id); +rpl::producer IDValue(MsgId topicRootId); diff --git a/Telegram/SourceFiles/core/sandbox.cpp b/Telegram/SourceFiles/core/sandbox.cpp index 741f7d072..ee8ff8fff 100644 --- a/Telegram/SourceFiles/core/sandbox.cpp +++ b/Telegram/SourceFiles/core/sandbox.cpp @@ -33,6 +33,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +#include "ayu/database/ayu_database.h" + namespace Core { namespace { @@ -122,6 +124,8 @@ int Sandbox::start() { } } + AyuDatabase::initialize(); + #if defined Q_OS_LINUX && QT_VERSION >= QT_VERSION_CHECK(6, 2, 0) _localServer.setSocketOptions(QLocalServer::AbstractNamespaceOption); _localSocket.setSocketOptions(QLocalSocket::AbstractNamespaceOption); diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index e104c0210..d383997e8 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -80,8 +80,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/random.h" #include "styles/style_boxes.h" // st::backgroundSize +// AyuGram includes #include "ayu/ayu_settings.h" #include "ayu/database/ayu_database.h" +#include "ayu/messages/ayu_messages_controller.h" namespace Data { namespace { @@ -2206,23 +2208,13 @@ void Session::updateEditedMessage(const MTPMessage &data) { } } - auto flags = MessageFlag::HasFromId - | MessageFlag::HasReplyInfo - | MessageFlag::HasPostAuthor; - - if (existing->isPost()) - { - flags |= MessageFlag::Post; - } - // adding msg data to local ayu db (table:editedMessage) auto userId = existing->displayFrom()->id.value; auto dialogId = history->peer->id.value; auto msgId = existing->id.bare; bool isDocument = media && media->document(); - AyuDatabase::addEditedMessage((long)userId, (long)dialogId, (long)msgId, msg.text, isDocument, QString(""), - (long)crl::now()); + AyuMessages::getInstance().addEditedMessage(edit, existing); if (!media || !(media->photo() || media->document())) { @@ -2239,37 +2231,6 @@ void Session::updateEditedMessage(const MTPMessage &data) { // HistoryMessageMarkupData(), // existing->groupId().empty() ? 0 : existing->groupId().value); } - else - { - if (media->photo()) - { - // history->addNewLocalMessage( - // history->nextNonHistoryEntryId(), - // flags, - // UserId(), - // existing->id, - // base::unixtime::now(), - // existing->author()->id, - // "AyuGram"_q, - // media->photo(), - // existing->originalText(), - // HistoryMessageMarkupData()); - } - else if (media->document()) - { - // history->addNewLocalMessage( - // history->nextNonHistoryEntryId(), - // flags, - // UserId(), - // existing->id, - // base::unixtime::now(), - // existing->author()->id, - // "AyuGram"_q, - // media->document(), - // existing->originalText(), - // HistoryMessageMarkupData()); - } - } } proceed: diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 130059cd4..24d52a639 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -73,8 +73,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +// AyuGram includes #include "ayu/ayu_settings.h" #include "ayu/database/ayu_database.h" +#include "ayu/messages/ayu_messages_controller.h" #include "ayu/ui/context_menu/message_history_box.h" namespace HistoryView { @@ -1079,11 +1081,11 @@ base::unique_qptr FillContextMenu( } } - if (item != nullptr) + if (item) { - if (AyuDatabase::editedMessagesTableExists() && !((AyuDatabase::getEditedMessages(item)).empty())) + if (AyuMessages::getInstance().hasRevisions(item)) { - result->addAction(QString("History"), [=] + result->addAction(tr::ayu_EditsHistoryMenuText(tr::now), [=] { auto box = Box(item); Ui::show(std::move(box)); @@ -1092,7 +1094,7 @@ base::unique_qptr FillContextMenu( const auto settings = &AyuSettings::getInstance(); const auto history = item->history(); - result->addAction(QString("Hide"), [=]() + result->addAction(tr::ayu_ContextHideMessage(tr::now), [=]() { const auto initKeepDeleted = settings->saveDeletedMessages;