Changeset 4 in code for trunk


Ignore:
Timestamp:
Feb 4, 2020, 11:19:18 AM (5 years ago)
Author:
contact
Message:

Handle NICK and USER

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server.go

    r3 r4  
    1010)
    1111
     12type ircError struct {
     13        Message *irc.Message
     14}
     15
     16func 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
     27func 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
     38func (err ircError) Error() string {
     39        return err.Message.String()
     40}
     41
    1242type 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
     51func (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
     71func (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        }
    1584}
    1685
     
    2089        defer netConn.Close()
    2190
    22         conn := conn{netConn, irc.NewConn(netConn)}
     91        c := conn{net: netConn, irc: irc.NewConn(netConn)}
    2392        for {
    24                 msg, err := conn.irc.ReadMessage()
     93                msg, err := c.irc.ReadMessage()
    2594                if err == io.EOF {
    2695                        break
    2796                } else if err != nil {
    28                         return err
     97                        return fmt.Errorf("failed to read IRC command: %v", err)
    2998                }
    3099                log.Println(msg)
    31100
    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)
    42112                }
    43113        }
Note: See TracChangeset for help on using the changeset viewer.