kike: implement USERHOST
This commit is contained in:
parent
559bedad65
commit
97f35bedfd
56
src/kike.c
56
src/kike.c
|
@ -626,6 +626,7 @@ enum
|
||||||
IRC_RPL_LUSERCHANNELS = 254,
|
IRC_RPL_LUSERCHANNELS = 254,
|
||||||
IRC_RPL_LUSERME = 255,
|
IRC_RPL_LUSERME = 255,
|
||||||
|
|
||||||
|
IRC_RPL_USERHOST = 302,
|
||||||
IRC_RPL_VERSION = 351,
|
IRC_RPL_VERSION = 351,
|
||||||
IRC_RPL_MOTD = 372,
|
IRC_RPL_MOTD = 372,
|
||||||
IRC_RPL_MOTDSTART = 375,
|
IRC_RPL_MOTDSTART = 375,
|
||||||
|
@ -660,6 +661,7 @@ static const char *g_default_replies[] =
|
||||||
[IRC_RPL_LUSERCHANNELS] = "%d :channels formed",
|
[IRC_RPL_LUSERCHANNELS] = "%d :channels formed",
|
||||||
[IRC_RPL_LUSERME] = ":I have %d clients and %d servers",
|
[IRC_RPL_LUSERME] = ":I have %d clients and %d servers",
|
||||||
|
|
||||||
|
[IRC_RPL_USERHOST] = ":%s",
|
||||||
[IRC_RPL_VERSION] = "%s.%d %s :%s",
|
[IRC_RPL_VERSION] = "%s.%d %s :%s",
|
||||||
[IRC_RPL_MOTD] = ":- %s",
|
[IRC_RPL_MOTD] = ":- %s",
|
||||||
[IRC_RPL_MOTDSTART] = ":- %s Message of the day - ",
|
[IRC_RPL_MOTDSTART] = ":- %s Message of the day - ",
|
||||||
|
@ -863,6 +865,37 @@ irc_handle_user (const struct irc_message *msg, struct client *c)
|
||||||
irc_try_finish_registration (c);
|
irc_try_finish_registration (c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
irc_handle_userhost (const struct irc_message *msg, struct client *c)
|
||||||
|
{
|
||||||
|
if (msg->params.len < 1)
|
||||||
|
{
|
||||||
|
irc_send_reply (c, IRC_ERR_NEEDMOREPARAMS, msg->command);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct str reply;
|
||||||
|
str_init (&reply);
|
||||||
|
for (size_t i = 0; i < 5 && i < msg->params.len; i++)
|
||||||
|
{
|
||||||
|
const char *nick = msg->params.vector[i];
|
||||||
|
struct client *target = str_map_find (&c->ctx->users, nick);
|
||||||
|
if (!target)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (i)
|
||||||
|
str_append_c (&reply, ' ');
|
||||||
|
str_append (&reply, nick);
|
||||||
|
if (target->mode & IRC_USER_MODE_OPERATOR)
|
||||||
|
str_append_c (&reply, '*');
|
||||||
|
str_append_printf (&reply, "=%c%s@%s",
|
||||||
|
target->away_message ? '-' : '+',
|
||||||
|
target->username, target->hostname);
|
||||||
|
}
|
||||||
|
irc_send_reply (c, IRC_RPL_USERHOST, reply.str);
|
||||||
|
str_free (&reply);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
irc_handle_lusers (const struct irc_message *msg, struct client *c)
|
irc_handle_lusers (const struct irc_message *msg, struct client *c)
|
||||||
{
|
{
|
||||||
|
@ -981,19 +1014,20 @@ irc_register_handlers (struct server_context *ctx)
|
||||||
// TODO: more commands, see RFC 2812 :!
|
// TODO: more commands, see RFC 2812 :!
|
||||||
static const struct irc_command message_handlers[] =
|
static const struct irc_command message_handlers[] =
|
||||||
{
|
{
|
||||||
{ "PASS", false, irc_handle_pass },
|
{ "PASS", false, irc_handle_pass },
|
||||||
{ "NICK", false, irc_handle_nick },
|
{ "NICK", false, irc_handle_nick },
|
||||||
{ "USER", false, irc_handle_user },
|
{ "USER", false, irc_handle_user },
|
||||||
|
|
||||||
{ "LUSERS", true, irc_handle_lusers },
|
{ "USERHOST", true, irc_handle_userhost },
|
||||||
{ "MOTD", true, irc_handle_motd },
|
{ "LUSERS", true, irc_handle_lusers },
|
||||||
{ "PING", true, irc_handle_ping },
|
{ "MOTD", true, irc_handle_motd },
|
||||||
{ "PONG", false, irc_handle_pong },
|
{ "PING", true, irc_handle_ping },
|
||||||
{ "QUIT", false, irc_handle_quit },
|
{ "PONG", false, irc_handle_pong },
|
||||||
{ "TIME", true, irc_handle_time },
|
{ "QUIT", false, irc_handle_quit },
|
||||||
{ "VERSION", true, irc_handle_version },
|
{ "TIME", true, irc_handle_time },
|
||||||
|
{ "VERSION", true, irc_handle_version },
|
||||||
|
|
||||||
{ "PRIVMSG", true, irc_handle_privmsg },
|
{ "PRIVMSG", true, irc_handle_privmsg },
|
||||||
};
|
};
|
||||||
|
|
||||||
for (size_t i = 0; i < N_ELEMENTS (message_handlers); i++)
|
for (size_t i = 0; i < N_ELEMENTS (message_handlers); i++)
|
||||||
|
|
Loading…
Reference in New Issue