package irclogs import "strings" type IRCMessage struct { Tags map[string]string Nick string Command string Params []string } func ParseIRCMessage(message string) IRCMessage { message = strings.TrimRight(message, "\r\n") msg := IRCMessage{ Tags: make(map[string]string), } if strings.HasPrefix(message, "@") { end := strings.IndexByte(message, ' ') rawTags := message[1:end] for _, tag := range strings.Split(rawTags, ";") { parts := strings.SplitN(tag, "=", 2) if len(parts) == 2 { msg.Tags[parts[0]] = parts[1] } else { msg.Tags[parts[0]] = "true" } } message = message[end+1:] } if strings.HasPrefix(message, ":") { end := strings.IndexByte(message, ' ') prefix := message[1:end] if bang := strings.IndexByte(prefix, '!'); bang != -1 { msg.Nick = prefix[:bang] } message = message[end+1:] } parts := strings.Split(message, " ") if len(parts) == 0 { return msg } msg.Command = parts[0] parts = parts[1:] for i := 0; i < len(parts); i++ { if len(parts[i]) == 0 { continue } if parts[i][0] == ':' { param := strings.Join(parts[i:], " ")[1:] msg.Params = append(msg.Params, param) break } msg.Params = append(msg.Params, parts[i]) } return msg }