Skip to content

Commit 32e48e0

Browse files
committed
Use listener registry for assistant ordering
1 parent 66b8d17 commit 32e48e0

3 files changed

Lines changed: 39 additions & 10 deletions

File tree

slack_bolt/app/app.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
CallableAuthorize,
2121
)
2222

23+
from slack_bolt.app.listener_registry import ListenerRegistry
2324
from slack_bolt.context.assistant.thread_context_store.store import AssistantThreadContextStore
2425

2526
from slack_bolt.error import BoltError, BoltUnhandledRequestError
@@ -348,8 +349,7 @@ def message_hello(message, say):
348349
# --------------------------------------
349350

350351
self._middleware_list: List[Middleware] = []
351-
self._listeners: List[Listener] = []
352-
self._assistant_listener_insertion_index = 0
352+
self._listeners: ListenerRegistry[Listener] = ListenerRegistry()
353353

354354
if listener_executor is None:
355355
listener_executor = ThreadPoolExecutor(max_workers=5)
@@ -706,9 +706,7 @@ def _register_assistant_listeners(self, assistant: Assistant) -> None:
706706
self._assistant_thread_context_store = assistant.thread_context_store
707707

708708
def register_listener(listener: Listener) -> None:
709-
# Keep Assistant listeners before catch-all listeners while preserving Assistant registration order.
710-
self._listeners.insert(self._assistant_listener_insertion_index, listener)
711-
self._assistant_listener_insertion_index += 1
709+
self._listeners.append_assistant(listener)
712710

713711
assistant._register_app_listeners(register_listener)
714712

slack_bolt/app/async_app.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from aiohttp import web
99

1010
from slack_bolt.app.async_server import AsyncSlackAppServer
11+
from slack_bolt.app.listener_registry import ListenerRegistry
1112
from slack_bolt.context.assistant.thread_context_store.async_store import (
1213
AsyncAssistantThreadContextStore,
1314
)
@@ -360,8 +361,7 @@ async def message_hello(message, say): # async function
360361
# --------------------------------------
361362

362363
self._async_middleware_list: List[AsyncMiddleware] = []
363-
self._async_listeners: List[AsyncListener] = []
364-
self._assistant_listener_insertion_index = 0
364+
self._async_listeners: ListenerRegistry[AsyncListener] = ListenerRegistry()
365365

366366
self._assistant_thread_context_store = assistant_thread_context_store
367367
self._attaching_conversation_kwargs_enabled = attaching_conversation_kwargs_enabled
@@ -733,9 +733,7 @@ def _register_assistant_listeners(self, assistant: AsyncAssistant) -> None:
733733
self._assistant_thread_context_store = assistant.thread_context_store
734734

735735
def register_listener(listener: AsyncListener) -> None:
736-
# Keep Assistant listeners before catch-all listeners while preserving Assistant registration order.
737-
self._async_listeners.insert(self._assistant_listener_insertion_index, listener)
738-
self._assistant_listener_insertion_index += 1
736+
self._async_listeners.append_assistant(listener)
739737

740738
assistant._register_app_listeners(register_listener)
741739

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from typing import Generic, Iterator, List, TypeVar, Union, overload
2+
3+
ListenerT = TypeVar("ListenerT")
4+
5+
6+
class ListenerRegistry(Generic[ListenerT]):
7+
def __init__(self) -> None:
8+
self._assistant_listeners: List[ListenerT] = []
9+
self._listeners: List[ListenerT] = []
10+
11+
def append(self, listener: ListenerT) -> None:
12+
self._listeners.append(listener)
13+
14+
def append_assistant(self, listener: ListenerT) -> None:
15+
self._assistant_listeners.append(listener)
16+
17+
def __iter__(self) -> Iterator[ListenerT]:
18+
yield from self._assistant_listeners
19+
yield from self._listeners
20+
21+
def __len__(self) -> int:
22+
return len(self._assistant_listeners) + len(self._listeners)
23+
24+
@overload
25+
def __getitem__(self, index: int) -> ListenerT:
26+
pass
27+
28+
@overload
29+
def __getitem__(self, index: slice) -> List[ListenerT]:
30+
pass
31+
32+
def __getitem__(self, index: Union[int, slice]) -> Union[ListenerT, List[ListenerT]]:
33+
return list(self)[index]

0 commit comments

Comments
 (0)