summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2001-03-04 00:14:00 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2001-03-04 00:14:00 +0000
commitd0a4404bdf4b43f7888525792d2f58577a1d6122 (patch)
treea01d49cc8de1bfc1afb829762514e6f496c07415
parent5def50c7f600f5031468435ce432844731aef0f7 (diff)
downloadirssi-d0a4404bdf4b43f7888525792d2f58577a1d6122.zip
/NAMES: -ops -halfops -voices -normal options added. /NAMES without
parameters now prints nicklist in active channel, /NAMES ** shows all nicks in all channels. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1332 dbcabf3a-b0e7-0310-adc4-f8d773084564
-rw-r--r--docs/help/in/names.in14
-rw-r--r--src/fe-common/core/fe-channels.c86
-rw-r--r--src/fe-common/core/fe-channels.h8
-rw-r--r--src/fe-common/irc/fe-events-numeric.c3
-rw-r--r--src/irc/core/irc-commands.c37
5 files changed, 113 insertions, 35 deletions
diff --git a/docs/help/in/names.in b/docs/help/in/names.in
index 7bd4f3d4..2d515c1c 100644
--- a/docs/help/in/names.in
+++ b/docs/help/in/names.in
@@ -1,13 +1,21 @@
@SYNTAX:names@
-Shows the names (nicks) on the specified channel.
+ -ops: show channel operators in list
+ -halfops: show half operators in list
+ -voices: show voiced people in list
+ -normal: show rest of the people in list
+
+Shows the names (nicks) in the specified channels. /NAMES ** shows all
+nicks in all channels, you probably don't want to do this.
Examples:
-/NAMES * - shows nicks on the current channel.
+/NAMES
+ - shows nicks in the current channel.
-/NAMES #42 - shows nicks on the channel #42.
+/NAMES -ops #c1,#c2
+ - shows operators in channels #c1 and #c2
See also: WHO, CHANNEL
diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c
index 6175cb55..56371f1f 100644
--- a/src/fe-common/core/fe-channels.c
+++ b/src/fe-common/core/fe-channels.c
@@ -34,6 +34,7 @@
#include "nicklist.h"
#include "fe-windows.h"
+#include "fe-channels.h"
#include "window-items.h"
#include "printtext.h"
@@ -416,11 +417,11 @@ static void display_sorted_nicks(CHANNEL_REC *channel, GSList *nicklist)
g_slist_free(nicklist);
g_string_free(str, TRUE);
- g_free(columns);
+ g_free_not_null(columns);
g_free(linebuf);
}
-void fe_channels_nicklist(CHANNEL_REC *channel)
+void fe_channels_nicklist(CHANNEL_REC *channel, int flags)
{
NICK_REC *nick;
GSList *tmp, *nicklist, *sorted;
@@ -434,14 +435,26 @@ void fe_channels_nicklist(CHANNEL_REC *channel)
for (tmp = nicklist; tmp != NULL; tmp = tmp->next) {
nick = tmp->data;
- sorted = g_slist_insert_sorted(sorted, nick, (GCompareFunc) nicklist_compare);
- if (nick->op)
+ nicks++;
+ if (nick->op) {
ops++;
- else if (nick->voice)
+ if ((flags & CHANNEL_NICKLIST_FLAG_OPS) == 0)
+ continue;
+ } else if (nick->halfop) {
+ if ((flags & CHANNEL_NICKLIST_FLAG_HALFOPS) == 0)
+ continue;
+ } else if (nick->voice) {
voices++;
- else
+ if ((flags & CHANNEL_NICKLIST_FLAG_VOICES) == 0)
+ continue;
+ } else {
normal++;
- nicks++;
+ if ((flags & CHANNEL_NICKLIST_FLAG_NORMAL) == 0)
+ continue;
+ }
+
+ sorted = g_slist_insert_sorted(sorted, nick, (GCompareFunc)
+ nicklist_compare);
}
g_slist_free(nicklist);
@@ -456,27 +469,65 @@ void fe_channels_nicklist(CHANNEL_REC *channel)
channel->name, nicks, ops, voices, normal);
}
+/* SYNTAX: NAMES [-ops -halfops -voices -normal] [<channels> | **] */
static void cmd_names(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
{
- CHANNEL_REC *channel;
+ CHANNEL_REC *chanrec;
+ GHashTable *optlist;
+ GString *unknowns;
+ char *channel, **channels, **tmp;
+ int flags;
+ void *free_arg;
g_return_if_fail(data != NULL);
-
- if (server == NULL || !server->connected)
+ if (!IS_SERVER(server) || !server->connected)
cmd_return_error(CMDERR_NOT_CONNECTED);
- if (strcmp(data, "*") == 0) {
+ if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS |
+ PARAM_FLAG_GETREST, "names", &optlist, &channel))
+ return;
+
+ if (strcmp(channel, "*") == 0 || *channel == '\0') {
if (!IS_CHANNEL(item))
- cmd_return_error(CMDERR_NOT_JOINED);
+ cmd_param_error(CMDERR_NOT_JOINED);
- data = item->name;
+ channel = item->name;
}
- channel = channel_find(server, data);
- if (channel != NULL) {
- fe_channels_nicklist(channel);
- signal_stop();
+ flags = 0;
+ if (g_hash_table_lookup(optlist, "ops") != NULL)
+ flags |= CHANNEL_NICKLIST_FLAG_OPS;
+ if (g_hash_table_lookup(optlist, "halfops") != NULL)
+ flags |= CHANNEL_NICKLIST_FLAG_HALFOPS;
+ if (g_hash_table_lookup(optlist, "voices") != NULL)
+ flags |= CHANNEL_NICKLIST_FLAG_VOICES;
+ if (g_hash_table_lookup(optlist, "normal") != NULL)
+ flags |= CHANNEL_NICKLIST_FLAG_NORMAL;
+
+ if (flags == 0) flags = CHANNEL_NICKLIST_FLAG_ALL;
+
+ unknowns = g_string_new(NULL);
+
+ channels = g_strsplit(channel, ",", -1);
+ for (tmp = channels; *tmp != NULL; tmp++) {
+ chanrec = channel_find(server, *tmp);
+ if (chanrec != NULL)
+ fe_channels_nicklist(chanrec, flags);
+ else
+ g_string_sprintfa(unknowns, "%s,", *tmp);
}
+ g_strfreev(channels);
+
+ if (unknowns->len > 1)
+ g_string_truncate(unknowns, unknowns->len-1);
+
+ if (unknowns->len > 0 && strcmp(channel, unknowns->str) != 0) {
+ signal_stop();
+ signal_emit("command names", 3, unknowns->str, server, item);
+ }
+ g_string_free(unknowns, TRUE);
+
+ cmd_params_free(free_arg);
}
void fe_channels_init(void)
@@ -501,6 +552,7 @@ void fe_channels_init(void)
command_bind("names", NULL, (SIGNAL_FUNC) cmd_names);
command_set_options("channel add", "auto noauto -bots -botcmd");
+ command_set_options("names", "ops halfops voices normal");
command_set_options("join", "window");
}
diff --git a/src/fe-common/core/fe-channels.h b/src/fe-common/core/fe-channels.h
index 3d6d31ab..a8aa697e 100644
--- a/src/fe-common/core/fe-channels.h
+++ b/src/fe-common/core/fe-channels.h
@@ -1,7 +1,13 @@
#ifndef __FE_CHANNELS_H
#define __FE_CHANNELS_H
-void fe_channels_nicklist(CHANNEL_REC *channel);
+#define CHANNEL_NICKLIST_FLAG_OPS 0x01
+#define CHANNEL_NICKLIST_FLAG_HALFOPS 0x02
+#define CHANNEL_NICKLIST_FLAG_VOICES 0x04
+#define CHANNEL_NICKLIST_FLAG_NORMAL 0x08
+#define CHANNEL_NICKLIST_FLAG_ALL 0x0f
+
+void fe_channels_nicklist(CHANNEL_REC *channel, int flags);
void fe_channels_init(void);
void fe_channels_deinit(void);
diff --git a/src/fe-common/irc/fe-events-numeric.c b/src/fe-common/irc/fe-events-numeric.c
index 1974d3a4..c0328c0b 100644
--- a/src/fe-common/irc/fe-events-numeric.c
+++ b/src/fe-common/irc/fe-events-numeric.c
@@ -90,7 +90,8 @@ static void event_end_of_names(IRC_SERVER_REC *server, const char *data)
chanrec = irc_channel_find(server, channel);
if (chanrec != NULL)
- fe_channels_nicklist(CHANNEL(chanrec));
+ fe_channels_nicklist(CHANNEL(chanrec),
+ CHANNEL_NICKLIST_FLAG_ALL);
else {
printformat_module("fe-common/core", server, channel,
MSGLEVEL_CRAP, TXT_ENDOFNAMES,
diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c
index a4f63e46..a35061bf 100644
--- a/src/irc/core/irc-commands.c
+++ b/src/irc/core/irc-commands.c
@@ -237,8 +237,9 @@ static void cmd_list(const char *data, IRC_SERVER_REC *server,
server_redirect_default((SERVER_REC *) server, "bogus command list");
}
-/* SYNTAX: WHO <nicks>|<channels>|** */
-static void cmd_who(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
+/* SYNTAX: WHO [<nicks> | <channels> | **] */
+static void cmd_who(const char *data, IRC_SERVER_REC *server,
+ WI_ITEM_REC *item)
{
char *channel, *rest;
void *free_arg;
@@ -269,26 +270,36 @@ static void cmd_who(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
server_redirect_default((SERVER_REC *) server, "bogus command who");
}
-/* SYNTAX: NAMES [-yes] [<channels>] */
-static void cmd_names(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
+static void cmd_names(const char *data, IRC_SERVER_REC *server,
+ WI_ITEM_REC *item)
{
- g_return_if_fail(data != NULL);
+ GHashTable *optlist;
+ char *channel;
+ void *free_arg;
+ g_return_if_fail(data != NULL);
if (!IS_IRC_SERVER(server) || !server->connected)
cmd_return_error(CMDERR_NOT_CONNECTED);
- if (*data == '\0') cmd_return_error(CMDERR_NOT_GOOD_IDEA);
- if (strcmp(data, "*") == 0) {
+ if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS |
+ PARAM_FLAG_GETREST, "names", &optlist, &channel))
+ return;
+
+ if (strcmp(channel, "*") == 0 || *channel == '\0') {
if (!IS_IRC_CHANNEL(item))
- cmd_return_error(CMDERR_NOT_JOINED);
+ cmd_param_error(CMDERR_NOT_JOINED);
- data = item->name;
+ channel = item->name;
}
- if (g_strcasecmp(data, "-YES") == 0)
- irc_send_cmd(server, "NAMES");
- else
- irc_send_cmdv(server, "NAMES %s", data);
+ if (strcmp(channel, "**") == 0) {
+ /* ** displays all nicks.. */
+ irc_send_cmd(server, "NAMES");
+ } else {
+ irc_send_cmdv(server, "NAMES %s", channel);
+ }
+
+ cmd_params_free(free_arg);
}
/* SYNTAX: NICK <new nick> */