From 6c2e54275c384297f1d3a2babfabb37a8436dab9 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Wed, 13 Aug 2025 11:31:16 +0200 Subject: [PATCH] feat: implement TOPIC-related commands and replies --- irc/commands/commands.go | 4 +-- irc/handler/handler.go | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/irc/commands/commands.go b/irc/commands/commands.go index c8350f1..4272701 100644 --- a/irc/commands/commands.go +++ b/irc/commands/commands.go @@ -187,8 +187,8 @@ const ( RPL_CHANNELMODEIS = "324" // RFC1459 - Not Implemented (TODO:) RPL_UNIQOPIS = "325" // RFC2812 - Not Implemented - Has Conflicts (TODO:) RPL_CREATIONTIME = "329" // Bahamut,InspIRCd - Not Implemented (TODO:) - RPL_NOTOPIC = "331" // RFC1459 - Not Implemented (TODO:) - RPL_TOPIC = "332" // RFC1459 - Not Implemented (TODO:) + RPL_NOTOPIC = "331" // RFC1459 - Implemented + RPL_TOPIC = "332" // RFC1459 - Implemented RPL_TOPICWHOTIME = "333" // ircu,InspIRCd - Not Implemented (TODO:) RPL_INVITING = "341" // RFC1459 - Not Implemented (TODO:) RPL_SUMMONING = "342" // RFC1459 - Not Implemented - Deprecated (TODO:) diff --git a/irc/handler/handler.go b/irc/handler/handler.go index 5fd7831..f8a8d91 100644 --- a/irc/handler/handler.go +++ b/irc/handler/handler.go @@ -171,6 +171,22 @@ func handlePart(msg parser.IRCMessage, client *irc.Client) { client.Tea.Send(cmds.SwitchChannels()) } +func handleTopic(msg parser.IRCMessage, client *irc.Client) { + channel := msg.Parameters[0] + topic := msg.Parameters[1] + + msgOpts := irc.MsgFmtOpts{ + AsServerMsg: true, + } + + for i, c := range client.Channels { + if c.Name == channel { + client.Channels[i].Topic = topic + client.Channels[i].AppendMsg(msg.Timestamp, fmt.Sprintf("Topic changed: %v", topic), msgOpts) + } + } +} + func handleCAP(msg parser.IRCMessage, client *irc.Client) { switch msg.Parameters[1] { case "LIST": @@ -465,6 +481,37 @@ func handleWHOISCHANNELS(msg parser.IRCMessage, client *irc.Client) { client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) } +func handleNOTOPIC(msg parser.IRCMessage, client *irc.Client) { + channel := msg.Parameters[1] + msgStr := msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + AsServerMsg: true, + } + + for i, c := range client.Channels { + if c.Name == channel { + client.Channels[i].AppendMsg(msg.Timestamp, msgStr, msgOpts) + } + } +} + +func handleTOPIC(msg parser.IRCMessage, client *irc.Client) { + channel := msg.Parameters[1] + topic := msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + AsServerMsg: true, + } + + for i, c := range client.Channels { + if c.Name == channel { + client.Channels[i].Topic = topic + client.Channels[i].AppendMsg(msg.Timestamp, fmt.Sprintf("TOPIC: %v", topic), msgOpts) + } + } +} + func handleNAMREPLY(msg parser.IRCMessage, client *irc.Client) { // TODO: do i need these // client := msg.Parameters[0] @@ -607,6 +654,8 @@ func HandleCommand(msg parser.IRCMessage, client *irc.Client) { handleQuit(msg, client) case commands.PART: handlePart(msg, client) + case commands.TOPIC: + handleTopic(msg, client) case commands.CAP: handleCAP(msg, client) case commands.RPL_WELCOME: @@ -641,6 +690,10 @@ func HandleCommand(msg parser.IRCMessage, client *irc.Client) { handleENDOFWHOIS(msg, client) case commands.RPL_WHOISCHANNELS: handleWHOISCHANNELS(msg, client) + case commands.RPL_NOTOPIC: + handleNOTOPIC(msg, client) + case commands.RPL_TOPIC: + handleTOPIC(msg, client) case commands.RPL_NAMREPLY: handleNAMREPLY(msg, client) case commands.RPL_ENDOFNAMES: