diff options
Diffstat (limited to 'vendor/github.com/lrstanley/girc/builtin.go')
-rw-r--r-- | vendor/github.com/lrstanley/girc/builtin.go | 81 |
1 files changed, 40 insertions, 41 deletions
diff --git a/vendor/github.com/lrstanley/girc/builtin.go b/vendor/github.com/lrstanley/girc/builtin.go index 9dd02804..7f285fda 100644 --- a/vendor/github.com/lrstanley/girc/builtin.go +++ b/vendor/github.com/lrstanley/girc/builtin.go @@ -93,7 +93,7 @@ func handleConnect(c *Client, e Event) { } time.Sleep(2 * time.Second) - c.RunHandlers(&Event{Command: CONNECTED, Trailing: c.Server()}) + c.RunHandlers(&Event{Command: CONNECTED, Params: []string{c.Server()}}) } // nickCollisionHandler helps prevent the client from having conflicting @@ -109,7 +109,7 @@ func nickCollisionHandler(c *Client, e Event) { // handlePING helps respond to ping requests from the server. func handlePING(c *Client, e Event) { - c.Cmd.Pong(e.Trailing) + c.Cmd.Pong(e.Last()) } func handlePONG(c *Client, e Event) { @@ -120,16 +120,11 @@ func handlePONG(c *Client, e Event) { // handleJOIN ensures that the state has updated users and channels. func handleJOIN(c *Client, e Event) { - if e.Source == nil { + if e.Source == nil || len(e.Params) == 0 { return } - var channelName string - if len(e.Params) > 0 { - channelName = e.Params[0] - } else { - channelName = e.Trailing - } + channelName := e.Params[0] c.state.Lock() @@ -158,13 +153,13 @@ func handleJOIN(c *Client, e Event) { user.addChannel(channel.Name) // Assume extended-join (ircv3). - if len(e.Params) == 2 { + if len(e.Params) >= 2 { if e.Params[1] != "*" { user.Extras.Account = e.Params[1] } - if len(e.Trailing) > 0 { - user.Extras.Name = e.Trailing + if len(e.Params) > 2 { + user.Extras.Name = e.Params[2] } } c.state.Unlock() @@ -192,16 +187,13 @@ func handleJOIN(c *Client, e Event) { // handlePART ensures that the state is clean of old user and channel entries. func handlePART(c *Client, e Event) { - if e.Source == nil { + if e.Source == nil || len(e.Params) < 1 { return } - var channel string - if len(e.Params) > 0 { - channel = e.Params[0] - } else { - channel = e.Trailing - } + // TODO: does this work if it's not the bot? + + channel := e.Params[0] if channel == "" { return @@ -231,7 +223,7 @@ func handleTOPIC(c *Client, e Event) { case 1: name = e.Params[0] default: - name = e.Params[len(e.Params)-1] + name = e.Params[1] } c.state.Lock() @@ -241,7 +233,7 @@ func handleTOPIC(c *Client, e Event) { return } - channel.Topic = e.Trailing + channel.Topic = e.Last() c.state.Unlock() c.state.notify(c, UPDATE_STATE) } @@ -253,7 +245,7 @@ func handleWHO(c *Client, e Event) { // Assume WHOX related. if e.Command == RPL_WHOSPCRPL { - if len(e.Params) != 7 { + if len(e.Params) != 8 { // Assume there was some form of error or invalid WHOX response. return } @@ -266,12 +258,24 @@ func handleWHO(c *Client, e Event) { } ident, host, nick, account = e.Params[3], e.Params[4], e.Params[5], e.Params[6] - realname = e.Trailing + realname = e.Last() } else { // Assume RPL_WHOREPLY. - ident, host, nick = e.Params[2], e.Params[3], e.Params[5] - if len(e.Trailing) > 2 { - realname = e.Trailing[2:] + // format: "<client> <channel> <user> <host> <server> <nick> <H|G>[*][@|+] :<hopcount> <real_name>" + ident, host, nick, realname = e.Params[2], e.Params[3], e.Params[5], e.Last() + + // Strip the numbers from "<hopcount> <realname>" + for i := 0; i < len(realname); i++ { + // Check if it's not 0-9. + if realname[i] < 0x30 || i > 0x39 { + realname = strings.TrimLeft(realname[i+1:], " ") + break + } + + if i == len(realname)-1 { + // Assume it's only numbers? + realname = "" + } } } @@ -326,10 +330,8 @@ func handleNICK(c *Client, e Event) { c.state.Lock() // renameUser updates the LastActive time automatically. - if len(e.Params) == 1 { - c.state.renameUser(e.Source.ID(), e.Params[0]) - } else if len(e.Trailing) > 0 { - c.state.renameUser(e.Source.ID(), e.Trailing) + if len(e.Params) >= 1 { + c.state.renameUser(e.Source.ID(), e.Last()) } c.state.Unlock() c.state.notify(c, UPDATE_STATE) @@ -372,12 +374,10 @@ func handleMYINFO(c *Client, e Event) { // events. These commonly contain the server capabilities and limitations. // For example, things like max channel name length, or nickname length. func handleISUPPORT(c *Client, e Event) { - // Must be a ISUPPORT-based message. 005 is also used for server bounce - // related things, so this handler may be triggered during other - // situations. + // Must be a ISUPPORT-based message. // Also known as RPL_PROTOCTL. - if !strings.HasSuffix(e.Trailing, "this server") { + if !strings.HasSuffix(e.Last(), "this server") { return } @@ -387,8 +387,8 @@ func handleISUPPORT(c *Client, e Event) { } c.state.Lock() - // Skip the first parameter, as it's our nickname. - for i := 1; i < len(e.Params); i++ { + // Skip the first parameter, as it's our nickname, and the last, as it's the doc. + for i := 1; i < len(e.Params)-1; i++ { j := strings.IndexByte(e.Params[i], '=') if j < 1 || (j+1) == len(e.Params[i]) { @@ -421,10 +421,9 @@ func handleMOTD(c *Client, e Event) { // Otherwise, assume we're getting sent the MOTD line-by-line. if len(c.state.motd) != 0 { - e.Trailing = "\n" + e.Trailing + c.state.motd += "\n" } - - c.state.motd += e.Trailing + c.state.motd += e.Last() c.state.Unlock() } @@ -436,12 +435,12 @@ func handleNAMES(c *Client, e Event) { return } - channel := c.state.lookupChannel(e.Params[len(e.Params)-1]) + channel := c.state.lookupChannel(e.Params[2]) if channel == nil { return } - parts := strings.Split(e.Trailing, " ") + parts := strings.Split(e.Last(), " ") var modes, nick string var ok bool |