From a063ce3c45e5abfa7717acb426b80891cbddd723 Mon Sep 17 00:00:00 2001 From: AlexeyZavar Date: Wed, 19 Nov 2025 02:35:29 +0300 Subject: [PATCH] fix: invalidate message filtered status on edit --- .../filters/filters_cache_controller.cpp | 31 +++++++++++++------ .../filters/filters_cache_controller.h | 12 +++---- .../features/filters/filters_controller.cpp | 9 ++++++ .../ayu/features/filters/filters_controller.h | 3 +- Telegram/SourceFiles/data/data_session.cpp | 3 ++ 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp index 270dc6cb70..5f54da2fd6 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp +++ b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.cpp @@ -17,13 +17,13 @@ static std::mutex mutex; namespace FiltersCacheController { + std::optional> sharedPatterns; std::optional>> patternsByDialogId; std::optional>> exclusionsByDialogId; -std::unordered_map,std::optional>> filteredMessages; - +std::unordered_map, std::optional>> filteredMessages; void rebuildCache() { std::lock_guard lock(mutex); @@ -40,9 +40,7 @@ void rebuildCache() { } int flags = UREGEX_MULTILINE; - if (filter.caseInsensitive) - flags |= UREGEX_CASE_INSENSITIVE; - + if (filter.caseInsensitive) flags |= UREGEX_CASE_INSENSITIVE; auto status = U_ZERO_ERROR; auto pattern = RegexPattern::compile(UnicodeString::fromUTF8(filter.text), flags, status); @@ -69,16 +67,13 @@ void rebuildCache() { std::unordered_map> buildExclusions( const std::vector &exclusions, const std::vector &shared) { - std::unordered_map> exclusionsByDialogId; for (const auto &exclusion : exclusions) { - auto &exclusionSet = exclusionsByDialogId[exclusion.dialogId]; for (const auto &filter : shared) { if (filter.id == exclusion.filterId) { - exclusionSet.insert(filter); break; } @@ -87,7 +82,7 @@ std::unordered_map return exclusionsByDialogId; } -std::optional isFiltered(not_null item) { +std::optional isFiltered(not_null item) { std::lock_guard lock(mutex); auto dialogIt = filteredMessages.find(item->history()->peer->id.value); @@ -103,11 +98,27 @@ std::optional isFiltered(not_null item) { return it->second; } -void putFiltered(not_null item, bool res) { +void putFiltered(not_null item, bool res) { std::lock_guard lock(mutex); filteredMessages[item->history()->peer->id.value][item->id.bare] = res; } +void invalidate(not_null item) { + std::lock_guard lock(mutex); + const auto dialogIt = filteredMessages.find(item->history()->peer->id.value); + + if (dialogIt == filteredMessages.end()) { + return; + } + + const auto it = dialogIt->second.find(item->id.bare); + if (it == dialogIt->second.end()) { + return; + } + + dialogIt->second.erase(it); +} + std::optional> getPatternsByDialogId(uint64 dialogId) { if (!patternsByDialogId.has_value()) { rebuildCache(); diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h index 0c93fdc721..ba81dde92f 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h +++ b/Telegram/SourceFiles/ayu/features/filters/filters_cache_controller.h @@ -13,19 +13,19 @@ using namespace FiltersController; namespace FiltersCacheController { - void rebuildCache(); std::unordered_map> buildExclusions( - const std::vector& exclusions, - const std::vector& shared); + const std::vector &exclusions, + const std::vector &shared); -std::optional isFiltered(not_null item); -void putFiltered(not_null item, bool res); +std::optional isFiltered(not_null item); +void putFiltered(not_null item, bool res); + +void invalidate(not_null item); std::optional> getPatternsByDialogId(uint64 dialogId); std::optional> getExclusionsByDialogId(long long dialogId); const std::vector &getSharedPatterns(); } - diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp b/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp index 84fc5156a7..3b3dbf9835 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp +++ b/Telegram/SourceFiles/ayu/features/filters/filters_controller.cpp @@ -150,4 +150,13 @@ bool filtered(const not_null item) { return false; } +void invalidate(not_null item) { + const auto &settings = AyuSettings::getInstance(); + if (!settings.filtersEnabled) { + return; + } + + FiltersCacheController::invalidate(item); +} + } diff --git a/Telegram/SourceFiles/ayu/features/filters/filters_controller.h b/Telegram/SourceFiles/ayu/features/filters/filters_controller.h index 755063dbf0..ce8515d531 100644 --- a/Telegram/SourceFiles/ayu/features/filters/filters_controller.h +++ b/Telegram/SourceFiles/ayu/features/filters/filters_controller.h @@ -16,9 +16,10 @@ namespace FiltersController { bool isEnabled(PeerData *peer); bool isBlocked(not_null item); -bool filteredWithoutCaching(not_null historyItem); bool filtered(not_null historyItem); +void invalidate(not_null item); + struct ReversiblePattern { std::shared_ptr pattern; diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index d65aeef809..5937a3972b 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -86,6 +86,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL // AyuGram includes #include "ayu/ayu_settings.h" #include "ayu/data/messages_storage.h" +#include "ayu/features/filters/filters_controller.h" #include "ayu/utils/telegram_helpers.h" @@ -2680,6 +2681,8 @@ void Session::updateEditedMessage(const MTPMessage &data) { AyuMessages::addEditedMessage(existing); } + FiltersController::invalidate(existing); + proceed: if (existing->isLocalUpdateMedia() && data.type() == mtpc_message) {