From 540b50c4d86fa6385a60f434befaffa566262b91 Mon Sep 17 00:00:00 2001 From: grassblock Date: Thu, 31 Jul 2025 10:50:19 +0800 Subject: [PATCH] fix: only repeat the message when it appears continuously --- adapters/tg.py | 2 +- core/repeater.py | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/adapters/tg.py b/adapters/tg.py index 539041d..954469a 100644 --- a/adapters/tg.py +++ b/adapters/tg.py @@ -53,7 +53,7 @@ class TelegramAdapter: # link 模块 router.message(F.text.regexp(r'https?:\/\/(?:www\.)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)*(\/[\/\d\w\.-]*)*(?:[\?])*(.+)*'))(handle_links) # repeater 模块 - router.message(F.text & (F.chat.type.in_({'group', 'supergroup'})))(MessageRepeater().handle_message) + router.message(F.chat.type.in_({'group', 'supergroup'}))(MessageRepeater().handle_message) # 捕获所有其他消息 router.message(F.chat.type.in_({'group', 'supergroup'}))(dummy_handler) diff --git a/core/repeater.py b/core/repeater.py index 60ef3d5..a5229db 100644 --- a/core/repeater.py +++ b/core/repeater.py @@ -10,32 +10,37 @@ class MessageRepeater: self.message_counts = defaultdict(lambda: defaultdict(int)) self.repeated_messages = defaultdict(set) self.message_timestamps = defaultdict(lambda: defaultdict(float)) + self.last_messages = defaultdict(str) # Track last message in each chat self.expiry_seconds = message_expiry_seconds async def handle_message(self, message: aiogram.types.Message): """Handle incoming messages and repeat when a threshold is met""" chat_id = message.chat.id - text = message.text + content = '' + if message.text: + content = message.text + elif message.sticker: + content = message.sticker.file_id if not config.is_feature_enabled('repeater', message.chat.id): return - if not text: - return - # Clean expired messages self._clean_expired_messages(chat_id) # Increment message count - self.message_counts[chat_id][text] += 1 - self.message_timestamps[chat_id][text] = time.time() + self.message_counts[chat_id][content] += 1 + self.message_timestamps[chat_id][content] = time.time() # If a message appears twice and hasn't been repeated yet - if (self.message_counts[chat_id][text] >= 2 and - text not in self.repeated_messages[chat_id]): + if (content == self.last_messages[chat_id] and + self.message_counts[chat_id][content] >= 2 and + content not in self.repeated_messages[chat_id]): # Mark as repeated and send the message - self.repeated_messages[chat_id].add(text) - await message.answer(text) + self.repeated_messages[chat_id].add(content) + await message.copy_to(chat_id) + + self.last_messages[chat_id] = content def _clean_expired_messages(self, chat_id: int): """Remove messages older than expiry_seconds"""