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