- Timestamp:
- Feb 6, 2020, 9:46:46 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/upstream.go
r27 r33 29 29 irc *irc.Conn 30 30 srv *Server 31 messages chan<- *irc.Message 31 32 32 33 serverName string … … 36 37 37 38 registered bool 39 closed bool 38 40 modes modeSet 39 41 channels map[string]*upstreamChannel 42 } 43 44 func connectToUpstream(s *Server, upstream *Upstream) (*upstreamConn, error) { 45 logger := &prefixLogger{s.Logger, fmt.Sprintf("upstream %q: ", upstream.Addr)} 46 logger.Printf("connecting to server") 47 48 netConn, err := tls.Dial("tcp", upstream.Addr, nil) 49 if err != nil { 50 return nil, fmt.Errorf("failed to dial %q: %v", upstream.Addr, err) 51 } 52 53 msgs := make(chan *irc.Message, 64) 54 conn := &upstreamConn{ 55 upstream: upstream, 56 logger: logger, 57 net: netConn, 58 irc: irc.NewConn(netConn), 59 srv: s, 60 messages: msgs, 61 channels: make(map[string]*upstreamChannel), 62 } 63 64 go func() { 65 for msg := range msgs { 66 if err := conn.irc.WriteMessage(msg); err != nil { 67 conn.logger.Printf("failed to write message: %v", err) 68 } 69 } 70 }() 71 72 return conn, nil 73 } 74 75 func (c *upstreamConn) Close() error { 76 if c.closed { 77 return fmt.Errorf("upstream connection already closed") 78 } 79 if err := c.net.Close(); err != nil { 80 return err 81 } 82 close(c.messages) 83 c.closed = true 84 return nil 40 85 } 41 86 … … 52 97 case "PING": 53 98 // TODO: handle params 54 return c.irc.WriteMessage(&irc.Message{99 c.messages <- &irc.Message{ 55 100 Command: "PONG", 56 101 Params: []string{c.srv.Hostname}, 57 }) 102 } 103 return nil 58 104 case "MODE": 59 105 if len(msg.Params) < 2 { … … 71 117 72 118 for _, ch := range c.upstream.Channels { 73 err := c.irc.WriteMessage(&irc.Message{119 c.messages <- &irc.Message{ 74 120 Command: "JOIN", 75 121 Params: []string{ch}, 76 })77 if err != nil {78 return err79 122 } 80 123 } … … 192 235 193 236 func (c *upstreamConn) readMessages() error { 194 defer c. net.Close()195 196 err := c.irc.WriteMessage(&irc.Message{237 defer c.Close() 238 239 c.messages <- &irc.Message{ 197 240 Command: "NICK", 198 241 Params: []string{c.upstream.Nick}, 199 }) 200 if err != nil { 201 return err 202 } 203 204 err = c.irc.WriteMessage(&irc.Message{ 242 } 243 244 c.messages <- &irc.Message{ 205 245 Command: "USER", 206 246 Params: []string{c.upstream.Username, "0", "*", c.upstream.Realname}, 207 })208 if err != nil {209 return err210 247 } 211 248 … … 223 260 } 224 261 225 return c.net.Close() 226 } 227 228 func connectToUpstream(s *Server, upstream *Upstream) (*upstreamConn, error) { 229 logger := &prefixLogger{s.Logger, fmt.Sprintf("upstream %q: ", upstream.Addr)} 230 logger.Printf("connecting to server") 231 232 netConn, err := tls.Dial("tcp", upstream.Addr, nil) 233 if err != nil { 234 return nil, fmt.Errorf("failed to dial %q: %v", upstream.Addr, err) 235 } 236 237 return &upstreamConn{ 238 upstream: upstream, 239 logger: logger, 240 net: netConn, 241 irc: irc.NewConn(netConn), 242 srv: s, 243 channels: make(map[string]*upstreamChannel), 244 }, nil 245 } 262 return c.Close() 263 }
Note:
See TracChangeset
for help on using the changeset viewer.