13
13
from typing import cast
14
14
15
15
from pydantic import BaseModel
16
+ from redis import Redis
16
17
from slack_sdk import WebClient
17
18
from slack_sdk .errors import SlackApiError
18
19
from slack_sdk .http_retry import ConnectionErrorRetryHandler
@@ -538,8 +539,44 @@ def __init__(
538
539
self .user_cache : dict [str , BasicExpertInfo | None ] = {}
539
540
self .credentials_provider : CredentialsProviderInterface | None = None
540
541
self .credential_prefix : str | None = None
541
- self .delay_lock : str | None = None # the redis key for the shared lock
542
- self .delay_key : str | None = None # the redis key for the shared delay
542
+ # self.delay_lock: str | None = None # the redis key for the shared lock
543
+ # self.delay_key: str | None = None # the redis key for the shared delay
544
+
545
+ @staticmethod
546
+ def make_credential_prefix (key : str ) -> str :
547
+ return f"connector:slack:credential_{ key } "
548
+
549
+ @staticmethod
550
+ def make_delay_lock (prefix : str ) -> str :
551
+ return f"{ prefix } :delay_lock"
552
+
553
+ @staticmethod
554
+ def make_delay_key (prefix : str ) -> str :
555
+ return f"{ prefix } :delay"
556
+
557
+ @staticmethod
558
+ def make_slack_web_client (
559
+ prefix : str , token : str , max_retry_count : int , r : Redis
560
+ ) -> WebClient :
561
+ delay_lock = SlackConnector .make_delay_lock (prefix )
562
+ delay_key = SlackConnector .make_delay_key (prefix )
563
+
564
+ # NOTE: slack has a built in RateLimitErrorRetryHandler, but it isn't designed
565
+ # for concurrent workers. We've extended it with OnyxRedisSlackRetryHandler.
566
+ connection_error_retry_handler = ConnectionErrorRetryHandler ()
567
+ onyx_rate_limit_error_retry_handler = OnyxRedisSlackRetryHandler (
568
+ max_retry_count = max_retry_count ,
569
+ delay_lock = delay_lock ,
570
+ delay_key = delay_key ,
571
+ r = r ,
572
+ )
573
+ custom_retry_handlers : list [RetryHandler ] = [
574
+ connection_error_retry_handler ,
575
+ onyx_rate_limit_error_retry_handler ,
576
+ ]
577
+
578
+ client = WebClient (token = token , retry_handlers = custom_retry_handlers )
579
+ return client
543
580
544
581
@property
545
582
def channels (self ) -> list [str ] | None :
@@ -559,30 +596,20 @@ def set_credentials_provider(
559
596
) -> None :
560
597
credentials = credentials_provider .get_credentials ()
561
598
tenant_id = credentials_provider .get_tenant_id ()
599
+ if not tenant_id :
600
+ raise ValueError ("tenant_id cannot be None!" )
601
+
562
602
self .redis = get_redis_client (tenant_id = tenant_id )
563
603
564
- self .credential_prefix = (
565
- f"connector:slack:credential_ { credentials_provider .get_provider_key ()} "
604
+ self .credential_prefix = SlackConnector . make_credential_prefix (
605
+ credentials_provider .get_provider_key ()
566
606
)
567
- self .delay_lock = f"{ self .credential_prefix } :delay_lock"
568
- self .delay_key = f"{ self .credential_prefix } :delay"
569
607
570
- # NOTE: slack has a built in RateLimitErrorRetryHandler, but it isn't designed
571
- # for concurrent workers. We've extended it with OnyxRedisSlackRetryHandler.
572
- connection_error_retry_handler = ConnectionErrorRetryHandler ()
573
- onyx_rate_limit_error_retry_handler = OnyxRedisSlackRetryHandler (
574
- max_retry_count = self .MAX_RETRIES ,
575
- delay_lock = self .delay_lock ,
576
- delay_key = self .delay_key ,
577
- r = self .redis ,
608
+ bot_token = credentials ["slack_bot_token" ]
609
+ self .client = SlackConnector .make_slack_web_client (
610
+ self .credential_prefix , bot_token , self .MAX_RETRIES , self .redis
578
611
)
579
- custom_retry_handlers : list [RetryHandler ] = [
580
- connection_error_retry_handler ,
581
- onyx_rate_limit_error_retry_handler ,
582
- ]
583
612
584
- bot_token = credentials ["slack_bot_token" ]
585
- self .client = WebClient (token = bot_token , retry_handlers = custom_retry_handlers )
586
613
# use for requests that must return quickly (e.g. realtime flows where user is waiting)
587
614
self .fast_client = WebClient (
588
615
token = bot_token , timeout = SlackConnector .FAST_TIMEOUT
0 commit comments