Changeset 281 in code for trunk/upstream.go
- Timestamp:
- Apr 30, 2020, 1:27:41 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/upstream.go
r278 r281 299 299 return newNeedMoreParamsError(msg.Command) 300 300 } 301 caps := s trings.Fields(subParams[len(subParams)-1])301 caps := subParams[len(subParams)-1] 302 302 more := len(subParams) >= 2 && msg.Params[len(subParams)-2] == "*" 303 303 304 for _, s := range caps { 305 kv := strings.SplitN(s, "=", 2) 306 k := strings.ToLower(kv[0]) 307 var v string 308 if len(kv) == 2 { 309 v = kv[1] 310 } 311 uc.supportedCaps[k] = v 312 } 304 uc.handleSupportedCaps(caps) 313 305 314 306 if more { … … 316 308 } 317 309 318 requestCaps := make([]string, 0, 16) 319 for _, c := range []string{"message-tags", "batch", "labeled-response", "server-time", "away-notify"} { 320 if _, ok := uc.supportedCaps[c]; ok { 321 requestCaps = append(requestCaps, c) 322 } 323 } 324 325 if uc.requestSASL() { 326 requestCaps = append(requestCaps, "sasl") 327 } 328 329 if len(requestCaps) > 0 { 330 uc.SendMessage(&irc.Message{ 331 Command: "CAP", 332 Params: []string{"REQ", strings.Join(requestCaps, " ")}, 333 }) 334 } 310 uc.requestCaps() 335 311 336 312 if uc.requestSASL() { … … 358 334 Command: "CAP", 359 335 Params: []string{"END"}, 336 }) 337 } 338 339 if uc.registered { 340 uc.forEachDownstream(func(dc *downstreamConn) { 341 dc.updateSupportedCaps() 342 }) 343 } 344 case "NEW": 345 if len(subParams) < 1 { 346 return newNeedMoreParamsError(msg.Command) 347 } 348 uc.handleSupportedCaps(subParams[0]) 349 uc.requestCaps() 350 case "DEL": 351 if len(subParams) < 1 { 352 return newNeedMoreParamsError(msg.Command) 353 } 354 caps := strings.Fields(subParams[0]) 355 356 for _, c := range caps { 357 delete(uc.supportedCaps, c) 358 delete(uc.caps, c) 359 } 360 361 if uc.registered { 362 uc.forEachDownstream(func(dc *downstreamConn) { 363 dc.updateSupportedCaps() 360 364 }) 361 365 } … … 1191 1195 } 1192 1196 1197 func (uc *upstreamConn) handleSupportedCaps(capsStr string) { 1198 caps := strings.Fields(capsStr) 1199 for _, s := range caps { 1200 kv := strings.SplitN(s, "=", 2) 1201 k := strings.ToLower(kv[0]) 1202 var v string 1203 if len(kv) == 2 { 1204 v = kv[1] 1205 } 1206 uc.supportedCaps[k] = v 1207 } 1208 } 1209 1210 func (uc *upstreamConn) requestCaps() { 1211 var requestCaps []string 1212 for _, c := range []string{"message-tags", "batch", "labeled-response", "server-time", "away-notify"} { 1213 if _, ok := uc.supportedCaps[c]; ok && !uc.caps[c] { 1214 requestCaps = append(requestCaps, c) 1215 } 1216 } 1217 1218 if uc.requestSASL() && !uc.caps["sasl"] { 1219 requestCaps = append(requestCaps, "sasl") 1220 } 1221 1222 if len(requestCaps) > 0 { 1223 uc.SendMessage(&irc.Message{ 1224 Command: "CAP", 1225 Params: []string{"REQ", strings.Join(requestCaps, " ")}, 1226 }) 1227 } 1228 } 1229 1193 1230 func splitSpace(s string) []string { 1194 1231 return strings.FieldsFunc(s, func(r rune) bool {
Note:
See TracChangeset
for help on using the changeset viewer.