@@ -9,7 +9,7 @@ from typing import Any, Callable, Dict
9
9
10
10
import bridge_with_slack_config
11
11
import slack_sdk
12
- from slack_sdk .rtm import RTMClient
12
+ from slack_sdk .rtm_v2 import RTMClient
13
13
14
14
import zulip
15
15
@@ -48,7 +48,7 @@ class SlackBridge:
48
48
49
49
# slack-specific
50
50
self .channel = self .slack_config ["channel" ]
51
- self .slack_client = RTMClient ( token = self . slack_config [ "token" ], auto_reconnect = True )
51
+ self .slack_client = rtm
52
52
# Spawn a non-websocket client for getting the users
53
53
# list and for posting messages in Slack.
54
54
self .slack_webclient = slack_sdk .WebClient (token = self .slack_config ["token" ])
@@ -84,23 +84,22 @@ class SlackBridge:
84
84
def run_slack_listener (self ) -> None :
85
85
members = self .slack_webclient .users_list ()["members" ]
86
86
# See also https://api.slack.com/changelog/2017-09-the-one-about-usernames
87
- self .slack_id_to_name = {
87
+ self .slack_id_to_name : Dict [ str , str ] = {
88
88
u ["id" ]: u ["profile" ].get ("display_name" , u ["profile" ]["real_name" ]) for u in members
89
89
}
90
90
self .slack_name_to_id = {v : k for k , v in self .slack_id_to_name .items ()}
91
91
92
- @RTMClient .run_on (event = "message" )
93
- def slack_to_zulip (** payload : Any ) -> None :
94
- msg = payload ["data" ]
95
- if msg ["channel" ] != self .channel :
92
+ @rtm .on ("message" )
93
+ def slack_to_zulip (client : RTMClient , event : Dict [str , Any ]) -> None :
94
+ if event ["channel" ] != self .channel :
96
95
return
97
- user_id = msg ["user" ]
96
+ user_id = event ["user" ]
98
97
user = self .slack_id_to_name [user_id ]
99
98
from_bot = user == self .slack_config ["username" ]
100
99
if from_bot :
101
100
return
102
- self .replace_slack_id_with_name (msg )
103
- content = ZULIP_MESSAGE_TEMPLATE .format (username = user , message = msg ["text" ])
101
+ self .replace_slack_id_with_name (event )
102
+ content = ZULIP_MESSAGE_TEMPLATE .format (username = user , message = event ["text" ])
104
103
msg_data = dict (
105
104
type = "stream" , to = self .zulip_stream , subject = self .zulip_subject , content = content
106
105
)
@@ -124,6 +123,9 @@ if __name__ == "__main__":
124
123
125
124
config = bridge_with_slack_config .config
126
125
126
+ # We have to define rtm outside of SlackBridge because the rtm variable is used as a method decorator.
127
+ rtm = RTMClient (token = config ["slack" ]["token" ])
128
+
127
129
backoff = zulip .RandomExponentialBackoff (timeout_success_equivalent = 300 )
128
130
while backoff .keep_going ():
129
131
try :
0 commit comments