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) { | 
