degesch: parse MODES from RPL_ISUPPORT

This commit is contained in:
Přemysl Eric Janouch 2015-06-17 21:19:09 +02:00
parent e2a3b48114
commit 178c1b072a
1 changed files with 17 additions and 1 deletions

View File

@ -1073,6 +1073,8 @@ struct server
char *irc_chanuser_prefixes; ///< Channel user prefixes char *irc_chanuser_prefixes; ///< Channel user prefixes
char *irc_chanuser_modes; ///< Channel user modes char *irc_chanuser_modes; ///< Channel user modes
unsigned irc_max_modes; ///< Max parametrized modes per command
// Events: // Events:
struct poller_timer ping_tmr; ///< We should send a ping struct poller_timer ping_tmr; ///< We should send a ping
@ -1111,6 +1113,8 @@ server_init (struct server *self, struct poller *poller)
self->irc_chanuser_prefixes = xstrdup ("@+"); self->irc_chanuser_prefixes = xstrdup ("@+");
self->irc_chanuser_modes = xstrdup ("ov"); self->irc_chanuser_modes = xstrdup ("ov");
self->irc_max_modes = 3;
str_map_init (&self->irc_users); str_map_init (&self->irc_users);
self->irc_users.key_xfrm = irc_strxfrm; self->irc_users.key_xfrm = irc_strxfrm;
str_map_init (&self->irc_channels); str_map_init (&self->irc_channels);
@ -5127,6 +5131,16 @@ irc_handle_isupport_chanmodes (struct server *s, char *value)
str_vector_free (&v); str_vector_free (&v);
} }
static void
irc_handle_isupport_modes (struct server *s, char *value)
{
unsigned long modes;
if (!*value)
s->irc_max_modes = UINT_MAX;
else if (xstrtoul (&modes, value, 10) && modes && modes <= UINT_MAX)
s->irc_max_modes = modes;
}
static void static void
unescape_isupport_value (const char *value, struct str *output) unescape_isupport_value (const char *value, struct str *output)
{ {
@ -5175,8 +5189,10 @@ irc_handle_rpl_isupport (struct server *s, const struct irc_message *msg)
irc_handle_isupport_statusmsg (s, value_unescaped.str); irc_handle_isupport_statusmsg (s, value_unescaped.str);
else if (!strcmp (param, "CHANMODES")) else if (!strcmp (param, "CHANMODES"))
irc_handle_isupport_chanmodes (s, value_unescaped.str); irc_handle_isupport_chanmodes (s, value_unescaped.str);
else if (!strcmp (param, "MODES"))
irc_handle_isupport_modes (s, value_unescaped.str);
// TODO: also parse MODES, TARGMAX and make use of them // TODO: also parse TARGMAX and make use of it
// to split client commands as necessary // to split client commands as necessary
str_free (&value_unescaped); str_free (&value_unescaped);