diff options
| author | ilotterytea <iltsu@alright.party> | 2025-08-03 16:43:54 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-08-03 16:43:54 +0500 |
| commit | 40eb34ed8c932ae00f3a6cc97ff34ba59ab8066e (patch) | |
| tree | 3778c132cfdd41caca073883102e38abe11a1e8d | |
| parent | 29804aca7c87efd1d67c7fb278ac64f9a879107f (diff) | |
feat: parse irc messages
| -rw-r--r-- | internal/client.go | 8 | ||||
| -rw-r--r-- | internal/message.go | 44 |
2 files changed, 48 insertions, 4 deletions
diff --git a/internal/client.go b/internal/client.go index c6a3704..44b1f32 100644 --- a/internal/client.go +++ b/internal/client.go @@ -38,13 +38,13 @@ func (c *Client) HandleConnection() { data := strings.TrimSpace(string(buffer[:n])) fmt.Printf("%s (ID %d) sent %s\n", c.conn.RemoteAddr(), c.id, data) - _, err = c.conn.Write([]byte("you said " + data)) + msg, err := ParseIRCMessage(data) if err != nil { - log.Printf("Error sending to client (ID %d) %s: %v", c.id, c.conn.RemoteAddr(), err) - return + log.Printf("Error parsing IRC message from client (ID %d): %v\n", c.id, err) + continue } - if data == "QUIT" { + if msg.command == "QUIT" { break } } diff --git a/internal/message.go b/internal/message.go new file mode 100644 index 0000000..7a70d79 --- /dev/null +++ b/internal/message.go @@ -0,0 +1,44 @@ +package ircd + +import ( + "errors" + "strings" +) + +type Message struct { + command string + params []string +} + +func ParseIRCMessage(raw string) (*Message, error) { + m := Message{} + + raw = strings.TrimSpace(raw) + parts := []string{} + + for { + if len(raw) == 0 { + break + } else if strings.HasPrefix(raw, ":") { + parts = append(parts, raw[1:]) + break + } else { + p := strings.SplitN(raw, " ", 2) + parts = append(parts, p[0]) + + if len(p) == 1 { + raw = "" + } else { + raw = strings.TrimSpace(p[1]) + } + } + } + + if len(parts) > 0 { + m.command = parts[0] + m.params = parts[1:] + return &m, nil + } else { + return nil, errors.New("Invalid IRC message") + } +} |
