- Timestamp:
- Feb 6, 2020, 8:52:04 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/downstream.go
r23 r26 40 40 41 41 type downstreamConn struct { 42 net net.Conn 43 irc *irc.Conn 44 srv *Server 45 logger Logger 42 net net.Conn 43 irc *irc.Conn 44 srv *Server 45 logger Logger 46 messages chan<- *irc.Message 46 47 47 48 registered bool … … 53 54 54 55 func newDownstreamConn(srv *Server, netConn net.Conn) *downstreamConn { 55 return &downstreamConn{ 56 net: netConn, 57 irc: irc.NewConn(netConn), 58 srv: srv, 59 logger: &prefixLogger{srv.Logger, fmt.Sprintf("downstream %q: ", netConn.RemoteAddr())}, 60 } 56 msgs := make(chan *irc.Message, 64) 57 conn := &downstreamConn{ 58 net: netConn, 59 irc: irc.NewConn(netConn), 60 srv: srv, 61 logger: &prefixLogger{srv.Logger, fmt.Sprintf("downstream %q: ", netConn.RemoteAddr())}, 62 messages: msgs, 63 } 64 65 go func() { 66 for msg := range msgs { 67 if err := conn.irc.WriteMessage(msg); err != nil { 68 conn.logger.Printf("failed to write message: %v", err) 69 } 70 } 71 }() 72 73 return conn 61 74 } 62 75 … … 76 89 if ircErr, ok := err.(ircError); ok { 77 90 ircErr.Message.Prefix = c.srv.prefix() 78 if err := c.WriteMessage(ircErr.Message); err != nil { 79 return fmt.Errorf("failed to write IRC reply: %v", err) 80 } 91 c.messages <- ircErr.Message 81 92 } else if err != nil { 82 93 return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err) … … 92 103 93 104 func (c *downstreamConn) Close() error { 105 if c.closed { 106 return fmt.Errorf("downstream connection already closed") 107 } 94 108 if err := c.net.Close(); err != nil { 95 109 return err 96 110 } 111 close(c.messages) 97 112 c.closed = true 98 113 return nil 99 114 } 100 115 101 func (c *downstreamConn) WriteMessage(msg *irc.Message) error{116 func (c *downstreamConn) WriteMessage(msg *irc.Message) { 102 117 msg.Prefix = c.srv.prefix() 103 return c.irc.WriteMessage(msg)118 c.messages <- msg 104 119 } 105 120 … … 108 123 case "PING": 109 124 // TODO: handle params 110 returnc.WriteMessage(&irc.Message{125 c.WriteMessage(&irc.Message{ 111 126 Command: "PONG", 112 127 Params: []string{c.srv.Hostname}, 113 128 }) 129 return nil 114 130 default: 115 131 if c.registered { … … 149 165 c.registered = true 150 166 151 err :=c.WriteMessage(&irc.Message{167 c.WriteMessage(&irc.Message{ 152 168 Command: irc.RPL_WELCOME, 153 169 Params: []string{c.nick, "Welcome to jounce, " + c.nick}, 154 170 }) 155 if err != nil { 156 return err 157 } 158 159 err = c.WriteMessage(&irc.Message{ 171 172 c.WriteMessage(&irc.Message{ 160 173 Command: irc.RPL_YOURHOST, 161 174 Params: []string{c.nick, "Your host is " + c.srv.Hostname}, 162 175 }) 163 if err != nil { 164 return err 165 } 166 167 err = c.WriteMessage(&irc.Message{ 176 177 c.WriteMessage(&irc.Message{ 168 178 Command: irc.RPL_CREATED, 169 179 Params: []string{c.nick, "This server was created <datetime>"}, // TODO 170 180 }) 171 if err != nil { 172 return err 173 } 174 175 err = c.WriteMessage(&irc.Message{ 181 182 c.WriteMessage(&irc.Message{ 176 183 Command: irc.RPL_MYINFO, 177 184 Params: []string{c.nick, c.srv.Hostname, "unknown", "aiwroO", "OovaimnqpsrtklbeI"}, 178 185 }) 179 if err != nil { 180 return err 181 } 182 183 err = c.WriteMessage(&irc.Message{ 186 187 c.WriteMessage(&irc.Message{ 184 188 Command: irc.ERR_NOMOTD, 185 189 Params: []string{c.nick, "No MOTD"}, 186 190 }) 187 if err != nil {188 return err189 }190 191 191 192 return nil
Note:
See TracChangeset
for help on using the changeset viewer.