diff options
| author | dequis <dx@dxzone.com.ar> | 2015-07-27 02:14:09 -0300 | 
|---|---|---|
| committer | dequis <dx@dxzone.com.ar> | 2015-09-10 23:31:10 -0300 | 
| commit | 0ef1c9293b2055807e14e404cdf96cf7d8843170 (patch) | |
| tree | bfa51613f2ea1b72dd54c99dd4b26fd466f5ecdd /irc_commands.c | |
| parent | 34d16d5b4b5265990125894572a90493284358cd (diff) | |
Initial implementation of ircv3 capability negotiation
Mostly no-op for now. Puts registration on hold, supports the basic
commands, and NAKs everything
Diffstat (limited to 'irc_commands.c')
| -rw-r--r-- | irc_commands.c | 28 | 
1 files changed, 28 insertions, 0 deletions
| diff --git a/irc_commands.c b/irc_commands.c index 98579d99..078a59ff 100644 --- a/irc_commands.c +++ b/irc_commands.c @@ -28,6 +28,33 @@  #include "help.h"  #include "ipc.h" +static void irc_cmd_cap(irc_t *irc, char **cmd) +{ +	if (!(irc->status & USTATUS_LOGGED_IN)) { +		/* Put registration on hold until CAP END */ +		irc->status |= USTATUS_CAP_PENDING; +	} + +	if (g_strcasecmp(cmd[1], "LS") == 0) { +		/* gboolean irc302 = (g_strcmp0(cmd[2], "302") == 0); */ +		irc_send_cap(irc, "LS", ""); + +	} else if (g_strcasecmp(cmd[1], "LIST") == 0) { +		irc_send_cap(irc, "LIST", ""); + +	} else if (g_strcasecmp(cmd[1], "REQ") == 0) { +		irc_send_cap(irc, "NAK", cmd[2] ? : ""); + +	} else if (g_strcasecmp(cmd[1], "END") == 0) { +		irc->status &= ~USTATUS_CAP_PENDING; +		irc_check_login(irc); + +	} else { +		irc_send_num(irc, 410, "%s :Invalid CAP command", cmd[1]); +	} + +} +  static void irc_cmd_pass(irc_t *irc, char **cmd)  {  	if (irc->status & USTATUS_LOGGED_IN) { @@ -684,6 +711,7 @@ static void irc_cmd_rehash(irc_t *irc, char **cmd)  }  static const command_t irc_commands[] = { +	{ "cap",         1, irc_cmd_cap,         0 },  	{ "pass",        1, irc_cmd_pass,        0 },  	{ "user",        4, irc_cmd_user,        IRC_CMD_PRE_LOGIN },  	{ "nick",        1, irc_cmd_nick,        0 }, | 
