feat: rewrite database part

This commit is contained in:
ZavaruKitsu 2023-07-10 21:06:49 +00:00
parent 67df965f92
commit e22b86a2f5
18 changed files with 745 additions and 138 deletions

View file

@ -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

View file

@ -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;

View file

@ -7,79 +7,104 @@
#include "ayu_database.h"
#include <QString>
#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<EditedMessage> getEditedMessages(
long userId,
long dialogId,
long messageId
)
void addEditedMessage(const EditedMessage& message)
{
storage.begin_transaction();
storage.insert(message);
storage.commit();
}
std::vector<EditedMessage> getEditedMessages(ID userId, ID dialogId, ID messageId)
{
return storage.get_all<EditedMessage>(
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<EditedMessage> 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<long>(userId), static_cast<long>(dialogId), static_cast<long>(msgId));
}
bool editedMessagesTableExists()
{
return storage.table_exists("editedmessage");
return storage.count<EditedMessage>(
where(
c(&EditedMessage::get_user_id) == userId and
c(&EditedMessage::get_dialog_id) == dialogId and
c(&EditedMessage::get_message_id) == messageId
)
) > 0;
}
}

View file

@ -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<EditedMessage> getEditedMessages(
long userId,
long dialogId,
long messageId
);
std::vector<EditedMessage> getEditedMessages(HistoryItem* item);
bool editedMessagesTableExists();
void addEditedMessage(const EditedMessage& message);
std::vector<EditedMessage> getEditedMessages(ID userId, ID dialogId, ID messageId);
bool hasRevisions(ID userId, ID dialogId, ID messageId);
}

View file

@ -10,16 +10,463 @@
#include <string>
// 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;
}
};

View file

@ -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<ayu_messages_controller> 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<HistoryItem*> 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<HistoryItem*> item)
{
EditedMessage message;
map(edition, item, message);
AyuDatabase::addEditedMessage(message);
}
std::vector<EditedMessage> 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<HistoryItem*> 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);
}
}

View file

@ -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<HistoryItem*> item);
std::vector<EditedMessage> getEditedMessages(HistoryItem* item);
bool hasRevisions(not_null<HistoryItem*> item);
};
ayu_messages_controller& getInstance();
}

View file

@ -5,7 +5,7 @@
#include <string>
#include <vector>
#define ID long long
#include "ayu/database/entities.h"
using json = nlohmann::json;

View file

@ -8,12 +8,16 @@
#include "telegram_helpers.h"
#include <functional>
#include <QTimer>
#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<PeerData*> peer)
return peerId;
}
std::pair<std::string, std::string> serializeTextWithEntities(not_null<HistoryItem*> 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<char*>(buff.data()), buff.size()));
}

View file

@ -19,3 +19,4 @@ bool accountExists(ID userId);
void dispatchToMainThread(std::function<void()> callback);
not_null<History*> getHistoryFromDialogId(ID dialogId, Main::Session* session);
ID getDialogIdFromPeer(not_null<PeerData*> peer);
std::pair<std::string, std::string> serializeTextWithEntities(not_null<HistoryItem*> item);

View file

@ -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);
}

View file

@ -6,14 +6,15 @@
// Copyright @Radolyn, 2023
#include "message_history_box.h"
#include <styles/style_boxes.h>
#include <styles/style_layers.h>
#include <styles/style_settings.h>
#include <ui/effects/scroll_content_shadow.h>
#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;

View file

@ -5,8 +5,10 @@
//
// Copyright @Radolyn, 2023
#include <ui/layers/box_content.h>
#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"

View file

@ -53,7 +53,7 @@ rpl::producer<TextWithEntities> IDValue(not_null<PeerData*> peer)
return rpl::single(IDString(peer)) | Ui::Text::ToWithEntities();
}
rpl::producer<TextWithEntities> IDValue(MsgId topic_root_id)
rpl::producer<TextWithEntities> IDValue(MsgId topicRootId)
{
return rpl::single(IDString(topic_root_id)) | Ui::Text::ToWithEntities();
return rpl::single(IDString(topicRootId)) | Ui::Text::ToWithEntities();
}

View file

@ -12,4 +12,4 @@ QString IDString(not_null<PeerData*> peer);
QString IDString(MsgId topic_root_id);
rpl::producer<TextWithEntities> IDValue(not_null<PeerData*> peer);
rpl::producer<TextWithEntities> IDValue(MsgId topic_root_id);
rpl::producer<TextWithEntities> IDValue(MsgId topicRootId);

View file

@ -33,6 +33,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include <QtGui/QScreen>
#include <QtGui/qpa/qplatformscreen.h>
#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);

View file

@ -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:

View file

@ -73,8 +73,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include <QtGui/QGuiApplication>
#include <QtGui/QClipboard>
// 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<Ui::PopupMenu> 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<AyuUi::MessageHistoryBox>(item);
Ui::show(std::move(box));
@ -1092,7 +1094,7 @@ base::unique_qptr<Ui::PopupMenu> 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;