diff --git a/client/client.go b/client/client.go index 202518b..00455b2 100644 --- a/client/client.go +++ b/client/client.go @@ -20,12 +20,16 @@ import ( "crypto/tls" "fmt" "log" + "net" "strings" ) type Client struct { + // tls connection + TlsConn *tls.Conn + // tcp connection - Conn *tls.Conn + TcpConn *net.TCPConn } const CRLF = "\r\n" @@ -34,24 +38,37 @@ func NewClient(host string, port string, tlsEnabled bool) *Client { // TODO: distinguish between secure and insecure connections addr := fmt.Sprintf("%s:%s", host, port) - cfg := &tls.Config{ServerName: host} - conn, err := tls.Dial("tcp", addr, cfg) + if tlsEnabled { + cfg := &tls.Config{ServerName: host} + conn, err := tls.Dial("tcp", addr, cfg) + if err != nil { + // TODO: properly handle the error instead of Fatal-ing (failed to initiate a connection to server) + log.Fatal(err) + } + + return &Client{ + TlsConn: conn, + TcpConn: nil, + } + } + + addrTCP, err := net.ResolveTCPAddr("tcp", addr) + if err != nil { + log.Fatal(err) + } + + conn, err := net.DialTCP("tcp", nil, addrTCP) if err != nil { - // TODO: properly handle the error instead of Fatal-ing (failed to initiate a connection to server) log.Fatal(err) } return &Client{ - Conn: conn, + TlsConn: nil, + TcpConn: conn, } } func (c Client) Register(nick string, password string, channel string) { - if c.Conn == nil { - // TODO: properly handle the error instead of Fatal-ing - log.Fatal("Attempted to write data to nil connection") - } - c.SendCommand("CAP", "LS") if password != "" { c.SendCommand("PASS", password) @@ -65,6 +82,11 @@ func (c Client) Register(nick string, password string, channel string) { } func (c Client) SendCommand(cmd string, params ...string) { + if c.TlsConn == nil && c.TcpConn == nil { + // TODO: properly handle the error instead of Fatal-ing + log.Fatal("Attempted to write data to nil connection") + } + paramsString := "" if len(params) > 0 { paramsString = " " + strings.Join(params, " ") @@ -79,5 +101,12 @@ func (c Client) SendCommand(cmd string, params ...string) { paramsString = ":" + paramsString } - c.Conn.Write([]byte(cmd + paramsString + CRLF)) + if c.TlsConn != nil { + c.TlsConn.Write([]byte(cmd + paramsString + CRLF)) + } else if c.TcpConn != nil { + c.TcpConn.Write([]byte(cmd + paramsString + CRLF)) + } else { + // TODO: properly handle the error instead of Fatal-ing + log.Fatal("No valid connections to write to") + } } diff --git a/ui/app/app.go b/ui/app/app.go index e55df04..a86fcdd 100644 --- a/ui/app/app.go +++ b/ui/app/app.go @@ -83,8 +83,11 @@ func (s State) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg.String() { case "ctrl+c": // TODO: clean up and gracefully quit by leaving the IRC channel/server and then quit bubble. - if s.client.Conn != nil { - s.client.Conn.Close() + if s.client.TlsConn != nil { + s.client.TlsConn.Close() + } + if s.client.TcpConn != nil { + s.client.TcpConn.Close() } return s, tea.Quit } @@ -114,8 +117,13 @@ func (s State) Update(msg tea.Msg) (tea.Model, tea.Cmd) { s.client = client s.ui.mainScreen.Client = client - r := bufio.NewReaderSize(client.Conn, 512) - s.ui.mainScreen.Reader = r + if tlsEnabled { + r := bufio.NewReaderSize(client.TlsConn, 512) + s.ui.mainScreen.Reader = r + } else { + r := bufio.NewReaderSize(client.TcpConn, 512) + s.ui.mainScreen.Reader = r + } return s, mainscreen.InitialRead }