#include "chat-protocols.h"
#include "chatnets.h"
+#include "servers.h"
#include "channels.h"
#include "channels-setup.h"
#include "nicklist.h"
window_auto_destroy(window);
}
-static void signal_window_item_destroy(WINDOW_REC *window, WI_ITEM_REC *item)
-{
- CHANNEL_REC *channel;
-
- g_return_if_fail(window != NULL);
-
- channel = CHANNEL(item);
- if (channel != NULL) channel_destroy(channel);
-}
-
static void sig_disconnected(SERVER_REC *server)
{
WINDOW_REC *window;
{
if (*data == '\0')
cmd_channel_list_joined();
- else
+ else if (server != NULL && server_ischannel(server, data)) {
+ signal_emit("command join", 3, data, server, item);
+ } else {
command_runsub("channel", data, server, item);
+ }
}
/* SYNTAX: CHANNEL ADD [-auto | -noauto] [-bots <masks>] [-botcmd <command>]
TEXT_DEST_REC dest;
GString *str;
GSList *tmp;
- char *format, *stripped;
+ char *format, *stripped, *prefix_format;
char *linebuf, nickmode[2] = { 0, 0 };
int *columns, cols, rows, last_col_rows, col, row, max_width;
- int item_extra, linebuf_size;
+ int item_extra, linebuf_size, formatnum;
window = window_find_closest(channel->server, channel->name,
MSGLEVEL_CLIENTCRAP);
g_free(format);
if (settings_get_int("names_max_width") > 0 &&
- max_width > settings_get_int("names_max_width"))
+ settings_get_int("names_max_width") < max_width)
max_width = settings_get_int("names_max_width");
- /* remove width of timestamp from max_width */
+ /* remove width of the timestamp from max_width */
format_create_dest(&dest, channel->server, channel->name,
MSGLEVEL_CLIENTCRAP, NULL);
format = format_get_line_start(current_theme, &dest, time(NULL));
g_free(format);
}
+ /* remove width of the prefix from max_width */
+ prefix_format = format_get_text(MODULE_NAME, NULL,
+ channel->server, channel->name,
+ TXT_NAMES_PREFIX, channel->name);
+ if (prefix_format != NULL) {
+ stripped = strip_codes(prefix_format);
+ max_width -= strlen(stripped);
+ g_free(stripped);
+ }
+
+ if (max_width <= 0) {
+ /* we should always have at least some space .. if we
+ really don't, it won't show properly anyway. */
+ max_width = 10;
+ }
+
/* calculate columns */
cols = get_max_column_count(nicklist, get_nick_length, max_width,
settings_get_int("names_max_columns"),
if (last_col_rows == 0)
last_col_rows = rows;
- str = g_string_new(NULL);
+ str = g_string_new(prefix_format);
linebuf_size = max_width+1; linebuf = g_malloc(linebuf_size);
col = 0; row = 0;
for (tmp = nicklist; tmp != NULL; tmp = tmp->next) {
NICK_REC *rec = tmp->data;
- nickmode[0] = rec->op ? '@' : rec->voice ? '+' : ' ';
-
+ if (rec->op)
+ nickmode[0] = '@';
+ else if (rec->halfop)
+ nickmode[0] = '%';
+ else if (rec->voice)
+ nickmode[0] = '+';
+ else
+ nickmode[0] = ' ';
+
if (linebuf_size < columns[col]-item_extra+1) {
linebuf_size = (columns[col]-item_extra+1)*2;
linebuf = g_realloc(linebuf, linebuf_size);
linebuf[columns[col]-item_extra] = '\0';
memcpy(linebuf, rec->nick, strlen(rec->nick));
+ formatnum = rec->op ? TXT_NAMES_NICK_OP :
+ rec->halfop ? TXT_NAMES_NICK_HALFOP :
+ rec->voice ? TXT_NAMES_NICK_VOICE :
+ TXT_NAMES_NICK;
format = format_get_text(MODULE_NAME, NULL,
channel->server, channel->name,
- TXT_NAMES_NICK, nickmode, linebuf);
+ formatnum, nickmode, linebuf);
g_string_append(str, format);
g_free(format);
printtext(channel->server, channel->name,
MSGLEVEL_CLIENTCRAP, "%s", str->str);
g_string_truncate(str, 0);
+ if (prefix_format != NULL)
+ g_string_assign(str, prefix_format);
col = 0; row++;
if (row == last_col_rows)
}
}
- if (str->len != 0) {
+ if (str->len > strlen(prefix_format)) {
printtext(channel->server, channel->name,
MSGLEVEL_CLIENTCRAP, "%s", str->str);
}
g_slist_free(nicklist);
g_string_free(str, TRUE);
g_free_not_null(columns);
+ g_free_not_null(prefix_format);
g_free(linebuf);
}
{
NICK_REC *nick;
GSList *tmp, *nicklist, *sorted;
- int nicks, normal, voices, ops;
+ int nicks, normal, voices, halfops, ops;
- nicks = normal = voices = ops = 0;
+ nicks = normal = voices = halfops = ops = 0;
nicklist = nicklist_getnicks(channel);
sorted = NULL;
if ((flags & CHANNEL_NICKLIST_FLAG_OPS) == 0)
continue;
} else if (nick->halfop) {
+ halfops++;
if ((flags & CHANNEL_NICKLIST_FLAG_HALFOPS) == 0)
continue;
} else if (nick->voice) {
g_slist_free(nicklist);
/* display the nicks */
- printformat(channel->server, channel->name,
- MSGLEVEL_CRAP, TXT_NAMES, channel->name, "");
- display_sorted_nicks(channel, sorted);
+ if ((flags & CHANNEL_NICKLIST_FLAG_COUNT) == 0) {
+ printformat(channel->server, channel->name,
+ MSGLEVEL_CLIENTCRAP, TXT_NAMES, channel->name, nicks, ops, halfops, voices, normal);
+ display_sorted_nicks(channel, sorted);
+ }
g_slist_free(sorted);
printformat(channel->server, channel->name,
- MSGLEVEL_CRAP, TXT_ENDOFNAMES,
- channel->name, nicks, ops, voices, normal);
+ MSGLEVEL_CLIENTNOTICE, TXT_ENDOFNAMES,
+ channel->name, nicks, ops, halfops, voices, normal);
}
-/* SYNTAX: NAMES [-ops -halfops -voices -normal] [<channels> | **] */
+/* SYNTAX: NAMES [-count | -ops -halfops -voices -normal] [<channels> | **] */
static void cmd_names(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
{
CHANNEL_REC *chanrec;
flags |= CHANNEL_NICKLIST_FLAG_VOICES;
if (g_hash_table_lookup(optlist, "normal") != NULL)
flags |= CHANNEL_NICKLIST_FLAG_NORMAL;
+ if (g_hash_table_lookup(optlist, "count") != NULL)
+ flags |= CHANNEL_NICKLIST_FLAG_COUNT;
if (flags == 0) flags = CHANNEL_NICKLIST_FLAG_ALL;
joindata = chanrec->get_join_data(chanrec);
window_bind_add(window_item_window(chanrec),
chanrec->server->tag, chanrec->name);
- channel_destroy(chanrec);
+
+ /* FIXME: kludgy kludgy... and it relies on channel not
+ being destroyed immediately.. */
+ signal_emit("command part", 3, data, server, item);
+ chanrec->left = TRUE;
+ channel_destroy(chanrec);
server->channels_join(server, joindata, FALSE);
g_free(joindata);
signal_add("channel created", (SIGNAL_FUNC) signal_channel_created);
signal_add("channel destroyed", (SIGNAL_FUNC) signal_channel_destroyed);
- signal_add_last("window item destroy", (SIGNAL_FUNC) signal_window_item_destroy);
signal_add_last("window item changed", (SIGNAL_FUNC) signal_window_item_changed);
signal_add_last("server disconnected", (SIGNAL_FUNC) sig_disconnected);
command_bind("cycle", NULL, (SIGNAL_FUNC) cmd_cycle);
command_set_options("channel add", "auto noauto -bots -botcmd");
- command_set_options("names", "ops halfops voices normal");
+ command_set_options("names", "count ops halfops voices normal");
command_set_options("join", "window");
}
{
signal_remove("channel created", (SIGNAL_FUNC) signal_channel_created);
signal_remove("channel destroyed", (SIGNAL_FUNC) signal_channel_destroyed);
- signal_remove("window item destroy", (SIGNAL_FUNC) signal_window_item_destroy);
signal_remove("window item changed", (SIGNAL_FUNC) signal_window_item_changed);
signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);