- Timestamp:
- Feb 4, 2020, 11:19:18 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server.go
r3 r4 10 10 ) 11 11 12 type ircError struct { 13 Message *irc.Message 14 } 15 16 func newUnknownCommandError(cmd string) ircError { 17 return ircError{&irc.Message{ 18 Command: irc.ERR_UNKNOWNCOMMAND, 19 Params: []string{ 20 "*", 21 cmd, 22 "Unknown command", 23 }, 24 }} 25 } 26 27 func newNeedMoreParamsError(cmd string) ircError { 28 return ircError{&irc.Message{ 29 Command: irc.ERR_NEEDMOREPARAMS, 30 Params: []string{ 31 "*", 32 cmd, 33 "Not enough parameters", 34 }, 35 }} 36 } 37 38 func (err ircError) Error() string { 39 return err.Message.String() 40 } 41 12 42 type conn struct { 13 net net.Conn 14 irc *irc.Conn 43 net net.Conn 44 irc *irc.Conn 45 registered bool 46 nick string 47 username string 48 realname string 49 } 50 51 func (c *conn) handleMessageUnregistered(msg *irc.Message) error { 52 switch msg.Command { 53 case "NICK": 54 if len(msg.Params) != 1 { 55 return newNeedMoreParamsError(msg.Command) 56 } 57 c.nick = msg.Params[0] 58 case "USER": 59 if len(msg.Params) != 4 { 60 return newNeedMoreParamsError(msg.Command) 61 } 62 c.username = "~" + msg.Params[0] 63 c.realname = msg.Params[3] 64 c.registered = true 65 default: 66 return newUnknownCommandError(msg.Command) 67 } 68 return nil 69 } 70 71 func (c *conn) handleMessage(msg *irc.Message) error { 72 switch msg.Command { 73 case "NICK", "USER": 74 return ircError{&irc.Message{ 75 Command: irc.ERR_ALREADYREGISTERED, 76 Params: []string{ 77 c.nick, 78 "You may not reregister", 79 }, 80 }} 81 default: 82 return newUnknownCommandError(msg.Command) 83 } 15 84 } 16 85 … … 20 89 defer netConn.Close() 21 90 22 c onn := conn{netConn,irc.NewConn(netConn)}91 c := conn{net: netConn, irc: irc.NewConn(netConn)} 23 92 for { 24 msg, err := c onn.irc.ReadMessage()93 msg, err := c.irc.ReadMessage() 25 94 if err == io.EOF { 26 95 break 27 96 } else if err != nil { 28 return err97 return fmt.Errorf("failed to read IRC command: %v", err) 29 98 } 30 99 log.Println(msg) 31 100 32 switch msg.Command { 33 default: 34 err = conn.irc.WriteMessage(&irc.Message{ 35 Command: irc.ERR_UNKNOWNCOMMAND, 36 Params: []string{ 37 "*", 38 msg.Command, 39 "Unknown command", 40 }, 41 }) 101 if c.registered { 102 err = c.handleMessage(msg) 103 } else { 104 err = c.handleMessageUnregistered(msg) 105 } 106 if ircErr, ok := err.(ircError); ok { 107 if err := c.irc.WriteMessage(ircErr.Message); err != nil { 108 return fmt.Errorf("failed to write IRC reply: %v", err) 109 } 110 } else if err != nil { 111 return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err) 42 112 } 43 113 }
Note:
See TracChangeset
for help on using the changeset viewer.