diff --git a/channels/telegram_channel.py b/channels/telegram_channel.py index a92bbe5..d786188 100644 --- a/channels/telegram_channel.py +++ b/channels/telegram_channel.py @@ -21,6 +21,7 @@ class TelegramChannel(BaseChannel): def __init__(self) -> None: self._app: Application | None = None + self._polling_task: asyncio.Task | None = None self._inbound_callback: Callable[[dict[str, Any]], Awaitable[None]] | None = None def set_inbound_callback(self, cb: Callable[[dict[str, Any]], Awaitable[None]]) -> None: @@ -67,14 +68,21 @@ class TelegramChannel(BaseChannel): await self._app.initialize() await self._app.start() - # Long-Polling als Background-Task - asyncio.create_task(self._polling_loop(), name="telegram-polling") + # Long-Polling als Background-Task (Referenz speichern für sauberes Cancel) + self._polling_task = asyncio.create_task(self._polling_loop(), name="telegram-polling") logger.info("Telegram channel started (long-polling)") async def stop(self) -> None: + # Polling-Task sauber canceln + if self._polling_task and not self._polling_task.done(): + self._polling_task.cancel() + try: + await self._polling_task + except asyncio.CancelledError: + pass + self._polling_task = None + if self._app: - # Korrekte PTB v20+ Shutdown-Reihenfolge: - # Erst Updater stoppen, dann Application stoppen/shutdown try: if self._app.updater.running: await self._app.updater.stop() diff --git a/channels/whatsapp_channel.py b/channels/whatsapp_channel.py index 69a9881..7a829fe 100644 --- a/channels/whatsapp_channel.py +++ b/channels/whatsapp_channel.py @@ -1,5 +1,6 @@ from __future__ import annotations +import asyncio import logging from typing import Any, Callable, Awaitable @@ -98,6 +99,8 @@ class WhatsAppChannel(BaseChannel): await self._process_notification(body) if receipt_id: await self._delete_notification(receipt_id) + except asyncio.CancelledError: + raise except Exception as exc: logger.error("WhatsApp poll error: %s", exc)