fix: only repeat the message when it appears continuously
This commit is contained in:
parent
359f3aee88
commit
540b50c4d8
2 changed files with 16 additions and 11 deletions
|
@ -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)
|
||||||
|
|
|
@ -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"""
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue