diff options
Diffstat (limited to 'forged/internal/ipc/irc')
-rw-r--r-- | forged/internal/ipc/irc/bot.go | 23 | ||||
-rw-r--r-- | forged/internal/ipc/irc/conn.go | 13 | ||||
-rw-r--r-- | forged/internal/ipc/irc/message.go | 18 | ||||
-rw-r--r-- | forged/internal/ipc/irc/source.go | 1 |
4 files changed, 36 insertions, 19 deletions
diff --git a/forged/internal/ipc/irc/bot.go b/forged/internal/ipc/irc/bot.go index 6113913..c7a188b 100644 --- a/forged/internal/ipc/irc/bot.go +++ b/forged/internal/ipc/irc/bot.go @@ -4,7 +4,9 @@ package irc import ( + "context" "crypto/tls" + "fmt" "log/slog" "net" @@ -25,6 +27,7 @@ type Config struct { // Bot represents an IRC bot client that handles events and allows for sending messages. type Bot struct { + // TODO: Use each config field instead of embedding Config here. config *Config ircSendBuffered chan string ircSendDirectChan chan misc.ErrorBack[string] @@ -34,24 +37,28 @@ type Bot struct { func NewBot(c *Config) (b *Bot) { b = &Bot{ config: c, - } + } //exhaustruct:ignore return } // Connect establishes a new IRC session and starts handling incoming and outgoing messages. // This method blocks until an error occurs or the connection is closed. -func (b *Bot) Connect() error { +func (b *Bot) Connect(ctx context.Context) error { var err error var underlyingConn net.Conn if b.config.TLS { - underlyingConn, err = tls.Dial(b.config.Net, b.config.Addr, nil) + dialer := tls.Dialer{} //exhaustruct:ignore + underlyingConn, err = dialer.DialContext(ctx, b.config.Net, b.config.Addr) } else { - underlyingConn, err = net.Dial(b.config.Net, b.config.Addr) + dialer := net.Dialer{} //exhaustruct:ignore + underlyingConn, err = dialer.DialContext(ctx, b.config.Net, b.config.Addr) } if err != nil { - return err + return fmt.Errorf("dialing irc: %w", err) } - defer underlyingConn.Close() + defer func() { + _ = underlyingConn.Close() + }() conn := NewConn(underlyingConn) @@ -164,12 +171,12 @@ func (b *Bot) Send(line string) { // ConnectLoop continuously attempts to maintain an IRC session. // If the connection drops, it automatically retries with no delay. -func (b *Bot) ConnectLoop() { +func (b *Bot) ConnectLoop(ctx context.Context) { b.ircSendBuffered = make(chan string, b.config.SendQ) b.ircSendDirectChan = make(chan misc.ErrorBack[string]) for { - err := b.Connect() + err := b.Connect(ctx) slog.Error("irc session error", "error", err) } } diff --git a/forged/internal/ipc/irc/conn.go b/forged/internal/ipc/irc/conn.go index 15294ee..b9b208c 100644 --- a/forged/internal/ipc/irc/conn.go +++ b/forged/internal/ipc/irc/conn.go @@ -2,6 +2,7 @@ package irc import ( "bufio" + "fmt" "net" "slices" @@ -41,9 +42,17 @@ func (c *Conn) ReadMessage() (msg Message, line string, err error) { } func (c *Conn) Write(p []byte) (n int, err error) { - return c.netConn.Write(p) + 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) { - return c.netConn.Write(misc.StringToBytes(s)) + n, err = c.netConn.Write(misc.StringToBytes(s)) + if err != nil { + err = fmt.Errorf("write to connection: %w", err) + } + return n, err } diff --git a/forged/internal/ipc/irc/message.go b/forged/internal/ipc/irc/message.go index 5843226..3387bec 100644 --- a/forged/internal/ipc/irc/message.go +++ b/forged/internal/ipc/irc/message.go @@ -24,18 +24,18 @@ func Parse(raw []byte) (msg Message, err error) { if bytes.HasPrefix(sp[0], []byte{'@'}) { // TODO: Check size manually if len(sp[0]) < 2 { err = ErrMalformedMsg - return + return msg, err } sp[0] = sp[0][1:] msg.Tags, err = tagsToMap(sp[0]) if err != nil { - return + return msg, err } if len(sp) < 2 { err = ErrMalformedMsg - return + return msg, err } sp = sp[1:] } else { @@ -45,7 +45,7 @@ func Parse(raw []byte) (msg Message, err error) { if bytes.HasPrefix(sp[0], []byte{':'}) { // TODO: Check size manually if len(sp[0]) < 2 { err = ErrMalformedMsg - return + return msg, err } sp[0] = sp[0][1:] @@ -53,14 +53,14 @@ func Parse(raw []byte) (msg Message, err error) { if len(sp) < 2 { err = ErrMalformedMsg - return + return msg, err } sp = sp[1:] } msg.Command = misc.BytesToString(sp[0]) if len(sp) < 2 { - return + return msg, err } sp = sp[1:] @@ -81,7 +81,7 @@ func Parse(raw []byte) (msg Message, err error) { msg.Args = append(msg.Args, misc.BytesToString(sp[i])) } - return + return msg, err } var ircv3TagEscapes = map[byte]byte{ //nolint:gochecknoglobals @@ -97,7 +97,7 @@ func tagsToMap(raw []byte) (tags map[string]string, err error) { key, value, found := bytes.Cut(rawTag, []byte{'='}) if !found { err = ErrInvalidIRCv3Tag - return + return tags, err } if len(value) == 0 { tags[misc.BytesToString(key)] = "" @@ -122,5 +122,5 @@ func tagsToMap(raw []byte) (tags map[string]string, err error) { } } } - return + return tags, err } diff --git a/forged/internal/ipc/irc/source.go b/forged/internal/ipc/irc/source.go index c6baf75..938751f 100644 --- a/forged/internal/ipc/irc/source.go +++ b/forged/internal/ipc/irc/source.go @@ -13,6 +13,7 @@ type Source interface { AsSourceString() string } +//nolint:ireturn func parseSource(s []byte) Source { nick, userhost, found := bytes.Cut(s, []byte{'!'}) if !found { |