@@ -37,10 +37,11 @@ func init() {
37
37
}
38
38
39
39
type providerSlack struct {
40
- token string
41
- wsURL string
42
- wsConn * websocket.Conn
43
- selfID string
40
+ token string
41
+ wsURL string
42
+ selfID string
43
+ wsConnMu sync.Mutex
44
+ wsConn * websocket.Conn
44
45
45
46
in chan messages.Message
46
47
out chan messages.Message
@@ -105,7 +106,6 @@ func (p *providerSlack) handshake() {
105
106
if ! v {
106
107
p .err = err
107
108
return
108
-
109
109
}
110
110
default :
111
111
p .err = err
@@ -126,7 +126,9 @@ func (p *providerSlack) dial() {
126
126
p .err = err
127
127
return
128
128
}
129
+ p .wsConnMu .Lock ()
129
130
p .wsConn = ws
131
+ p .wsConnMu .Unlock ()
130
132
}
131
133
132
134
func (p * providerSlack ) intakeLoop () {
@@ -138,9 +140,15 @@ func (p *providerSlack) intakeLoop() {
138
140
UserID string `json:"user"`
139
141
Text string `json:"text"`
140
142
}
141
- if err := json .NewDecoder (p .wsConn ).Decode (& data ); err != nil {
143
+
144
+ p .wsConnMu .Lock ()
145
+ wsConn := p .wsConn
146
+ p .wsConnMu .Unlock ()
147
+
148
+ if err := json .NewDecoder (wsConn ).Decode (& data ); err != nil {
142
149
continue
143
150
}
151
+
144
152
if data .Type != "message" {
145
153
continue
146
154
}
@@ -219,21 +227,32 @@ func (p *providerSlack) dispatchLoop() {
219
227
if len (wsMsg ) > 16 * 1024 {
220
228
continue
221
229
}
222
- fmt .Fprint (p .wsConn , wsMsg )
230
+
231
+ p .wsConnMu .Lock ()
232
+ wsConn := p .wsConn
233
+ p .wsConnMu .Unlock ()
234
+
235
+ fmt .Fprint (wsConn , wsMsg )
236
+
223
237
time .Sleep (1 * time .Second ) // https://api.slack.com/docs/rate-limits
224
238
}
225
239
}
226
240
227
241
func (p * providerSlack ) reconnect () {
228
242
for {
229
243
time .Sleep (1 * time .Second )
230
- if p .wsConn == nil {
244
+
245
+ p .wsConnMu .Lock ()
246
+ wsConn := p .wsConn
247
+ p .wsConnMu .Unlock ()
248
+
249
+ if wsConn == nil {
231
250
log .Println ("slack: cannot reconnect" )
232
251
break
233
252
}
234
- _ , err := p . wsConn . Write ([] byte ( `{"type":"hello"}` ))
235
- if err != nil {
236
- log .Println ("slack: reconnecting" )
253
+
254
+ if _ , err := wsConn . Write ([] byte ( `{"type":"hello"}` )); err != nil {
255
+ log .Printf ("slack: reconnecting (%v)" , err )
237
256
p .handshake ()
238
257
p .dial ()
239
258
}
0 commit comments