mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
chore: sync database schema & refactor & reformat
This commit is contained in:
parent
adb5abf4fb
commit
d4a22a5110
49 changed files with 601 additions and 549 deletions
|
@ -116,8 +116,8 @@ PRIVATE
|
|||
ayu/utils/telegram_helpers.h
|
||||
ayu/utils/windows_utils.cpp
|
||||
ayu/utils/windows_utils.h
|
||||
ayu/ui/ayu_assets.cpp
|
||||
ayu/ui/ayu_assets.h
|
||||
ayu/ui/ayu_logo.cpp
|
||||
ayu/ui/ayu_logo.h
|
||||
ayu/ui/utils/ayu_profile_values.cpp
|
||||
ayu/ui/utils/ayu_profile_values.h
|
||||
ayu/ui/settings/icon_picker.cpp
|
||||
|
@ -148,8 +148,6 @@ PRIVATE
|
|||
ayu/ui/boxes/message_shot_box.h
|
||||
ayu/ui/components/image_view.cpp
|
||||
ayu/ui/components/image_view.h
|
||||
ayu/messages/ayu_messages_controller.cpp
|
||||
ayu/messages/ayu_messages_controller.h
|
||||
ayu/libs/json.hpp
|
||||
ayu/libs/json_ext.hpp
|
||||
ayu/libs/sqlite/sqlite3.c
|
||||
|
@ -160,9 +158,11 @@ PRIVATE
|
|||
ayu/features/streamer_mode/streamer_mode.h
|
||||
ayu/features/messageshot/message_shot.cpp
|
||||
ayu/features/messageshot/message_shot.h
|
||||
ayu/database/entities.h
|
||||
ayu/database/ayu_database.cpp
|
||||
ayu/database/ayu_database.h
|
||||
ayu/data/messages_storage.cpp
|
||||
ayu/data/messages_storage.h
|
||||
ayu/data/entities.h
|
||||
ayu/data/ayu_database.cpp
|
||||
ayu/data/ayu_database.h
|
||||
|
||||
api/api_attached_stickers.cpp
|
||||
api/api_attached_stickers.h
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "ayu_lang.h"
|
||||
#include "ayu_worker.h"
|
||||
#include "ayu/ayu_settings.h"
|
||||
#include "ayu/database/ayu_database.h"
|
||||
#include "ayu/data/ayu_database.h"
|
||||
#include "lang/lang_instance.h"
|
||||
|
||||
namespace AyuInfra {
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
// Copyright @Radolyn, 2023
|
||||
#include "ayu_settings.h"
|
||||
|
||||
#include "ayu/ui/ayu_assets.h"
|
||||
#include "ayu/ui/ayu_logo.h"
|
||||
|
||||
#include "lang_auto.h"
|
||||
#include "core/application.h"
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "base/unixtime.h"
|
||||
#include "core/application.h"
|
||||
#include "data/data_user.h"
|
||||
#include "database/entities.h"
|
||||
#include "data/entities.h"
|
||||
#include "main/main_account.h"
|
||||
#include "main/main_domain.h"
|
||||
#include "main/main_session.h"
|
||||
|
|
210
Telegram/SourceFiles/ayu/data/ayu_database.cpp
Normal file
210
Telegram/SourceFiles/ayu/data/ayu_database.cpp
Normal file
|
@ -0,0 +1,210 @@
|
|||
// 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_database.h"
|
||||
|
||||
#include <ranges>
|
||||
|
||||
#include "entities.h"
|
||||
#include "ayu/libs/sqlite/sqlite_orm.h"
|
||||
|
||||
#include "base/unixtime.h"
|
||||
|
||||
using namespace sqlite_orm;
|
||||
auto storage = make_storage(
|
||||
"./tdata/ayudata.db",
|
||||
make_table(
|
||||
"DeletedMessage",
|
||||
make_column("fakeId", &DeletedMessage::fakeId, primary_key().autoincrement()),
|
||||
make_column("userId", &DeletedMessage::userId),
|
||||
make_column("dialogId", &DeletedMessage::dialogId),
|
||||
make_column("groupedId", &DeletedMessage::groupedId),
|
||||
make_column("peerId", &DeletedMessage::peerId),
|
||||
make_column("fromId", &DeletedMessage::fromId),
|
||||
make_column("topicId", &DeletedMessage::topicId),
|
||||
make_column("messageId", &DeletedMessage::messageId),
|
||||
make_column("date", &DeletedMessage::date),
|
||||
make_column("flags", &DeletedMessage::flags),
|
||||
make_column("editDate", &DeletedMessage::editDate),
|
||||
make_column("views", &DeletedMessage::views),
|
||||
make_column("fwdFlags", &DeletedMessage::fwdFlags),
|
||||
make_column("fwdFromId", &DeletedMessage::fwdFromId),
|
||||
make_column("fwdName", &DeletedMessage::fwdName),
|
||||
make_column("fwdDate", &DeletedMessage::fwdDate),
|
||||
make_column("fwdPostAuthor", &DeletedMessage::fwdPostAuthor),
|
||||
make_column("replyFlags", &DeletedMessage::replyFlags),
|
||||
make_column("replyMessageId", &DeletedMessage::replyMessageId),
|
||||
make_column("replyPeerId", &DeletedMessage::replyPeerId),
|
||||
make_column("replyTopId", &DeletedMessage::replyTopId),
|
||||
make_column("replyForumTopic", &DeletedMessage::replyForumTopic),
|
||||
make_column("replySerialized", &DeletedMessage::replySerialized),
|
||||
make_column("entityCreateDate", &DeletedMessage::entityCreateDate),
|
||||
make_column("text", &DeletedMessage::text),
|
||||
make_column("textEntities", &DeletedMessage::textEntities),
|
||||
make_column("mediaPath", &DeletedMessage::mediaPath),
|
||||
make_column("hqThumbPath", &DeletedMessage::hqThumbPath),
|
||||
make_column("documentType", &DeletedMessage::documentType),
|
||||
make_column("documentSerialized", &DeletedMessage::documentSerialized),
|
||||
make_column("thumbsSerialized", &DeletedMessage::thumbsSerialized),
|
||||
make_column("documentAttributesSerialized", &DeletedMessage::documentAttributesSerialized),
|
||||
make_column("mimeType", &DeletedMessage::mimeType)
|
||||
),
|
||||
make_table(
|
||||
"EditedMessage",
|
||||
make_column("fakeId", &EditedMessage::fakeId, primary_key().autoincrement()),
|
||||
make_column("userId", &EditedMessage::userId),
|
||||
make_column("dialogId", &EditedMessage::dialogId),
|
||||
make_column("groupedId", &EditedMessage::groupedId),
|
||||
make_column("peerId", &EditedMessage::peerId),
|
||||
make_column("fromId", &EditedMessage::fromId),
|
||||
make_column("topicId", &EditedMessage::topicId),
|
||||
make_column("messageId", &EditedMessage::messageId),
|
||||
make_column("date", &EditedMessage::date),
|
||||
make_column("flags", &EditedMessage::flags),
|
||||
make_column("editDate", &EditedMessage::editDate),
|
||||
make_column("views", &EditedMessage::views),
|
||||
make_column("fwdFlags", &EditedMessage::fwdFlags),
|
||||
make_column("fwdFromId", &EditedMessage::fwdFromId),
|
||||
make_column("fwdName", &EditedMessage::fwdName),
|
||||
make_column("fwdDate", &EditedMessage::fwdDate),
|
||||
make_column("fwdPostAuthor", &EditedMessage::fwdPostAuthor),
|
||||
make_column("replyFlags", &EditedMessage::replyFlags),
|
||||
make_column("replyMessageId", &EditedMessage::replyMessageId),
|
||||
make_column("replyPeerId", &EditedMessage::replyPeerId),
|
||||
make_column("replyTopId", &EditedMessage::replyTopId),
|
||||
make_column("replyForumTopic", &EditedMessage::replyForumTopic),
|
||||
make_column("replySerialized", &EditedMessage::replySerialized),
|
||||
make_column("entityCreateDate", &EditedMessage::entityCreateDate),
|
||||
make_column("text", &EditedMessage::text),
|
||||
make_column("textEntities", &EditedMessage::textEntities),
|
||||
make_column("mediaPath", &EditedMessage::mediaPath),
|
||||
make_column("hqThumbPath", &EditedMessage::hqThumbPath),
|
||||
make_column("documentType", &EditedMessage::documentType),
|
||||
make_column("documentSerialized", &EditedMessage::documentSerialized),
|
||||
make_column("thumbsSerialized", &EditedMessage::thumbsSerialized),
|
||||
make_column("documentAttributesSerialized", &EditedMessage::documentAttributesSerialized),
|
||||
make_column("mimeType", &EditedMessage::mimeType)
|
||||
),
|
||||
make_table(
|
||||
"DeletedDialog",
|
||||
make_column("fakeId", &DeletedDialog::fakeId, primary_key().autoincrement()),
|
||||
make_column("userId", &DeletedDialog::userId),
|
||||
make_column("dialogId", &DeletedDialog::dialogId),
|
||||
make_column("peerId", &DeletedDialog::peerId),
|
||||
make_column("folderId", &DeletedDialog::folderId),
|
||||
make_column("topMessage", &DeletedDialog::topMessage),
|
||||
make_column("lastMessageDate", &DeletedDialog::lastMessageDate),
|
||||
make_column("flags", &DeletedDialog::flags),
|
||||
make_column("entityCreateDate", &DeletedDialog::entityCreateDate)
|
||||
),
|
||||
make_table(
|
||||
"RegexFilter",
|
||||
make_column("id", &RegexFilter::id),
|
||||
make_column("text", &RegexFilter::text),
|
||||
make_column("enabled", &RegexFilter::enabled),
|
||||
make_column("caseInsensitive", &RegexFilter::caseInsensitive),
|
||||
make_column("dialogId", &RegexFilter::dialogId)
|
||||
),
|
||||
make_table(
|
||||
"RegexFilterGlobalExclusion",
|
||||
make_column("fakeId", &RegexFilterGlobalExclusion::fakeId, primary_key().autoincrement()),
|
||||
make_column("dialogId", &RegexFilterGlobalExclusion::dialogId),
|
||||
make_column("filterId", &RegexFilterGlobalExclusion::filterId)
|
||||
),
|
||||
make_table(
|
||||
"SpyMessageRead",
|
||||
make_column("fakeId", &SpyMessageRead::fakeId, primary_key().autoincrement()),
|
||||
make_column("userId", &SpyMessageRead::userId),
|
||||
make_column("dialogId", &SpyMessageRead::dialogId),
|
||||
make_column("messageId", &SpyMessageRead::messageId),
|
||||
make_column("entityCreateDate", &SpyMessageRead::entityCreateDate)
|
||||
),
|
||||
make_table(
|
||||
"SpyMessageContentsRead",
|
||||
make_column("fakeId", &SpyMessageContentsRead::fakeId, primary_key().autoincrement()),
|
||||
make_column("userId", &SpyMessageContentsRead::userId),
|
||||
make_column("dialogId", &SpyMessageContentsRead::dialogId),
|
||||
make_column("messageId", &SpyMessageContentsRead::messageId),
|
||||
make_column("entityCreateDate", &SpyMessageContentsRead::entityCreateDate)
|
||||
)
|
||||
);
|
||||
|
||||
namespace AyuDatabase {
|
||||
|
||||
void moveCurrentDatabase() {
|
||||
auto time = base::unixtime::now();
|
||||
|
||||
if (std::filesystem::exists("./tdata/ayudata.db")) {
|
||||
std::filesystem::rename("./tdata/ayudata.db", QString("./tdata/ayudata_%1.db").arg(time).toStdString());
|
||||
}
|
||||
|
||||
if (std::filesystem::exists("./tdata/ayudata.db-shm")) {
|
||||
std::filesystem::rename("./tdata/ayudata.db-shm",
|
||||
QString("./tdata/ayudata_%1.db-shm").arg(time).toStdString());
|
||||
}
|
||||
|
||||
if (std::filesystem::exists("./tdata/ayudata.db-wal")) {
|
||||
std::filesystem::rename("./tdata/ayudata.db-wal",
|
||||
QString("./tdata/ayudata_%1.db-wal").arg(time).toStdString());
|
||||
}
|
||||
}
|
||||
|
||||
void initialize() {
|
||||
const auto res = storage.sync_schema_simulate(true);
|
||||
auto movePrevious = false;
|
||||
for (const auto val : res | std::views::values) {
|
||||
if (val == sync_schema_result::dropped_and_recreated) {
|
||||
movePrevious = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (movePrevious) {
|
||||
moveCurrentDatabase();
|
||||
}
|
||||
|
||||
try {
|
||||
storage.sync_schema(true);
|
||||
} catch (...) {
|
||||
LOG(("Failed to sync database schema"));
|
||||
LOG(("Moving current database just in case"));
|
||||
|
||||
moveCurrentDatabase();
|
||||
|
||||
storage.sync_schema();
|
||||
}
|
||||
|
||||
storage.begin_transaction();
|
||||
storage.commit();
|
||||
}
|
||||
|
||||
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
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
bool hasRevisions(ID userId, ID dialogId, ID messageId) {
|
||||
return storage.count<EditedMessage>(
|
||||
where(
|
||||
c(&EditedMessage::userId) == userId and
|
||||
c(&EditedMessage::dialogId) == dialogId and
|
||||
c(&EditedMessage::messageId) == messageId
|
||||
)
|
||||
) > 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -7,8 +7,6 @@
|
|||
#pragma once
|
||||
|
||||
#include "entities.h"
|
||||
#include "history/history.h"
|
||||
#include "history/history_item.h"
|
||||
|
||||
namespace AyuDatabase {
|
||||
|
|
@ -36,6 +36,7 @@ public:
|
|||
ID replyPeerId;
|
||||
int replyTopId;
|
||||
bool replyForumTopic;
|
||||
std::vector<char> replySerialized;
|
||||
int entityCreateDate;
|
||||
std::string text;
|
||||
std::vector<char> textEntities;
|
||||
|
@ -49,6 +50,7 @@ public:
|
|||
};
|
||||
|
||||
using DeletedMessage = AyuMessageBase<struct DeletedMessageTag>;
|
||||
|
||||
using EditedMessage = AyuMessageBase<struct EditedMessageTag>;
|
||||
|
||||
class DeletedDialog
|
||||
|
@ -58,8 +60,47 @@ public:
|
|||
ID userId;
|
||||
ID dialogId;
|
||||
ID peerId;
|
||||
std::unique_ptr<int> folderId; // nullable
|
||||
int topMessage;
|
||||
int lastMessageDate;
|
||||
int flags;
|
||||
int entityCreateDate;
|
||||
};
|
||||
|
||||
class RegexFilter
|
||||
{
|
||||
public:
|
||||
std::vector<char> id;
|
||||
std::string text;
|
||||
bool enabled;
|
||||
bool caseInsensitive;
|
||||
std::unique_ptr<ID> dialogId; // nullable
|
||||
};
|
||||
|
||||
class RegexFilterGlobalExclusion
|
||||
{
|
||||
public:
|
||||
ID fakeId;
|
||||
ID dialogId;
|
||||
std::vector<char> filterId;
|
||||
};
|
||||
|
||||
class SpyMessageRead
|
||||
{
|
||||
public:
|
||||
ID fakeId;
|
||||
ID userId;
|
||||
ID dialogId;
|
||||
int messageId;
|
||||
int entityCreateDate;
|
||||
};
|
||||
|
||||
class SpyMessageContentsRead
|
||||
{
|
||||
public:
|
||||
ID fakeId;
|
||||
ID userId;
|
||||
ID dialogId;
|
||||
int messageId;
|
||||
int entityCreateDate;
|
||||
};
|
|
@ -4,10 +4,10 @@
|
|||
// but be respectful and credit the original author.
|
||||
//
|
||||
// Copyright @Radolyn, 2023
|
||||
#include "ayu_messages_controller.h"
|
||||
#include "messages_storage.h"
|
||||
|
||||
#include "ayu/ayu_constants.h"
|
||||
#include "ayu/database/ayu_database.h"
|
||||
#include "ayu/data/ayu_database.h"
|
||||
#include "ayu/utils/ayu_mapper.h"
|
||||
#include "ayu/utils/telegram_helpers.h"
|
||||
|
||||
|
@ -24,21 +24,6 @@
|
|||
|
||||
namespace AyuMessages {
|
||||
|
||||
std::optional<AyuMessagesController> controller = std::nullopt;
|
||||
|
||||
void initialize() {
|
||||
if (controller.has_value()) {
|
||||
return;
|
||||
}
|
||||
|
||||
controller = AyuMessagesController();
|
||||
}
|
||||
|
||||
AyuMessagesController &getInstance() {
|
||||
initialize();
|
||||
return controller.value();
|
||||
}
|
||||
|
||||
void map(HistoryMessageEdition &edition, not_null<HistoryItem*> item, EditedMessage &message) {
|
||||
message.userId = item->history()->owner().session().userId().bare;
|
||||
message.dialogId = getDialogIdFromPeer(item->history()->peer);
|
||||
|
@ -61,11 +46,11 @@ void map(HistoryMessageEdition &edition, not_null<HistoryItem *> item, EditedMes
|
|||
message.views = item->viewsCount();
|
||||
message.entityCreateDate = base::unixtime::now(); // todo: rework
|
||||
|
||||
auto serializedText = serializeTextWithEntities(item);
|
||||
auto serializedText = AyuMapper::serializeTextWithEntities(item);
|
||||
message.text = serializedText.first;
|
||||
// message.textEntities = serializedText.second;
|
||||
message.textEntities = serializedText.second;
|
||||
|
||||
// todo:
|
||||
// todo: implement mapping
|
||||
message.mediaPath = "/";
|
||||
message.documentType = DOCUMENT_TYPE_NONE;
|
||||
|
||||
|
@ -75,14 +60,14 @@ void map(HistoryMessageEdition &edition, not_null<HistoryItem *> item, EditedMes
|
|||
// message.mimeType;
|
||||
}
|
||||
|
||||
void AyuMessagesController::addEditedMessage(HistoryMessageEdition &edition, not_null<HistoryItem *> item) {
|
||||
void addEditedMessage(HistoryMessageEdition &edition, not_null<HistoryItem*> item) {
|
||||
EditedMessage message;
|
||||
map(edition, item, message);
|
||||
|
||||
AyuDatabase::addEditedMessage(message);
|
||||
}
|
||||
|
||||
std::vector<EditedMessage> AyuMessagesController::getEditedMessages(HistoryItem *item) {
|
||||
std::vector<EditedMessage> getEditedMessages(not_null<HistoryItem*> item) {
|
||||
auto userId = item->history()->owner().session().userId().bare;
|
||||
auto dialogId = getDialogIdFromPeer(item->history()->peer);
|
||||
auto msgId = item->id.bare;
|
||||
|
@ -90,7 +75,7 @@ std::vector<EditedMessage> AyuMessagesController::getEditedMessages(HistoryItem
|
|||
return AyuDatabase::getEditedMessages(userId, dialogId, msgId);
|
||||
}
|
||||
|
||||
bool AyuMessagesController::hasRevisions(not_null<HistoryItem *> item) {
|
||||
bool hasRevisions(not_null<HistoryItem*> item) {
|
||||
auto userId = item->history()->owner().session().userId().bare;
|
||||
auto dialogId = getDialogIdFromPeer(item->history()->peer);
|
||||
auto msgId = item->id.bare;
|
19
Telegram/SourceFiles/ayu/data/messages_storage.h
Normal file
19
Telegram/SourceFiles/ayu/data/messages_storage.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
// 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 "entities.h"
|
||||
|
||||
#include "history/history_item_edition.h"
|
||||
|
||||
namespace AyuMessages {
|
||||
|
||||
void addEditedMessage(HistoryMessageEdition &edition, not_null<HistoryItem*> item);
|
||||
std::vector<EditedMessage> getEditedMessages(not_null<HistoryItem*> item);
|
||||
bool hasRevisions(not_null<HistoryItem*> item);
|
||||
|
||||
}
|
|
@ -1,163 +0,0 @@
|
|||
// 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_database.h"
|
||||
|
||||
#include "entities.h"
|
||||
#include "ayu/libs/sqlite/sqlite_orm.h"
|
||||
|
||||
#include "base/unixtime.h"
|
||||
|
||||
using namespace sqlite_orm;
|
||||
|
||||
auto storage = make_storage("./tdata/ayudata.db",
|
||||
make_table("DeletedMessage",
|
||||
make_column("userId", &DeletedMessage::userId),
|
||||
make_column("dialogId", &DeletedMessage::dialogId),
|
||||
make_column("groupedId", &DeletedMessage::groupedId),
|
||||
make_column("peerId", &DeletedMessage::peerId),
|
||||
make_column("fromId", &DeletedMessage::fromId),
|
||||
make_column("topicId", &DeletedMessage::topicId),
|
||||
make_column("messageId", &DeletedMessage::messageId),
|
||||
make_column("date", &DeletedMessage::date),
|
||||
make_column("flags", &DeletedMessage::flags),
|
||||
make_column("editDate", &DeletedMessage::editDate),
|
||||
make_column("views", &DeletedMessage::views),
|
||||
make_column("fwdFlags", &DeletedMessage::fwdFlags),
|
||||
make_column("fwdFromId", &DeletedMessage::fwdFromId),
|
||||
make_column("fwdName", &DeletedMessage::fwdName),
|
||||
make_column("fwdDate", &DeletedMessage::fwdDate),
|
||||
make_column("fwdPostAuthor", &DeletedMessage::fwdPostAuthor),
|
||||
make_column("replyFlags", &DeletedMessage::replyFlags),
|
||||
make_column("replyMessageId", &DeletedMessage::replyMessageId),
|
||||
make_column("replyPeerId", &DeletedMessage::replyPeerId),
|
||||
make_column("replyTopId", &DeletedMessage::replyTopId),
|
||||
make_column("replyForumTopic", &DeletedMessage::replyForumTopic),
|
||||
make_column("entityCreateDate", &DeletedMessage::entityCreateDate),
|
||||
make_column("text", &DeletedMessage::text),
|
||||
make_column("textEntities", &DeletedMessage::textEntities),
|
||||
make_column("mediaPath", &DeletedMessage::mediaPath),
|
||||
make_column("hqThumbPath", &DeletedMessage::hqThumbPath),
|
||||
make_column("documentType", &DeletedMessage::documentType),
|
||||
make_column("documentSerialized", &DeletedMessage::documentSerialized),
|
||||
make_column("thumbsSerialized", &DeletedMessage::thumbsSerialized),
|
||||
make_column("documentAttributesSerialized",
|
||||
&DeletedMessage::documentAttributesSerialized),
|
||||
make_column("mimeType", &DeletedMessage::mimeType)
|
||||
),
|
||||
make_table("EditedMessage",
|
||||
make_column("userId", &EditedMessage::userId),
|
||||
make_column("dialogId", &EditedMessage::dialogId),
|
||||
make_column("groupedId", &EditedMessage::groupedId),
|
||||
make_column("peerId", &EditedMessage::peerId),
|
||||
make_column("fromId", &EditedMessage::fromId),
|
||||
make_column("topicId", &EditedMessage::topicId),
|
||||
make_column("messageId", &EditedMessage::messageId),
|
||||
make_column("date", &EditedMessage::date),
|
||||
make_column("flags", &EditedMessage::flags),
|
||||
make_column("editDate", &EditedMessage::editDate),
|
||||
make_column("views", &EditedMessage::views),
|
||||
make_column("fwdFlags", &EditedMessage::fwdFlags),
|
||||
make_column("fwdFromId", &EditedMessage::fwdFromId),
|
||||
make_column("fwdName", &EditedMessage::fwdName),
|
||||
make_column("fwdDate", &EditedMessage::fwdDate),
|
||||
make_column("fwdPostAuthor", &EditedMessage::fwdPostAuthor),
|
||||
make_column("replyFlags", &EditedMessage::replyFlags),
|
||||
make_column("replyMessageId", &EditedMessage::replyMessageId),
|
||||
make_column("replyPeerId", &EditedMessage::replyPeerId),
|
||||
make_column("replyTopId", &EditedMessage::replyTopId),
|
||||
make_column("replyForumTopic", &EditedMessage::replyForumTopic),
|
||||
make_column("entityCreateDate", &EditedMessage::entityCreateDate),
|
||||
make_column("text", &EditedMessage::text),
|
||||
make_column("textEntities", &EditedMessage::textEntities),
|
||||
make_column("mediaPath", &EditedMessage::mediaPath),
|
||||
make_column("hqThumbPath", &EditedMessage::hqThumbPath),
|
||||
make_column("documentType", &EditedMessage::documentType),
|
||||
make_column("documentSerialized", &EditedMessage::documentSerialized),
|
||||
make_column("thumbsSerialized", &EditedMessage::thumbsSerialized),
|
||||
make_column("documentAttributesSerialized",
|
||||
&EditedMessage::documentAttributesSerialized),
|
||||
make_column("mimeType", &EditedMessage::mimeType)
|
||||
),
|
||||
make_table("DeletedDialog",
|
||||
make_column("userId", &DeletedDialog::userId),
|
||||
make_column("dialogId", &DeletedDialog::dialogId),
|
||||
make_column("peerId", &DeletedDialog::peerId),
|
||||
make_column("topMessage", &DeletedDialog::topMessage),
|
||||
make_column("lastMessageDate", &DeletedDialog::lastMessageDate),
|
||||
make_column("flags", &DeletedDialog::flags),
|
||||
make_column("entityCreateDate", &DeletedDialog::entityCreateDate)
|
||||
)
|
||||
);
|
||||
|
||||
namespace AyuDatabase {
|
||||
|
||||
void initialize() {
|
||||
// move to `tdata` from legacy version
|
||||
if (std::filesystem::exists("ayugram.db")) {
|
||||
try {
|
||||
std::filesystem::rename("ayugram.db", "./tdata/ayudata.db");
|
||||
} catch (std::filesystem::filesystem_error &e) {
|
||||
LOG(("Failed to move database: %1").arg(e.what()));
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
storage.sync_schema();
|
||||
} catch (...) {
|
||||
auto time = base::unixtime::now();
|
||||
|
||||
LOG(("Failed to sync database schema"));
|
||||
LOG(("Moving current database just in case"));
|
||||
|
||||
if (std::filesystem::exists("./tdata/ayudata.db")) {
|
||||
std::filesystem::rename("./tdata/ayudata.db", QString("./tdata/ayudata_%1.db").arg(time).toStdString());
|
||||
}
|
||||
|
||||
if (std::filesystem::exists("./tdata/ayudata.db-shm")) {
|
||||
std::filesystem::rename("./tdata/ayudata.db-shm",
|
||||
QString("./tdata/ayudata_%1.db-shm").arg(time).toStdString());
|
||||
}
|
||||
|
||||
if (std::filesystem::exists("./tdata/ayudata.db-wal")) {
|
||||
std::filesystem::rename("./tdata/ayudata.db-wal",
|
||||
QString("./tdata/ayudata_%1.db-wal").arg(time).toStdString());
|
||||
}
|
||||
|
||||
storage.sync_schema();
|
||||
}
|
||||
|
||||
storage.begin_transaction();
|
||||
storage.commit();
|
||||
}
|
||||
|
||||
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
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
bool hasRevisions(ID userId, ID dialogId, ID messageId) {
|
||||
return storage.count<EditedMessage>(
|
||||
where(
|
||||
c(&EditedMessage::userId) == userId and
|
||||
c(&EditedMessage::dialogId) == dialogId and
|
||||
c(&EditedMessage::messageId) == messageId
|
||||
)
|
||||
) > 0;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
// 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 AyuMessagesController
|
||||
{
|
||||
public:
|
||||
void addEditedMessage(HistoryMessageEdition &edition, not_null<HistoryItem *> item);
|
||||
std::vector<EditedMessage> getEditedMessages(HistoryItem *item);
|
||||
bool hasRevisions(not_null<HistoryItem *> item);
|
||||
};
|
||||
|
||||
AyuMessagesController &getInstance();
|
||||
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
// but be respectful and credit the original author.
|
||||
//
|
||||
// Copyright @Radolyn, 2023
|
||||
#include "ayu_assets.h"
|
||||
#include "ayu_logo.h"
|
||||
#include "ayu/ayu_settings.h"
|
||||
|
||||
static QString LAST_LOADED_NAME;
|
|
@ -13,7 +13,7 @@
|
|||
#include "mainwindow.h"
|
||||
#include "ayu/ayu_settings.h"
|
||||
#include "ayu/ayu_state.h"
|
||||
#include "ayu/messages/ayu_messages_controller.h"
|
||||
#include "../../data/messages_storage.h"
|
||||
#include "ayu/ui/context_menu/menu_item_subtext.h"
|
||||
#include "ayu/utils/qt_key_modifiers_extended.h"
|
||||
#include "history/history_item_components.h"
|
||||
|
@ -37,7 +37,7 @@ bool needToShowItem(int state) {
|
|||
}
|
||||
|
||||
void AddHistoryAction(not_null<Ui::PopupMenu*> menu, HistoryItem *item) {
|
||||
if (AyuMessages::getInstance().hasRevisions(item)) {
|
||||
if (AyuMessages::hasRevisions(item)) {
|
||||
menu->addAction(tr::ayu_EditsHistoryMenuText(tr::now),
|
||||
[=]
|
||||
{
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
#include "mainwindow.h"
|
||||
#include "qguiapplication.h"
|
||||
#include "ayu/database/entities.h"
|
||||
#include "ayu/data/entities.h"
|
||||
#include "ayu/utils/telegram_helpers.h"
|
||||
|
||||
#include "base/unixtime.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
// Copyright @Radolyn, 2023
|
||||
#pragma once
|
||||
|
||||
#include "ayu/database/entities.h"
|
||||
#include "ayu/data/entities.h"
|
||||
#include "main/main_session.h"
|
||||
|
||||
#include "base/unique_qptr.h"
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "mainwidget.h"
|
||||
#include "mainwindow.h"
|
||||
#include "api/api_attached_stickers.h"
|
||||
#include "ayu/data/messages_storage.h"
|
||||
#include "ayu/ui/sections/edited/edited_log_section.h"
|
||||
#include "base/call_delayed.h"
|
||||
#include "base/unixtime.h"
|
||||
|
@ -53,7 +54,6 @@
|
|||
#include "ui/widgets/popup_menu.h"
|
||||
#include "window/window_session_controller.h"
|
||||
|
||||
#include <ayu/messages/ayu_messages_controller.h>
|
||||
#include <QtGui/QClipboard>
|
||||
#include <QtWidgets/QApplication>
|
||||
|
||||
|
@ -650,7 +650,7 @@ void InnerWidget::restoreState(not_null<SectionMemento *> memento) {
|
|||
}
|
||||
|
||||
void InnerWidget::addEvents(Direction direction) {
|
||||
auto messages = AyuMessages::getInstance().getEditedMessages(_item);
|
||||
auto messages = AyuMessages::getEditedMessages(_item);
|
||||
if (messages.empty()) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
//
|
||||
// Copyright @Radolyn, 2023
|
||||
#include "ayu/ui/sections/edited/edited_log_item.h"
|
||||
#include <ayu/database/entities.h>
|
||||
#include "ayu/data/entities.h"
|
||||
|
||||
#include "api/api_chat_participants.h"
|
||||
#include "api/api_text_entities.h"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
// Copyright @Radolyn, 2023
|
||||
#pragma once
|
||||
|
||||
#include "ayu/database/entities.h"
|
||||
#include "ayu/data/entities.h"
|
||||
|
||||
class History;
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "core/application.h"
|
||||
#include "styles/style_layers.h"
|
||||
|
||||
#include "ayu/ui/ayu_assets.h"
|
||||
#include "ayu/ui/ayu_logo.h"
|
||||
#include "main/main_domain.h"
|
||||
#include "styles/style_ayu_styles.h"
|
||||
#include "ui/painter.h"
|
||||
|
|
|
@ -12,6 +12,17 @@
|
|||
|
||||
namespace AyuMapper {
|
||||
|
||||
std::pair<std::string, std::vector<char>> serializeTextWithEntities(not_null<HistoryItem*> item) {
|
||||
if (item->emptyText()) {
|
||||
return std::make_pair("", std::vector<char>());
|
||||
}
|
||||
|
||||
auto textWithEntities = item->originalText();
|
||||
std::vector<char> entities; // todo: implement writing to buffer
|
||||
|
||||
return std::make_pair(textWithEntities.text.toStdString(), entities);
|
||||
}
|
||||
|
||||
int mapItemFlagsToMTPFlags(not_null<HistoryItem*> item) {
|
||||
int flags = 0;
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
namespace AyuMapper {
|
||||
|
||||
std::pair<std::string, std::vector<char>> serializeTextWithEntities(not_null<HistoryItem*> item);
|
||||
int mapItemFlagsToMTPFlags(not_null<HistoryItem*> item);
|
||||
|
||||
} // namespace AyuMapper
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
#include "lang_auto.h"
|
||||
#include "ayu/ayu_worker.h"
|
||||
#include "ayu/database/entities.h"
|
||||
#include "ayu/data/entities.h"
|
||||
#include "core/mime_type.h"
|
||||
#include "data/data_channel.h"
|
||||
#include "data/data_forum.h"
|
||||
|
@ -139,29 +139,6 @@ 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()));
|
||||
}
|
||||
|
||||
ID getBareID(not_null<PeerData*> peer) {
|
||||
return peerIsUser(peer->id)
|
||||
? peerToUser(peer->id).bare
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
// Copyright @Radolyn, 2023
|
||||
#pragma once
|
||||
|
||||
#include "ayu/database/entities.h"
|
||||
#include "ayu/data/entities.h"
|
||||
|
||||
#include "core/application.h"
|
||||
#include "dialogs/dialogs_main_list.h"
|
||||
|
@ -19,7 +19,6 @@ bool accountExists(ID userId);
|
|||
void dispatchToMainThread(std::function<void()> callback, int delay = 0);
|
||||
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);
|
||||
|
||||
ID getBareID(not_null<PeerData*> peer);
|
||||
|
||||
|
|
|
@ -78,8 +78,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
|
||||
// AyuGram includes
|
||||
#include "ayu/ayu_settings.h"
|
||||
#include "ayu/database/ayu_database.h"
|
||||
#include "ayu/messages/ayu_messages_controller.h"
|
||||
#include "ayu/data/ayu_database.h"
|
||||
#include "../ayu/data/messages_storage.h"
|
||||
#include "ayu/ayu_state.h"
|
||||
|
||||
|
||||
|
@ -2309,12 +2309,11 @@ void Session::updateEditedMessage(const MTPMessage &data) {
|
|||
|
||||
// AyuGram saveMessagesHistory
|
||||
const auto settings = &AyuSettings::getInstance();
|
||||
HistoryMessageEdition edit;
|
||||
|
||||
if (data.type() != mtpc_message) {
|
||||
goto proceed;
|
||||
}
|
||||
edit = HistoryMessageEdition(_session, data.c_message());
|
||||
HistoryMessageEdition edit = HistoryMessageEdition(_session, data.c_message());
|
||||
if (settings->saveMessagesHistory && !existing->isLocal() && !existing->author()->isSelf() && !edit.isEditHide) {
|
||||
const auto msg = existing->originalText();
|
||||
|
||||
|
@ -2322,7 +2321,7 @@ void Session::updateEditedMessage(const MTPMessage &data) {
|
|||
goto proceed;
|
||||
}
|
||||
|
||||
AyuMessages::getInstance().addEditedMessage(edit, existing);
|
||||
AyuMessages::addEditedMessage(edit, existing);
|
||||
}
|
||||
|
||||
proceed:
|
||||
|
|
|
@ -87,8 +87,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
|
||||
// AyuGram includes
|
||||
#include "ayu/ayu_settings.h"
|
||||
#include "ayu/database/ayu_database.h"
|
||||
#include "ayu/messages/ayu_messages_controller.h"
|
||||
#include "ayu/data/ayu_database.h"
|
||||
#include "../../ayu/data/messages_storage.h"
|
||||
#include "ayu/ui/context_menu/context_menu.h"
|
||||
#include "ayu/ui/sections/edited/edited_log_section.h"
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include "styles/style_window.h"
|
||||
|
||||
// AyuGram includes
|
||||
#include "ayu/ui/ayu_assets.h"
|
||||
#include "ayu/ui/ayu_logo.h"
|
||||
|
||||
|
||||
namespace Intro {
|
||||
|
|
|
@ -29,7 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include <QBuffer>
|
||||
|
||||
// AyuGram includes
|
||||
#include "ayu/ui/ayu_assets.h"
|
||||
#include "ayu/ui/ayu_logo.h"
|
||||
#include "ui/painter.h"
|
||||
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include <kurlmimedata.h>
|
||||
|
||||
// AyuGram includes
|
||||
#include "ayu/ui/ayu_assets.h"
|
||||
#include "ayu/ui/ayu_logo.h"
|
||||
|
||||
|
||||
namespace Window {
|
||||
|
|
Loading…
Add table
Reference in a new issue