From 683aef44f92087c0747878dfa89030bf4c238901 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Jul 2025 22:55:01 +0000 Subject: [PATCH] Add local message feature to context menu with settings option Co-authored-by: g6582566 --- Telegram/Resources/langs/lang.strings | 4 + Telegram/SourceFiles/ayu/ayu_settings.cpp | 5 + Telegram/SourceFiles/ayu/ayu_settings.h | 3 + .../ayu/ui/context_menu/context_menu.cpp | 106 ++++++++++++++++++ .../ayu/ui/context_menu/context_menu.h | 1 + .../ayu/ui/settings/settings_ayu.cpp | 13 +++ .../view/history_view_context_menu.cpp | 1 + 7 files changed, 133 insertions(+) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 779778df3e..fbb2eb025c 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -6905,3 +6905,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "ayu_AboutText1" = "ToS breaking Telegram client based on {api_link}."; "ayu_UpdateAyuGram" = "Update AyuGram"; "ayu_UtilityRestartRequired" = "The app will close in 5 seconds."; +"ayu_AddLocalMessage" = "Add Local Message"; +"ayu_AddLocalMessageTitle" = "Add Local Message"; +"ayu_AddLocalMessagePlaceholder" = "Message text..."; +"ayu_AddLocalMessageFromPlaceholder" = "From user (optional)..."; diff --git a/Telegram/SourceFiles/ayu/ayu_settings.cpp b/Telegram/SourceFiles/ayu/ayu_settings.cpp index e3ea5e76ec..7fcf168f82 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.cpp +++ b/Telegram/SourceFiles/ayu/ayu_settings.cpp @@ -255,6 +255,7 @@ AyuGramSettings::AyuGramSettings() { showHideMessageInContextMenu = 0; showUserMessagesInContextMenu = 2; showMessageDetailsInContextMenu = 2; + showAddLocalMessageInContextMenu = 2; showAttachButtonInMessageField = true; showCommandsButtonInMessageField = true; @@ -463,6 +464,10 @@ void set_showMessageDetailsInContextMenu(int val) { settings->showMessageDetailsInContextMenu = val; } +void set_showAddLocalMessageInContextMenu(int val) { + settings->showAddLocalMessageInContextMenu = val; +} + void set_showAttachButtonInMessageField(bool val) { settings->showAttachButtonInMessageField = val; triggerHistoryUpdate(); diff --git a/Telegram/SourceFiles/ayu/ayu_settings.h b/Telegram/SourceFiles/ayu/ayu_settings.h index 6bbf81c7c7..fe0945b4a9 100644 --- a/Telegram/SourceFiles/ayu/ayu_settings.h +++ b/Telegram/SourceFiles/ayu/ayu_settings.h @@ -62,6 +62,7 @@ public: int showHideMessageInContextMenu; int showUserMessagesInContextMenu; int showMessageDetailsInContextMenu; + int showAddLocalMessageInContextMenu; bool showAttachButtonInMessageField; bool showCommandsButtonInMessageField; @@ -144,6 +145,7 @@ void set_showViewsPanelInContextMenu(int val); void set_showHideMessageInContextMenu(int val); void set_showUserMessagesInContextMenu(int val); void set_showMessageDetailsInContextMenu(int val); +void set_showAddLocalMessageInContextMenu(int val); void set_showAttachButtonInMessageField(bool val); void set_showCommandsButtonInMessageField(bool val); @@ -215,6 +217,7 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( showHideMessageInContextMenu, showUserMessagesInContextMenu, showMessageDetailsInContextMenu, + showAddLocalMessageInContextMenu, showAttachButtonInMessageField, showCommandsButtonInMessageField, showEmojiButtonInMessageField, diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp index 7216520af4..f01177a326 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.cpp @@ -22,6 +22,8 @@ #include "styles/style_menu_icons.h" #include "ui/widgets/popup_menu.h" #include "ui/widgets/menu/menu_add_action_callback_factory.h" +#include "ui/widgets/fields/input_field.h" +#include "ui/boxes/generic_box.h" #include "window/window_peer_menu.h" #include "ayu/ui/message_history/history_section.h" @@ -34,8 +36,10 @@ #include "data/data_session.h" #include "history/view/history_view_context_menu.h" #include "history/view/history_view_element.h" +#include "history/history.h" #include "window/window_controller.h" #include "window/window_session_controller.h" +#include "base/unixtime.h" namespace AyuUi { @@ -542,4 +546,106 @@ void AddBurnAction(not_null menu, HistoryItem *item) { &st::menuIconTTLAny); } +void AddLocalMessageAction(not_null menu, HistoryItem *item) { + if (!item) { + return; + } + + const auto& settings = AyuSettings::getInstance(); + if (!needToShowItem(settings.showAddLocalMessageInContextMenu)) { + return; + } + + const auto history = item->history(); + const auto controller = history->session().tryResolveWindow(); + if (!controller) { + return; + } + + menu->addAction( + tr::ayu_AddLocalMessage(tr::now), + [=]() { + const auto showBox = [=](const QString &text, PeerId fromId) { + if (text.isEmpty()) { + return; + } + + // Создаем локальное сообщение + const auto localId = history->session().data().nextLocalMessageId(); + const auto localItem = history->addNewLocalMessage({ + .id = localId, + .flags = MessageFlag::HasFromId, + .from = fromId, + .date = base::unixtime::now(), + }, TextWithEntities{ text }, MTP_messageMediaEmpty()); + + // Добавляем в базу данных локальных сообщений + AyuMessages::addLocalMessage(localItem); + }; + + controller->show(Box([=](not_null box) { + box->setTitle(tr::ayu_AddLocalMessageTitle()); + + // Поле для ввода текста сообщения + const auto textField = box->addRow(object_ptr( + box, + st::defaultInputField, + tr::ayu_AddLocalMessagePlaceholder(), + QString())); + textField->setMaxLength(4096); + + // Поле для выбора отправителя + const auto fromField = box->addRow(object_ptr( + box, + st::defaultInputField, + tr::ayu_AddLocalMessageFromPlaceholder(), + QString())); + + box->setFocusCallback([=] { + textField->setFocusFast(); + }); + + box->addButton(tr::lng_box_ok(), [=] { + const auto text = textField->getLastText().trimmed(); + const auto fromText = fromField->getLastText().trimmed(); + + PeerId fromId = history->peer->id; + if (!fromText.isEmpty()) { + // Пытаемся найти пользователя по имени или username + const auto session = &history->session(); + const auto &owner = session->data(); + + // Сначала пытаемся найти по username + if (const auto user = owner.userByUsername(fromText)) { + fromId = user->id; + } else { + // Затем ищем по имени среди участников чата + if (const auto chat = history->peer->asChat()) { + for (const auto &participant : chat->participants) { + if (const auto user = owner.user(participant.userId())) { + if (user->name().toLower().contains(fromText.toLower())) { + fromId = user->id; + break; + } + } + } + } else if (const auto channel = history->peer->asChannel()) { + // Для каналов используем текущего пользователя, если не найден + // В реальном приложении можно было бы реализовать поиск по участникам + } + } + } + + showBox(text, fromId); + box->closeBox(); + }); + + box->addButton(tr::lng_cancel(), [=] { + box->closeBox(); + }); + })); + }, + &st::menuIconEdit); +} + } // namespace AyuUi diff --git a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h index 1a422aad05..16750858b7 100644 --- a/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h +++ b/Telegram/SourceFiles/ayu/ui/context_menu/context_menu.h @@ -35,5 +35,6 @@ void AddUserMessagesAction(not_null menu, HistoryItem *item); void AddMessageDetailsAction(not_null menu, HistoryItem *item); void AddReadUntilAction(not_null menu, HistoryItem *item); void AddBurnAction(not_null menu, HistoryItem *item); +void AddLocalMessageAction(not_null menu, HistoryItem *item); } diff --git a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp index 9ace785559..b6c2a6c6eb 100644 --- a/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp +++ b/Telegram/SourceFiles/ayu/ui/settings/settings_ayu.cpp @@ -933,6 +933,19 @@ void SetupContextMenuElements(not_null container, AyuSettings::set_showMessageDetailsInContextMenu(index); AyuSettings::save(); }); + AddChooseButtonWithIconAndRightText( + container, + controller, + settings.showAddLocalMessageInContextMenu, + options, + tr::ayu_AddLocalMessage(), + tr::ayu_SettingsContextMenuTitle(), + st::menuIconEdit, + [=](int index) + { + AyuSettings::set_showAddLocalMessageInContextMenu(index); + AyuSettings::save(); + }); AddSkip(container); AddDividerText(container, tr::ayu_SettingsContextMenuDescription()); diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index efe1beea85..d541d553a0 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -1031,6 +1031,7 @@ void AddMessageActions( AyuUi::AddHideMessageAction(menu, request.item); AyuUi::AddUserMessagesAction(menu, request.item); AyuUi::AddMessageDetailsAction(menu, request.item); + AyuUi::AddLocalMessageAction(menu, request.item); } AddPostLinkAction(menu, request);