diff --git a/matrix_alertbot/callback.py b/matrix_alertbot/callback.py index 8db1d3c..385db72 100644 --- a/matrix_alertbot/callback.py +++ b/matrix_alertbot/callback.py @@ -96,7 +96,7 @@ class Callbacks: user_id_patterns.append(rf"@?{username}(:{homeserver})?") pattern = re.compile( - rf"(^|\s+)({'|'.join(user_id_patterns)})(\s+|$)", + rf"(^|\s+)({'|'.join(user_id_patterns)}):?(?=\s+|$)", re.IGNORECASE | re.MULTILINE, ) if pattern.search(msg) is None: @@ -123,6 +123,11 @@ class Callbacks: # Remove the mention of the bot cmd = pattern.sub(" ", msg).strip() + logger.debug( + "Bot {self.matrix_client.user_id} | Room ID {room.room_id} | " + f"Event ID {event.event_id} | Sender {event.sender} | " + f"Processing command {cmd}" + ) try: command = CommandFactory.create( cmd, diff --git a/tests/test_callback.py b/tests/test_callback.py index 4fdbab1..4510909 100644 --- a/tests/test_callback.py +++ b/tests/test_callback.py @@ -307,6 +307,39 @@ class CallbacksTestCase(unittest.IsolatedAsyncioTestCase): ) fake_command.return_value.process.assert_called_once() + @patch.object(matrix_alertbot.command, "AckAlertCommand", autospec=True) + async def test_message_ack_in_reply_with_multi_mentions( + self, fake_command: Mock + ) -> None: + """Tests the callback for RoomMessageText with a mention of the bot""" + # Tests that the bot process messages in the room that contain a command + fake_message_event = Mock(spec=nio.RoomMessageText) + fake_message_event.event_id = "some event id" + fake_message_event.sender = "@some_other_fake_user:example.com" + fake_message_event.body = "@fake_user:example.com @fake_user:example.com: ack" + fake_message_event.source = { + "content": { + "m.relates_to": {"m.in_reply_to": {"event_id": "some alert event id"}} + } + } + + # Pretend that we received a text message event + await self.callbacks.message(self.fake_room, fake_message_event) + + # Check that the command was not executed + fake_command.assert_called_once_with( + self.fake_matrix_client, + self.fake_cache, + self.fake_alertmanager_client, + self.fake_config, + self.fake_room, + fake_message_event.sender, + fake_message_event.event_id, + "some alert event id", + (), + ) + fake_command.return_value.process.assert_called_once() + @patch.object(matrix_alertbot.callback, "UnackAlertCommand", autospec=True) async def test_message_unack_not_in_reply_with_mention( self, fake_command: Mock