@@ -8,8 +8,8 @@ import traceback
8
8
from typing import Any , Callable , Dict , Optional , Tuple
9
9
10
10
import bridge_with_slack_config
11
- import slack_sdk
12
11
from slack_sdk .rtm_v2 import RTMClient
12
+ from slack_sdk .web .client import WebClient
13
13
14
14
import zulip
15
15
@@ -41,6 +41,18 @@ def get_slack_channel_for_zulip_message(
41
41
return zulip_to_slack_map [stream_topic ]
42
42
43
43
44
+ def check_token_access (token : str ) -> None :
45
+ if token .startswith ("xoxp-" ):
46
+ print (
47
+ "--- Warning! ---\n "
48
+ "You entered a Slack user token, please copy the token under\n "
49
+ "'Bot User OAuth Token' which starts with 'xoxb-...'."
50
+ )
51
+ sys .exit (1 )
52
+ elif token .startswith ("xoxb-" ):
53
+ return
54
+
55
+
44
56
class SlackBridge :
45
57
def __init__ (self , config : Dict [str , Any ]) -> None :
46
58
self .config = config
@@ -49,7 +61,7 @@ class SlackBridge:
49
61
50
62
self .slack_to_zulip_map : Dict [str , Dict [str , str ]] = config ["channel_mapping" ]
51
63
self .zulip_to_slack_map : Dict [StreamTopicT , str ] = {
52
- (z ["stream " ], z ["topic" ]): s for s , z in config ["channel_mapping" ].items ()
64
+ (z ["channel " ], z ["topic" ]): s for s , z in config ["channel_mapping" ].items ()
53
65
}
54
66
55
67
# zulip-specific
@@ -69,7 +81,7 @@ class SlackBridge:
69
81
self .slack_client = rtm
70
82
# Spawn a non-websocket client for getting the users
71
83
# list and for posting messages in Slack.
72
- self .slack_webclient = slack_sdk . WebClient (token = self .slack_config ["token" ])
84
+ self .slack_webclient = WebClient (token = self .slack_config ["token" ])
73
85
74
86
def wrap_slack_mention_with_bracket (self , zulip_msg : Dict [str , Any ]) -> None :
75
87
words = zulip_msg ["content" ].split (" " )
@@ -123,7 +135,7 @@ class SlackBridge:
123
135
zulip_endpoint = self .slack_to_zulip_map [event ["channel" ]]
124
136
msg_data = dict (
125
137
type = "stream" ,
126
- to = zulip_endpoint ["stream " ],
138
+ to = zulip_endpoint ["channel " ],
127
139
subject = zulip_endpoint ["topic" ],
128
140
content = content ,
129
141
)
@@ -141,6 +153,10 @@ if __name__ == "__main__":
141
153
142
154
sys .path .append (os .path .join (os .path .dirname (__file__ ), ".." ))
143
155
parser = argparse .ArgumentParser (usage = usage )
156
+ parser .add_argument (
157
+ "--legacy" , action = "store_true" , help = "Run the bridge using the legacy Slack RTM API"
158
+ )
159
+ args = parser .parse_args ()
144
160
145
161
config : Dict [str , Any ] = bridge_with_slack_config .config
146
162
if "channel_mapping" not in config :
@@ -150,10 +166,13 @@ if __name__ == "__main__":
150
166
)
151
167
sys .exit (1 )
152
168
169
+ check_token_access (config ["slack" ]["token" ])
170
+
153
171
print ("Starting slack mirroring bot" )
154
172
print ("MAKE SURE THE BOT IS SUBSCRIBED TO THE RELEVANT ZULIP STREAM(S) & SLACK CHANNEL(S)!" )
155
173
156
174
# We have to define rtm outside of SlackBridge because the rtm variable is used as a method decorator.
175
+ # the RTM API is a legacy Slack SDK, we keep using them only to provide backwards compitability.
157
176
rtm = RTMClient (token = config ["slack" ]["token" ])
158
177
159
178
backoff = zulip .RandomExponentialBackoff (timeout_success_equivalent = 300 )
@@ -164,14 +183,26 @@ if __name__ == "__main__":
164
183
zp = threading .Thread (
165
184
target = sb .zulip_client .call_on_each_message , args = (sb .zulip_to_slack (),)
166
185
)
167
- sp = threading .Thread (target = sb .run_slack_listener , args = ())
168
186
print ("Starting message handler on Zulip client" )
169
187
zp .start ()
170
- print ("Starting message handler on Slack client" )
171
- sp .start ()
172
188
173
- zp .join ()
174
- sp .join ()
189
+ if args .legacy :
190
+ sp = threading .Thread (target = sb .run_slack_listener , args = ())
191
+ print (
192
+ "Warning! Running on legacy Slack SDK\n "
193
+ "Starting message handler on Slack client"
194
+ )
195
+ sp .start ()
196
+ sp .join ()
197
+ zp .join ()
198
+ else :
199
+ print (
200
+ "Warning! if you haven't moved to the new Slack app,\n "
201
+ "please run the script with the --legacy argument.\n "
202
+ "Make sure your Slack Webhook integration is running\n "
203
+ "to receive messages from Slack."
204
+ )
205
+ zp .join ()
175
206
except Exception :
176
207
traceback .print_exc ()
177
208
backoff .fail ()
0 commit comments