fix: only repeat the message when it appears continuously

This commit is contained in:
草师傅 2025-07-31 10:50:19 +08:00
parent 359f3aee88
commit 540b50c4d8
2 changed files with 16 additions and 11 deletions

View file

@ -53,7 +53,7 @@ class TelegramAdapter:
# link 模块 # link 模块
router.message(F.text.regexp(r'https?:\/\/(?:www\.)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)*(\/[\/\d\w\.-]*)*(?:[\?])*(.+)*'))(handle_links) router.message(F.text.regexp(r'https?:\/\/(?:www\.)?([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)*(\/[\/\d\w\.-]*)*(?:[\?])*(.+)*'))(handle_links)
# repeater 模块 # 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) router.message(F.chat.type.in_({'group', 'supergroup'}))(dummy_handler)

View file

@ -10,32 +10,37 @@ class MessageRepeater:
self.message_counts = defaultdict(lambda: defaultdict(int)) self.message_counts = defaultdict(lambda: defaultdict(int))
self.repeated_messages = defaultdict(set) self.repeated_messages = defaultdict(set)
self.message_timestamps = defaultdict(lambda: defaultdict(float)) self.message_timestamps = defaultdict(lambda: defaultdict(float))
self.last_messages = defaultdict(str) # Track last message in each chat
self.expiry_seconds = message_expiry_seconds self.expiry_seconds = message_expiry_seconds
async def handle_message(self, message: aiogram.types.Message): async def handle_message(self, message: aiogram.types.Message):
"""Handle incoming messages and repeat when a threshold is met""" """Handle incoming messages and repeat when a threshold is met"""
chat_id = message.chat.id 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): if not config.is_feature_enabled('repeater', message.chat.id):
return return
if not text:
return
# Clean expired messages # Clean expired messages
self._clean_expired_messages(chat_id) self._clean_expired_messages(chat_id)
# Increment message count # Increment message count
self.message_counts[chat_id][text] += 1 self.message_counts[chat_id][content] += 1
self.message_timestamps[chat_id][text] = time.time() self.message_timestamps[chat_id][content] = time.time()
# If a message appears twice and hasn't been repeated yet # If a message appears twice and hasn't been repeated yet
if (self.message_counts[chat_id][text] >= 2 and if (content == self.last_messages[chat_id] and
text not in self.repeated_messages[chat_id]): self.message_counts[chat_id][content] >= 2 and
content not in self.repeated_messages[chat_id]):
# Mark as repeated and send the message # Mark as repeated and send the message
self.repeated_messages[chat_id].add(text) self.repeated_messages[chat_id].add(content)
await message.answer(text) await message.copy_to(chat_id)
self.last_messages[chat_id] = content
def _clean_expired_messages(self, chat_id: int): def _clean_expired_messages(self, chat_id: int):
"""Remove messages older than expiry_seconds""" """Remove messages older than expiry_seconds"""