From 026021c11863c926fbe0c28f10d9ecbceee69452 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Fri, 15 Aug 2025 22:18:55 +0200 Subject: [PATCH] fix: only join the initial channel after registration is complete During registration, only a subset of commands are allowed. Servers MUST send a RPL_WELCOME (001) after registration is complete so we join the channel in response to that numeric reply. https://modern.ircdocs.horse/#connection-registration --- irc/client.go | 7 +++---- irc/handler/handler.go | 8 +++++++- ui/app/app.go | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/irc/client.go b/irc/client.go index 40e1c5a..feaf1f0 100644 --- a/irc/client.go +++ b/irc/client.go @@ -84,6 +84,9 @@ type Client struct { // Active channel index ActiveChannelIndex int + // The channel to join immediately after registration completes. + InitialChannel string + // Reference to the bubbletea program Tea *tea.Program @@ -213,10 +216,6 @@ func (c *Client) Register(nick string, password string, channel string) { // set user-wanted nickname c.Nickname = nick c.SendCommand(commands.USER, nick, "0", "*", nick) - // joining a channel when registering is optional - if channel != "" { - c.SendCommand(commands.JOIN, channel) - } } func (c *Client) SetDay() { diff --git a/irc/handler/handler.go b/irc/handler/handler.go index 1b1882d..06da963 100644 --- a/irc/handler/handler.go +++ b/irc/handler/handler.go @@ -371,9 +371,15 @@ func handleWELCOME(msg irc.Message, client *irc.Client) { AsServerMsg: true, } - // set server-registered nickname + // set server-registered nickname because the server MAY return a different nickname than + // the one the user chose because of length restrictions or otherwise. client.Nickname = nick client.Channels[0].AppendMsg(msg.Timestamp, welcomeMsg, msgOpts) + + // Only join the user-requested channel AFTER registration is complete. + if client.InitialChannel != "" { + client.SendCommand(commands.JOIN, client.InitialChannel) + } } func handleYOURHOST(msg irc.Message, client *irc.Client) { diff --git a/ui/app/app.go b/ui/app/app.go index 1fce456..7edc21e 100644 --- a/ui/app/app.go +++ b/ui/app/app.go @@ -91,6 +91,7 @@ func (s State) Update(msg tea.Msg) (tea.Model, tea.Cmd) { tlsEnabled := s.UI.Login.TLS s.UI.CurrentScreen = MainScreen + s.Client.InitialChannel = channel s.Client.Initialize(host, port, tlsEnabled) s.Client.Register(nickname, password, channel)