summaryrefslogtreecommitdiff
path: root/internal/message.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/message.go')
-rw-r--r--internal/message.go64
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
+}