diff options
Diffstat (limited to 'forged/internal/ipc/irc/conn.go')
-rw-r--r-- | forged/internal/ipc/irc/conn.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/forged/internal/ipc/irc/conn.go b/forged/internal/ipc/irc/conn.go new file mode 100644 index 0000000..b9b208c --- /dev/null +++ b/forged/internal/ipc/irc/conn.go @@ -0,0 +1,58 @@ +package irc + +import ( + "bufio" + "fmt" + "net" + "slices" + + "go.lindenii.runxiyu.org/forge/forged/internal/common/misc" +) + +type Conn struct { + netConn net.Conn + bufReader *bufio.Reader +} + +func NewConn(netConn net.Conn) Conn { + return Conn{ + netConn: netConn, + bufReader: bufio.NewReader(netConn), + } +} + +func (c *Conn) ReadMessage() (msg Message, line string, err error) { + raw, err := c.bufReader.ReadSlice('\n') + if err != nil { + return + } + + if raw[len(raw)-1] == '\n' { + raw = raw[:len(raw)-1] + } + if raw[len(raw)-1] == '\r' { + raw = raw[:len(raw)-1] + } + + lineBytes := slices.Clone(raw) + line = misc.BytesToString(lineBytes) + msg, err = Parse(lineBytes) + + return +} + +func (c *Conn) Write(p []byte) (n int, err error) { + n, err = c.netConn.Write(p) + if err != nil { + err = fmt.Errorf("write to connection: %w", err) + } + return n, err +} + +func (c *Conn) WriteString(s string) (n int, err error) { + n, err = c.netConn.Write(misc.StringToBytes(s)) + if err != nil { + err = fmt.Errorf("write to connection: %w", err) + } + return n, err +} |