diff options
Diffstat (limited to 'src/plugins/irc/irc-command.c')
-rw-r--r-- | src/plugins/irc/irc-command.c | 78 |
1 files changed, 62 insertions, 16 deletions
diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index 9e8c37dbe..3b6b91929 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -3895,6 +3895,10 @@ IRC_COMMAND_CALLBACK(msg) IRC_COMMAND_CALLBACK(names) { + int i, arg_channels; + char filter[2], **channels, *channel_name_lower; + int num_channels; + IRC_BUFFER_GET_SERVER_CHANNEL(buffer); IRC_COMMAND_CHECK_SERVER("names", 1, 1); @@ -3903,26 +3907,64 @@ IRC_COMMAND_CALLBACK(names) (void) data; (void) argv; - if (argc > 1) + arg_channels = argc; + filter[0] = '\0'; + filter[1] = '\0'; + + for (i = 1; i < argc; i++) { - irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL, - "NAMES %s", argv_eol[1]); + if (argv[i][0] == '-') + { + if (weechat_strcmp (argv[i], "-count") == 0) + filter[0] = '#'; + else if (argv[i][1]) + filter[0] = argv[i][1]; + } + else + { + arg_channels = i; + break; + } } - else + + if ((arg_channels >= argc) + && (!ptr_channel || (ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL))) { - if (!ptr_channel || (ptr_channel->type != IRC_CHANNEL_TYPE_CHANNEL)) + weechat_printf ( + ptr_server->buffer, + _("%s%s: \"%s\" command can only be executed in a channel " + "buffer"), + weechat_prefix ("error"), IRC_PLUGIN_NAME, "names"); + return WEECHAT_RC_OK; + } + + if (filter[0]) + { + channels = weechat_string_split ( + (arg_channels < argc) ? argv_eol[arg_channels] : ptr_channel->name, + ",", NULL, 0, 0, &num_channels); + if (channels) { - weechat_printf ( - ptr_server->buffer, - _("%s%s: \"%s\" command can only be executed in a channel " - "buffer"), - weechat_prefix ("error"), IRC_PLUGIN_NAME, "names"); - return WEECHAT_RC_OK; + for (i = 0; i < num_channels; i++) + { + channel_name_lower = weechat_string_tolower (channels[i]); + if (channel_name_lower) + { + weechat_hashtable_set (ptr_server->names_channel_filter, + channel_name_lower, + filter); + free (channel_name_lower); + } + } + weechat_string_free_split (channels); } - irc_server_sendf (ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL, - "NAMES %s", ptr_channel->name); } + irc_server_sendf ( + ptr_server, IRC_SERVER_SEND_OUTQ_PRIO_HIGH, NULL, + "NAMES %s", + (arg_channels < argc) ? argv_eol[arg_channels] : ptr_channel->name); + return WEECHAT_RC_OK; } @@ -7432,9 +7474,13 @@ irc_command_init () weechat_hook_command ( "names", N_("list nicks on channels"), - N_("[<channel>[,<channel>...]]"), - N_("channel: channel name"), - "%(irc_channels)", &irc_command_names, NULL, NULL); + N_("[-count | -x] [<channel>[,<channel>...]]"), + N_(" -count: display only number of users\n" + " -x: display only users with this mode: -o for ops, " + "-h for halfops, -v for voiced, etc. and -* for regular users\n" + "channel: channel name"), + "-count|%(irc_server_prefix_modes_filter) %(irc_channels)" + " || %(irc_channels)", &irc_command_names, NULL, NULL); weechat_hook_command ( "nick", N_("change current nick"), |