diff options
Diffstat (limited to 'internal')
| -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") + } +} |
