|
1 | 1 | import asyncio |
| 2 | +import inspect |
2 | 3 | import itertools |
3 | 4 | import logging |
4 | 5 | import time |
@@ -436,7 +437,42 @@ def run(self) -> Awaitable[Any]: |
436 | 437 | return coro |
437 | 438 |
|
438 | 439 | async def terminate(self) -> None: |
439 | | - self.shutdown_event.set() |
| 440 | + if hasattr(self, "shutdown_event"): |
| 441 | + self.shutdown_event.set() |
| 442 | + await self._close_reverse_ws_connections() |
| 443 | + |
| 444 | + async def _close_reverse_ws_connections(self) -> None: |
| 445 | + api_clients = getattr(self.bot, "_wsr_api_clients", None) |
| 446 | + event_clients = getattr(self.bot, "_wsr_event_clients", None) |
| 447 | + |
| 448 | + ws_clients: set[Any] = set() |
| 449 | + if isinstance(api_clients, dict): |
| 450 | + ws_clients.update(api_clients.values()) |
| 451 | + if isinstance(event_clients, set): |
| 452 | + ws_clients.update(event_clients) |
| 453 | + |
| 454 | + close_tasks: list[Awaitable[Any]] = [] |
| 455 | + for ws in ws_clients: |
| 456 | + close_func = getattr(ws, "close", None) |
| 457 | + if not callable(close_func): |
| 458 | + continue |
| 459 | + try: |
| 460 | + close_result = close_func(code=1000, reason="Adapter shutdown") |
| 461 | + except TypeError: |
| 462 | + close_result = close_func() |
| 463 | + except Exception: |
| 464 | + continue |
| 465 | + |
| 466 | + if inspect.isawaitable(close_result): |
| 467 | + close_tasks.append(close_result) |
| 468 | + |
| 469 | + if close_tasks: |
| 470 | + await asyncio.gather(*close_tasks, return_exceptions=True) |
| 471 | + |
| 472 | + if isinstance(api_clients, dict): |
| 473 | + api_clients.clear() |
| 474 | + if isinstance(event_clients, set): |
| 475 | + event_clients.clear() |
440 | 476 |
|
441 | 477 | async def shutdown_trigger_placeholder(self) -> None: |
442 | 478 | await self.shutdown_event.wait() |
|
0 commit comments