Changeset 5 in code for trunk/server.go


Ignore:
Timestamp:
Feb 4, 2020, 5:56:07 PM (5 years ago)
Author:
contact
Message:

Add connection registration

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server.go

    r4 r5  
    4343        net        net.Conn
    4444        irc        *irc.Conn
     45        srv        *Server
    4546        registered bool
     47        closed     bool
    4648        nick       string
    4749        username   string
    4850        realname   string
     51}
     52
     53func (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
     61func (c *conn) WriteMessage(msg *irc.Message) error {
     62        msg.Prefix = c.srv.prefix()
     63        return c.irc.WriteMessage(msg)
    4964}
    5065
     
    6277                c.username = "~" + msg.Params[0]
    6378                c.realname = msg.Params[3]
    64                 c.registered = true
     79        case "QUIT":
     80                return c.Close()
    6581        default:
    6682                return newUnknownCommandError(msg.Command)
    6783        }
     84        if c.username != "" && c.nick != "" {
     85                return c.register()
     86        }
     87        return nil
     88}
     89
     90func (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
    68125        return nil
    69126}
     
    79136                        },
    80137                }}
     138        case "QUIT":
     139                return c.Close()
    81140        default:
    82141                return newUnknownCommandError(msg.Command)
     
    84143}
    85144
    86 type Server struct{}
     145type Server struct{
     146        Hostname string
     147}
     148
     149func (s *Server) prefix() *irc.Prefix {
     150        return &irc.Prefix{Name: s.Hostname}
     151}
    87152
    88153func (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()
    92156        for {
    93157                msg, err := c.irc.ReadMessage()
     
    105169                }
    106170                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 {
    108173                                return fmt.Errorf("failed to write IRC reply: %v", err)
    109174                        }
     
    111176                        return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err)
    112177                }
    113         }
    114 
    115         return netConn.Close()
     178
     179                if c.closed {
     180                        return nil
     181                }
     182        }
     183
     184        return c.Close()
    116185}
    117186
Note: See TracChangeset for help on using the changeset viewer.