summaryrefslogtreecommitdiff
path: root/internal/message.go
blob: e8df9a4a6240e524b6e4d061d7f6fc55c1ab1aa8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
}