summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-08-03 16:43:54 +0500
committerilotterytea <iltsu@alright.party>2025-08-03 16:43:54 +0500
commit40eb34ed8c932ae00f3a6cc97ff34ba59ab8066e (patch)
tree3778c132cfdd41caca073883102e38abe11a1e8d
parent29804aca7c87efd1d67c7fb278ac64f9a879107f (diff)
feat: parse irc messages
-rw-r--r--internal/client.go8
-rw-r--r--internal/message.go44
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")
+ }
+}