diff options
Diffstat (limited to 'internal/message.go')
| -rw-r--r-- | internal/message.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/internal/message.go b/internal/message.go new file mode 100644 index 0000000..e8df9a4 --- /dev/null +++ b/internal/message.go @@ -0,0 +1,64 @@ +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 +} |
