diff --git a/source/birchwood/client.d b/source/birchwood/client.d index 301c320..af0496d 100644 --- a/source/birchwood/client.d +++ b/source/birchwood/client.d @@ -8,7 +8,8 @@ import core.sync.mutex : Mutex; import core.thread : Thread, dur; import std.string; import eventy; -import birchwood.messages : Message, encodeMessage, decodeMessage, ReplyType; +import birchwood.messages : Message, encodeMessage, decodeMessage; +import birchwood.constants : ReplyType; // TODO: Remove this import import std.stdio : writeln; @@ -255,7 +256,7 @@ public final class Client : Thread public void onCommandReply(Message commandReply) { /* Default implementation */ - logger.log("Response("~to!(string)(commandReply.replyType)~"): "~commandReply.toString()); + logger.log("Response("~to!(string)(commandReply.getReplyType())~"): "~commandReply.toString()); } /** @@ -379,7 +380,7 @@ public final class Client : Thread string message; } // If the command is numeric then it is a reply of some sorts - else if(ircMessage.isResponse) + else if(ircMessage.isResponseMessage()) { /* Call the command reply handler */ onCommandReply(ircMessage); diff --git a/source/birchwood/constants.d b/source/birchwood/constants.d new file mode 100644 index 0000000..0965fa2 --- /dev/null +++ b/source/birchwood/constants.d @@ -0,0 +1,148 @@ +module birchwood.constants; + +/* Reply object */ + public enum ReplyType : ulong + { + /* Error replies */ + ERR_NOSUCHNICK = 401, + ERR_NOSUCHSERVER = 402, + ERR_NOSUCHCHANNEL = 403, + ERR_CANNOTSENDTOCHAN = 404, + ERR_TOOMANYCHANNELS = 405, + ERR_WASNOSUCHNICK = 406, + ERR_TOOMANYTARGETS = 407, + ERR_NOORIGIN = 409, + ERR_NORECIPIENT = 411, + ERR_NOTEXTTOSEND = 412, + ERR_NOTOPLEVEL = 413, + ERR_WILDTOPLEVEL = 414, + ERR_UNKNOWNCOMMAND = 421, + ERR_NOMOTD = 422, + ERR_NOADMININFO = 423, + ERR_FILEERROR = 424, + ERR_NONICKNAMEGIVEN = 431, + ERR_ERRONEUSNICKNAME = 432, + ERR_NICKNAMEINUSE = 433, + ERR_NICKCOLLISION = 436, + ERR_USERNOTINCHANNEL = 441, + ERR_NOTONCHANNEL = 442, + ERR_USERONCHANNEL = 443, + ERR_NOLOGIN = 444, + ERR_SUMMONDISABLED = 445, + ERR_USERSDISABLED = 446, + ERR_NOTREGISTERED = 451, + ERR_NEEDMOREPARAMS = 461, + ERR_ALREADYREGISTRED = 462, + ERR_NOPERMFORHOST = 463, + ERR_PASSWDMISMATCH = 464, + ERR_YOUREBANNEDCREEP = 465, + ERR_KEYSET = 467, + ERR_CHANNELISFULL = 471, + ERR_UNKNOWNMODE = 472, + ERR_INVITEONLYCHAN = 473, + ERR_BANNEDFROMCHAN = 474, + ERR_BADCHANNELKEY = 475, + ERR_NOPRIVILEGES = 481, + ERR_CHANOPRIVSNEEDED = 482, + ERR_CANTKILLSERVER = 483, + ERR_NOOPERHOST = 491, + ERR_UMODEUNKNOWNFLAG = 501, + ERR_USERSDONTMATCH = 502, + + /* Command responses */ + RPL_NONE = 300, + RPL_USERHOST = 302, + RPL_ISON = 303, + RPL_AWAY = 301, + RPL_UNAWAY = 305, + RPL_NOWAWAY = 306, + RPL_WHOISUSER = 311, + RPL_WHOISSERVER = 312, + RPL_WHOISOPERATOR = 313, + RPL_WHOISIDLE = 317, + RPL_ENDOFWHOIS = 318, + RPL_WHOISCHANNELS = 319, + RPL_WHOWASUSER = 314, + RPL_ENDOFWHOWAS = 369, + RPL_LISTSTART = 321, + RPL_LIST = 322, + RPL_LISTEND = 323, + RPL_CHANNELMODEIS = 324, + RPL_NOTOPIC = 331, + RPL_TOPIC = 332, + RPL_INVITING = 341, + RPL_SUMMONING = 342, + RPL_VERSION = 351, + RPL_WHOREPLY = 352, + RPL_ENDOFWHO = 315, + RPL_NAMREPLY = 353, + RPL_ENDOFNAMES = 366, + RPL_LINKS = 364, + RPL_ENDOFLINKS = 365, + RPL_BANLIST = 367, + RPL_ENDOFBANLIST = 368, + RPL_INFO = 371, + RPL_ENDOFINFO = 374, + RPL_MOTDSTART = 375, + RPL_MOTD = 372, + RPL_ENDOFMOTD = 376, + RPL_YOUREOPER = 381, + RPL_REHASHING = 382, + RPL_TIME = 391, + RPL_USERSSTART = 392, + RPL_USERS = 393, + RPL_ENDOFUSERS = 394, + RPL_NOUSERS = 395, + RPL_TRACELINK = 200, + RPL_TRACECONNECTING = 201, + RPL_TRACEHANDSHAKE = 202, + RPL_TRACEUNKNOWN = 203, + RPL_TRACEOPERATOR = 204, + RPL_TRACEUSER = 205, + RPL_TRACESERVER = 206, + RPL_TRACENEWTYPE = 208, + RPL_TRACELOG = 261, + RPL_STATSLINKINFO = 211, + RPL_STATSCOMMANDS = 212, + RPL_STATSCLINE = 213, + RPL_STATSNLINE = 214, + RPL_STATSILINE = 215, + RPL_STATSKLINE = 216, + RPL_STATSYLINE = 218, + RPL_ENDOFSTATS = 219, + RPL_STATSLLINE = 241, + RPL_STATSUPTIME = 242, + RPL_STATSOLINE = 243, + RPL_STATSHLINE = 244, + RPL_UMODEIS = 221, + RPL_LUSERCLIENT = 251, + RPL_LUSEROP = 252, + RPL_LUSERUNKNOWN = 253, + RPL_LUSERCHANNELS = 254, + RPL_LUSERME = 255, + RPL_ADMINME = 256, + RPL_ADMINLOC1 = 257, + RPL_ADMINLOC2 = 258, + RPL_ADMINEMAIL = 259, + + /* Reserved Numerics (See section 6.3 in RFC 1459) */ + RPL_TRACECLASS = 209, + RPL_SERVICEINFO = 231, + RPL_SERVICE = 233, + RPL_SERVLISTEND = 235, + RPL_WHOISCHANOP = 316, + RPL_CLOSING = 362, + RPL_INFOSTART = 372, + ERR_YOUWILLBEBANNED = 466, + ERR_NOSERVICEHOST = 492, + RPL_STATSQLINE = 217, + RPL_ENDOFSERVICES = 232, + RPL_SERVLIST = 234, + RPL_KILLDONE = 361, + RPL_CLOSEEND = 363, + RPL_MYPORTIS = 384, + ERR_BADCHANMASK = 476, + + + BIRCHWOOD_UNKNOWN_RESP_CODE = 0 +} \ No newline at end of file diff --git a/source/birchwood/messages.d b/source/birchwood/messages.d index 7de8255..209a3f3 100644 --- a/source/birchwood/messages.d +++ b/source/birchwood/messages.d @@ -4,6 +4,7 @@ import dlog; import std.string; import std.conv : to, ConvException; +import birchwood.constants : ReplyType; // TODO: Before release we should remove this import import std.stdio : writeln; @@ -44,171 +45,30 @@ public static string decodeMessage(ubyte[] messageIn) // return null; } -/* Reply object */ - public enum ReplyType : ulong - { - /* Error replies */ - ERR_NOSUCHNICK = 401, - ERR_NOSUCHSERVER = 402, - ERR_NOSUCHCHANNEL = 403, - ERR_CANNOTSENDTOCHAN = 404, - ERR_TOOMANYCHANNELS = 405, - ERR_WASNOSUCHNICK = 406, - ERR_TOOMANYTARGETS = 407, - ERR_NOORIGIN = 409, - ERR_NORECIPIENT = 411, - ERR_NOTEXTTOSEND = 412, - ERR_NOTOPLEVEL = 413, - ERR_WILDTOPLEVEL = 414, - ERR_UNKNOWNCOMMAND = 421, - ERR_NOMOTD = 422, - ERR_NOADMININFO = 423, - ERR_FILEERROR = 424, - ERR_NONICKNAMEGIVEN = 431, - ERR_ERRONEUSNICKNAME = 432, - ERR_NICKNAMEINUSE = 433, - ERR_NICKCOLLISION = 436, - ERR_USERNOTINCHANNEL = 441, - ERR_NOTONCHANNEL = 442, - ERR_USERONCHANNEL = 443, - ERR_NOLOGIN = 444, - ERR_SUMMONDISABLED = 445, - ERR_USERSDISABLED = 446, - ERR_NOTREGISTERED = 451, - ERR_NEEDMOREPARAMS = 461, - ERR_ALREADYREGISTRED = 462, - ERR_NOPERMFORHOST = 463, - ERR_PASSWDMISMATCH = 464, - ERR_YOUREBANNEDCREEP = 465, - ERR_KEYSET = 467, - ERR_CHANNELISFULL = 471, - ERR_UNKNOWNMODE = 472, - ERR_INVITEONLYCHAN = 473, - ERR_BANNEDFROMCHAN = 474, - ERR_BADCHANNELKEY = 475, - ERR_NOPRIVILEGES = 481, - ERR_CHANOPRIVSNEEDED = 482, - ERR_CANTKILLSERVER = 483, - ERR_NOOPERHOST = 491, - ERR_UMODEUNKNOWNFLAG = 501, - ERR_USERSDONTMATCH = 502, - - /* Command responses */ - RPL_NONE = 300, - RPL_USERHOST = 302, - RPL_ISON = 303, - RPL_AWAY = 301, - RPL_UNAWAY = 305, - RPL_NOWAWAY = 306, - RPL_WHOISUSER = 311, - RPL_WHOISSERVER = 312, - RPL_WHOISOPERATOR = 313, - RPL_WHOISIDLE = 317, - RPL_ENDOFWHOIS = 318, - RPL_WHOISCHANNELS = 319, - RPL_WHOWASUSER = 314, - RPL_ENDOFWHOWAS = 369, - RPL_LISTSTART = 321, - RPL_LIST = 322, - RPL_LISTEND = 323, - RPL_CHANNELMODEIS = 324, - RPL_NOTOPIC = 331, - RPL_TOPIC = 332, - RPL_INVITING = 341, - RPL_SUMMONING = 342, - RPL_VERSION = 351, - RPL_WHOREPLY = 352, - RPL_ENDOFWHO = 315, - RPL_NAMREPLY = 353, - RPL_ENDOFNAMES = 366, - RPL_LINKS = 364, - RPL_ENDOFLINKS = 365, - RPL_BANLIST = 367, - RPL_ENDOFBANLIST = 368, - RPL_INFO = 371, - RPL_ENDOFINFO = 374, - RPL_MOTDSTART = 375, - RPL_MOTD = 372, - RPL_ENDOFMOTD = 376, - RPL_YOUREOPER = 381, - RPL_REHASHING = 382, - RPL_TIME = 391, - RPL_USERSSTART = 392, - RPL_USERS = 393, - RPL_ENDOFUSERS = 394, - RPL_NOUSERS = 395, - RPL_TRACELINK = 200, - RPL_TRACECONNECTING = 201, - RPL_TRACEHANDSHAKE = 202, - RPL_TRACEUNKNOWN = 203, - RPL_TRACEOPERATOR = 204, - RPL_TRACEUSER = 205, - RPL_TRACESERVER = 206, - RPL_TRACENEWTYPE = 208, - RPL_TRACELOG = 261, - RPL_STATSLINKINFO = 211, - RPL_STATSCOMMANDS = 212, - RPL_STATSCLINE = 213, - RPL_STATSNLINE = 214, - RPL_STATSILINE = 215, - RPL_STATSKLINE = 216, - RPL_STATSYLINE = 218, - RPL_ENDOFSTATS = 219, - RPL_STATSLLINE = 241, - RPL_STATSUPTIME = 242, - RPL_STATSOLINE = 243, - RPL_STATSHLINE = 244, - RPL_UMODEIS = 221, - RPL_LUSERCLIENT = 251, - RPL_LUSEROP = 252, - RPL_LUSERUNKNOWN = 253, - RPL_LUSERCHANNELS = 254, - RPL_LUSERME = 255, - RPL_ADMINME = 256, - RPL_ADMINLOC1 = 257, - RPL_ADMINLOC2 = 258, - RPL_ADMINEMAIL = 259, - - /* Reserved Numerics (See section 6.3 in RFC 1459) */ - RPL_TRACECLASS = 209, - RPL_SERVICEINFO = 231, - RPL_SERVICE = 233, - RPL_SERVLISTEND = 235, - RPL_WHOISCHANOP = 316, - RPL_CLOSING = 362, - RPL_INFOSTART = 372, - ERR_YOUWILLBEBANNED = 466, - ERR_NOSERVICEHOST = 492, - RPL_STATSQLINE = 217, - RPL_ENDOFSERVICES = 232, - RPL_SERVLIST = 234, - RPL_KILLDONE = 361, - RPL_CLOSEEND = 363, - RPL_MYPORTIS = 384, - ERR_BADCHANMASK = 476, - - - BIRCHWOOD_UNKNOWN_RESP_CODE = 0 -} - /** * Message types */ -public class Message +public final class Message { - public string from; - public string command; - public string params; + /* Message contents */ + private string from; + private string command; + private string params; - /* Whether this numeric reply is an error type */ - public bool isError = false; - /* Whether this is a response message */ - public bool isResponse = false; + /* The numeric reply (as per Section 6 of RFC 1459) */ + private bool isNumericResponse = false; + private ReplyType replyType = ReplyType.BIRCHWOOD_UNKNOWN_RESP_CODE; + private bool isError = false; - /* The numeric reply */ - public ReplyType replyType = ReplyType.BIRCHWOOD_UNKNOWN_RESP_CODE; - - this(string from, string command, string params) + /** + * Constructs a new Message + * + * Params: + * from = the from parameter + * command = the command + * params = any optional parameters to the command + */ + this(string from, string command, string params = "") { this.from = from; this.command = command; @@ -217,7 +77,7 @@ public class Message /* Check if this is a command reply */ if(isNumeric(command)) { - isResponse = true; + isNumericResponse = true; //FIXME: SOmething is tripping it u, elts' see try @@ -354,14 +214,68 @@ public class Message return "(from: "~from~", command: "~command~", message: `"~params~"`)"; } - /* TODO: Rename to `getParams()` */ + /** + * Returns the sender of the message + * + * Returns: The `from` field + */ + public string getFrom() + { + return from; + } + + /** + * Returns the command name + * + * Returns: The command itself + */ + public string getCommand() + { + return command; + } + + /** + * Returns the optional paremeters (if any) + * + * Returns: The parameters + */ public string getParams() { return params; } - public string getCommand() + /** + * Returns whether or not this message was + * a numeric response + * + * Returns: `true` if numeric response + * `false` otherwise + */ + public bool isResponseMessage() { - return command; + return isNumericResponse; + } + + /** + * Returns whether or not this message is + * an error kind-of numeric response + * + * Returns: `true` if numeric response + * is an error, `false` otherwise + */ + public bool isResponseError() + { + return isError; + } + + /** + * Returns the type of reply (if this message + * was a numeric response) + * + * Returns: the ReplyType + */ + public ReplyType getReplyType() + { + return replyType; } } \ No newline at end of file