aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/ipc/irc
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-17 13:52:55 +0800
committerRunxi Yu <me@runxiyu.org>2025-08-17 13:52:55 +0800
commitafcf2c711b907514a91e5c4d45d2da7f118bb2b8 (patch)
tree15debbe9e2086d310a85f1929f4c580186fabec1 /forged/internal/ipc/irc
parentLinting (diff)
downloadforge-afcf2c711b907514a91e5c4d45d2da7f118bb2b8.tar.gz
forge-afcf2c711b907514a91e5c4d45d2da7f118bb2b8.tar.zst
forge-afcf2c711b907514a91e5c4d45d2da7f118bb2b8.zip
Lint ipc
Diffstat (limited to 'forged/internal/ipc/irc')
-rw-r--r--forged/internal/ipc/irc/bot.go23
-rw-r--r--forged/internal/ipc/irc/conn.go13
-rw-r--r--forged/internal/ipc/irc/message.go18
-rw-r--r--forged/internal/ipc/irc/source.go1
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 {