Changeset 5 in code for trunk/server.go
- Timestamp:
- Feb 4, 2020, 5:56:07 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server.go
r4 r5 43 43 net net.Conn 44 44 irc *irc.Conn 45 srv *Server 45 46 registered bool 47 closed bool 46 48 nick string 47 49 username string 48 50 realname string 51 } 52 53 func (c *conn) Close() error { 54 if err := c.net.Close(); err != nil { 55 return err 56 } 57 c.closed = true 58 return nil 59 } 60 61 func (c *conn) WriteMessage(msg *irc.Message) error { 62 msg.Prefix = c.srv.prefix() 63 return c.irc.WriteMessage(msg) 49 64 } 50 65 … … 62 77 c.username = "~" + msg.Params[0] 63 78 c.realname = msg.Params[3] 64 c.registered = true 79 case "QUIT": 80 return c.Close() 65 81 default: 66 82 return newUnknownCommandError(msg.Command) 67 83 } 84 if c.username != "" && c.nick != "" { 85 return c.register() 86 } 87 return nil 88 } 89 90 func (c *conn) register() error { 91 c.registered = true 92 93 err := c.WriteMessage(&irc.Message{ 94 Command: irc.RPL_WELCOME, 95 Params: []string{c.nick, "Welcome to jounce, " + c.nick}, 96 }) 97 if err != nil { 98 return err 99 } 100 101 err = c.WriteMessage(&irc.Message{ 102 Command: irc.RPL_YOURHOST, 103 Params: []string{c.nick, "Your host is " + c.srv.Hostname}, 104 }) 105 if err != nil { 106 return err 107 } 108 109 err = c.WriteMessage(&irc.Message{ 110 Command: irc.RPL_CREATED, 111 Params: []string{c.nick, "This server was created <datetime>"}, // TODO 112 }) 113 if err != nil { 114 return err 115 } 116 117 err = c.WriteMessage(&irc.Message{ 118 Command: irc.RPL_MYINFO, 119 Params: []string{c.nick, c.srv.Hostname, "unknown", "", ""}, 120 }) 121 if err != nil { 122 return err 123 } 124 68 125 return nil 69 126 } … … 79 136 }, 80 137 }} 138 case "QUIT": 139 return c.Close() 81 140 default: 82 141 return newUnknownCommandError(msg.Command) … … 84 143 } 85 144 86 type Server struct{} 145 type Server struct{ 146 Hostname string 147 } 148 149 func (s *Server) prefix() *irc.Prefix { 150 return &irc.Prefix{Name: s.Hostname} 151 } 87 152 88 153 func (s *Server) handleConn(netConn net.Conn) error { 89 defer netConn.Close() 90 91 c := conn{net: netConn, irc: irc.NewConn(netConn)} 154 c := conn{net: netConn, irc: irc.NewConn(netConn), srv: s} 155 defer c.Close() 92 156 for { 93 157 msg, err := c.irc.ReadMessage() … … 105 169 } 106 170 if ircErr, ok := err.(ircError); ok { 107 if err := c.irc.WriteMessage(ircErr.Message); err != nil { 171 ircErr.Message.Prefix = s.prefix() 172 if err := c.WriteMessage(ircErr.Message); err != nil { 108 173 return fmt.Errorf("failed to write IRC reply: %v", err) 109 174 } … … 111 176 return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err) 112 177 } 113 } 114 115 return netConn.Close() 178 179 if c.closed { 180 return nil 181 } 182 } 183 184 return c.Close() 116 185 } 117 186
Note:
See TracChangeset
for help on using the changeset viewer.