1
0
mirror of https://github.com/irssi/irssi.git synced 2025-02-02 15:08:01 -05:00

/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
This commit is contained in:
Timo Sirainen 2001-03-04 00:14:00 +00:00 committed by cras
parent 5def50c7f6
commit d0a4404bdf
5 changed files with 115 additions and 37 deletions

@ -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

@ -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)
ops++;
else if (nick->voice)
voices++;
else
normal++;
nicks++;
if (nick->op) {
ops++;
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++;
if ((flags & CHANNEL_NICKLIST_FLAG_VOICES) == 0)
continue;
} else {
normal++;
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");
}

@ -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);

@ -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,

@ -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> */