diff --git a/irc/commands/commands.go b/irc/commands/commands.go index 7a2cef4..b42f2b6 100644 --- a/irc/commands/commands.go +++ b/irc/commands/commands.go @@ -16,12 +16,6 @@ package commands -/* --- IRC Ports --- */ -const ( - INSECURE_PORT = 6667 - SECURE_PORT = 6697 -) - /* --- Prohibited characters in channel names --- */ const ( // do we need this as a client ???? SPACE = " " // 0x20 @@ -178,14 +172,14 @@ const ( RPL_TEXT = "304" // irc2 - Not Implemented (TODO:) RPL_UNAWAY = "305" // RFC1459 - Not Implemented (TODO:) RPL_NOWAWAY = "306" // RFC1459 - Not Implemented (TODO:) - RPL_WHOISUSER = "311" // RFC1459 - Not Implemented (TODO:) - RPL_WHOISSERVER = "312" // RFC1459 - Not Implemented (TODO:) + RPL_WHOISUSER = "311" // RFC1459 - Implemented + RPL_WHOISSERVER = "312" // RFC1459 - Implemented RPL_WHOISOPERATOR = "313" // RFC1459 - Not Implemented (TODO:) RPL_WHOWASUSER = "314" // RFC1459 - Not Implemented (TODO:) RPL_ENDOFWHO = "315" // RFC1459 - Not Implemented (TODO:) - RPL_WHOISIDLE = "317" // RFC1459 - Not Implemented (TODO:) - RPL_ENDOFWHOIS = "318" // RFC1459 - Not Implemented (TODO:) - RPL_WHOISCHANNELS = "319" // RFC1459 - Not Implemented (TODO:) + RPL_WHOISIDLE = "317" // RFC1459 - Implemented + RPL_ENDOFWHOIS = "318" // RFC1459 - Implemented + RPL_WHOISCHANNELS = "319" // RFC1459 - Implemented RPL_LISTSTART = "321" // RFC1459 - Not Implemented - Deprecated (TODO:) RPL_LIST = "322" // RFC1459 - Not Implemented (TODO:) RPL_LISTEND = "323" // RFC1459 - Not Implemented (TODO:) @@ -220,6 +214,8 @@ const ( RPL_ENDOFINFO = "374" // RFC1459 - Not Implemented (TODO:) RPL_MOTDSTART = "375" // RFC1459 - Implemented RPL_ENDOFMOTD = "376" // RFC1459 - Not Implemented (TODO:) + RPL_WHOISHOST = "378" // ??????? - Implemented - Has Conflicts + RPL_WHOISMODES = "379" // ??????? - Implemented - Has Conflicts RPL_YOUREOPER = "381" // RFC1459 - Not Implemented (TODO:) RPL_REHASHING = "382" // RFC1459 - Not Implemented (TODO:) RPL_YOURSERVICE = "383" // RFC2812 - Not Implemented (TODO:) @@ -232,7 +228,7 @@ const ( ERR_UNKNOWNERROR = "400" // ??????? - Not Implemented (TODO:) ERR_NOSUCHNICK = "401" // RFC1459 - Not Implemented (TODO:) - ERR_NOSUCHSERVER = "402" // RFC1459 - Not Implemented (TODO:) + ERR_NOSUCHSERVER = "402" // RFC1459 - Implemented ERR_NOSUCHCHANNEL = "403" // RFC1459 - Not Implemented (TODO:) ERR_CANNOTSENDTOCHAN = "404" // RFC1459 - Not Implemented (TODO:) ERR_TOOMANYCHANNELS = "405" // RFC1459 - Not Implemented (TODO:) @@ -248,7 +244,7 @@ const ( ERR_NOMOTD = "422" // RFC1459 - Not Implemented (TODO:) ERR_NOADMININFO = "423" // RFC1459 - Not Implemented (TODO:) ERR_FILEERROR = "424" // RFC1459 - Not Implemented (TODO:) - ERR_NONICKNAMEGIVEN = "431" // RFC1459 - Not Implemented (TODO:) + ERR_NONICKNAMEGIVEN = "431" // RFC1459 - Implemented ERR_ERRONEUSNICKNAME = "432" // RFC1459 - Not Implemented (TODO:) ERR_NICKNAMEINUSE = "433" // RFC1459 - Not Implemented (TODO:) ERR_NICKCOLLISION = "436" // RFC1459 - Not Implemented (TODO:) @@ -260,8 +256,8 @@ const ( ERR_SUMMONDISABLED = "445" // RFC1459 - Not Implemented (TODO:) ERR_USERSDISABLED = "446" // RFC1459 - Not Implemented (TODO:) ERR_NOTREGISTERED = "451" // RFC1459 - Not Implemented (TODO:) - ERR_NEEDMOREPARAMS = "461" // RFC1459 - Not Implemented (TODO:) - ERR_ALREADYREGISTERED = "462" // RFC1459 - Not Implemented (TODO:) + ERR_NEEDMOREPARAMS = "461" // RFC1459 - Implemented + ERR_ALREADYREGISTERED = "462" // RFC1459 - Implemented ERR_NOPERMFORHOST = "463" // RFC1459 - Not Implemented (TODO:) ERR_PASSWDMISMATCH = "464" // RFC1459 - Not Implemented (TODO:) ERR_YOUREBANNEDCREEP = "465" // RFC1459 - Not Implemented (TODO:) diff --git a/irc/handler/handler.go b/irc/handler/handler.go index f8dedce..937e342 100644 --- a/irc/handler/handler.go +++ b/irc/handler/handler.go @@ -21,7 +21,9 @@ import ( "fmt" "io" "log" + "strconv" "strings" + "time" "github.com/illusionman1212/gorc/cmds" "github.com/illusionman1212/gorc/irc" @@ -291,6 +293,95 @@ func handleGLOBALUSERS(msg parser.IRCMessage, client *irc.Client) { client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) } +func handleWHOISUSER(msg parser.IRCMessage, client *irc.Client) { + nick := msg.Parameters[1] + user := msg.Parameters[2] + host := msg.Parameters[3] + realName := msg.Parameters[5] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + message := fmt.Sprintf( + "Nick: %s | User: %s | Host: %s | Real name: %s", + nick, + user, + host, + realName, + ) + + client.Channels[0].AppendMsg(msg.Timestamp, "WHOIS Information", msgOpts) + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleWHOISSERVER(msg parser.IRCMessage, client *irc.Client) { + server := msg.Parameters[2] + serverInfo := msg.Parameters[3] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + message := fmt.Sprintf( + "server: %s [%s]", + server, + serverInfo, + ) + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleWHOISIDLE(msg parser.IRCMessage, client *irc.Client) { + idleSeconds := msg.Parameters[2] + connectedTimestamp, err := strconv.ParseInt(msg.Parameters[3], 10, 64) + + if err != nil { + // TODO: return this err and handle it in the parent + log.Println(err) + } + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + since := time.Unix(connectedTimestamp, 0) + + message := fmt.Sprintf( + "idle for: %s seconds, connected since: %s", + idleSeconds, + since.Format(time.ANSIC), + ) + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleENDOFWHOIS(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleWHOISCHANNELS(msg parser.IRCMessage, client *irc.Client) { + chans := msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + message := fmt.Sprintf("channels: %s", chans) + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + func handleNAMREPLY(msg parser.IRCMessage, client *irc.Client) { // TODO: do i need these // client := msg.Parameters[0] @@ -343,6 +434,72 @@ func handleMOTD(msg parser.IRCMessage, client *irc.Client) { client.Channels[0].AppendMsg(msg.Timestamp, messageLine, msgOpts) } +func handleWHOISHOST(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[1] + " " + msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleWHOISMODES(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[1] + " " + msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleNOSUCHSERVER(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[1] + " " + msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleNONICKNAMEGIVEN(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[1] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleNEEDMOREPARAMS(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[1] + " " + msg.Parameters[2] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + +func handleALREADYREGISTERED(msg parser.IRCMessage, client *irc.Client) { + message := msg.Parameters[1] + + msgOpts := irc.MsgFmtOpts{ + WithTimestamp: true, + AsServerMsg: true, + } + + client.Channels[0].AppendMsg(msg.Timestamp, message, msgOpts) +} + func HandleCommand(msg parser.IRCMessage, client *irc.Client) { // TODO: handle different commands switch msg.Command { @@ -378,6 +535,16 @@ func HandleCommand(msg parser.IRCMessage, client *irc.Client) { handleLOCALUSERS(msg, client) case commands.RPL_GLOBALUSERS: handleGLOBALUSERS(msg, client) + case commands.RPL_WHOISUSER: + handleWHOISUSER(msg, client) + case commands.RPL_WHOISSERVER: + handleWHOISSERVER(msg, client) + case commands.RPL_WHOISIDLE: + handleWHOISIDLE(msg, client) + case commands.RPL_ENDOFWHOIS: + handleENDOFWHOIS(msg, client) + case commands.RPL_WHOISCHANNELS: + handleWHOISCHANNELS(msg, client) case commands.RPL_NAMREPLY: handleNAMREPLY(msg, client) case commands.RPL_ENDOFNAMES: @@ -396,6 +563,18 @@ func HandleCommand(msg parser.IRCMessage, client *irc.Client) { // start a timeout and update said timeout on every RPL_MOTD // and log an error if timeout ends without receiving this command. + case commands.RPL_WHOISHOST: + handleWHOISHOST(msg, client) + case commands.RPL_WHOISMODES: + handleWHOISMODES(msg, client) + case commands.ERR_NOSUCHSERVER: + handleNOSUCHSERVER(msg, client) + case commands.ERR_NONICKNAMEGIVEN: + handleNONICKNAMEGIVEN(msg, client) + case commands.ERR_NEEDMOREPARAMS: + handleNEEDMOREPARAMS(msg, client) + case commands.ERR_ALREADYREGISTERED: + handleALREADYREGISTERED(msg, client) default: fullMsg := fmt.Sprintf( "%s %s %s %s",