1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

irc: use parsed command parameters in "366" command callback

This commit is contained in:
Sébastien Helleu
2021-10-16 18:18:27 +02:00
parent dcbf534d53
commit aad86a1955
2 changed files with 132 additions and 112 deletions
+102 -106
View File
@@ -5732,7 +5732,7 @@ IRC_PROTOCOL_CALLBACK(354)
* Callback for the IRC command "366": end of /names list.
*
* Command looks like:
* :server 366 mynick #channel :End of /NAMES list.
* 366 mynick #channel :End of /NAMES list.
*/
IRC_PROTOCOL_CALLBACK(366)
@@ -5740,13 +5740,14 @@ IRC_PROTOCOL_CALLBACK(366)
struct t_irc_channel *ptr_channel;
struct t_infolist *infolist;
struct t_config_option *ptr_option;
int num_nicks, num_op, num_halfop, num_voice, num_normal, length, i;
char *string, str_nicks_count[2048], *color;
int num_nicks, num_op, num_halfop, num_voice, num_normal;
char *str_params, str_count[1024], **str_nicks, *color;
const char *prefix, *prefix_color, *nickname;
IRC_PROTOCOL_MIN_ARGS(5);
IRC_PROTOCOL_MIN_PARAMS(3);
ptr_channel = irc_channel_search (server, params[1]);
ptr_channel = irc_channel_search (server, argv[3]);
if (ptr_channel && ptr_channel->nicks)
{
/* display users on channel */
@@ -5756,95 +5757,89 @@ IRC_PROTOCOL_CALLBACK(366)
infolist = weechat_infolist_get ("nicklist", ptr_channel->buffer, NULL);
if (infolist)
{
length = 0;
str_nicks = weechat_string_dyn_alloc (1024);
while (weechat_infolist_next (infolist))
{
if (strcmp (weechat_infolist_string (infolist, "type"),
"nick") == 0)
{
ptr_option = weechat_config_get (weechat_infolist_string (infolist,
"prefix_color"));
length +=
((ptr_option) ? strlen (weechat_color (weechat_config_string (ptr_option))) : 0) +
strlen (weechat_infolist_string (infolist, "prefix")) +
16 + /* nick color */
strlen (weechat_infolist_string (infolist, "name")) +
16 + /* reset color */
1; /* space */
}
}
if (length > 0)
{
string = malloc (length);
if (string)
{
string[0] = '\0';
i = 0;
while (weechat_infolist_next (infolist))
if (*str_nicks[0])
{
if (strcmp (weechat_infolist_string (infolist, "type"),
"nick") == 0)
weechat_string_dyn_concat (str_nicks,
IRC_COLOR_RESET,
-1);
weechat_string_dyn_concat (str_nicks, " ", -1);
}
prefix = weechat_infolist_string (infolist, "prefix");
if (prefix[0] && (prefix[0] != ' '))
{
prefix_color = weechat_infolist_string (infolist,
"prefix_color");
if (strchr (prefix_color, '.'))
{
if (i > 0)
ptr_option = weechat_config_get (weechat_infolist_string (infolist,
"prefix_color"));
if (ptr_option)
{
strcat (string, IRC_COLOR_RESET);
strcat (string, " ");
weechat_string_dyn_concat (
str_nicks,
weechat_color (
weechat_config_string (ptr_option)),
-1);
}
prefix = weechat_infolist_string (infolist, "prefix");
if (prefix[0] && (prefix[0] != ' '))
{
prefix_color = weechat_infolist_string (infolist,
"prefix_color");
if (strchr (prefix_color, '.'))
{
ptr_option = weechat_config_get (weechat_infolist_string (infolist,
"prefix_color"));
if (ptr_option)
strcat (string, weechat_color (weechat_config_string (ptr_option)));
}
else
{
strcat (string, weechat_color (prefix_color));
}
strcat (string, prefix);
}
nickname = weechat_infolist_string (infolist, "name");
if (weechat_config_boolean (irc_config_look_color_nicks_in_names))
{
if (irc_server_strcasecmp (server, nickname, server->nick) == 0)
strcat (string, IRC_COLOR_CHAT_NICK_SELF);
else
{
color = irc_nick_find_color (nickname);
strcat (string, color);
if (color)
free (color);
}
}
else
strcat (string, IRC_COLOR_RESET);
strcat (string, nickname);
i++;
}
else
{
weechat_string_dyn_concat (
str_nicks,
weechat_color (prefix_color),
-1);
}
weechat_string_dyn_concat (str_nicks, prefix, -1);
}
nickname = weechat_infolist_string (infolist, "name");
if (weechat_config_boolean (irc_config_look_color_nicks_in_names))
{
if (irc_server_strcasecmp (server, nickname, server->nick) == 0)
{
weechat_string_dyn_concat (
str_nicks,
IRC_COLOR_CHAT_NICK_SELF,
-1);
}
else
{
color = irc_nick_find_color (nickname);
weechat_string_dyn_concat (str_nicks, color, -1);
if (color)
free (color);
}
}
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "names",
ptr_channel->buffer),
date,
irc_protocol_tags (
command, "irc_numeric", NULL, NULL),
_("%sNicks %s%s%s: %s[%s%s]"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_CHANNEL,
ptr_channel->name,
IRC_COLOR_RESET,
IRC_COLOR_CHAT_DELIMITERS,
string,
IRC_COLOR_CHAT_DELIMITERS);
free (string);
else
{
weechat_string_dyn_concat (str_nicks,
IRC_COLOR_RESET,
-1);
}
weechat_string_dyn_concat (str_nicks, nickname, -1);
}
}
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "names",
ptr_channel->buffer),
date,
irc_protocol_tags (
command, "irc_numeric", NULL, NULL),
_("%sNicks %s%s%s: %s[%s%s]"),
weechat_prefix ("network"),
IRC_COLOR_CHAT_CHANNEL,
ptr_channel->name,
IRC_COLOR_RESET,
IRC_COLOR_CHAT_DELIMITERS,
*str_nicks,
IRC_COLOR_CHAT_DELIMITERS);
weechat_string_dyn_free (str_nicks, 1);
weechat_infolist_free (infolist);
}
}
@@ -5855,52 +5850,49 @@ IRC_PROTOCOL_CALLBACK(366)
{
irc_nick_count (server, ptr_channel, &num_nicks, &num_op, &num_halfop,
&num_voice, &num_normal);
str_nicks_count[0] = '\0';
str_nicks = weechat_string_dyn_alloc (1024);
if (irc_server_get_prefix_mode_index (server, 'o') >= 0)
{
length = strlen (str_nicks_count);
snprintf (str_nicks_count + length,
sizeof (str_nicks_count) - length,
snprintf (str_count, sizeof (str_count),
"%s%s%d%s %s",
(str_nicks_count[0]) ? ", " : "",
(*str_nicks[0]) ? ", " : "",
IRC_COLOR_CHAT_CHANNEL,
num_op,
IRC_COLOR_RESET,
NG_("op", "ops", num_op));
weechat_string_dyn_concat (str_nicks, str_count, -1);
}
if (irc_server_get_prefix_mode_index (server, 'h') >= 0)
{
length = strlen (str_nicks_count);
snprintf (str_nicks_count + length,
sizeof (str_nicks_count) - length,
snprintf (str_count, sizeof (str_count),
"%s%s%d%s %s",
(str_nicks_count[0]) ? ", " : "",
(*str_nicks[0]) ? ", " : "",
IRC_COLOR_CHAT_CHANNEL,
num_halfop,
IRC_COLOR_RESET,
NG_("halfop", "halfops", num_halfop));
weechat_string_dyn_concat (str_nicks, str_count, -1);
}
if (irc_server_get_prefix_mode_index (server, 'v') >= 0)
{
length = strlen (str_nicks_count);
snprintf (str_nicks_count + length,
sizeof (str_nicks_count) - length,
snprintf (str_count, sizeof (str_count),
"%s%s%d%s %s",
(str_nicks_count[0]) ? ", " : "",
(*str_nicks[0]) ? ", " : "",
IRC_COLOR_CHAT_CHANNEL,
num_voice,
IRC_COLOR_RESET,
NG_("voice", "voices", num_voice));
weechat_string_dyn_concat (str_nicks, str_count, -1);
}
length = strlen (str_nicks_count);
snprintf (str_nicks_count + length,
sizeof (str_nicks_count) - length,
/* TRANSLATORS: number of "normal" nicks on a channel (ie no op/voice), for example: "56 normals" */
NG_("%s%s%d%s normal", "%s%s%d%s normals", num_normal),
(str_nicks_count[0]) ? ", " : "",
IRC_COLOR_CHAT_CHANNEL,
num_normal,
IRC_COLOR_RESET);
snprintf (
str_count, sizeof (str_count),
/* TRANSLATORS: number of "normal" nicks on a channel (ie no op/voice), for example: "56 normals" */
NG_("%s%s%d%s normal", "%s%s%d%s normals", num_normal),
(*str_nicks[0]) ? ", " : "",
IRC_COLOR_CHAT_CHANNEL,
num_normal,
IRC_COLOR_RESET);
weechat_string_dyn_concat (str_nicks, str_count, -1);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "names", ptr_channel->buffer),
@@ -5916,8 +5908,9 @@ IRC_PROTOCOL_CALLBACK(366)
IRC_COLOR_RESET,
NG_("nick", "nicks", num_nicks),
IRC_COLOR_CHAT_DELIMITERS,
str_nicks_count,
*str_nicks,
IRC_COLOR_CHAT_DELIMITERS);
weechat_string_dyn_free (str_nicks, 1);
}
if (!weechat_hashtable_has_key (ptr_channel->join_msg_received, command))
@@ -5929,6 +5922,7 @@ IRC_PROTOCOL_CALLBACK(366)
}
else
{
str_params = irc_protocol_string_params (params, 2, num_params - 1);
weechat_printf_date_tags (
irc_msgbuffer_get_target_buffer (
server, NULL, command, "names", NULL),
@@ -5937,9 +5931,11 @@ IRC_PROTOCOL_CALLBACK(366)
"%s%s%s%s: %s",
weechat_prefix ("network"),
IRC_COLOR_CHAT_CHANNEL,
argv[3],
params[1],
IRC_COLOR_RESET,
(argv[4][0] == ':') ? argv_eol[4] + 1 : argv_eol[4]);
str_params);
if (str_params)
free (str_params);
}
if (ptr_channel)
+30 -6
View File
@@ -3518,21 +3518,45 @@ TEST(IrcProtocolWithServer, 354)
TEST(IrcProtocolWithServer, 366)
{
SRV_INIT_JOIN2;
SRV_INIT_JOIN;
/* not enough arguments */
/* not enough parameters */
RECV(":server 366");
CHECK_ERROR_ARGS("366", 2, 5);
CHECK_ERROR_PARAMS("366", 0, 3);
RECV(":server 366 alice");
CHECK_ERROR_ARGS("366", 3, 5);
CHECK_ERROR_PARAMS("366", 1, 3);
RECV(":server 366 alice #test");
CHECK_ERROR_ARGS("366", 4, 5);
CHECK_ERROR_PARAMS("366", 2, 3);
RECV(":server 366 alice #test end");
CHECK_CHAN("-- Channel #test: 2 nicks (0 ops, 0 voices, 2 normals)");
CHECK_CHAN("-- Channel #test: 1 nick (0 ops, 0 voices, 1 normal)");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 1 nick (0 ops, 0 voices, 1 normal)");
RECV(":server 353 alice = #test :bob");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 2 nicks (0 ops, 0 voices, 2 normals)");
RECV(":server 353 alice = #test :@carol");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 3 nicks (1 op, 0 voices, 2 normals)");
RECV(":server 353 alice = #test :+dan!user@host");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 4 nicks (1 op, 1 voice, 2 normals)");
RECV(":server 353 alice = #test :@evans");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 5 nicks (2 ops, 1 voice, 2 normals)");
RECV(":server 353 alice = #test :+fred");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 6 nicks (2 ops, 2 voices, 2 normals)");
RECV(":server 353 alice = #test :greg");
RECV(":server 366 alice #test :End of /NAMES list");
CHECK_CHAN("-- Channel #test: 7 nicks (2 ops, 2 voices, 3 normals)");
/* channel not found */
RECV(":server 366 alice #xyz end");
CHECK_SRV("-- #xyz: end");