@@ -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