diff --git a/client/client.go b/client/client.go index 00455b2..3e2dfea 100644 --- a/client/client.go +++ b/client/client.go @@ -77,6 +77,7 @@ func (c Client) Register(nick string, password string, channel string) { c.SendCommand("NICK", nick) c.SendCommand("USER", nick, "0", "*", nick) // TODO: CAP REQ :whatever capability the client recognizes and supports + c.SendCommand("CAP", "REQ", ":message-tags") c.SendCommand("CAP", "END") c.SendCommand("JOIN", channel) } diff --git a/parser/parser.go b/parser/parser.go index 19d88f1..eeb5120 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -21,21 +21,33 @@ import ( ) type IRCMessage struct { - Tags []Tag // starts with @ | Optional + Tags Tags // starts with @ | Optional Source string // starts with : | Optional Command string // can either be a string or a numeric value | Required Parameters []string // Optional (Dependant on command) } -type Tag struct { - key string - value string -} +type Tags map[string]string -func parseTags(rawTags string) []Tag { - // TODO: - // TOOD: some tags don't have an "=" and they're basically considered "true" - return nil +func parseTags(rawTags string) Tags { + tags := make(Tags, 0) + rawTagsSlice := strings.Split(rawTags, ";") + + for _, tag := range rawTagsSlice { + str := strings.Split(tag, "=") + + key := str[0] + value := "" + + // we need to make sure a "value" exists before accessing str[1] + if len(str) > 1 { + value = str[1] + } + + tags[key] = value + } + + return tags } func ParseIRCMessage(line string) IRCMessage { diff --git a/ui/mainscreen/mainscreen.go b/ui/mainscreen/mainscreen.go index 90e1668..ffd97c6 100644 --- a/ui/mainscreen/mainscreen.go +++ b/ui/mainscreen/mainscreen.go @@ -38,7 +38,7 @@ func (s State) Update(msg tea.Msg) (State, tea.Cmd) { return s, s.readFromServer case ReceivedIRCCommandMsg: message := parser.ParseIRCMessage(msg.Msg) - fullMsg := fmt.Sprintf("%s %s %s", message.Source, message.Command, strings.Join(message.Parameters, " ")) + fullMsg := fmt.Sprintf("%s %s %s %s", message.Tags, message.Source, message.Command, strings.Join(message.Parameters, " ")) s.content += fullMsg // TODO: handle different commands