Changeset 73 in code for trunk/downstream.go
- Timestamp:
- Mar 4, 2020, 2:44:13 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r72 r73 59 59 username string 60 60 realname string 61 upstream *Upstream 61 62 } 62 63 … … 98 99 } 99 100 101 func (dc *downstreamConn) forEachUpstream(f func(*upstreamConn)) { 102 dc.user.forEachUpstream(func(uc *upstreamConn) { 103 if dc.upstream != nil && uc.upstream != dc.upstream { 104 return 105 } 106 f(uc) 107 }) 108 } 109 100 110 func (dc *downstreamConn) unmarshalChannel(name string) (*upstreamConn, string, error) { 101 // TODO: extract network name from channel name 102 ch, err := dc.user.getChannel(name) 103 if err != nil { 104 return nil, "", err 105 } 106 return ch.conn, ch.Name, nil 111 // TODO: extract network name from channel name if dc.upstream == nil 112 var channel *upstreamChannel 113 var err error 114 dc.forEachUpstream(func(uc *upstreamConn) { 115 if err != nil { 116 return 117 } 118 if ch, ok := uc.channels[name]; ok { 119 if channel != nil { 120 err = fmt.Errorf("ambiguous channel name %q", name) 121 } else { 122 channel = ch 123 } 124 } 125 }) 126 if channel == nil { 127 return nil, "", ircError{&irc.Message{ 128 Command: irc.ERR_NOSUCHCHANNEL, 129 Params: []string{name, "No such channel"}, 130 }} 131 } 132 return channel.conn, channel.Name, nil 107 133 } 108 134 … … 275 301 276 302 func (dc *downstreamConn) register() error { 277 u := dc.srv.getUser(strings.TrimPrefix(dc.username, "~")) 303 username := strings.TrimPrefix(dc.username, "~") 304 var network string 305 if i := strings.LastIndexAny(username, "/@"); i >= 0 { 306 network = username[i+1:] 307 } 308 if i := strings.IndexAny(username, "/@"); i >= 0 { 309 username = username[:i] 310 } 311 312 u := dc.srv.getUser(username) 278 313 if u == nil { 279 dc.logger.Printf("failed authentication: unknown username %q", dc.username)314 dc.logger.Printf("failed authentication: unknown username %q", username) 280 315 dc.SendMessage(&irc.Message{ 281 316 Prefix: dc.srv.prefix(), … … 286 321 } 287 322 323 if network != "" { 324 dc.upstream = dc.srv.getUpstream(network) 325 if dc.upstream == nil { 326 dc.logger.Printf("failed registration: unknown upstream %q", network) 327 dc.SendMessage(&irc.Message{ 328 Prefix: dc.srv.prefix(), 329 Command: irc.ERR_PASSWDMISMATCH, 330 Params: []string{"*", fmt.Sprintf("Unknown upstream server %q", network)}, 331 }) 332 return nil 333 } 334 } 335 288 336 dc.registered = true 289 337 dc.user = u … … 320 368 }) 321 369 322 u.forEachUpstream(func(uc *upstreamConn) {370 dc.forEachUpstream(func(uc *upstreamConn) { 323 371 // TODO: fix races accessing upstream connection data 324 372 for _, ch := range uc.channels { … … 328 376 } 329 377 330 // TODO: let clients specify the ring buffer name in their username 331 historyName := "" 378 historyName := dc.username 332 379 333 380 var seqPtr *uint64 … … 377 424 }} 378 425 case "NICK": 379 dc. user.forEachUpstream(func(uc *upstreamConn) {426 dc.forEachUpstream(func(uc *upstreamConn) { 380 427 uc.SendMessage(msg) 381 428 }) … … 449 496 450 497 if modeStr != "" { 451 dc. user.forEachUpstream(func(uc *upstreamConn) {498 dc.forEachUpstream(func(uc *upstreamConn) { 452 499 uc.SendMessage(&irc.Message{ 453 500 Command: "MODE",
Note:
See TracChangeset
for help on using the changeset viewer.