package main import ( "strings" ) func init() { CommandHandlers["CAP"] = handleClientCap } func handleClientCap(msg RMsg, client *Client) error { if len(msg.Params) < 1 { err := client.Send(MakeMsg(self, ERR_NEEDMOREPARAMS, "CAP", "Not enough parameters")) if err != nil { return err } return nil } if client.State == ClientStateRemote { return ErrRemoteClient } switch strings.ToUpper(msg.Params[0]) { case "LS": if client.State == ClientStatePreRegistration { client.State = ClientStateCapabilities } var err error if len(msg.Params) >= 2 && msg.Params[1] == "302" { err = client.Send(MakeMsg(self, "CAP", client.Nick, "LS", capls302)) } else { err = client.Send(MakeMsg(self, "CAP", client.Nick, "LS", capls)) } // TODO: Split when too long if err != nil { return err } case "REQ": if client.State == ClientStatePreRegistration { client.State = ClientStateCapabilities } caps := strings.Split(msg.Params[1], " ") for _, c := range caps { if c[0] == '-' { // TODO: Remove capability delete(client.Caps, c) continue } _, ok := Caps[c] if ok { err := client.Send(MakeMsg(self, "CAP", client.Nick, "ACK", c)) if err != nil { return err } client.Caps[c] = struct{}{} // TODO: This is terrible } else { err := client.Send(MakeMsg(self, "CAP", client.Nick, "NAK", c)) if err != nil { return err } } } case "END": if client.State != ClientStateCapabilities { // Just ignore it return nil } client.State = ClientStateCapabilitiesFinished err := client.checkRegistration() if err != nil { return err } } return nil }