feat: implement some RFC1459 numerics and errors

This commit is contained in:
2022-02-19 19:55:01 +02:00
parent f4dd0066c8
commit ec9d298e59
2 changed files with 190 additions and 15 deletions
+11 -15
View File
@@ -16,12 +16,6 @@
package commands package commands
/* --- IRC Ports --- */
const (
INSECURE_PORT = 6667
SECURE_PORT = 6697
)
/* --- Prohibited characters in channel names --- */ /* --- Prohibited characters in channel names --- */
const ( // do we need this as a client ???? const ( // do we need this as a client ????
SPACE = " " // 0x20 SPACE = " " // 0x20
@@ -178,14 +172,14 @@ const (
RPL_TEXT = "304" // irc2 - Not Implemented (TODO:) RPL_TEXT = "304" // irc2 - Not Implemented (TODO:)
RPL_UNAWAY = "305" // RFC1459 - Not Implemented (TODO:) RPL_UNAWAY = "305" // RFC1459 - Not Implemented (TODO:)
RPL_NOWAWAY = "306" // RFC1459 - Not Implemented (TODO:) RPL_NOWAWAY = "306" // RFC1459 - Not Implemented (TODO:)
RPL_WHOISUSER = "311" // RFC1459 - Not Implemented (TODO:) RPL_WHOISUSER = "311" // RFC1459 - Implemented
RPL_WHOISSERVER = "312" // RFC1459 - Not Implemented (TODO:) RPL_WHOISSERVER = "312" // RFC1459 - Implemented
RPL_WHOISOPERATOR = "313" // RFC1459 - Not Implemented (TODO:) RPL_WHOISOPERATOR = "313" // RFC1459 - Not Implemented (TODO:)
RPL_WHOWASUSER = "314" // RFC1459 - Not Implemented (TODO:) RPL_WHOWASUSER = "314" // RFC1459 - Not Implemented (TODO:)
RPL_ENDOFWHO = "315" // RFC1459 - Not Implemented (TODO:) RPL_ENDOFWHO = "315" // RFC1459 - Not Implemented (TODO:)
RPL_WHOISIDLE = "317" // RFC1459 - Not Implemented (TODO:) RPL_WHOISIDLE = "317" // RFC1459 - Implemented
RPL_ENDOFWHOIS = "318" // RFC1459 - Not Implemented (TODO:) RPL_ENDOFWHOIS = "318" // RFC1459 - Implemented
RPL_WHOISCHANNELS = "319" // RFC1459 - Not Implemented (TODO:) RPL_WHOISCHANNELS = "319" // RFC1459 - Implemented
RPL_LISTSTART = "321" // RFC1459 - Not Implemented - Deprecated (TODO:) RPL_LISTSTART = "321" // RFC1459 - Not Implemented - Deprecated (TODO:)
RPL_LIST = "322" // RFC1459 - Not Implemented (TODO:) RPL_LIST = "322" // RFC1459 - Not Implemented (TODO:)
RPL_LISTEND = "323" // RFC1459 - Not Implemented (TODO:) RPL_LISTEND = "323" // RFC1459 - Not Implemented (TODO:)
@@ -220,6 +214,8 @@ const (
RPL_ENDOFINFO = "374" // RFC1459 - Not Implemented (TODO:) RPL_ENDOFINFO = "374" // RFC1459 - Not Implemented (TODO:)
RPL_MOTDSTART = "375" // RFC1459 - Implemented RPL_MOTDSTART = "375" // RFC1459 - Implemented
RPL_ENDOFMOTD = "376" // RFC1459 - Not Implemented (TODO:) 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_YOUREOPER = "381" // RFC1459 - Not Implemented (TODO:)
RPL_REHASHING = "382" // RFC1459 - Not Implemented (TODO:) RPL_REHASHING = "382" // RFC1459 - Not Implemented (TODO:)
RPL_YOURSERVICE = "383" // RFC2812 - Not Implemented (TODO:) RPL_YOURSERVICE = "383" // RFC2812 - Not Implemented (TODO:)
@@ -232,7 +228,7 @@ const (
ERR_UNKNOWNERROR = "400" // ??????? - Not Implemented (TODO:) ERR_UNKNOWNERROR = "400" // ??????? - Not Implemented (TODO:)
ERR_NOSUCHNICK = "401" // RFC1459 - 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_NOSUCHCHANNEL = "403" // RFC1459 - Not Implemented (TODO:)
ERR_CANNOTSENDTOCHAN = "404" // RFC1459 - Not Implemented (TODO:) ERR_CANNOTSENDTOCHAN = "404" // RFC1459 - Not Implemented (TODO:)
ERR_TOOMANYCHANNELS = "405" // RFC1459 - Not Implemented (TODO:) ERR_TOOMANYCHANNELS = "405" // RFC1459 - Not Implemented (TODO:)
@@ -248,7 +244,7 @@ const (
ERR_NOMOTD = "422" // RFC1459 - Not Implemented (TODO:) ERR_NOMOTD = "422" // RFC1459 - Not Implemented (TODO:)
ERR_NOADMININFO = "423" // RFC1459 - Not Implemented (TODO:) ERR_NOADMININFO = "423" // RFC1459 - Not Implemented (TODO:)
ERR_FILEERROR = "424" // 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_ERRONEUSNICKNAME = "432" // RFC1459 - Not Implemented (TODO:)
ERR_NICKNAMEINUSE = "433" // RFC1459 - Not Implemented (TODO:) ERR_NICKNAMEINUSE = "433" // RFC1459 - Not Implemented (TODO:)
ERR_NICKCOLLISION = "436" // RFC1459 - Not Implemented (TODO:) ERR_NICKCOLLISION = "436" // RFC1459 - Not Implemented (TODO:)
@@ -260,8 +256,8 @@ const (
ERR_SUMMONDISABLED = "445" // RFC1459 - Not Implemented (TODO:) ERR_SUMMONDISABLED = "445" // RFC1459 - Not Implemented (TODO:)
ERR_USERSDISABLED = "446" // RFC1459 - Not Implemented (TODO:) ERR_USERSDISABLED = "446" // RFC1459 - Not Implemented (TODO:)
ERR_NOTREGISTERED = "451" // RFC1459 - Not Implemented (TODO:) ERR_NOTREGISTERED = "451" // RFC1459 - Not Implemented (TODO:)
ERR_NEEDMOREPARAMS = "461" // RFC1459 - Not Implemented (TODO:) ERR_NEEDMOREPARAMS = "461" // RFC1459 - Implemented
ERR_ALREADYREGISTERED = "462" // RFC1459 - Not Implemented (TODO:) ERR_ALREADYREGISTERED = "462" // RFC1459 - Implemented
ERR_NOPERMFORHOST = "463" // RFC1459 - Not Implemented (TODO:) ERR_NOPERMFORHOST = "463" // RFC1459 - Not Implemented (TODO:)
ERR_PASSWDMISMATCH = "464" // RFC1459 - Not Implemented (TODO:) ERR_PASSWDMISMATCH = "464" // RFC1459 - Not Implemented (TODO:)
ERR_YOUREBANNEDCREEP = "465" // RFC1459 - Not Implemented (TODO:) ERR_YOUREBANNEDCREEP = "465" // RFC1459 - Not Implemented (TODO:)
+179
View File
@@ -21,7 +21,9 @@ import (
"fmt" "fmt"
"io" "io"
"log" "log"
"strconv"
"strings" "strings"
"time"
"github.com/illusionman1212/gorc/cmds" "github.com/illusionman1212/gorc/cmds"
"github.com/illusionman1212/gorc/irc" "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) 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) { func handleNAMREPLY(msg parser.IRCMessage, client *irc.Client) {
// TODO: do i need these // TODO: do i need these
// client := msg.Parameters[0] // client := msg.Parameters[0]
@@ -343,6 +434,72 @@ func handleMOTD(msg parser.IRCMessage, client *irc.Client) {
client.Channels[0].AppendMsg(msg.Timestamp, messageLine, msgOpts) 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) { func HandleCommand(msg parser.IRCMessage, client *irc.Client) {
// TODO: handle different commands // TODO: handle different commands
switch msg.Command { switch msg.Command {
@@ -378,6 +535,16 @@ func HandleCommand(msg parser.IRCMessage, client *irc.Client) {
handleLOCALUSERS(msg, client) handleLOCALUSERS(msg, client)
case commands.RPL_GLOBALUSERS: case commands.RPL_GLOBALUSERS:
handleGLOBALUSERS(msg, client) 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: case commands.RPL_NAMREPLY:
handleNAMREPLY(msg, client) handleNAMREPLY(msg, client)
case commands.RPL_ENDOFNAMES: 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 // start a timeout and update said timeout on every RPL_MOTD
// and log an error if timeout ends without receiving this command. // 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: default:
fullMsg := fmt.Sprintf( fullMsg := fmt.Sprintf(
"%s %s %s %s", "%s %s %s %s",