diff options
-rw-r--r-- | irc.h | 1 | ||||
-rw-r--r-- | irc_cap.c | 1 | ||||
-rw-r--r-- | irc_send.c | 13 |
3 files changed, 13 insertions, 2 deletions
@@ -71,6 +71,7 @@ typedef enum { CAP_MULTI_PREFIX = (1 << 1), CAP_EXTENDED_JOIN = (1 << 2), CAP_AWAY_NOTIFY = (1 << 3), + CAP_USERHOST_IN_NAMES = (1 << 4), } irc_cap_flag_t; struct irc_user; @@ -41,6 +41,7 @@ static const cap_info_t supported_caps[] = { {"multi-prefix", CAP_MULTI_PREFIX}, {"extended-join", CAP_EXTENDED_JOIN}, {"away-notify", CAP_AWAY_NOTIFY}, + {"userhost-in-names", CAP_USERHOST_IN_NAMES}, {NULL}, }; @@ -207,6 +207,7 @@ void irc_send_names(irc_channel_t *ic) { GSList *l; GString *namelist = g_string_sized_new(IRC_NAMES_LEN); + gboolean uhnames = (ic->irc->caps & CAP_USERHOST_IN_NAMES); /* RFCs say there is no error reply allowed on NAMES, so when the channel is invalid, just give an empty reply. */ @@ -216,6 +217,10 @@ void irc_send_names(irc_channel_t *ic) size_t extra_len = strlen(iu->nick); char prefix; + if (uhnames) { + extra_len += strlen(iu->user) + strlen(iu->host) + 2; + } + if (namelist->len + extra_len > IRC_NAMES_LEN - 4) { irc_send_num(ic->irc, 353, "= %s :%s", ic->name, namelist->str); g_string_truncate(namelist, 0); @@ -225,8 +230,12 @@ void irc_send_names(irc_channel_t *ic) g_string_append_c(namelist, prefix); } - g_string_append(namelist, iu->nick); - g_string_append_c(namelist, ' '); + if (uhnames) { + g_string_append_printf(namelist, "%s!%s@%s ", iu->nick, iu->user, iu->host); + } else { + g_string_append(namelist, iu->nick); + g_string_append_c(namelist, ' '); + } } if (namelist->len) { |