diff --git a/backend/app/channels/feishu.py b/backend/app/channels/feishu.py index 1a2321eb7..d540a5dba 100644 --- a/backend/app/channels/feishu.py +++ b/backend/app/channels/feishu.py @@ -94,6 +94,14 @@ class FeishuChannel(Channel): return False return self._thread is not None and self._thread.is_alive() + def _build_event_handler(self, lark): + return ( + lark.EventDispatcherHandler.builder("", "") + .register_p2_im_message_receive_v1(self._on_message) + .register_p2_im_message_message_read_v1(self._on_message_read) + .build() + ) + async def start(self) -> None: if self._running: return @@ -187,7 +195,7 @@ class FeishuChannel(Channel): # thread's uvloop. _ws_client_mod.loop = loop - event_handler = lark.EventDispatcherHandler.builder("", "").register_p2_im_message_receive_v1(self._on_message).build() + event_handler = self._build_event_handler(lark) ws_client = lark.ws.Client( app_id=app_id, app_secret=app_secret, @@ -201,6 +209,9 @@ class FeishuChannel(Channel): logger.exception("Feishu WebSocket error") self._running = False + def _on_message_read(self, event) -> None: + logger.debug("[Feishu] ignoring message read event: %s", type(event).__name__) + async def stop(self) -> None: self._running = False self.bus.unsubscribe_outbound(self._on_outbound) diff --git a/backend/tests/test_feishu_parser.py b/backend/tests/test_feishu_parser.py index da9f780ac..fa0701fe5 100644 --- a/backend/tests/test_feishu_parser.py +++ b/backend/tests/test_feishu_parser.py @@ -83,6 +83,18 @@ def test_feishu_is_not_running_when_ws_thread_exits(): assert channel.is_running is False +def test_feishu_event_handler_ignores_message_read_events(): + import lark_oapi as lark + + bus = MessageBus() + channel = FeishuChannel(bus, {"app_id": "test", "app_secret": "test"}) + + event_handler = channel._build_event_handler(lark) + + assert "p2.im.message.receive_v1" in event_handler._processorMap + assert "p2.im.message.message_read_v1" in event_handler._processorMap + + def test_feishu_on_message_rich_text(): bus = MessageBus() config = {"app_id": "test", "app_secret": "test"}