From 12b89bb1ea84db360afad09dfdbb5a90fa8ffc00 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Wed, 8 Apr 2026 11:21:18 +0800 Subject: [PATCH 1/2] feat: add enabled property to Channel and TelegramChannel classes Signed-off-by: Frost Ming --- src/bub/channels/base.py | 5 +++++ src/bub/channels/manager.py | 6 ++++-- src/bub/channels/telegram.py | 4 ++++ tests/test_builtin_hook_impl.py | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/bub/channels/base.py b/src/bub/channels/base.py index e00ce436..939b37d6 100644 --- a/src/bub/channels/base.py +++ b/src/bub/channels/base.py @@ -23,6 +23,11 @@ def needs_debounce(self) -> bool: """Whether this channel needs debounce to prevent overload. Default to False.""" return False + @property + def enabled(self) -> bool: + """Whether this channel is enabled. Default to True.""" + return True + async def send(self, message: ChannelMessage) -> None: """Send a message to the channel. Optional to implement.""" # Do nothing by default diff --git a/src/bub/channels/manager.py b/src/bub/channels/manager.py index 85cd8af4..08d2f7a5 100644 --- a/src/bub/channels/manager.py +++ b/src/bub/channels/manager.py @@ -104,8 +104,10 @@ async def quit(self, session_id: str) -> None: def enabled_channels(self) -> list[Channel]: if "all" in self._enabled_channels: # Exclude 'cli' channel from 'all' to prevent interference with other channels - return [channel for name, channel in self._channels.items() if name != "cli"] - return [channel for name, channel in self._channels.items() if name in self._enabled_channels] + return [channel for name, channel in self._channels.items() if name != "cli" and channel.enabled] + return [ + channel for name, channel in self._channels.items() if name in self._enabled_channels and channel.enabled + ] def _on_task_done(self, session_id: str, task: asyncio.Task) -> None: task.exception() # to log any exception diff --git a/src/bub/channels/telegram.py b/src/bub/channels/telegram.py index b18363c2..db9feb57 100644 --- a/src/bub/channels/telegram.py +++ b/src/bub/channels/telegram.py @@ -153,6 +153,10 @@ def __init__(self, on_receive: MessageHandler) -> None: self._parser = TelegramMessageParser(bot_getter=lambda: self._app.bot) self._typing_tasks: dict[str, asyncio.Task] = {} + @property + def enabled(self) -> bool: + return bool(self._settings.token) + @property def needs_debounce(self) -> bool: return True diff --git a/tests/test_builtin_hook_impl.py b/tests/test_builtin_hook_impl.py index 5fc2766e..ce81a183 100644 --- a/tests/test_builtin_hook_impl.py +++ b/tests/test_builtin_hook_impl.py @@ -156,6 +156,10 @@ class DummyTelegramChannel: def __init__(self, on_receive) -> None: self.on_receive = on_receive + @property + def enabled(self) -> bool: + return True + import bub.channels.cli import bub.channels.telegram From f5c7e64c93e2f0742281139eca745507e5d1f8cc Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Wed, 8 Apr 2026 11:22:58 +0800 Subject: [PATCH 2/2] feat: add enabled property to FakeChannel class Signed-off-by: Frost Ming --- tests/test_channels.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_channels.py b/tests/test_channels.py index 5fbec216..6e0f2958 100644 --- a/tests/test_channels.py +++ b/tests/test_channels.py @@ -34,6 +34,10 @@ async def start(self, stop_event: asyncio.Event) -> None: async def stop(self) -> None: self.stopped = True + @property + def enabled(self) -> bool: + return True + async def send(self, message: ChannelMessage) -> None: self.sent.append(message)