1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-29 22:36:38 +02:00

Added group support for nicklist, fixed some bugs in plugins API and IRC plugin

Added group support for nicklist (with subgroups).
Partial changes in IRC protocol functions (new arguments with argv and argv_eol).
Fixed some bugs:
- nicklist in plugins API
- problem in main loop with select() when SIGWINCH is received (terminal resize)
- bug in string explode function
- bug in infobar countdown.
This commit is contained in:
Sebastien Helleu
2008-01-01 18:22:26 +01:00
parent cdbffe40da
commit 9222a7b109
48 changed files with 1619 additions and 987 deletions
+2 -1
View File
@@ -1,10 +1,11 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2007-12-17
ChangeLog - 2008-01-01
Version 0.2.7 (under dev!):
* added group support in nicklist
* added backlog option in logger plugin
* improved main loop: higher timout in select(), less CPU usage
* added /reload command to reload WeeChat and plugins config files
+22 -13
View File
@@ -399,15 +399,22 @@ command_clear (void *data, struct t_gui_buffer *buffer,
void
command_debug_display_windows (struct t_gui_window_tree *tree, int indent)
{
char format[128];
if (tree)
{
if (tree->window)
{
/* leaf */
snprintf (format,
sizeof (format),
"%%-%dsleaf: 0x%%X (parent:0x%%X), win=0x%%X, "
"child1=0x%%X, child2=0x%%X, %%d,%%d %%dx%%d, "
"%%d%%%%x%%d%%%%",
indent * 2);
gui_chat_printf (NULL,
"leaf: %X (parent:%X), win=%X, child1=%X, "
"child2=%X, %d,%d %dx%d, %d%%x%d%%",
tree, tree->parent_node, tree->window,
format,
" ", tree, tree->parent_node, tree->window,
tree->child1, tree->child2,
tree->window->win_x, tree->window->win_y,
tree->window->win_width, tree->window->win_height,
@@ -417,10 +424,14 @@ command_debug_display_windows (struct t_gui_window_tree *tree, int indent)
else
{
/* node */
snprintf (format,
sizeof (format),
"%%-%dsnode: 0x%%X (parent:0x%%X), win=0x%%X, "
"child1=0x%%X, child2=0x%%X)",
indent * 2);
gui_chat_printf (NULL,
"node: %X (parent:%X), win=%X, child1=%X, "
"child2=%X)",
tree, tree->parent_node, tree->window,
format,
" ", tree, tree->parent_node, tree->window,
tree->child1, tree->child2);
}
@@ -464,11 +475,7 @@ command_debug (void *data, struct t_gui_buffer *buffer,
}
else
{
gui_chat_printf (NULL,
_("%sError: unknown option for \"%s\" command"),
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
"debug");
return WEECHAT_RC_ERROR;
hook_signal_send ("debug", argv_eol[1]);
}
}
@@ -1928,12 +1935,14 @@ command_init ()
command_clear, NULL);
hook_command (NULL, "debug",
N_("print debug messages"),
N_("dump | buffer | windows"),
N_("dump | buffer | windows | text"),
N_(" dump: save memory dump in WeeChat log file (same "
"dump is written when WeeChat crashes)\n"
" buffer: dump buffer content with hexadecimal values "
"in log file\n"
"windows: display windows tree"),
"windows: display windows tree\n"
" text: send \"debug\" signal with \"text\" as "
"arguments"),
"dump|buffer|windows",
command_debug, NULL);
hook_command (NULL, "help",
+2 -4
View File
@@ -273,10 +273,8 @@ config_file_new_option (struct t_config_section *section, char *name,
*((int *)new_option->value) = int_value;
break;
case CONFIG_OPTION_INTEGER:
if (string_values)
new_option->string_values = string_explode (string_values,
"|", 0, 0,
&argc);
new_option->string_values = (string_values) ?
string_explode (string_values, "|", 0, 0, &argc) : NULL;
if (new_option->string_values)
{
new_option->min = 0;
+9 -2
View File
@@ -145,6 +145,7 @@ struct t_config_option *config_color_input_text_not_found;
struct t_config_option *config_color_input_actions;
struct t_config_option *config_color_nicklist;
struct t_config_option *config_color_nicklist_bg;
struct t_config_option *config_color_nicklist_group;
struct t_config_option *config_color_nicklist_away;
struct t_config_option *config_color_nicklist_prefix1;
struct t_config_option *config_color_nicklist_prefix2;
@@ -309,9 +310,10 @@ config_change_color ()
void
config_change_nicks_colors ()
{
/*
struct t_gui_buffer *ptr_buffer;
struct t_gui_nick *ptr_nick;
for (ptr_buffer = gui_buffers; ptr_buffer;
ptr_buffer = ptr_buffer->next_buffer)
{
@@ -320,10 +322,11 @@ config_change_nicks_colors ()
for (ptr_nick = ptr_buffer->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
//gui_nick_find_color (ptr_nick);
gui_nick_find_color (ptr_nick);
}
}
}
*/
}
/*
@@ -954,6 +957,10 @@ config_weechat_init ()
ptr_section, "color_nicklist_bg", "color",
N_("background color for nicklist"),
NULL, -1, 0, "default", &config_change_color);
config_color_nicklist_group = config_file_new_option (
ptr_section, "color_nicklist_group", "color",
N_("text color for groups in nicklist"),
NULL, GUI_COLOR_NICKLIST_GROUP, 0, "green", &config_change_color);
config_color_nicklist_away = config_file_new_option (
ptr_section, "color_nicklist_away", "color",
N_("text color for away nicknames"),
+1
View File
@@ -131,6 +131,7 @@ extern struct t_config_option *config_color_input_text_not_found;
extern struct t_config_option *config_color_input_actions;
extern struct t_config_option *config_color_nicklist;
extern struct t_config_option *config_color_nicklist_bg;
extern struct t_config_option *config_color_nicklist_group;
extern struct t_config_option *config_color_nicklist_away;
extern struct t_config_option *config_color_nicklist_prefix1;
extern struct t_config_option *config_color_nicklist_prefix2;
+23 -4
View File
@@ -638,26 +638,43 @@ hook_fd (struct t_weechat_plugin *plugin, int fd, int flag_read,
/*
* hook_fd_set: fill sets according to hd hooked
* return highest fd set
*/
void
int
hook_fd_set (fd_set *read_fds, fd_set *write_fds, fd_set *exception_fds)
{
struct t_hook *ptr_hook;
int max_fd;
max_fd = 0;
for (ptr_hook = weechat_hooks[HOOK_TYPE_FD]; ptr_hook;
ptr_hook = ptr_hook->next_hook)
{
if (!ptr_hook->deleted)
{
if (HOOK_FD(ptr_hook, flags) & HOOK_FD_FLAG_READ)
{
FD_SET (HOOK_FD(ptr_hook, fd), read_fds);
if (HOOK_FD(ptr_hook, fd) > max_fd)
max_fd = HOOK_FD(ptr_hook, fd);
}
if (HOOK_FD(ptr_hook, flags) & HOOK_FD_FLAG_WRITE)
{
FD_SET (HOOK_FD(ptr_hook, fd), write_fds);
if (HOOK_FD(ptr_hook, fd) > max_fd)
max_fd = HOOK_FD(ptr_hook, fd);
}
if (HOOK_FD(ptr_hook, flags) & HOOK_FD_FLAG_EXCEPTION)
{
FD_SET (HOOK_FD(ptr_hook, fd), exception_fds);
if (HOOK_FD(ptr_hook, fd) > max_fd)
max_fd = HOOK_FD(ptr_hook, fd);
}
}
}
return max_fd;
}
/*
@@ -678,7 +695,7 @@ hook_fd_exec (fd_set *read_fds, fd_set *write_fds, fd_set *exception_fds)
if (!ptr_hook->deleted
&& !ptr_hook->running
&& (((HOOK_FD(ptr_hook, flags)& HOOK_FD_FLAG_READ)
&& (((HOOK_FD(ptr_hook, flags) & HOOK_FD_FLAG_READ)
&& (FD_ISSET(HOOK_FD(ptr_hook, fd), read_fds)))
|| ((HOOK_FD(ptr_hook, flags) & HOOK_FD_FLAG_WRITE)
&& (FD_ISSET(HOOK_FD(ptr_hook, fd), write_fds)))
@@ -1172,7 +1189,9 @@ hook_print_log ()
{
log_printf ("");
log_printf ("[hook (addr:0x%X)]", ptr_hook);
log_printf (" plugin . . . . . . . . : 0x%X", ptr_hook->plugin);
log_printf (" plugin . . . . . . . . : 0x%X ('%s')",
ptr_hook->plugin,
(ptr_hook->plugin) ? ptr_hook->plugin->name : "");
log_printf (" deleted. . . . . . . . : %d", ptr_hook->deleted);
log_printf (" running. . . . . . . . : %d", ptr_hook->running);
switch (ptr_hook->type)
+3 -3
View File
@@ -173,8 +173,8 @@ extern struct t_hook *hook_fd (struct t_weechat_plugin *plugin, int fd,
int flag_exception,
t_hook_callback_fd * callback,
void *callback_data);
extern void hook_fd_set (fd_set *read_fds, fd_set *write_fds,
fd_set *exception_fds);
extern int hook_fd_set (fd_set *read_fds, fd_set *write_fds,
fd_set *exception_fds);
extern void hook_fd_exec (fd_set *read_fds, fd_set *write_fds,
fd_set *exception_fds);
extern struct t_hook *hook_print (struct t_weechat_plugin *plugin,
@@ -188,7 +188,7 @@ extern struct t_hook *hook_signal (struct t_weechat_plugin *plugin,
char *signal,
t_hook_callback_signal *callback,
void *callback_data);
extern void hook_signal_send (char *signal, void *signal_date);
extern void hook_signal_send (char *signal, void *signal_data);
extern struct t_hook *hook_config (struct t_weechat_plugin *, char *type,
char *option,
t_hook_callback_config *callback,
+15
View File
@@ -224,6 +224,21 @@ weelist_get (struct t_weelist *weelist, int position)
return NULL;
}
/*
* weelist_set: set a new value for an item
*/
void
weelist_set (struct t_weelist_item *item, char *new_value)
{
if (!item || !new_value)
return;
if (item->data)
free (item->data);
item->data = strdup (new_value);
}
/*
* weelist_next: get next item
*/
+1
View File
@@ -47,6 +47,7 @@ extern struct t_weelist_item *weelist_casesearch (struct t_weelist *weelist,
char *data);
extern struct t_weelist_item *weelist_get (struct t_weelist *weelist,
int position);
extern void weelist_set (struct t_weelist_item *item, char *new_value);
extern struct t_weelist_item *weelist_next (struct t_weelist_item *item);
extern struct t_weelist_item *weelist_prev (struct t_weelist_item *item);
extern char *weelist_string (struct t_weelist_item *item);
+2 -2
View File
@@ -385,7 +385,7 @@ string_explode (char *string, char *separators, int keep_eol,
i = 1;
while ((ptr = strpbrk (ptr, separators)))
{
while (strchr (separators, ptr[0]) != NULL)
while (ptr[0] && (strchr (separators, ptr[0]) != NULL))
ptr++;
i++;
}
@@ -402,7 +402,7 @@ string_explode (char *string, char *separators, int keep_eol,
for (i = 0; i < n_items; i++)
{
while (strchr (separators, ptr1[0]) != NULL)
while (ptr1[0] && (strchr (separators, ptr1[0]) != NULL))
ptr1++;
if (i == (n_items - 1) || (ptr2 = strpbrk (ptr1, separators)) == NULL)
if ((ptr2 = strchr (ptr1, '\r')) == NULL)
+15
View File
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <signal.h>
#include "weechat.h"
#include "wee-util.h"
@@ -119,6 +120,20 @@ util_get_time_length (char *time_format)
return strlen (text_time);
}
/*
* util_catch_signal: catch a signal
*/
void
util_catch_signal (int signum, void (*handler)(int))
{
struct sigaction act;
sigemptyset (&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = handler;
sigaction(signum, &act, NULL);
}
/*
* util_create_dir: create a directory
+1
View File
@@ -24,6 +24,7 @@ extern int util_timeval_cmp (struct timeval *tv1, struct timeval *tv2);
extern long util_timeval_diff (struct timeval *tv1, struct timeval *tv2);
extern void util_timeval_add (struct timeval *tv, long interval);
extern int util_get_time_length (char *time_format);
extern void util_catch_signal (int signum, void (*handler)(int));
extern int util_create_dir (char *directory, int permissions);
extern void util_exec_on_files (char *directory, void *data,
int (*callback)(void *data, char *filename));
+5 -4
View File
@@ -582,10 +582,11 @@ main (int argc, char *argv[])
#endif
utf8_init ();
signal (SIGINT, SIG_IGN); /* ignore SIGINT signal */
signal (SIGQUIT, SIG_IGN); /* ignore SIGQUIT signal */
signal (SIGPIPE, SIG_IGN); /* ignore SIGPIPE signal */
signal (SIGSEGV, weechat_sigsegv); /* crash dump when SIGSEGV received */
util_catch_signal (SIGINT, SIG_IGN); /* ignore SIGINT signal */
util_catch_signal (SIGQUIT, SIG_IGN); /* ignore SIGQUIT signal */
util_catch_signal (SIGPIPE, SIG_IGN); /* ignore SIGPIPE signal */
util_catch_signal (SIGSEGV,
&weechat_sigsegv); /* crash dump for SIGSEGV signal */
hook_init (); /* initialize hooks */
gui_main_pre_init (&argc, &argv); /* pre-initiliaze interface */
weechat_init_vars (); /* initialize some variables */
+1
View File
@@ -398,6 +398,7 @@ gui_color_init_weechat ()
gui_color[GUI_COLOR_INPUT_ACTIONS] = gui_color_build (GUI_COLOR_INPUT_ACTIONS, CONFIG_COLOR(config_color_input_actions), CONFIG_COLOR(config_color_input_bg));
gui_color[GUI_COLOR_NICKLIST] = gui_color_build (GUI_COLOR_NICKLIST, CONFIG_COLOR(config_color_nicklist), CONFIG_COLOR(config_color_nicklist_bg));
gui_color[GUI_COLOR_NICKLIST_GROUP] = gui_color_build (GUI_COLOR_NICKLIST_GROUP, CONFIG_COLOR(config_color_nicklist_group), CONFIG_COLOR(config_color_nicklist_bg));
gui_color[GUI_COLOR_NICKLIST_AWAY] = gui_color_build (GUI_COLOR_NICKLIST_AWAY, CONFIG_COLOR(config_color_nicklist_away), CONFIG_COLOR(config_color_nicklist_bg));
gui_color[GUI_COLOR_NICKLIST_PREFIX1] = gui_color_build (GUI_COLOR_NICKLIST_PREFIX1, CONFIG_COLOR(config_color_nicklist_prefix1), CONFIG_COLOR(config_color_nicklist_bg));
gui_color[GUI_COLOR_NICKLIST_PREFIX2] = gui_color_build (GUI_COLOR_NICKLIST_PREFIX2, CONFIG_COLOR(config_color_nicklist_prefix2), CONFIG_COLOR(config_color_nicklist_bg));
+4 -1
View File
@@ -185,7 +185,7 @@ gui_infobar_highlight_timer_cb (void *data)
if (gui_ok)
{
if (gui_infobar && gui_infobar->remaining_time > 0)
if (gui_infobar && (gui_infobar->remaining_time > 0))
{
gui_infobar->remaining_time--;
if (gui_infobar->remaining_time == 0)
@@ -196,7 +196,10 @@ gui_infobar_highlight_timer_cb (void *data)
}
/* remove this timer if there's no more data for infobar */
if (!gui_infobar)
{
unhook (gui_infobar_highlight_timer);
gui_infobar_highlight_timer = NULL;
}
}
return WEECHAT_RC_OK;
+85 -77
View File
@@ -30,6 +30,7 @@
#include "../../core/wee-config.h"
#include "../../core/wee-utf8.h"
#include "../../core/wee-string.h"
#include "../../plugins/plugin.h"
#include "../gui-keyboard.h"
#include "../gui-buffer.h"
#include "../gui-color.h"
@@ -155,83 +156,6 @@ gui_keyboard_default_bindings ()
}
}
/*
* gui_keyboard_read: read keyboard chars
*/
void
gui_keyboard_read ()
{
int key, accept_paste, cancel_paste, text_added_to_buffer, paste_lines;
accept_paste = 0;
cancel_paste = 0;
text_added_to_buffer = 0;
while (1)
{
key = getch ();
if (key == ERR)
break;
#ifdef KEY_RESIZE
if (key == KEY_RESIZE)
continue;
#endif
if (gui_keyboard_paste_pending)
{
/* ctrl-Y: accept paste */
if (key == 25)
{
accept_paste = 1;
break;
}
/* ctrl-N: cancel paste */
else if (key == 14)
{
cancel_paste = 1;
break;
}
}
gui_keyboard_buffer_add (key);
text_added_to_buffer = 1;
}
if (gui_keyboard_paste_pending)
{
/* user is ok for pasting text, let's paste! */
if (accept_paste)
{
gui_keyboard_paste_accept ();
gui_input_draw (gui_current_window->buffer, 1);
}
/* user doesn't want to paste text: clear whole buffer! */
else if (cancel_paste)
{
gui_keyboard_paste_cancel ();
gui_input_draw (gui_current_window->buffer, 1);
}
else if (text_added_to_buffer)
gui_input_draw (gui_current_window->buffer, 1);
}
else
{
/* detect user paste or large amount of text
if so, ask user what to do */
if (CONFIG_INTEGER(config_look_paste_max_lines) > 0)
{
paste_lines = gui_keyboard_get_paste_lines ();
if (paste_lines > CONFIG_INTEGER(config_look_paste_max_lines))
{
gui_keyboard_paste_pending = 1;
gui_input_draw (gui_current_window->buffer, 1);
}
}
}
}
/*
* gui_keyboard_flush: flush keyboard buffer
*/
@@ -410,3 +334,87 @@ gui_keyboard_flush ()
gui_keyboard_buffer_reset ();
}
}
/*
* gui_keyboard_read_cb: read keyboard chars
*/
int
gui_keyboard_read_cb (void *data)
{
int key, accept_paste, cancel_paste, text_added_to_buffer, paste_lines;
/* make C compiler happy */
(void) data;
accept_paste = 0;
cancel_paste = 0;
text_added_to_buffer = 0;
while (1)
{
key = getch ();
if (key == ERR)
break;
#ifdef KEY_RESIZE
if (key == KEY_RESIZE)
continue;
#endif
if (gui_keyboard_paste_pending)
{
/* ctrl-Y: accept paste */
if (key == 25)
{
accept_paste = 1;
break;
}
/* ctrl-N: cancel paste */
else if (key == 14)
{
cancel_paste = 1;
break;
}
}
gui_keyboard_buffer_add (key);
text_added_to_buffer = 1;
}
if (gui_keyboard_paste_pending)
{
/* user is ok for pasting text, let's paste! */
if (accept_paste)
{
gui_keyboard_paste_accept ();
gui_input_draw (gui_current_window->buffer, 1);
}
/* user doesn't want to paste text: clear whole buffer! */
else if (cancel_paste)
{
gui_keyboard_paste_cancel ();
gui_input_draw (gui_current_window->buffer, 1);
}
else if (text_added_to_buffer)
gui_input_draw (gui_current_window->buffer, 1);
}
else
{
/* detect user paste or large amount of text
if so, ask user what to do */
if (CONFIG_INTEGER(config_look_paste_max_lines) > 0)
{
paste_lines = gui_keyboard_get_paste_lines ();
if (paste_lines > CONFIG_INTEGER(config_look_paste_max_lines))
{
gui_keyboard_paste_pending = 1;
gui_input_draw (gui_current_window->buffer, 1);
}
}
}
gui_keyboard_flush ();
return WEECHAT_RC_OK;
}
+31 -16
View File
@@ -43,6 +43,7 @@
#include "../gui-infobar.h"
#include "../gui-input.h"
#include "../gui-history.h"
#include "../gui-nicklist.h"
#include "../gui-window.h"
#include "gui-curses.h"
@@ -113,8 +114,6 @@ gui_main_init ()
if (CONFIG_BOOLEAN(config_look_set_title))
gui_window_title_set ();
signal (SIGWINCH, gui_window_refresh_screen_sigwinch);
}
}
@@ -135,24 +134,33 @@ gui_main_quit ()
void
gui_main_loop ()
{
struct t_hook *hook_fd_keyboard;
struct t_gui_buffer *ptr_buffer;
struct timeval tv_timeout;
fd_set read_fds, write_fds, except_fds;
int max_fd;
int ready;
quit_weechat = 0;
/* if SIGTERM or SIGHUP received => quit */
signal (SIGTERM, gui_main_quit);
signal (SIGHUP, gui_main_quit);
/* catch SIGTERM signal: quit program */
util_catch_signal (SIGTERM, &gui_main_quit);
/* cach SIGHUP signal: reload configuration */
util_catch_signal (SIGHUP, &gui_main_quit);
/* catch SIGWINCH signal: redraw screen */
util_catch_signal (SIGWINCH, &gui_window_refresh_screen_sigwinch);
/* hook stdin (read keyboard) */
hook_fd_keyboard = hook_fd (NULL, STDIN_FILENO, 1, 0, 0,
&gui_keyboard_read_cb, NULL);
while (!quit_weechat)
{
/* execute hook timers */
hook_timer_exec ();
/* infobar count down */
/* refresh needed ? */
if (gui_refresh_screen_needed)
gui_window_refresh_screen (0);
@@ -165,25 +173,32 @@ gui_main_loop ()
gui_chat_draw (ptr_buffer, 0);
ptr_buffer->chat_refresh_needed = 0;
}
if (ptr_buffer->nicklist_refresh_needed)
{
gui_nicklist_draw (ptr_buffer, 0);
ptr_buffer->nicklist_refresh_needed = 0;
}
}
/* wait for keyboard or network activity */
FD_ZERO (&read_fds);
FD_ZERO (&write_fds);
FD_ZERO (&except_fds);
hook_fd_set (&read_fds, &write_fds, &except_fds);
FD_SET (STDIN_FILENO, &read_fds);
max_fd = hook_fd_set (&read_fds, &write_fds, &except_fds);
if (hook_timer_time_to_next (&tv_timeout))
select (FD_SETSIZE, &read_fds, &write_fds, &except_fds, &tv_timeout);
ready = select (max_fd + 1, &read_fds, &write_fds, &except_fds,
&tv_timeout);
else
select (FD_SETSIZE, &read_fds, &write_fds, &except_fds, NULL);
if (FD_ISSET (STDIN_FILENO, &read_fds))
ready = select (max_fd + 1, &read_fds, &write_fds, &except_fds,
NULL);
if (ready > 0)
{
gui_keyboard_read ();
gui_keyboard_flush ();
hook_fd_exec (&read_fds, &write_fds, &except_fds);
}
hook_fd_exec (&read_fds, &write_fds, &except_fds);
}
/* remove keyboard hook */
unhook (hook_fd_keyboard);
}
/*
+57 -73
View File
@@ -46,9 +46,10 @@ void
gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
{
struct t_gui_window *ptr_win;
struct t_gui_nick_group *ptr_group;
struct t_gui_nick *ptr_nick;
int i, j, k, x, y, x2, max_y, column, max_length, max_chars;
int nicks_displayed;
int nicks_displayed, chars_left;
char format_empty[32], *buf, *ptr_buf, *ptr_next, saved_char;
if (!gui_ok || (!buffer->nicklist))
@@ -58,12 +59,12 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
{
if ((ptr_win->buffer == buffer) && (buffer->num_displayed > 0))
{
max_length = gui_nicklist_get_max_length (buffer);
if ((max_length != buffer->nick_max_length)
max_length = gui_nicklist_get_max_length (buffer, NULL);
if ((max_length != buffer->nicklist_max_length)
|| (buffer->nicklist && !GUI_CURSES(ptr_win)->win_nick)
|| (!buffer->nicklist && GUI_CURSES(ptr_win)->win_nick))
{
buffer->nick_max_length = max_length;
buffer->nicklist_max_length = max_length;
if (gui_window_calculate_pos_size (ptr_win, 0))
{
delwin (GUI_CURSES(ptr_win)->win_chat);
@@ -134,8 +135,6 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
}
}
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
GUI_COLOR_NICKLIST);
x = 0;
y = (CONFIG_BOOLEAN(config_look_nicklist_separator)
&& (CONFIG_INTEGER(config_look_nicklist_position) == CONFIG_LOOK_NICKLIST_BOTTOM)) ?
@@ -165,17 +164,26 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
else
nicks_displayed = ptr_win->win_nick_height;
ptr_nick = buffer->nicks;
for (i = 0; i < ptr_win->win_nick_start; i++)
ptr_group = NULL;
ptr_nick = NULL;
gui_nicklist_get_next_item (buffer, &ptr_group, &ptr_nick);
i = 0;
while ((ptr_group || ptr_nick) && (i < ptr_win->win_nick_start))
{
if (!ptr_nick)
break;
ptr_nick = ptr_nick->next_nick;
if ((ptr_nick && ptr_nick->visible)
|| (ptr_group && buffer->nicklist_display_groups
&& ptr_group->visible))
i++;
gui_nicklist_get_next_item (buffer, &ptr_group, &ptr_nick);
}
if (ptr_nick)
i = 0;
while ((ptr_group || ptr_nick) && (i < nicks_displayed))
{
for (i = 0; i < nicks_displayed; i++)
if ((ptr_nick && ptr_nick->visible)
|| (ptr_group && buffer->nicklist_display_groups
&& ptr_group->visible))
{
i++;
switch (CONFIG_INTEGER(config_look_nicklist_position))
{
case CONFIG_LOOK_NICKLIST_LEFT:
@@ -202,70 +210,47 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
else
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
ptr_nick->color_prefix);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "%c",
ptr_nick->prefix);
x++;
/*if (ptr_nick->flags & IRC_NICK_CHANOWNER)
GUI_COLOR_NICKLIST);
if (ptr_nick)
{
/* display spaces and prefix for nick */
if (buffer->nicklist_display_groups)
{
for (k = 0; k < ptr_nick->group->level; k++)
{
mvwprintw (GUI_CURSES(ptr_win)->win_nick,
y, x, " ");
x++;
}
}
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
GUI_COLOR_WIN_NICK_CHANOWNER);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "~");
x++;
}
else if (ptr_nick->flags & IRC_NICK_CHANADMIN)
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK_CHANADMIN);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "&");
x++;
}
else if (ptr_nick->flags & IRC_NICK_CHANADMIN2)
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK_CHANADMIN);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "!");
x++;
}
else if (ptr_nick->flags & IRC_NICK_OP)
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK_OP);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "@");
x++;
}
else if (ptr_nick->flags & IRC_NICK_HALFOP)
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK_HALFOP);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "%%");
x++;
}
else if (ptr_nick->flags & IRC_NICK_VOICE)
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK_VOICE);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "+");
x++;
}
else if (ptr_nick->flags & IRC_NICK_CHANUSER)
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK_CHANUSER);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, "-");
ptr_nick->prefix_color);
mvwprintw (GUI_CURSES(ptr_win)->win_nick,
y, x, "%c", ptr_nick->prefix);
x++;
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
ptr_nick->color);
ptr_buf = ptr_nick->name;
}
else
{
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick, GUI_COLOR_WIN_NICK);
mvwprintw (GUI_CURSES(ptr_win)->win_nick, y, x, " ");
x++;
/* display group name */
for (k = 0; k < ptr_group->level - 1; k++)
{
mvwprintw (GUI_CURSES(ptr_win)->win_nick,
y, x, " ");
x++;
}
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
ptr_group->color);
//wattron (GUI_CURSES(ptr_win)->win_nick, A_UNDERLINE);
ptr_buf = gui_nicklist_get_group_start (ptr_group->name);
}
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
((config_irc_away_check > 0) && (ptr_nick->flags & IRC_NICK_AWAY)) ?
GUI_COLOR_WIN_NICK_AWAY : GUI_COLOR_WIN_NICK);*/
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_nick,
ptr_nick->color_nick);
wmove (GUI_CURSES(ptr_win)->win_nick, y, x);
ptr_buf = ptr_nick->nick;
saved_char = '\0';
for (k = 0; k < max_chars; k++)
chars_left = max_chars - ((ptr_nick) ? 1 : 0);
for (k = 0; k < chars_left; k++)
{
if (ptr_buf && ptr_buf[0])
{
@@ -284,15 +269,13 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
if (ptr_next)
ptr_next[0] = saved_char;
ptr_buf = ptr_next;
//if (!ptr_buf || !ptr_buf[0])
// wattroff (GUI_CURSES(ptr_win)->win_nick,
// A_UNDERLINE);
}
else
wprintw (GUI_CURSES(ptr_win)->win_nick, " ");
}
ptr_nick = ptr_nick->next_nick;
if (!ptr_nick)
break;
}
y++;
if ((CONFIG_INTEGER(config_look_nicklist_position) == CONFIG_LOOK_NICKLIST_TOP) ||
@@ -307,6 +290,7 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase)
}
}
}
gui_nicklist_get_next_item (buffer, &ptr_group, &ptr_nick);
}
wnoutrefresh (GUI_CURSES(ptr_win)->win_nick);
refresh ();
+10 -10
View File
@@ -205,7 +205,7 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate)
/* init chat & nicklist settings */
if (window->buffer->nicklist)
{
max_length = gui_nicklist_get_max_length (window->buffer);
max_length = window->buffer->nicklist_max_length;
lines = 0;
@@ -226,10 +226,10 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate)
else
{
width_used = window->win_width - (window->win_width % (max_length + 2));
if (((max_length + 2) * window->buffer->nicks_count) % width_used == 0)
lines = ((max_length + 2) * window->buffer->nicks_count) / width_used;
if (((max_length + 2) * window->buffer->nicklist_visible_count) % width_used == 0)
lines = ((max_length + 2) * window->buffer->nicklist_visible_count) / width_used;
else
lines = (((max_length + 2) * window->buffer->nicks_count) / width_used) + 1;
lines = (((max_length + 2) * window->buffer->nicklist_visible_count) / width_used) + 1;
if ((CONFIG_INTEGER(config_look_nicklist_max_size) > 0)
&& (lines > CONFIG_INTEGER(config_look_nicklist_max_size)))
lines = CONFIG_INTEGER(config_look_nicklist_max_size);
@@ -808,7 +808,7 @@ gui_window_nick_end (struct t_gui_window *window)
if (window->buffer->nicklist)
{
new_start =
window->buffer->nicks_count - window->win_nick_num_max;
window->buffer->nicklist_visible_count - window->win_nick_num_max;
if (new_start < 0)
new_start = 0;
else if (new_start >= 1)
@@ -856,9 +856,9 @@ gui_window_nick_page_down (struct t_gui_window *window)
if (window->buffer->nicklist)
{
if ((window->buffer->nicks_count > window->win_nick_num_max)
if ((window->buffer->nicklist_visible_count > window->win_nick_num_max)
&& (window->win_nick_start + window->win_nick_num_max - 1
< window->buffer->nicks_count))
< window->buffer->nicklist_visible_count))
{
if (window->win_nick_start == 0)
window->win_nick_start += (window->win_nick_num_max - 1);
@@ -1335,9 +1335,9 @@ gui_window_refresh_screen (int force)
void
gui_window_refresh_screen_sigwinch ()
{
if (gui_refresh_screen_needed < 2)
gui_refresh_screen_needed++;
signal (SIGWINCH, gui_window_refresh_screen_sigwinch);
gui_refresh_screen_needed = 1;
//gui_window_refresh_screen (0);
signal (SIGWINCH, &gui_window_refresh_screen_sigwinch);
}
/*
+1 -2
View File
@@ -60,8 +60,7 @@ extern void gui_chat_calculate_line_diff (struct t_gui_window *window,
/* keyboard functions */
extern void gui_keyboard_default_bindings ();
extern void gui_keyboard_read ();
extern void gui_keyboard_flush ();
extern int gui_keyboard_read_cb (void *data);
/* window functions */
extern void gui_window_wprintw (WINDOW *window, char *data, ...);
+3 -3
View File
@@ -451,7 +451,7 @@ gui_window_nick_end (struct t_gui_window *window)
if (window->buffer->nicklist)
{
new_start =
window->buffer->nicks_count - window->win_nick_height;
window->buffer->nicklist_visible_count - window->win_nick_height;
if (new_start < 0)
new_start = 0;
else if (new_start >= 1)
@@ -499,9 +499,9 @@ gui_window_nick_page_down (struct t_gui_window *window)
if (window->buffer->nicklist)
{
if ((window->buffer->nicks_count > window->win_nick_height)
if ((window->buffer->nicklist_visible_count > window->win_nick_height)
&& (window->win_nick_start + window->win_nick_height - 1
< window->buffer->nicks_count))
< window->buffer->nicklist_visible_count))
{
if (window->win_nick_start == 0)
window->win_nick_start += (window->win_nick_height - 1);
+44 -29
View File
@@ -113,11 +113,13 @@ gui_buffer_new (struct t_weechat_plugin *plugin, char *category, char *name,
/* nicklist */
new_buffer->nicklist = 0;
new_buffer->nick_case_sensitive = 0;
new_buffer->nicks = NULL;
new_buffer->last_nick = NULL;
new_buffer->nick_max_length = -1;
new_buffer->nicks_count = 0;
new_buffer->nicklist_case_sensitive = 0;
new_buffer->nicklist_root = NULL;
new_buffer->nicklist_max_length = -1;
new_buffer->nicklist_display_groups = 1;
new_buffer->nicklist_visible_count = 0;
new_buffer->nicklist_refresh_needed = 0;
gui_nicklist_add_group (new_buffer, NULL, "root", NULL, 0);
/* input */
new_buffer->input = 1;
@@ -282,14 +284,27 @@ gui_buffer_set_nicklist (struct t_gui_buffer *buffer, int nicklist)
}
/*
* gui_buffer_set_nick_case_sensitive: set nick_case_sensitive flag for a buffer
* gui_buffer_set_nicklist_case_sensitive: set case_sensitive flag for a buffer
*/
void
gui_buffer_set_nick_case_sensitive (struct t_gui_buffer *buffer,
int nick_case_sensitive)
gui_buffer_set_nicklist_case_sensitive (struct t_gui_buffer *buffer,
int case_sensitive)
{
buffer->nick_case_sensitive = (nick_case_sensitive) ? 1 : 0;
buffer->nicklist_case_sensitive = (case_sensitive) ? 1 : 0;
}
/*
* gui_buffer_set_nicklist_display_groups: set display_groups flag for a buffer
*/
void
gui_buffer_set_nicklist_display_groups (struct t_gui_buffer *buffer,
int display_groups)
{
buffer->nicklist_display_groups = (display_groups) ? 1 : 0;
buffer->nicklist_visible_count = 0;
gui_nicklist_compute_visible_count (buffer, buffer->nicklist_root);
}
/*
@@ -344,12 +359,19 @@ gui_buffer_set (struct t_gui_buffer *buffer, char *property, char *value)
gui_window_refresh_windows ();
}
}
else if (string_strcasecmp (property, "nick_case_sensitive") == 0)
else if (string_strcasecmp (property, "nicklist_case_sensitive") == 0)
{
error = NULL;
number = strtol (value, &error, 10);
if (error && (error[0] == '\0'))
gui_buffer_set_nick_case_sensitive (buffer, number);
gui_buffer_set_nicklist_case_sensitive (buffer, number);
}
else if (string_strcasecmp (property, "nicklist_display_groups") == 0)
{
error = NULL;
number = strtol (value, &error, 10);
if (error && (error[0] == '\0'))
gui_buffer_set_nicklist_display_groups (buffer, number);
}
else if (string_strcasecmp (property, "nick") == 0)
{
@@ -641,6 +663,7 @@ gui_buffer_close (struct t_gui_buffer *buffer, int switch_to_another)
gui_history_buffer_free (buffer);
if (buffer->text_search_input)
free (buffer->text_search_input);
gui_nicklist_remove_all (buffer);
/* remove buffer from buffers list */
if (buffer->prev_buffer)
@@ -962,7 +985,6 @@ void
gui_buffer_print_log ()
{
struct t_gui_buffer *ptr_buffer;
struct t_gui_nick *ptr_nick;
struct t_gui_line *ptr_line;
int num;
@@ -986,10 +1008,12 @@ gui_buffer_print_log ()
log_printf (" prefix_max_length. . . : %d", ptr_buffer->prefix_max_length);
log_printf (" chat_refresh_needed. . : %d", ptr_buffer->chat_refresh_needed);
log_printf (" nicklist . . . . . . . : %d", ptr_buffer->nicklist);
log_printf (" nick_case_sensitive. . : %d", ptr_buffer->nick_case_sensitive);
log_printf (" nicks. . . . . . . . . : 0x%X", ptr_buffer->nicks);
log_printf (" last_nick. . . . . . . : 0x%X", ptr_buffer->last_nick);
log_printf (" nicks_count. . . . . . : %d", ptr_buffer->nicks_count);
log_printf (" nicklist_case_sensitive: %d", ptr_buffer->nicklist_case_sensitive);
log_printf (" nicklist_root. . . . . : 0x%X", ptr_buffer->nicklist_root);
log_printf (" nicklist_max_length. . : %d", ptr_buffer->nicklist_max_length);
log_printf (" nicklist_display_groups: %d", ptr_buffer->nicklist_display_groups);
log_printf (" nicklist_visible_count.: %d", ptr_buffer->nicklist_visible_count);
log_printf (" nicklist_refresh_needed: %d", ptr_buffer->nicklist_refresh_needed);
log_printf (" input. . . . . . . . . : %d", ptr_buffer->input);
log_printf (" input_data_cb. . . . . : 0x%X", ptr_buffer->input_data_cb);
log_printf (" input_nick . . . . . . : '%s'", ptr_buffer->input_nick);
@@ -1011,19 +1035,10 @@ gui_buffer_print_log ()
log_printf (" text_search_input. . . : '%s'", ptr_buffer->text_search_input);
log_printf (" prev_buffer. . . . . . : 0x%X", ptr_buffer->prev_buffer);
log_printf (" next_buffer. . . . . . : 0x%X", ptr_buffer->next_buffer);
for (ptr_nick = ptr_buffer->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
log_printf ("");
log_printf (" => nick %s (addr:0x%X):", ptr_nick->nick, ptr_nick);
log_printf (" sort_index. . . . . . : %d", ptr_nick->sort_index);
log_printf (" color_nick. . . . . . : %d", ptr_nick->color_nick);
log_printf (" prefix. . . . . . . . : '%c'", ptr_nick->prefix);
log_printf (" color_prefix. . . . . : %d", ptr_nick->color_prefix);
log_printf (" prev_nick . . . . . . : 0x%X", ptr_nick->prev_nick);
log_printf (" next_nick . . . . . . : 0x%X", ptr_nick->next_nick);
}
log_printf ("");
log_printf (" => nicklist_root (addr:0x%X):", ptr_buffer->nicklist_root);
gui_nicklist_print_log (ptr_buffer->nicklist_root, 0);
log_printf ("");
log_printf (" => last 100 lines:");
+9 -8
View File
@@ -73,15 +73,16 @@ struct t_gui_buffer
struct t_gui_line *last_read_line; /* last read line before jump */
int lines_count; /* number of lines in the buffer */
int prefix_max_length; /* length for prefix align */
int chat_refresh_needed; /* if refresh is needed (printf) */
int chat_refresh_needed; /* refresh for chat is needed ? */
/* nicklist */
int nicklist; /* = 1 if nicklist is enabled */
int nick_case_sensitive; /* nicks are case sensitive ? */
struct t_gui_nick *nicks; /* pointer to nicks for nicklist */
struct t_gui_nick *last_nick; /* last nick in nicklist */
int nick_max_length; /* max length for a nick */
int nicks_count; /* number of nicks on buffer */
int nicklist_case_sensitive; /* nicks are case sensitive ? */
struct t_gui_nick_group *nicklist_root; /* pointer to groups root */
int nicklist_max_length; /* max length for a nick */
int nicklist_display_groups; /* display groups ? */
int nicklist_visible_count; /* number of nicks/groups to display */
int nicklist_refresh_needed; /* refresh for nicklist is needed ? */
/* inupt */
int input; /* = 1 if input is enabled */
@@ -139,8 +140,8 @@ extern void gui_buffer_set_category (struct t_gui_buffer *buffer,
extern void gui_buffer_set_name (struct t_gui_buffer *buffer, char *name);
extern void gui_buffer_set_title (struct t_gui_buffer *buffer, char *new_title);
extern void gui_buffer_set_nicklist (struct t_gui_buffer *buffer, int nicklist);
extern void gui_buffer_set_nick_case_sensitive (struct t_gui_buffer * buffer,
int nick_case_sensitive);
extern void gui_buffer_set_nicklist_case_sensitive (struct t_gui_buffer * buffer,
int case_sensitive);
extern void gui_buffer_set_nick (struct t_gui_buffer *buffer, char *new_nick);
extern void gui_buffer_set (struct t_gui_buffer *buffer, char *property,
char *value);
+1
View File
@@ -83,6 +83,7 @@ enum t_gui_color_enum
GUI_COLOR_INPUT_ACTIONS,
GUI_COLOR_NICKLIST,
GUI_COLOR_NICKLIST_GROUP,
GUI_COLOR_NICKLIST_AWAY,
GUI_COLOR_NICKLIST_PREFIX1,
GUI_COLOR_NICKLIST_PREFIX2,
+552 -153
View File
@@ -33,6 +33,7 @@
#include <ctype.h>
#include "../core/weechat.h"
#include "../core/wee-log.h"
#include "../core/wee-string.h"
#include "../core/wee-utf8.h"
#include "gui-nicklist.h"
@@ -41,58 +42,198 @@
/*
* gui_nicklist_compare: compare two nicks
* return: -1 is nick1 < nick2
* 0 if nick1 = nick2
* +1 if nick1 > nick2
* gui_nicklist_find_pos_group: find position for a group (for sorting nicklist)
*/
int
gui_nicklist_compare (struct t_gui_buffer *buffer,
struct t_gui_nick *nick1, struct t_gui_nick *nick2)
struct t_gui_nick_group *
gui_nicklist_find_pos_group (struct t_gui_nick_group *groups,
struct t_gui_nick_group *group)
{
if (nick1->sort_index > nick2->sort_index)
return 1;
struct t_gui_nick_group *ptr_group;
if (nick1->sort_index < nick2->sort_index)
return -1;
/* sort index are the same, then use alphabetical sorting */
if (buffer->nick_case_sensitive)
return strcmp (nick1->nick, nick2->nick);
else
return string_strcasecmp (nick1->nick, nick2->nick);
}
/*
* gui_nicklist_find_pos: find position for a nick (for sorting nicklist)
*/
struct t_gui_nick *
gui_nicklist_find_pos (struct t_gui_buffer *buffer, struct t_gui_nick *nick)
{
struct t_gui_nick *ptr_nick;
for (ptr_nick = buffer->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
for (ptr_group = groups; ptr_group; ptr_group = ptr_group->next_group)
{
if (gui_nicklist_compare (buffer, nick, ptr_nick) < 0)
return ptr_nick;
if (strcmp (group->name, ptr_group->name) < 0)
return ptr_group;
}
/* group will be inserted at end of list */
return NULL;
}
/*
* gui_nicklist_insert_sorted: insert nick into sorted list
* gui_nicklist_insert_group_sorted: insert group into sorted list
*/
void
gui_nicklist_insert_sorted (struct t_gui_buffer *buffer, struct t_gui_nick *nick)
gui_nicklist_insert_group_sorted (struct t_gui_nick_group **groups,
struct t_gui_nick_group **last_group,
struct t_gui_nick_group *group)
{
struct t_gui_nick_group *pos_group;
if (*groups)
{
pos_group = gui_nicklist_find_pos_group (*groups, group);
if (pos_group)
{
/* insert group into the list (before group found) */
group->prev_group = pos_group->prev_group;
group->next_group = pos_group;
if (pos_group->prev_group)
pos_group->prev_group->next_group = group;
else
*groups = group;
pos_group->prev_group = group;
}
else
{
/* add group to the end */
group->prev_group = *last_group;
group->next_group = NULL;
(*last_group)->next_group = group;
*last_group = group;
}
}
else
{
group->prev_group = NULL;
group->next_group = NULL;
*groups = group;
*last_group = group;
}
}
/*
* gui_nicklist_search_group: search a group in buffer nicklist
*/
struct t_gui_nick_group *
gui_nicklist_search_group (struct t_gui_buffer *buffer,
struct t_gui_nick_group *from_group,
char *name)
{
struct t_gui_nick_group *ptr_group;
if (!from_group)
from_group = buffer->nicklist_root;
if (!from_group)
return NULL;
if (from_group->childs)
{
ptr_group = gui_nicklist_search_group (buffer, from_group->childs, name);
if (ptr_group)
return ptr_group;
}
ptr_group = from_group;
while (ptr_group)
{
if (strcmp (ptr_group->name, name) == 0)
return ptr_group;
ptr_group = ptr_group->next_group;
}
/* group not found */
return NULL;
}
/*
* gui_nicklist_add_group: add a group to nicklist for a buffer
*/
struct t_gui_nick_group *
gui_nicklist_add_group (struct t_gui_buffer *buffer,
struct t_gui_nick_group *parent_group, char *name,
char *color, int visible)
{
struct t_gui_nick_group *new_group;
int num_color;
if (!name || gui_nicklist_search_group (buffer, parent_group, name))
return NULL;
new_group = (struct t_gui_nick_group *)malloc (sizeof (struct t_gui_nick_group));
if (!new_group)
return NULL;
if (color)
{
num_color = gui_color_search_config (color);
if (num_color < 0)
num_color = GUI_COLOR_NICKLIST;
}
else
num_color = GUI_COLOR_NICKLIST;
new_group->name = strdup (name);
new_group->color = num_color;
new_group->visible = visible;
new_group->parent = (parent_group) ? parent_group : buffer->nicklist_root;
new_group->level = (new_group->parent) ? new_group->parent->level + 1 : 0;
new_group->childs = NULL;
new_group->last_child = NULL;
new_group->nicks = NULL;
new_group->last_nick = NULL;
new_group->prev_group = NULL;
new_group->next_group = NULL;
if (new_group->parent)
{
gui_nicklist_insert_group_sorted (&(new_group->parent->childs),
&(new_group->parent->last_child),
new_group);
}
else
{
buffer->nicklist_root = new_group;
}
if (buffer->nicklist_display_groups && visible)
{
buffer->nicklist_refresh_needed = 1;
buffer->nicklist_visible_count++;
}
return new_group;
}
/*
* gui_nicklist_find_pos_nick: find position for a nick (for sorting nicklist)
*/
struct t_gui_nick *
gui_nicklist_find_pos_nick (struct t_gui_nick_group *group,
struct t_gui_nick *nick)
{
struct t_gui_nick *ptr_nick;
for (ptr_nick = group->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
{
if (strcmp (nick->name, ptr_nick->name) < 0)
return ptr_nick;
}
/* nick will be inserted at end of list */
return NULL;
}
/*
* gui_nicklist_insert_nick_sorted: insert nick into sorted list
*/
void
gui_nicklist_insert_nick_sorted (struct t_gui_nick_group *group,
struct t_gui_nick *nick)
{
struct t_gui_nick *pos_nick;
if (buffer->nicks)
if (group->nicks)
{
pos_nick = gui_nicklist_find_pos (buffer, nick);
pos_nick = gui_nicklist_find_pos_nick (group, nick);
if (pos_nick)
{
@@ -102,64 +243,42 @@ gui_nicklist_insert_sorted (struct t_gui_buffer *buffer, struct t_gui_nick *nick
if (pos_nick->prev_nick)
pos_nick->prev_nick->next_nick = nick;
else
buffer->nicks = nick;
group->nicks = nick;
pos_nick->prev_nick = nick;
}
else
{
/* add nick to the end */
nick->prev_nick = buffer->last_nick;
nick->prev_nick = group->last_nick;
nick->next_nick = NULL;
buffer->last_nick->next_nick = nick;
buffer->last_nick = nick;
group->last_nick->next_nick = nick;
group->last_nick = nick;
}
}
else
{
nick->prev_nick = NULL;
nick->next_nick = NULL;
buffer->nicks = nick;
buffer->last_nick = nick;
group->nicks = nick;
group->last_nick = nick;
}
}
/*
* gui_nicklist_resort: resort a nick in nicklist
*/
void
gui_nicklist_resort (struct t_gui_buffer *buffer, struct t_gui_nick *nick)
{
/* temporarly remove nick from list */
if (nick == buffer->nicks)
buffer->nicks = nick->next_nick;
else
nick->prev_nick->next_nick = nick->next_nick;
if (nick->next_nick)
nick->next_nick->prev_nick = nick->prev_nick;
if (nick == buffer->last_nick)
buffer->last_nick = nick->prev_nick;
/* insert again nick into sorted list */
gui_nicklist_insert_sorted (buffer, nick);
}
/*
* gui_nicklist_search: search a nick in buffer nicklist
* gui_nicklist_search_nick: search a nick in buffer nicklist
*/
struct t_gui_nick *
gui_nicklist_search (struct t_gui_buffer *buffer, char *nick)
gui_nicklist_search_nick (struct t_gui_buffer *buffer,
struct t_gui_nick_group *from_group,
char *name)
{
struct t_gui_nick *ptr_nick;
for (ptr_nick = buffer->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
for (ptr_nick = (from_group) ? from_group->nicks : buffer->nicklist_root->nicks;
ptr_nick; ptr_nick = ptr_nick->next_nick)
{
if ((buffer->nick_case_sensitive
&& (strcmp (ptr_nick->nick, nick) == 0))
|| (!buffer->nick_case_sensitive
&& (string_strcasecmp (ptr_nick->nick, nick) == 0)))
if (strcmp (ptr_nick->name, name) == 0)
return ptr_nick;
}
@@ -168,132 +287,257 @@ gui_nicklist_search (struct t_gui_buffer *buffer, char *nick)
}
/*
* gui_nicklist_add: add a nick to nicklist for a buffer
* gui_nicklist_add_nick: add a nick to nicklist for a buffer
*/
struct t_gui_nick *
gui_nicklist_add (struct t_gui_buffer *buffer, char *nick, int sort_index,
char *color_nick, char prefix, char *color_prefix)
gui_nicklist_add_nick (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group, char *name,
char *color, char prefix, char *prefix_color,
int visible)
{
struct t_gui_nick *new_nick;
int num_color_nick, num_color_prefix;
int num_color, num_color_prefix;
if (!nick || gui_nicklist_search (buffer, nick))
if (!name || gui_nicklist_search_nick (buffer, NULL, name))
return NULL;
new_nick = (struct t_gui_nick *)malloc (sizeof (struct t_gui_nick));
if (!new_nick)
return NULL;
num_color_nick = gui_color_search_config (color_nick);
if (num_color_nick < 0)
num_color_nick = GUI_COLOR_NICKLIST;
num_color_prefix = gui_color_search_config (color_prefix);
if (num_color_prefix < 0)
if (color)
{
num_color = gui_color_search_config (color);
if (num_color < 0)
num_color = GUI_COLOR_NICKLIST;
}
else
num_color = GUI_COLOR_NICKLIST;
if (prefix_color)
{
num_color_prefix = gui_color_search_config (prefix_color);
if (num_color_prefix < 0)
num_color_prefix = GUI_COLOR_NICKLIST;
}
else
num_color_prefix = GUI_COLOR_NICKLIST;
new_nick->nick = strdup (nick);
new_nick->sort_index = sort_index;
new_nick->color_nick = num_color_nick;
new_nick->group = (group) ? group : buffer->nicklist_root;
new_nick->name = strdup (name);
new_nick->color = num_color;
new_nick->prefix = prefix;
new_nick->color_prefix = num_color_prefix;
new_nick->prefix_color = num_color_prefix;
new_nick->visible = visible;
gui_nicklist_insert_sorted (buffer, new_nick);
gui_nicklist_insert_nick_sorted (new_nick->group, new_nick);
buffer->nicks_count++;
if (visible)
{
buffer->nicklist_refresh_needed = 1;
buffer->nicklist_visible_count++;
}
return new_nick;
}
/*
* gui_nicklist_update: update a nick in nicklist
* gui_nicklist_remove_nick: remove a nick from a group
*/
void
gui_nicklist_update (struct t_gui_buffer *buffer, struct t_gui_nick *nick,
char *new_nick, int sort_index,
char *color_nick, char prefix, char *color_prefix)
gui_nicklist_remove_nick (struct t_gui_buffer *buffer,
struct t_gui_nick *nick)
{
int num_color_nick, num_color_prefix;
if (!nick)
return;
num_color_nick = gui_color_search_config (color_nick);
if (num_color_nick < 0)
num_color_nick = GUI_COLOR_NICKLIST;
num_color_prefix = gui_color_search_config (color_prefix);
if (num_color_prefix < 0)
num_color_prefix = GUI_COLOR_NICKLIST;
if (new_nick)
{
free (nick->nick);
nick->nick = strdup (new_nick);
}
nick->sort_index = sort_index;
nick->color_nick = num_color_nick;
nick->prefix = prefix;
nick->color_prefix = num_color_prefix;
gui_nicklist_resort (buffer, nick);
}
/*
* gui_nicklist_free: remove a nick to nicklist for a buffer
*/
void
gui_nicklist_free (struct t_gui_buffer *buffer, struct t_gui_nick *nick)
{
if (nick->nick)
free (nick->nick);
/* remove nick from nicks list */
/* remove nick from list */
if (nick->prev_nick)
nick->prev_nick->next_nick = nick->next_nick;
if (nick->next_nick)
nick->next_nick->prev_nick = nick->prev_nick;
if (buffer->nicks == nick)
buffer->nicks = nick->next_nick;
if (buffer->last_nick == nick)
buffer->last_nick = nick->prev_nick;
if (nick->group->nicks == nick)
nick->group->nicks = nick->next_nick;
if (nick->group->last_nick == nick)
nick->group->last_nick = nick->prev_nick;
if (buffer->nicks_count > 0)
buffer->nicks_count--;
/* free data */
if (nick->name)
free (nick->name);
if (nick->visible)
{
buffer->nicklist_refresh_needed = 1;
if (buffer->nicklist_visible_count > 0)
buffer->nicklist_visible_count--;
}
free (nick);
}
/*
* gui_nicklist_free_all: remove all nicks in nicklist
* gui_nicklist_remove_group: remove a group from nicklist
*/
void
gui_nicklist_free_all (struct t_gui_buffer *buffer)
gui_nicklist_remove_group (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group)
{
while (buffer->nicks)
if (!group)
return;
/* remove childs first */
while (group->childs)
{
gui_nicklist_free (buffer, buffer->nicks);
gui_nicklist_remove_group (buffer, group->childs);
}
/* remove nicks from group */
while (group->nicks)
{
gui_nicklist_remove_nick (buffer, group->nicks);
}
if (group->parent)
{
/* remove group from list */
if (group->prev_group)
group->prev_group->next_group = group->next_group;
if (group->next_group)
group->next_group->prev_group = group->prev_group;
if (group->parent->childs == group)
group->parent->childs = group->next_group;
if (group->parent->last_child == group)
group->parent->last_child = group->prev_group;
}
else
{
buffer->nicklist_root = NULL;
}
/* free data */
if (group->name)
free (group->name);
if (group->visible)
{
buffer->nicklist_refresh_needed = 1;
if (buffer->nicklist_display_groups
&& (buffer->nicklist_visible_count > 0))
buffer->nicklist_visible_count--;
}
free (group);
}
/*
* gui_nicklist_remove_all: remove all nicks in nicklist
*/
void
gui_nicklist_remove_all (struct t_gui_buffer *buffer)
{
while (buffer->nicklist_root)
{
gui_nicklist_remove_group (buffer, buffer->nicklist_root);
}
}
/*
* gui_nicklist_remove: remove a nickname to nicklist for a buffer
* return 1 if a nick was removed, 0 otherwise
* gui_nicklist_get_next_item: get next item (group or nick) of a group/nick
*/
int
gui_nicklist_remove (struct t_gui_buffer *buffer, char *nick)
void
gui_nicklist_get_next_item (struct t_gui_buffer *buffer,
struct t_gui_nick_group **group,
struct t_gui_nick **nick)
{
struct t_gui_nick *ptr_nick;
struct t_gui_nick_group *ptr_group;
ptr_nick = gui_nicklist_search (buffer, nick);
if (!ptr_nick)
return 0;
/* root group */
if (!*group && !*nick)
{
*group = buffer->nicklist_root;
return;
}
gui_nicklist_free (buffer, ptr_nick);
return 1;
/* next nick */
if (*nick && (*nick)->next_nick)
{
*nick = (*nick)->next_nick;
return;
}
if (*group && !*nick)
{
/* first child */
if ((*group)->childs)
{
*group = (*group)->childs;
return;
}
/* first nick of current group */
if ((*group)->nicks)
{
*nick = (*group)->nicks;
return;
}
if ((*group)->next_group)
{
*group = (*group)->next_group;
return;
}
}
*nick = NULL;
ptr_group = (*group) ? *group : buffer->nicklist_root;
/* next group */
if (ptr_group->next_group)
{
*group = ptr_group->next_group;
return;
}
/* find next group by parents */
while ((ptr_group = ptr_group->parent))
{
if (ptr_group->next_group)
{
*group = ptr_group->next_group;
return;
}
}
/* nothing found */
*group = NULL;
}
/*
* gui_nicklist_get_group_start: return first char of a group that will be
* displayed on screen: if name begins with
* some digits followed by '|', then start is
* after '|', otherwise it's beginning of name
*/
char *
gui_nicklist_get_group_start (char *name)
{
char *ptr_name;
ptr_name = name;
while (isdigit (ptr_name[0]))
{
if (ptr_name[0] == '|')
break;
ptr_name++;
}
if ((ptr_name[0] == '|') && (ptr_name != name))
return ptr_name + 1;
else
return name;
}
/*
@@ -301,17 +545,172 @@ gui_nicklist_remove (struct t_gui_buffer *buffer, char *nick)
*/
int
gui_nicklist_get_max_length (struct t_gui_buffer *buffer)
gui_nicklist_get_max_length (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group)
{
int length, max_length;
struct t_gui_nick_group *ptr_group;
struct t_gui_nick *ptr_nick;
max_length = 0;
for (ptr_nick = buffer->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
for (ptr_group = (group) ? group : buffer->nicklist_root;
ptr_group; ptr_group = ptr_group->next_group)
{
length = utf8_strlen_screen (ptr_nick->nick);
if (length > max_length)
max_length = length;
if (buffer->nicklist_display_groups && ptr_group->visible)
{
length = utf8_strlen_screen (gui_nicklist_get_group_start (ptr_group->name)) +
ptr_group->level - 1;
if (length > max_length)
max_length = length;
}
for (ptr_nick = ptr_group->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
if (ptr_nick->visible)
{
if (buffer->nicklist_display_groups)
length = utf8_strlen_screen (ptr_nick->name) + ptr_group->level + 1;
else
length = utf8_strlen_screen (ptr_nick->name) + 1;
if (length > max_length)
max_length = length;
}
}
if (ptr_group->childs)
{
length = gui_nicklist_get_max_length (buffer, ptr_group->childs);
if (length > max_length)
max_length = length;
}
}
return max_length;
}
/*
* gui_nicklist_compute_visible_count: compute visible_count variable for a buffer
*/
void
gui_nicklist_compute_visible_count (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group)
{
if (!group)
return;
/* count for childs */
if (group->childs)
gui_nicklist_compute_visible_count (buffer, group->childs);
/* count current group */
if (buffer->nicklist_display_groups && group->visible)
buffer->nicklist_visible_count++;
}
/*
* gui_nicklist_print_log: print nicklist infos in log (usually for crash dump)
*/
void
gui_nicklist_print_log (struct t_gui_nick_group *group, int indent)
{
char format[128];
struct t_gui_nick_group *ptr_group;
struct t_gui_nick *ptr_nick;
snprintf (format, sizeof (format),
"%%-%ds=> group (addr:0x%%X)",
(indent * 2) + 4);
log_printf (format, " ", group);
snprintf (format, sizeof (format),
"%%-%dsname. . . . : '%%s'",
(indent * 2) + 6);
log_printf (format, " ", group->name);
snprintf (format, sizeof (format),
"%%-%dscolor . . . : %%d",
(indent * 2) + 6);
log_printf (format, " ", group->color);
snprintf (format, sizeof (format),
"%%-%dsvisible . . : %%d",
(indent * 2) + 6);
log_printf (format, " ", group->visible);
snprintf (format, sizeof (format),
"%%-%dsparent. . . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->parent);
snprintf (format, sizeof (format),
"%%-%dschilds. . . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->childs);
snprintf (format, sizeof (format),
"%%-%dslast_child. : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->last_child);
snprintf (format, sizeof (format),
"%%-%dsnicks . . . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->nicks);
snprintf (format, sizeof (format),
"%%-%dslast_nick . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->last_nick);
snprintf (format, sizeof (format),
"%%-%dsprev_group. : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->prev_group);
snprintf (format, sizeof (format),
"%%-%dsnext_group. : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", group->next_group);
/* display child groups first */
if (group->childs)
{
for (ptr_group = group->childs; ptr_group;
ptr_group = ptr_group->next_group)
{
gui_nicklist_print_log (ptr_group, indent + 1);
}
}
/* then display nicks in group */
for (ptr_nick = group->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
snprintf (format, sizeof (format),
"%%-%ds=> nick (addr:0x%%X)",
(indent * 2) + 4);
log_printf (format, " ", ptr_nick);
snprintf (format, sizeof (format),
"%%-%dsgroup . . . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->group);
snprintf (format, sizeof (format),
"%%-%dsname. . . . : '%%s'",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->name);
snprintf (format, sizeof (format),
"%%-%dscolor . . . : %%d",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->color);
snprintf (format, sizeof (format),
"%%-%dsprefix. . . : '%%c'",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->prefix);
snprintf (format, sizeof (format),
"%%-%dsprefix_color: %%d",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->prefix_color);
snprintf (format, sizeof (format),
"%%-%dsvisible . . : %%d",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->visible);
snprintf (format, sizeof (format),
"%%-%dsprev_nick . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->prev_nick);
snprintf (format, sizeof (format),
"%%-%dsnext_nick . : 0x%%X",
(indent * 2) + 6);
log_printf (format, " ", ptr_nick->next_nick);
}
}
+51 -22
View File
@@ -22,35 +22,64 @@
struct t_gui_buffer;
struct t_gui_nick_group
{
char *name; /* group name */
int color; /* color for group in nicklist */
int visible; /* 1 if group is displayed */
int level; /* group level (root is 0) */
struct t_gui_nick_group *parent; /* parent */
struct t_gui_nick_group *childs; /* childs */
struct t_gui_nick_group *last_child; /* last child */
struct t_gui_nick *nicks; /* nicks for group */
struct t_gui_nick *last_nick; /* last nick for group */
struct t_gui_nick_group *prev_group; /* link to previous group */
struct t_gui_nick_group *next_group; /* link to next group */
};
struct t_gui_nick
{
char *nick; /* nickname */
int sort_index; /* index to force sort */
int color_nick; /* color for nick in nicklist */
struct t_gui_nick_group *group; /* group which contains nick */
char *name; /* nick name */
int color; /* color for nick in nicklist */
char prefix; /* prefix for nick (for admins, ..) */
int color_prefix; /* color for prefix */
struct t_gui_nick *prev_nick; /* link to previous nick in nicklist */
struct t_gui_nick *next_nick; /* link to next nick in nicklist */
int prefix_color; /* color for prefix */
int visible; /* 1 if nick is displayed */
struct t_gui_nick *prev_nick; /* link to previous nick */
struct t_gui_nick *next_nick; /* link to next nick */
};
/* nicklist functions */
extern struct t_gui_nick *gui_nicklist_search (struct t_gui_buffer *buffer,
char *nick);
extern struct t_gui_nick *gui_nicklist_add (struct t_gui_buffer *buffer,
char *nick,
int sort_index, char *color_nick,
char prefix, char *color_prefix);
extern void gui_nicklist_update (struct t_gui_buffer *buffer,
struct t_gui_nick *nick,
char *new_nick, int sort_index,
char *color_nick, char prefix,
char *color_prefix);
extern void gui_nicklist_free (struct t_gui_buffer *buffer,
struct t_gui_nick *nick);
extern void gui_nicklist_free_all (struct t_gui_buffer *buffer);
extern int gui_nicklist_remove (struct t_gui_buffer *buffer, char *nick);
extern int gui_nicklist_get_max_length (struct t_gui_buffer *buffer);
extern struct t_gui_nick_group *gui_nicklist_search_group (struct t_gui_buffer *buffer,
struct t_gui_nick_group *from_group,
char *name);
extern struct t_gui_nick_group *gui_nicklist_add_group (struct t_gui_buffer *buffer,
struct t_gui_nick_group *parent_group,
char *name, char *color,
int visible);
extern struct t_gui_nick *gui_nicklist_search_nick (struct t_gui_buffer *buffer,
struct t_gui_nick_group *from_group,
char *name);
extern struct t_gui_nick *gui_nicklist_add_nick (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group,
char *name, char *color,
char prefix, char *prefix_color,
int visible);
extern void gui_nicklist_remove_group (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group);
extern void gui_nicklist_remove_nick (struct t_gui_buffer *buffer,
struct t_gui_nick *nick);
extern void gui_nicklist_remove_all (struct t_gui_buffer *buffer);
extern void gui_nicklist_get_next_item (struct t_gui_buffer *buffer,
struct t_gui_nick_group **group,
struct t_gui_nick **nick);
extern char *gui_nicklist_get_group_start (char *name);
extern int gui_nicklist_get_max_length (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group);
extern void gui_nicklist_compute_visible_count (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group);
extern void gui_nicklist_print_log (struct t_gui_nick_group *group, int indent);
/* nicklist functions (GUI dependent) */
-2
View File
@@ -115,8 +115,6 @@ fifo_create ()
fifo_filename);
}
}
if (weechat_home)
free (weechat_home);
return rc;
}
-3
View File
@@ -20,9 +20,6 @@
#ifndef __WEECHAT_IRC_BUFFER_H
#define __WEECHAT_IRC_BUFFER_H 1
#include "irc-server.h"
#include "irc-channel.h"
#define IRC_BUFFER_SERVER(buffer) (((t_irc_buffer_data *)(buffer->protocol_data))->server)
#define IRC_BUFFER_CHANNEL(buffer) (((t_irc_buffer_data *)(buffer->protocol_data))->channel)
#define IRC_BUFFER_ALL_SERVERS(buffer) (((t_irc_buffer_data *)(buffer->protocol_data))->all_servers)
+41 -19
View File
@@ -64,7 +64,20 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
return NULL;
}
if (channel_type == IRC_CHANNEL_TYPE_CHANNEL)
{
weechat_buffer_set (new_buffer, "nicklist", "1");
weechat_buffer_set (new_buffer, "nicklist_display_groups", "0");
weechat_nicklist_add_group (new_buffer, NULL, IRC_NICK_GROUP_OP,
"color_nicklist_group", 1);
weechat_nicklist_add_group (new_buffer, NULL, IRC_NICK_GROUP_HALFOP,
"color_nicklist_group", 1);
weechat_nicklist_add_group (new_buffer, NULL, IRC_NICK_GROUP_VOICE,
"color_nicklist_group", 1);
weechat_nicklist_add_group (new_buffer, NULL, IRC_NICK_GROUP_CHANUSER,
"color_nicklist_group", 1);
weechat_nicklist_add_group (new_buffer, NULL, IRC_NICK_GROUP_NORMAL,
"color_nicklist_group", 1);
}
/* initialize new channel */
new_channel->type = channel_type;
@@ -450,6 +463,9 @@ void
irc_channel_add_nick_speaking (struct t_irc_channel *channel, char *nick)
{
int size, to_remove, i;
if (!channel->nicks_speaking)
channel->nicks_speaking = weechat_list_new ();
weechat_list_add (channel->nicks_speaking, nick, "end");
@@ -474,25 +490,27 @@ irc_channel_print_log (struct t_irc_channel *channel)
{
struct t_weelist_item *ptr_item;
int i;
struct t_irc_nick *ptr_nick;
weechat_log_printf ("=> channel %s (addr:0x%X)]", channel->name, channel);
weechat_log_printf (" type . . . . . . . . : %d", channel->type);
weechat_log_printf (" dcc_chat . . . . . . : 0x%X", channel->dcc_chat);
weechat_log_printf (" topic. . . . . . . . : '%s'", channel->topic);
weechat_log_printf (" modes. . . . . . . . : '%s'", channel->modes);
weechat_log_printf (" limit. . . . . . . . : %d", channel->limit);
weechat_log_printf (" key. . . . . . . . . : '%s'", channel->key);
weechat_log_printf (" checking_away. . . . : %d", channel->checking_away);
weechat_log_printf (" away_message . . . . : '%s'", channel->away_message);
weechat_log_printf (" cycle. . . . . . . . : %d", channel->cycle);
weechat_log_printf (" close. . . . . . . . : %d", channel->close);
weechat_log_printf (" display_creation_date: %d", channel->display_creation_date);
weechat_log_printf (" nicks. . . . . . . . : 0x%X", channel->nicks);
weechat_log_printf (" last_nick. . . . . . : 0x%X", channel->last_nick);
weechat_log_printf (" buffer . . . . . . . : 0x%X", channel->buffer);
weechat_log_printf (" nicks_speaking . . . : 0x%X", channel->nicks_speaking);
weechat_log_printf (" prev_channel . . . . : 0x%X", channel->prev_channel);
weechat_log_printf (" next_channel . . . . : 0x%X", channel->next_channel);
weechat_log_printf ("");
weechat_log_printf (" => channel %s (addr:0x%X)]", channel->name, channel);
weechat_log_printf (" type . . . . . . . . : %d", channel->type);
weechat_log_printf (" dcc_chat . . . . . . : 0x%X", channel->dcc_chat);
weechat_log_printf (" topic. . . . . . . . : '%s'", channel->topic);
weechat_log_printf (" modes. . . . . . . . : '%s'", channel->modes);
weechat_log_printf (" limit. . . . . . . . : %d", channel->limit);
weechat_log_printf (" key. . . . . . . . . : '%s'", channel->key);
weechat_log_printf (" checking_away. . . . : %d", channel->checking_away);
weechat_log_printf (" away_message . . . . : '%s'", channel->away_message);
weechat_log_printf (" cycle. . . . . . . . : %d", channel->cycle);
weechat_log_printf (" close. . . . . . . . : %d", channel->close);
weechat_log_printf (" display_creation_date: %d", channel->display_creation_date);
weechat_log_printf (" nicks. . . . . . . . : 0x%X", channel->nicks);
weechat_log_printf (" last_nick. . . . . . : 0x%X", channel->last_nick);
weechat_log_printf (" buffer . . . . . . . : 0x%X", channel->buffer);
weechat_log_printf (" nicks_speaking . . . : 0x%X", channel->nicks_speaking);
weechat_log_printf (" prev_channel . . . . : 0x%X", channel->prev_channel);
weechat_log_printf (" next_channel . . . . : 0x%X", channel->next_channel);
if (channel->nicks_speaking)
{
weechat_log_printf ("");
@@ -500,9 +518,13 @@ irc_channel_print_log (struct t_irc_channel *channel)
for (ptr_item = weechat_list_get (channel->nicks_speaking, 0);
ptr_item; ptr_item = weechat_list_next (ptr_item))
{
weechat_log_printf (" nick speaking %d: '%s'",
weechat_log_printf (" nick speaking %d: '%s'",
i, weechat_list_string (ptr_item));
i++;
}
}
for (ptr_nick = channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
{
irc_nick_print_log (ptr_nick);
}
}
+2 -2
View File
@@ -20,8 +20,6 @@
#ifndef __WEECHAT_IRC_CHANNEL_H
#define __WEECHAT_IRC_CHANNEL_H 1
#include "irc-server.h"
#define IRC_CHANNEL_PREFIX "#&+!"
/* channel types */
@@ -32,6 +30,8 @@
#define IRC_CHANNEL_NICKS_SPEAKING_LIMIT 32
struct t_irc_server;
struct t_irc_channel
{
int type; /* channel type */
-6
View File
@@ -849,8 +849,6 @@ irc_command_cycle (void *data, struct t_gui_buffer *buffer, int argc,
(buf) ? buf : ptr_arg);
if (buf)
free (buf);
if (version)
free (version);
}
else
irc_server_sendf (ptr_server, "PART %s", channel_name);
@@ -1085,8 +1083,6 @@ irc_command_quit_server (struct t_irc_server *server, char *arguments)
(buf) ? buf : ptr_arg);
if (buf)
free (buf);
if (version)
free (version);
}
else
irc_server_sendf (server, "QUIT");
@@ -2182,8 +2178,6 @@ irc_command_part (void *data, struct t_gui_buffer *buffer, int argc,
(buf) ? buf : ptr_arg);
if (buf)
free (buf);
if (version)
free (version);
}
else
irc_server_sendf (ptr_server, "PART %s", channel_name);
+6 -6
View File
@@ -90,7 +90,7 @@ irc_completion_server_nicks_cb (void *data, char *completion,
for (ptr_nick = ptr_channel2->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
weechat_list_add (list, ptr_nick->nick, "sort");
weechat_list_add (list, ptr_nick->name, "sort");
}
}
}
@@ -102,7 +102,7 @@ irc_completion_server_nicks_cb (void *data, char *completion,
for (ptr_nick = ptr_channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
weechat_list_add (list, ptr_nick->nick, "beginning");
weechat_list_add (list, ptr_nick->name, "beginning");
}
}
@@ -184,7 +184,7 @@ irc_completion_channel_nicks_cb (void *data, char *completion,
for (ptr_nick = ptr_channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
weechat_list_add (list, ptr_nick->nick, "sort");
weechat_list_add (list, ptr_nick->name, "sort");
}
/* add nicks speaking recently on this channel */
@@ -241,16 +241,16 @@ irc_completion_channel_nicks_hosts_cb (void *data, char *completion,
for (ptr_nick = ptr_channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
weechat_list_add (list, ptr_nick->nick, "sort");
weechat_list_add (list, ptr_nick->name, "sort");
if (ptr_nick->host)
{
length = strlen (ptr_nick->nick) + 1 +
length = strlen (ptr_nick->name) + 1 +
strlen (ptr_nick->host) + 1;
buf = (char *)malloc (length);
if (buf)
{
snprintf (buf, length, "%s!%s",
ptr_nick->nick, ptr_nick->host);
ptr_nick->name, ptr_nick->host);
weechat_list_add (list, buf, "sort");
free (buf);
}
+17 -6
View File
@@ -124,7 +124,7 @@ irc_dcc_file_is_resumable (struct t_irc_dcc *ptr_dcc, char *filename)
{
struct stat st;
if (!irc_cfg_dcc_auto_resume)
if (!weechat_config_boolean (irc_config_dcc_auto_resume))
return 0;
if (access (filename, W_OK) == 0)
@@ -154,15 +154,24 @@ irc_dcc_file_is_resumable (struct t_irc_dcc *ptr_dcc, char *filename)
void
irc_dcc_find_filename (struct t_irc_dcc *ptr_dcc)
{
char *dir1, *dir2, *filename2;
char *weechat_home, *dir1, *dir2, *filename2, *dir_separator;
if (!IRC_DCC_IS_FILE(ptr_dcc->type))
return;
dir1 = weechat_strreplace (irc_cfg_dcc_download_path, "~", getenv ("HOME"));
dir1 = weechat_string_replace (weechat_config_string (irc_config_dcc_download_path),
"~",
getenv ("HOME"));
if (!dir1)
return;
dir2 = weechat_strreplace (dir1, "%h", weechat_home);
weechat_home = weechat_info_get ("weechat_dir");
if (!weechat_home)
{
free (dir1);
return;
}
dir2 = weechat_string_replace (dir1, "%h", weechat_home);
if (!dir2)
{
free (dir1);
@@ -176,8 +185,10 @@ irc_dcc_find_filename (struct t_irc_dcc *ptr_dcc)
return;
strcpy (ptr_dcc->local_filename, dir2);
if (ptr_dcc->local_filename[strlen (ptr_dcc->local_filename) - 1] != DIR_SEPARATOR_CHAR)
strcat (ptr_dcc->local_filename, DIR_SEPARATOR);
dir_separator = weechat_info_get("dir_separator");
if (dir_separator
&& (ptr_dcc->local_filename[strlen (ptr_dcc->local_filename) - 1] != dir_separator[0]))
strcat (ptr_dcc->local_filename, dir_separator);
strcat (ptr_dcc->local_filename, ptr_dcc->nick);
strcat (ptr_dcc->local_filename, ".");
strcat (ptr_dcc->local_filename, ptr_dcc->filename);
-3
View File
@@ -20,9 +20,6 @@
#ifndef __WEECHAT_IRC_DCC_H
#define __WEECHAT_IRC_DCC_H 1
#include "irc-server.h"
#include "irc-channel.h"
/* DCC types */
#define IRC_DCC_CHAT_RECV 0 /* receiving DCC chat */
+1
View File
@@ -29,6 +29,7 @@
#include <string.h>
#include "irc.h"
#include "irc-channel.h"
#include "irc-command.h"
#include "irc-config.h"
#include "irc-server.h"
+2 -1
View File
@@ -20,7 +20,8 @@
#ifndef __WEECHAT_IRC_MODE_H
#define __WEECHAT_IRC_MODE_H 1
#include "irc-server.h"
struct t_irc_server;
struct t_irc_channel;
extern void irc_mode_channel_set (struct t_irc_server *server,
struct t_irc_channel *channel, char *modes);
+127 -113
View File
@@ -39,20 +39,24 @@
* irc_nick_find_color: find a color for a nick (according to nick letters)
*/
int
char *
irc_nick_find_color (struct t_irc_nick *nick)
{
int i, color;
char color_name[64];
color = 0;
for (i = strlen (nick->nick) - 1; i >= 0; i--)
for (i = strlen (nick->name) - 1; i >= 0; i--)
{
color += (int)(nick->nick[i]);
color += (int)(nick->name[i]);
}
color = (color %
weechat_config_integer (weechat_config_get_weechat ("look_color_nicks_number")));
snprintf (color_name, sizeof (color_name),
"color_chat_nick_color%d", color);
return color;
return weechat_color (color_name);
}
/*
@@ -61,56 +65,66 @@ irc_nick_find_color (struct t_irc_nick *nick)
*/
void
irc_nick_get_gui_infos (struct t_irc_nick *nick,
int *sort_index, char *prefix, int *color_prefix)
irc_nick_get_gui_infos (struct t_gui_buffer *buffer,
struct t_irc_nick *nick,
char *prefix, int *color_prefix,
struct t_gui_nick_group **group)
{
if (nick->flags & IRC_NICK_CHANOWNER)
{
*sort_index = 1;
*prefix = '~';
*color_prefix = 1;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_OP);
}
else if (nick->flags & IRC_NICK_CHANADMIN)
{
*sort_index = 2;
*prefix = '&';
*color_prefix = 1;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_OP);
}
else if (nick->flags & IRC_NICK_CHANADMIN2)
{
*sort_index = 3;
*prefix = '!';
*color_prefix = 1;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_OP);
}
else if (nick->flags & IRC_NICK_OP)
{
*sort_index = 4;
*prefix = '@';
*color_prefix = 1;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_OP);
}
else if (nick->flags & IRC_NICK_HALFOP)
{
*sort_index = 5;
*prefix = '%';
*color_prefix = 2;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_HALFOP);
}
else if (nick->flags & IRC_NICK_VOICE)
{
*sort_index = 6;
*prefix = '+';
*color_prefix = 3;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_VOICE);
}
else if (nick->flags & IRC_NICK_CHANUSER)
{
*sort_index = 7;
*prefix = '-';
*color_prefix = 4;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_CHANUSER);
}
else
{
*sort_index = 8;
*prefix = ' ';
*color_prefix = 0;
*group = weechat_nicklist_search_group (buffer, NULL,
IRC_NICK_GROUP_NORMAL);
}
}
@@ -124,52 +138,46 @@ irc_nick_new (struct t_irc_server *server, struct t_irc_channel *channel,
int is_chanadmin2, int is_op, int is_halfop, int has_voice,
int is_chanuser)
{
(void) server;
(void) channel;
(void) nick_name;
(void) is_chanowner;
(void) is_chanadmin;
(void) is_chanadmin2;
(void) is_op;
(void) is_halfop;
(void) has_voice;
(void) is_chanuser;
struct t_irc_nick *new_nick, *ptr_nick;
char prefix, str_prefix_color[64];
int prefix_color;
struct t_gui_nick_group *ptr_group;
/*
struct t_irc_nick *new_nick;
struct t_gui_nick *ptr_gui_nick;
int sort_index, color_prefix;
char prefix;
// nick already exists on this channel?
if ((new_nick = irc_nick_search (channel, nick_name)))
/* nick already exists on this channel? */
ptr_nick = irc_nick_search (channel, nick_name);
if (ptr_nick)
{
// update nick
IRC_NICK_SET_FLAG(new_nick, is_chanowner, IRC_NICK_CHANOWNER);
IRC_NICK_SET_FLAG(new_nick, is_chanadmin, IRC_NICK_CHANADMIN);
IRC_NICK_SET_FLAG(new_nick, is_chanadmin2, IRC_NICK_CHANADMIN2);
IRC_NICK_SET_FLAG(new_nick, is_op, IRC_NICK_OP);
IRC_NICK_SET_FLAG(new_nick, is_halfop, IRC_NICK_HALFOP);
IRC_NICK_SET_FLAG(new_nick, has_voice, IRC_NICK_VOICE);
IRC_NICK_SET_FLAG(new_nick, is_chanuser, IRC_NICK_CHANUSER);
irc_nick_get_gui_infos (new_nick, &sort_index, &prefix, &color_prefix);
ptr_gui_nick = gui_nicklist_search (channel->buffer, new_nick->nick);
if (ptr_gui_nick)
gui_nicklist_update (channel->buffer, ptr_gui_nick, NULL,
sort_index,
ptr_gui_nick->color_nick,
prefix,
color_prefix);
return new_nick;
/* update nick */
IRC_NICK_SET_FLAG(ptr_nick, is_chanowner, IRC_NICK_CHANOWNER);
IRC_NICK_SET_FLAG(ptr_nick, is_chanadmin, IRC_NICK_CHANADMIN);
IRC_NICK_SET_FLAG(ptr_nick, is_chanadmin2, IRC_NICK_CHANADMIN2);
IRC_NICK_SET_FLAG(ptr_nick, is_op, IRC_NICK_OP);
IRC_NICK_SET_FLAG(ptr_nick, is_halfop, IRC_NICK_HALFOP);
IRC_NICK_SET_FLAG(ptr_nick, has_voice, IRC_NICK_VOICE);
IRC_NICK_SET_FLAG(ptr_nick, is_chanuser, IRC_NICK_CHANUSER);
irc_nick_get_gui_infos (channel->buffer, ptr_nick, &prefix,
&prefix_color, &ptr_group);
weechat_nicklist_remove_nick (channel->buffer,
weechat_nicklist_search_nick (channel->buffer,
ptr_group,
ptr_nick->name));
snprintf (str_prefix_color, sizeof (str_prefix_color),
"color_nicklist_prefix%d",
prefix_color);
weechat_nicklist_add_nick (channel->buffer, ptr_group,
ptr_nick->name, ptr_nick->color,
prefix, str_prefix_color, 1);
return ptr_nick;
}
// alloc memory for new nick
/* alloc memory for new nick */
if ((new_nick = (struct t_irc_nick *)malloc (sizeof (struct t_irc_nick))) == NULL)
return NULL;
// initialize new nick
new_nick->nick = strdup (nick_name);
/* initialize new nick */
new_nick->name = strdup (nick_name);
new_nick->host = NULL;
new_nick->flags = 0;
IRC_NICK_SET_FLAG(new_nick, is_chanowner, IRC_NICK_CHANOWNER);
@@ -179,12 +187,12 @@ irc_nick_new (struct t_irc_server *server, struct t_irc_channel *channel,
IRC_NICK_SET_FLAG(new_nick, is_halfop, IRC_NICK_HALFOP);
IRC_NICK_SET_FLAG(new_nick, has_voice, IRC_NICK_VOICE);
IRC_NICK_SET_FLAG(new_nick, is_chanuser, IRC_NICK_CHANUSER);
if (weechat_strcasecmp (new_nick->nick, server->nick) == 0)
new_nick->color = GUI_COLOR_CHAT_NICK_SELF;
if (weechat_strcasecmp (new_nick->name, server->nick) == 0)
new_nick->color = IRC_COLOR_CHAT_NICK_SELF;
else
new_nick->color = irc_nick_find_color (new_nick);
// add nick to end of list
/* add nick to end of list */
new_nick->prev_nick = channel->last_nick;
if (channel->nicks)
channel->last_nick->next_nick = new_nick;
@@ -197,15 +205,18 @@ irc_nick_new (struct t_irc_server *server, struct t_irc_channel *channel,
channel->nick_completion_reset = 1;
// add nick to buffer nicklist
irc_nick_get_gui_infos (new_nick, &sort_index, &prefix, &color_prefix);
gui_nicklist_add (channel->buffer, new_nick->nick, sort_index,
GUI_COLOR_NICKLIST, prefix, color_prefix);
/* add nick to buffer nicklist */
irc_nick_get_gui_infos (channel->buffer, new_nick, &prefix, &prefix_color,
&ptr_group);
snprintf (str_prefix_color, sizeof (str_prefix_color),
"color_nicklist_prefix%d",
prefix_color);
weechat_nicklist_add_nick (channel->buffer, ptr_group,
new_nick->name, new_nick->color,
prefix, str_prefix_color, 1);
// all is ok, return address of new nick
/* all is ok, return address of new nick */
return new_nick;
*/
return NULL;
}
/*
@@ -216,46 +227,45 @@ void
irc_nick_change (struct t_irc_server *server, struct t_irc_channel *channel,
struct t_irc_nick *nick, char *new_nick)
{
(void) server;
(void) channel;
(void) nick;
(void) new_nick;
int nick_is_me, prefix_color;
struct t_gui_nick_group *ptr_group;
char prefix, str_prefix_color[64];
/*
int nick_is_me;
struct t_weelist *ptr_weelist;
struct t_gui_nick *ptr_nick;
// update buffer nick
ptr_nick = gui_nicklist_search (channel->buffer, nick->nick);
if (ptr_nick)
gui_nicklist_update (channel->buffer, ptr_nick, new_nick,
ptr_nick->sort_index,
ptr_nick->color_nick,
ptr_nick->prefix,
ptr_nick->color_prefix);
nick_is_me = (strcmp (nick->nick, server->nick) == 0) ? 1 : 0;
/* remove nick from nicklist */
irc_nick_get_gui_infos (channel->buffer, nick, &prefix, &prefix_color,
&ptr_group);
weechat_nicklist_remove_nick (channel->buffer,
weechat_nicklist_search_nick (channel->buffer,
ptr_group,
nick->name));
/* update nicks speaking */
nick_is_me = (strcmp (nick->name, server->nick) == 0) ? 1 : 0;
if (!nick_is_me && channel->nicks_speaking)
{
ptr_weelist = weelist_search (channel->nicks_speaking, nick->nick);
if (ptr_weelist && ptr_weelist->data)
{
free (ptr_weelist->data);
ptr_weelist->data = strdup (new_nick);
}
weechat_list_set (weechat_list_search (channel->nicks_speaking,
nick->name),
new_nick);
}
// change nickname
if (nick->nick)
free (nick->nick);
nick->nick = strdup (new_nick);
/* change nickname */
if (nick->name)
free (nick->name);
nick->name = strdup (new_nick);
if (nick_is_me)
nick->color = GUI_COLOR_CHAT_NICK_SELF;
nick->color = IRC_COLOR_CHAT_NICK_SELF;
else
nick->color = irc_nick_find_color (nick);
*/
/* add nick in nicklist */
irc_nick_get_gui_infos (channel->buffer, nick, &prefix, &prefix_color,
&ptr_group);
snprintf (str_prefix_color, sizeof (str_prefix_color),
"color_nicklist_prefix%d",
prefix_color);
weechat_nicklist_add_nick (channel->buffer, ptr_group,
nick->name, nick->color,
prefix, str_prefix_color, 1);
}
/*
@@ -265,19 +275,23 @@ irc_nick_change (struct t_irc_server *server, struct t_irc_channel *channel,
void
irc_nick_free (struct t_irc_channel *channel, struct t_irc_nick *nick)
{
(void) channel;
(void) nick;
/*
struct t_irc_nick *new_nicks;
char prefix;
int prefix_color;
struct t_gui_nick_group *ptr_group;
if (!channel || !nick)
return;
// remove nick from buffer nicklist
(void) gui_nicklist_remove (channel->buffer, nick->nick);
/* remove nick from nicklist */
irc_nick_get_gui_infos (channel->buffer, nick, &prefix, &prefix_color,
&ptr_group);
weechat_nicklist_remove_nick (channel->buffer,
weechat_nicklist_search_nick (channel->buffer,
ptr_group,
nick->name));
// remove nick from nicks list
/* remove nick */
if (channel->last_nick == nick)
channel->last_nick = nick->prev_nick;
if (nick->prev_nick)
@@ -293,16 +307,15 @@ irc_nick_free (struct t_irc_channel *channel, struct t_irc_nick *nick)
channel->nicks_count--;
// free data
if (nick->nick)
free (nick->nick);
/* free data */
if (nick->name)
free (nick->name);
if (nick->host)
free (nick->host);
free (nick);
channel->nicks = new_nicks;
channel->nick_completion_reset = 1;
*/
}
/*
@@ -338,7 +351,7 @@ irc_nick_search (struct t_irc_channel *channel, char *nickname)
for (ptr_nick = channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
if (weechat_strcasecmp (ptr_nick->nick, nickname) == 0)
if (weechat_strcasecmp (ptr_nick->name, nickname) == 0)
return ptr_nick;
}
return NULL;
@@ -438,7 +451,7 @@ irc_nick_as_prefix (struct t_irc_nick *nick, char *nickname, char *force_color)
&& weechat_config_string (irc_config_irc_nick_prefix)[0]) ?
weechat_config_string (irc_config_irc_nick_prefix) : "",
(force_color) ? force_color : ((nick) ? nick->color : IRC_COLOR_CHAT_NICK),
(nick) ? nick->nick : nickname,
(nick) ? nick->name : nickname,
(weechat_config_string (irc_config_irc_nick_suffix)
&& weechat_config_string (irc_config_irc_nick_suffix)[0]) ?
IRC_COLOR_CHAT_DELIMITERS : "",
@@ -456,10 +469,11 @@ irc_nick_as_prefix (struct t_irc_nick *nick, char *nickname, char *force_color)
void
irc_nick_print_log (struct t_irc_nick *nick)
{
weechat_log_printf ("=> nick %s (addr:0x%X):", nick->nick, nick);
weechat_log_printf (" host . . . . . : %s", nick->host);
weechat_log_printf (" flags. . . . . : %d", nick->flags);
weechat_log_printf (" color. . . . . : %d", nick->color);
weechat_log_printf (" prev_nick. . . : 0x%X", nick->prev_nick);
weechat_log_printf (" next_nick. . . : 0x%X", nick->next_nick);
weechat_log_printf ("");
weechat_log_printf (" => nick %s (addr:0x%X):", nick->name, nick);
weechat_log_printf (" host . . . . . : %s", nick->host);
weechat_log_printf (" flags. . . . . : %d", nick->flags);
weechat_log_printf (" color. . . . . : '%s'", nick->color);
weechat_log_printf (" prev_nick. . . : 0x%X", nick->prev_nick);
weechat_log_printf (" next_nick. . . : 0x%X", nick->next_nick);
}
+10 -7
View File
@@ -20,9 +20,6 @@
#ifndef __WEECHAT_IRC_NICK_H
#define __WEECHAT_IRC_NICK_H 1
#include "irc-server.h"
#include "irc-channel.h"
#define IRC_NICK_DEFAULT_PREFIXES_LIST "@%+~&!-"
#define IRC_NICK_CHANOWNER 1
@@ -39,9 +36,18 @@
else \
nick->flags &= 0xFFFF - flag;
#define IRC_NICK_GROUP_OP "1|op"
#define IRC_NICK_GROUP_HALFOP "2|halfop"
#define IRC_NICK_GROUP_VOICE "3|voice"
#define IRC_NICK_GROUP_CHANUSER "4|chanuser"
#define IRC_NICK_GROUP_NORMAL "5|normal"
struct t_irc_server;
struct t_irc_channel;
struct t_irc_nick
{
char *nick; /* nickname */
char *name; /* nickname */
char *host; /* full hostname */
int flags; /* chanowner/chanadmin (unrealircd), */
/* op, halfop, voice, away */
@@ -50,9 +56,6 @@ struct t_irc_nick
struct t_irc_nick *next_nick; /* link to next nick on channel */
};
extern int irc_nick_find_color (struct t_irc_nick *nick);
extern void irc_nick_get_gui_infos (struct t_irc_nick *nick, int *sort_index,
char *prefix, int *color_prefix);
extern struct t_irc_nick *irc_nick_new (struct t_irc_server *server,
struct t_irc_channel *channel,
char *nick_name, int is_chanowner,
+297 -258
View File
@@ -16,8 +16,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* irc-protocol.c: description of IRC commands, according to
RFC 1459,2810,2811,2812 */
/* irc-protocol.c: description of IRC commands, according to RFC 1459, 2810,
2811 2812 */
#ifdef HAVE_CONFIG_H
@@ -54,129 +54,126 @@
struct t_irc_protocol_msg irc_protocol_messages[] =
{ { "error", N_("error received from IRC server"), irc_protocol_cmd_error },
{ "invite", N_("invite a nick on a channel"), irc_protocol_cmd_invite },
{ "join", N_("join a channel"), irc_protocol_cmd_join },
{ "kick", N_("forcibly remove a user from a channel"), irc_protocol_cmd_kick },
{ "kill", N_("close client-server connection"), irc_protocol_cmd_kill },
{ "mode", N_("change channel or user mode"), irc_protocol_cmd_mode },
{ "nick", N_("change current nickname"), irc_protocol_cmd_nick },
{ "notice", N_("send notice message to user"), irc_protocol_cmd_notice },
{ "part", N_("leave a channel"), irc_protocol_cmd_part },
{ "ping", N_("ping server"), irc_protocol_cmd_ping },
{ "pong", N_("answer to a ping message"), irc_protocol_cmd_pong },
{ "privmsg", N_("message received"), irc_protocol_cmd_privmsg },
{ "quit", N_("close all connections and quit"), irc_protocol_cmd_quit },
{ "topic", N_("get/set channel topic"), irc_protocol_cmd_topic },
{ { "error", N_("error received from IRC server"), NULL, irc_protocol_cmd_error },
{ "invite", N_("invite a nick on a channel"), NULL, irc_protocol_cmd_invite },
{ "join", N_("join a channel"), NULL, irc_protocol_cmd_join },
{ "kick", N_("forcibly remove a user from a channel"), irc_protocol_cmd_kick, NULL },
{ "kill", N_("close client-server connection"), irc_protocol_cmd_kill, NULL },
{ "mode", N_("change channel or user mode"), irc_protocol_cmd_mode, NULL },
{ "nick", N_("change current nickname"), irc_protocol_cmd_nick, NULL },
{ "notice", N_("send notice message to user"), irc_protocol_cmd_notice, NULL },
{ "part", N_("leave a channel"), irc_protocol_cmd_part, NULL },
{ "ping", N_("ping server"), irc_protocol_cmd_ping, NULL },
{ "pong", N_("answer to a ping message"), irc_protocol_cmd_pong, NULL },
{ "privmsg", N_("message received"), irc_protocol_cmd_privmsg, NULL },
{ "quit", N_("close all connections and quit"), irc_protocol_cmd_quit, NULL },
{ "topic", N_("get/set channel topic"), irc_protocol_cmd_topic, NULL },
{ "wallops", N_("send a message to all currently connected users who have "
"set the 'w' user mode for themselves"), irc_protocol_cmd_wallops },
{ "001", N_("a server message"), irc_protocol_cmd_001 },
{ "005", N_("a server message"), irc_protocol_cmd_005 },
{ "221", N_("user mode string"), irc_protocol_cmd_221 },
{ "301", N_("away message"), irc_protocol_cmd_301 },
{ "302", N_("userhost"), irc_protocol_cmd_302 },
{ "303", N_("ison"), irc_protocol_cmd_303 },
{ "305", N_("unaway"), irc_protocol_cmd_305 },
{ "306", N_("now away"), irc_protocol_cmd_306 },
{ "307", N_("whois (registered nick)"), irc_protocol_cmd_whois_nick_msg },
{ "310", N_("whois (help mode)"), irc_protocol_cmd_310 },
{ "311", N_("whois (user)"), irc_protocol_cmd_311 },
{ "312", N_("whois (server)"), irc_protocol_cmd_312 },
{ "313", N_("whois (operator)"), irc_protocol_cmd_whois_nick_msg },
{ "314", N_("whowas"), irc_protocol_cmd_314 },
{ "315", N_("end of /who list"), irc_protocol_cmd_315 },
{ "317", N_("whois (idle)"), irc_protocol_cmd_317 },
{ "318", N_("whois (end)"), irc_protocol_cmd_whois_nick_msg },
{ "319", N_("whois (channels)"), irc_protocol_cmd_319 },
{ "320", N_("whois (identified user)"), irc_protocol_cmd_whois_nick_msg },
{ "321", N_("/list start"), irc_protocol_cmd_321 },
{ "322", N_("channel (for /list)"), irc_protocol_cmd_322 },
{ "323", N_("/list end"), irc_protocol_cmd_323 },
{ "324", N_("channel mode"), irc_protocol_cmd_324 },
{ "326", N_("whois (has oper privs)"), irc_protocol_cmd_whois_nick_msg },
{ "327", N_("whois (host)"), irc_protocol_cmd_327 },
{ "329", N_("channel creation date"), irc_protocol_cmd_329 },
{ "331", N_("no topic for channel"), irc_protocol_cmd_331 },
{ "332", N_("topic of channel"), irc_protocol_cmd_332 },
{ "333", N_("infos about topic (nick and date changed)"), irc_protocol_cmd_333 },
{ "338", N_("whois (host)"), irc_protocol_cmd_338 },
{ "341", N_("inviting"), irc_protocol_cmd_341 },
{ "344", N_("channel reop"), irc_protocol_cmd_344 },
{ "345", N_("end of channel reop list"), irc_protocol_cmd_345 },
{ "348", N_("channel exception list"), irc_protocol_cmd_348 },
{ "349", N_("end of channel exception list"), irc_protocol_cmd_349 },
{ "351", N_("server version"), irc_protocol_cmd_351 },
{ "352", N_("who"), irc_protocol_cmd_352 },
{ "353", N_("list of nicks on channel"), irc_protocol_cmd_353 },
{ "366", N_("end of /names list"), irc_protocol_cmd_366 },
{ "367", N_("banlist"), irc_protocol_cmd_367 },
{ "368", N_("end of banlist"), irc_protocol_cmd_368 },
{ "378", N_("whois (connecting from)"), irc_protocol_cmd_whois_nick_msg },
{ "379", N_("whois (using modes)"), irc_protocol_cmd_whois_nick_msg },
{ "401", N_("no such nick/channel"), irc_protocol_cmd_error },
{ "402", N_("no such server"), irc_protocol_cmd_error },
{ "403", N_("no such channel"), irc_protocol_cmd_error },
{ "404", N_("cannot send to channel"), irc_protocol_cmd_error },
{ "405", N_("too many channels"), irc_protocol_cmd_error },
{ "406", N_("was no such nick"), irc_protocol_cmd_error },
{ "407", N_("was no such nick"), irc_protocol_cmd_error },
{ "409", N_("no origin"), irc_protocol_cmd_error },
{ "410", N_("no services"), irc_protocol_cmd_error },
{ "411", N_("no recipient"), irc_protocol_cmd_error },
{ "412", N_("no text to send"), irc_protocol_cmd_error },
{ "413", N_("no toplevel"), irc_protocol_cmd_error },
{ "414", N_("wilcard in toplevel domain"), irc_protocol_cmd_error },
{ "421", N_("unknown command"), irc_protocol_cmd_error },
{ "422", N_("MOTD is missing"), irc_protocol_cmd_error },
{ "423", N_("no administrative info"), irc_protocol_cmd_error },
{ "424", N_("file error"), irc_protocol_cmd_error },
{ "431", N_("no nickname given"), irc_protocol_cmd_error },
{ "432", N_("erroneous nickname"), irc_protocol_cmd_432 },
{ "433", N_("nickname already in use"), irc_protocol_cmd_433 },
{ "436", N_("nickname collision"), irc_protocol_cmd_error },
{ "437", N_("resource unavailable"), irc_protocol_cmd_error },
{ "438", N_("not authorized to change nickname"), irc_protocol_cmd_438 },
{ "441", N_("user not in channel"), irc_protocol_cmd_error },
{ "442", N_("not on channel"), irc_protocol_cmd_error },
{ "443", N_("user already on channel"), irc_protocol_cmd_error },
{ "444", N_("user not logged in"), irc_protocol_cmd_error },
{ "445", N_("summon has been disabled"), irc_protocol_cmd_error },
{ "446", N_("users has been disabled"), irc_protocol_cmd_error },
{ "451", N_("you are not registered"), irc_protocol_cmd_error },
{ "461", N_("not enough parameters"), irc_protocol_cmd_error },
{ "462", N_("you may not register"), irc_protocol_cmd_error },
{ "463", N_("your host isn't among the privileged"), irc_protocol_cmd_error },
{ "464", N_("password incorrect"), irc_protocol_cmd_error },
{ "465", N_("you are banned from this server"), irc_protocol_cmd_error },
{ "467", N_("channel key already set"), irc_protocol_cmd_error },
{ "470", N_("forwarding to another channel"), irc_protocol_cmd_error },
{ "471", N_("channel is already full"), irc_protocol_cmd_error },
{ "472", N_("unknown mode char to me"), irc_protocol_cmd_error },
{ "473", N_("cannot join channel (invite only)"), irc_protocol_cmd_error },
{ "474", N_("cannot join channel (banned from channel)"), irc_protocol_cmd_error },
{ "475", N_("cannot join channel (bad channel key)"), irc_protocol_cmd_error },
{ "476", N_("bad channel mask"), irc_protocol_cmd_error },
{ "477", N_("channel doesn't support modes"), irc_protocol_cmd_error },
{ "481", N_("you're not an IRC operator"), irc_protocol_cmd_error },
{ "482", N_("you're not channel operator"), irc_protocol_cmd_error },
{ "483", N_("you can't kill a server!"), irc_protocol_cmd_error },
{ "484", N_("your connection is restricted!"), irc_protocol_cmd_error },
{ "485", N_("user is immune from kick/deop"), irc_protocol_cmd_error },
{ "487", N_("network split"), irc_protocol_cmd_error },
{ "491", N_("no O-lines for your host"), irc_protocol_cmd_error },
{ "501", N_("unknown mode flag"), irc_protocol_cmd_error },
{ "502", N_("can't change mode for other users"), irc_protocol_cmd_error },
{ "671", N_("whois (secure connection)"), irc_protocol_cmd_671 },
{ "973", N_("whois (secure connection)"), irc_protocol_cmd_server_mode_reason },
{ "974", N_("whois (secure connection)"), irc_protocol_cmd_server_mode_reason },
{ "975", N_("whois (secure connection)"), irc_protocol_cmd_server_mode_reason },
{ NULL, NULL, NULL }
"set the 'w' user mode for themselves"), irc_protocol_cmd_wallops, NULL },
{ "001", N_("a server message"), irc_protocol_cmd_001, NULL },
{ "005", N_("a server message"), irc_protocol_cmd_005, NULL },
{ "221", N_("user mode string"), irc_protocol_cmd_221, NULL },
{ "301", N_("away message"), irc_protocol_cmd_301, NULL },
{ "302", N_("userhost"), irc_protocol_cmd_302, NULL },
{ "303", N_("ison"), irc_protocol_cmd_303, NULL },
{ "305", N_("unaway"), irc_protocol_cmd_305, NULL },
{ "306", N_("now away"), irc_protocol_cmd_306, NULL },
{ "307", N_("whois (registered nick)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "310", N_("whois (help mode)"), irc_protocol_cmd_310, NULL },
{ "311", N_("whois (user)"), irc_protocol_cmd_311, NULL },
{ "312", N_("whois (server)"), irc_protocol_cmd_312, NULL },
{ "313", N_("whois (operator)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "314", N_("whowas"), irc_protocol_cmd_314, NULL },
{ "315", N_("end of /who list"), irc_protocol_cmd_315, NULL },
{ "317", N_("whois (idle)"), irc_protocol_cmd_317, NULL },
{ "318", N_("whois (end)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "319", N_("whois (channels)"), irc_protocol_cmd_319, NULL },
{ "320", N_("whois (identified user)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "321", N_("/list start"), irc_protocol_cmd_321, NULL },
{ "322", N_("channel (for /list)"), irc_protocol_cmd_322, NULL },
{ "323", N_("/list end"), irc_protocol_cmd_323, NULL },
{ "324", N_("channel mode"), irc_protocol_cmd_324, NULL },
{ "326", N_("whois (has oper privs)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "327", N_("whois (host)"), irc_protocol_cmd_327, NULL },
{ "329", N_("channel creation date"), irc_protocol_cmd_329, NULL },
{ "331", N_("no topic for channel"), irc_protocol_cmd_331, NULL },
{ "332", N_("topic of channel"), irc_protocol_cmd_332, NULL },
{ "333", N_("infos about topic (nick and date changed)"), irc_protocol_cmd_333, NULL },
{ "338", N_("whois (host)"), irc_protocol_cmd_338, NULL },
{ "341", N_("inviting"), irc_protocol_cmd_341, NULL },
{ "344", N_("channel reop"), irc_protocol_cmd_344, NULL },
{ "345", N_("end of channel reop list"), irc_protocol_cmd_345, NULL },
{ "348", N_("channel exception list"), irc_protocol_cmd_348, NULL },
{ "349", N_("end of channel exception list"), irc_protocol_cmd_349, NULL },
{ "351", N_("server version"), irc_protocol_cmd_351, NULL },
{ "352", N_("who"), irc_protocol_cmd_352, NULL },
{ "353", N_("list of nicks on channel"), irc_protocol_cmd_353, NULL },
{ "366", N_("end of /names list"), irc_protocol_cmd_366, NULL },
{ "367", N_("banlist"), irc_protocol_cmd_367, NULL },
{ "368", N_("end of banlist"), irc_protocol_cmd_368, NULL },
{ "378", N_("whois (connecting from)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "379", N_("whois (using modes)"), irc_protocol_cmd_whois_nick_msg, NULL },
{ "401", N_("no such nick/channel"), NULL, irc_protocol_cmd_error },
{ "402", N_("no such server"), NULL, irc_protocol_cmd_error },
{ "403", N_("no such channel"), NULL, irc_protocol_cmd_error },
{ "404", N_("cannot send to channel"), NULL, irc_protocol_cmd_error },
{ "405", N_("too many channels"), NULL, irc_protocol_cmd_error },
{ "406", N_("was no such nick"), NULL, irc_protocol_cmd_error },
{ "407", N_("was no such nick"), NULL, irc_protocol_cmd_error },
{ "409", N_("no origin"), NULL, irc_protocol_cmd_error },
{ "410", N_("no services"), NULL, irc_protocol_cmd_error },
{ "411", N_("no recipient"), NULL, irc_protocol_cmd_error },
{ "412", N_("no text to send"), NULL, irc_protocol_cmd_error },
{ "413", N_("no toplevel"), NULL, irc_protocol_cmd_error },
{ "414", N_("wilcard in toplevel domain"), NULL, irc_protocol_cmd_error },
{ "421", N_("unknown command"), NULL, irc_protocol_cmd_error },
{ "422", N_("MOTD is missing"), NULL, irc_protocol_cmd_error },
{ "423", N_("no administrative info"), NULL, irc_protocol_cmd_error },
{ "424", N_("file error"), NULL, irc_protocol_cmd_error },
{ "431", N_("no nickname given"), NULL, irc_protocol_cmd_error },
{ "432", N_("erroneous nickname"), NULL, irc_protocol_cmd_432 },
{ "433", N_("nickname already in use"), NULL, irc_protocol_cmd_433 },
{ "436", N_("nickname collision"), NULL, irc_protocol_cmd_error },
{ "437", N_("resource unavailable"), NULL, irc_protocol_cmd_error },
{ "438", N_("not authorized to change nickname"), irc_protocol_cmd_438, NULL },
{ "441", N_("user not in channel"), NULL, irc_protocol_cmd_error },
{ "442", N_("not on channel"), NULL, irc_protocol_cmd_error },
{ "443", N_("user already on channel"), NULL, irc_protocol_cmd_error },
{ "444", N_("user not logged in"), NULL, irc_protocol_cmd_error },
{ "445", N_("summon has been disabled"), NULL, irc_protocol_cmd_error },
{ "446", N_("users has been disabled"), NULL, irc_protocol_cmd_error },
{ "451", N_("you are not registered"), NULL, irc_protocol_cmd_error },
{ "461", N_("not enough parameters"), NULL, irc_protocol_cmd_error },
{ "462", N_("you may not register"), NULL, irc_protocol_cmd_error },
{ "463", N_("your host isn't among the privileged"), NULL, irc_protocol_cmd_error },
{ "464", N_("password incorrect"), NULL, irc_protocol_cmd_error },
{ "465", N_("you are banned from this server"), NULL, irc_protocol_cmd_error },
{ "467", N_("channel key already set"), NULL, irc_protocol_cmd_error },
{ "470", N_("forwarding to another channel"), NULL, irc_protocol_cmd_error },
{ "471", N_("channel is already full"), NULL, irc_protocol_cmd_error },
{ "472", N_("unknown mode char to me"), NULL, irc_protocol_cmd_error },
{ "473", N_("cannot join channel (invite only)"), NULL, irc_protocol_cmd_error },
{ "474", N_("cannot join channel (banned from channel)"), NULL, irc_protocol_cmd_error },
{ "475", N_("cannot join channel (bad channel key)"), NULL, irc_protocol_cmd_error },
{ "476", N_("bad channel mask"), NULL, irc_protocol_cmd_error },
{ "477", N_("channel doesn't support modes"), NULL, irc_protocol_cmd_error },
{ "481", N_("you're not an IRC operator"), NULL, irc_protocol_cmd_error },
{ "482", N_("you're not channel operator"), NULL, irc_protocol_cmd_error },
{ "483", N_("you can't kill a server!"), NULL, irc_protocol_cmd_error },
{ "484", N_("your connection is restricted!"), NULL, irc_protocol_cmd_error },
{ "485", N_("user is immune from kick/deop"), NULL, irc_protocol_cmd_error },
{ "487", N_("network split"), NULL, irc_protocol_cmd_error },
{ "491", N_("no O-lines for your host"), NULL, irc_protocol_cmd_error },
{ "501", N_("unknown mode flag"), NULL, irc_protocol_cmd_error },
{ "502", N_("can't change mode for other users"), NULL, irc_protocol_cmd_error },
{ "671", N_("whois (secure connection)"), irc_protocol_cmd_671, NULL },
{ "973", N_("whois (secure connection)"), irc_protocol_cmd_server_mode_reason, NULL },
{ "974", N_("whois (secure connection)"), irc_protocol_cmd_server_mode_reason, NULL },
{ "975", N_("whois (secure connection)"), irc_protocol_cmd_server_mode_reason, NULL },
{ NULL, NULL, NULL, NULL }
};
char *irc_message = NULL;
/*
* irc_protocol_get_wide_char: get wide char from string (first char)
*/
@@ -394,7 +391,8 @@ irc_protocol_is_highlight (char *message, char *nick)
*/
char *
irc_protocol_replace_vars (struct t_irc_server *server, struct t_irc_channel *channel, char *string)
irc_protocol_replace_vars (struct t_irc_server *server,
struct t_irc_channel *channel, char *string)
{
char *var_nick, *var_channel, *var_server;
char empty_string[1] = { '\0' };
@@ -428,6 +426,57 @@ irc_protocol_replace_vars (struct t_irc_server *server, struct t_irc_channel *ch
return res;
}
/*
* irc_protocol_get_nick_from_host: get nick from host in an IRC message
*/
char *
irc_protocol_get_nick_from_host (char *host)
{
static char nick[128];
char *pos;
nick[0] = '\0';
if (host)
{
if (host[0] == ':')
host++;
pos = strchr (host, '!');
if (pos && (pos - host < (int)sizeof (nick)))
{
strncpy (nick, host, pos - host);
nick[pos - host] = '\0';
}
else
snprintf (nick, sizeof (nick), "%s", host);
}
return nick;
}
/*
* irc_protocol_get_address_from_host: get address from host in an IRC message
*/
char *
irc_protocol_get_address_from_host (char *host)
{
static char address[256];
char *pos;
address[0] = '\0';
if (host)
{
if (host[0] == ':')
host++;
pos = strchr (host, '!');
if (pos)
snprintf (address, sizeof (address), "%s", pos + 1);
else
snprintf (address, sizeof (address), "%s", host);
}
return address;
}
/*
* irc_protocol_recv_command: executes action when receiving IRC command
* return: 0 = all ok, command executed
@@ -440,11 +489,12 @@ int
irc_protocol_recv_command (struct t_irc_server *server, char *entire_line,
char *host, char *command, char *arguments)
{
int i, cmd_found, return_code, ignore, highlight;
int i, cmd_found, return_code, ignore, highlight, argc;
char *pos, *nick;
char *dup_entire_line, *dup_host, *dup_arguments, *irc_message;
t_irc_recv_func *cmd_recv_func;
char *cmd_name;
t_irc_recv_func2 *cmd_recv_func2;
char *cmd_name, **argv, **argv_eol;
if (!command)
return -2;
@@ -468,6 +518,7 @@ irc_protocol_recv_command (struct t_irc_server *server, char *entire_line,
{
cmd_name = command;
cmd_recv_func = irc_protocol_cmd_server_msg;
cmd_recv_func2 = NULL;
}
else
return -3;
@@ -476,10 +527,13 @@ irc_protocol_recv_command (struct t_irc_server *server, char *entire_line,
{
cmd_name = irc_protocol_messages[cmd_found].name;
cmd_recv_func = irc_protocol_messages[cmd_found].recv_function;
cmd_recv_func2 = irc_protocol_messages[cmd_found].recv_function2;
}
if (cmd_recv_func != NULL)
if ((cmd_recv_func != NULL) || (cmd_recv_func2 != NULL))
{
argv = weechat_string_explode (entire_line, " ", 0, 0, &argc);
argv_eol = weechat_string_explode (entire_line, " ", 1, 0, NULL);
dup_entire_line = (entire_line) ? strdup (entire_line) : NULL;
dup_host = (host) ? strdup (host) : NULL;
dup_arguments = (arguments) ? strdup (arguments) : NULL;
@@ -505,10 +559,19 @@ irc_protocol_recv_command (struct t_irc_server *server, char *entire_line,
if (pos)
pos[0] = '!';
irc_message = strdup (dup_entire_line);
return_code = (int) (cmd_recv_func) (server, irc_message,
dup_host, nick,
dup_arguments,
ignore, highlight);
if (cmd_recv_func2 != NULL)
{
return_code = (int) (cmd_recv_func2) (server, argc, argv, argv_eol,
ignore, highlight);
}
else
{
return_code = (int) (cmd_recv_func) (server, irc_message,
dup_host, nick,
dup_arguments,
ignore, highlight);
}
if (irc_message)
free (irc_message);
if (nick)
@@ -519,6 +582,10 @@ irc_protocol_recv_command (struct t_irc_server *server, char *entire_line,
free (dup_host);
if (dup_arguments)
free (dup_arguments);
if (argv)
weechat_string_free_exploded (argv);
if (argv_eol)
weechat_string_free_exploded (argv_eol);
return return_code;
}
@@ -530,53 +597,41 @@ irc_protocol_recv_command (struct t_irc_server *server, char *entire_line,
*/
int
irc_protocol_cmd_error (struct t_irc_server *server, char *irc_message, char *host,
char *nick, char *arguments, int ignore, int highlight)
irc_protocol_cmd_error (struct t_irc_server *server, int argc, char **argv,
char **argv_eol, int ignore, int highlight)
{
char *pos_args, *pos;
int first;
int first_arg;
char *chan_nick, *args;
/* make C compiler happy */
(void) irc_message;
(void) host;
(void) nick;
(void) argc;
(void) ignore;
(void) highlight;
first = 1;
first_arg = (strcmp (argv[2], server->nick) == 0) ? 3 : 2;
pos_args = strstr (arguments, " :");
if (pos_args)
if ((argv[first_arg][0] != ':') && argv[first_arg + 1])
{
pos_args[0] = '\0';
if (weechat_strncasecmp (arguments, server->nick,
strlen (server->nick)) == 0)
{
pos = strchr (arguments, ' ');
if (pos)
{
while (pos[0] == ' ')
pos++;
}
else
pos = arguments;
}
else
{
pos = arguments;
}
weechat_printf (server->buffer, "%s%s: %s",
weechat_prefix ("error"),
pos, pos_args + 2);
if (strncmp (arguments, "Closing Link", 12) == 0)
irc_server_disconnect (server, 1);
chan_nick = argv[first_arg];
args = argv_eol[first_arg + 1];
}
else
{
weechat_printf (server->buffer, "%s%s",
weechat_prefix ("error"),
arguments);
chan_nick = NULL;
args = argv_eol[first_arg];
}
if (args[0] == ':')
args++;
weechat_printf (server->buffer,
"%s%s%s%s",
weechat_prefix ("error"),
(chan_nick) ? chan_nick : "",
(chan_nick) ? ": " : "",
args);
if (strncmp (args, "Closing Link", 12) == 0)
irc_server_disconnect (server, 1);
return WEECHAT_RC_OK;
}
@@ -586,47 +641,34 @@ irc_protocol_cmd_error (struct t_irc_server *server, char *irc_message, char *ho
*/
int
irc_protocol_cmd_invite (struct t_irc_server *server, char *irc_message, char *host,
char *nick, char *arguments, int ignore, int highlight)
irc_protocol_cmd_invite (struct t_irc_server *server, int argc, char **argv,
char **argv_eol, int ignore, int highlight)
{
char *pos_channel;
/* make C compiler happy */
(void) irc_message;
(void) host;
(void) argc;
(void) argv_eol;
(void) highlight;
pos_channel = strchr (arguments, ' ');
if (pos_channel)
if (!ignore && argv[3])
{
pos_channel[0] = '\0';
pos_channel++;
while (pos_channel[0] == ' ')
pos_channel++;
if (pos_channel[0] == ':')
pos_channel++;
if (!ignore)
{
weechat_printf (server->buffer,
_("You have been invited to %s%s%s by "
"%s%s"),
IRC_COLOR_CHAT_CHANNEL,
pos_channel,
IRC_COLOR_CHAT,
IRC_COLOR_CHAT_NICK,
nick);
/*
if (gui_add_hotlist
&& ((server->buffer->num_displayed == 0)
|| (gui_buffer_is_scrolled (server->buffer))))
{
gui_hotlist_add (GUI_HOTLIST_HIGHLIGHT, NULL,
server->buffer, 0);
gui_status_draw (gui_current_window->buffer, 1);
}
*/
}
weechat_printf (server->buffer,
_("You have been invited to %s%s%s by "
"%s%s"),
IRC_COLOR_CHAT_CHANNEL,
(argv[3][0] == ':') ? argv[3] + 1 : argv[3],
IRC_COLOR_CHAT,
IRC_COLOR_CHAT_NICK,
irc_protocol_get_nick_from_host (argv[0]));
/*
if (gui_add_hotlist
&& ((server->buffer->num_displayed == 0)
|| (gui_buffer_is_scrolled (server->buffer))))
{
gui_hotlist_add (GUI_HOTLIST_HIGHLIGHT, NULL,
server->buffer, 0);
gui_status_draw (gui_current_window->buffer, 1);
}
*/
}
else
{
@@ -646,19 +688,20 @@ irc_protocol_cmd_invite (struct t_irc_server *server, char *irc_message, char *h
*/
int
irc_protocol_cmd_join (struct t_irc_server *server, char *irc_message, char *host,
char *nick, char *arguments, int ignore, int highlight)
irc_protocol_cmd_join (struct t_irc_server *server, int argc, char **argv,
char **argv_eol, int ignore, int highlight)
{
struct t_irc_channel *ptr_channel;
struct t_irc_nick *ptr_nick;
char *pos;
char *pos_channel;
/* make C compiler happy */
(void) irc_message;
(void) argc;
(void) argv_eol;
(void) highlight;
/* no host => we can't identify sender of message! */
if (!host)
if (argv[0][0] != ':')
{
weechat_printf (server->buffer,
_("%s%s: \"%s\" command received without host"),
@@ -666,38 +709,35 @@ irc_protocol_cmd_join (struct t_irc_server *server, char *irc_message, char *hos
return WEECHAT_RC_ERROR;
}
if (arguments[0] == ':')
arguments++;
ptr_channel = irc_channel_search (server, arguments);
pos_channel = (argv[2][0] == ':') ? argv[2] + 1 : argv[2];
ptr_channel = irc_channel_search (server, pos_channel);
if (!ptr_channel)
{
ptr_channel = irc_channel_new (server, IRC_CHANNEL_TYPE_CHANNEL,
arguments, 1);
pos_channel, 1);
if (!ptr_channel)
{
weechat_printf (server->buffer,
_("%s%s: cannot create new channel \"%s\""),
weechat_prefix ("error"), "irc", arguments);
weechat_prefix ("error"), "irc", pos_channel);
return WEECHAT_RC_ERROR;
}
}
pos = strchr (host, '!');
if (!ignore)
{
weechat_printf (ptr_channel->buffer,
_("%s%s%s %s(%s%s%s)%s has joined %s%s"),
weechat_prefix ("join"),
IRC_COLOR_CHAT_NICK,
nick,
irc_protocol_get_nick_from_host (argv[0]),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT_HOST,
(pos) ? pos + 1 : host,
irc_protocol_get_address_from_host (argv[0]),
IRC_COLOR_CHAT_DELIMITERS,
IRC_COLOR_CHAT,
IRC_COLOR_CHAT_CHANNEL,
arguments);
pos_channel);
}
/* remove topic and display channel creation date if joining new channel */
@@ -713,9 +753,11 @@ irc_protocol_cmd_join (struct t_irc_server *server, char *irc_message, char *hos
}
/* add nick in channel */
ptr_nick = irc_nick_new (server, ptr_channel, nick, 0, 0, 0, 0, 0, 0, 0);
ptr_nick = irc_nick_new (server, ptr_channel,
irc_protocol_get_nick_from_host (argv[0]),
0, 0, 0, 0, 0, 0, 0);
if (ptr_nick)
ptr_nick->host = strdup ((pos) ? pos + 1 : host);
ptr_nick->host = strdup (irc_protocol_get_address_from_host (argv[0]));
/* redraw nicklist and status bar */
//gui_nicklist_draw (ptr_channel->buffer, 1, 1);
@@ -1082,7 +1124,7 @@ irc_protocol_cmd_nick (struct t_irc_server *server, char *irc_message, char *hos
ptr_nick = irc_nick_search (ptr_channel, nick);
if (ptr_nick)
{
nick_is_me = (strcmp (ptr_nick->nick, server->nick) == 0) ? 1 : 0;
nick_is_me = (strcmp (ptr_nick->name, server->nick) == 0) ? 1 : 0;
//if (nick_is_me)
// gui_add_hotlist = 0;
irc_nick_change (server, ptr_channel, ptr_nick, arguments);
@@ -1403,7 +1445,8 @@ irc_protocol_cmd_part (struct t_irc_server *server, char *irc_message, char *hos
if (pos_args && pos_args[0])
{
weechat_printf (ptr_channel->buffer,
_("%s%s %s(%s%s%s)%s has left %s%s %s(%s%s%s)"),
_("%s%s%s %s(%s%s%s)%s has left %s%s %s(%s%s%s)"),
weechat_prefix ("quit"),
IRC_COLOR_CHAT_NICK,
nick,
IRC_COLOR_CHAT_DELIMITERS,
@@ -1421,7 +1464,8 @@ irc_protocol_cmd_part (struct t_irc_server *server, char *irc_message, char *hos
else
{
weechat_printf (ptr_channel->buffer,
_("%s%s %s(%s%s%s)%s has left %s%s"),
_("%s%s%s %s(%s%s%s)%s has left %s%s"),
weechat_prefix ("quit"),
IRC_COLOR_CHAT_NICK,
nick,
IRC_COLOR_CHAT_DELIMITERS,
@@ -1435,7 +1479,7 @@ irc_protocol_cmd_part (struct t_irc_server *server, char *irc_message, char *hos
}
/* part request was issued by local client ? */
if (strcmp (ptr_nick->nick, server->nick) == 0)
if (strcmp (ptr_nick->name, server->nick) == 0)
{
irc_nick_free_all (ptr_channel);
@@ -1630,10 +1674,6 @@ irc_protocol_reply_version (struct t_irc_server *server, struct t_irc_channel *c
nick);
}
}
if (version)
free (version);
if (date)
free (date);
//(void) plugin_msg_handler_exec (server->name,
// "weechat_ctcp",
// irc_message);
@@ -2451,7 +2491,8 @@ irc_protocol_cmd_quit (struct t_irc_server *server, char *irc_message, char *hos
{
pos = strchr (host, '!');
weechat_printf (ptr_channel->buffer,
_("%s%s %s(%s%s%s)%s has quit %s(%s%s%s)"),
_("%s%s%s %s(%s%s%s)%s has quit %s(%s%s%s)"),
weechat_prefix ("quit"),
IRC_COLOR_CHAT_NICK,
nick,
IRC_COLOR_CHAT_DELIMITERS,
@@ -4079,6 +4120,8 @@ irc_protocol_cmd_332 (struct t_irc_server *server, char *irc_message, char *host
if (ptr_channel->topic)
free (ptr_channel->topic);
ptr_channel->topic = strdup (pos2);
weechat_buffer_set (ptr_channel->buffer, "title",
ptr_channel->topic);
}
if (!ignore)
@@ -4092,9 +4135,6 @@ irc_protocol_cmd_332 (struct t_irc_server *server, char *irc_message, char *host
pos2,
IRC_COLOR_CHAT);
}
//if (ptr_channel)
// gui_chat_draw_title (ptr_buffer, 1);
}
}
else
@@ -4823,12 +4863,12 @@ irc_protocol_cmd_353 (struct t_irc_server *server, char *irc_message, char *host
if (!ignore && !ptr_channel)
{
/* display users on channel */
weechat_printf (ptr_buffer,
_("Nicks %s%s%s: %s["),
IRC_COLOR_CHAT_CHANNEL,
arguments,
IRC_COLOR_CHAT,
IRC_COLOR_CHAT_DELIMITERS);
//weechat_printf (ptr_buffer,
// _("Nicks %s%s%s: %s["),
// IRC_COLOR_CHAT_CHANNEL,
// arguments,
// IRC_COLOR_CHAT,
// IRC_COLOR_CHAT_DELIMITERS);
}
pos++;
@@ -4987,12 +5027,12 @@ irc_protocol_cmd_366 (struct t_irc_server *server, char *irc_message, char *host
if (!ignore)
{
/* display users on channel */
weechat_printf (ptr_channel->buffer,
_("Nicks %s%s%s: %s["),
IRC_COLOR_CHAT_CHANNEL,
ptr_channel->name,
IRC_COLOR_CHAT,
IRC_COLOR_CHAT_DELIMITERS);
//weechat_printf (ptr_channel->buffer,
// _("Nicks %s%s%s: %s["),
// IRC_COLOR_CHAT_CHANNEL,
// ptr_channel->name,
// IRC_COLOR_CHAT,
// IRC_COLOR_CHAT_DELIMITERS);
/*
for (ptr_nick = ptr_channel->nicks; ptr_nick; ptr_nick = ptr_nick->next_nick)
@@ -5004,8 +5044,8 @@ irc_protocol_cmd_366 (struct t_irc_server *server, char *irc_message, char *host
gui_chat_printf (ptr_channel->buffer, " ");
}
*/
weechat_printf (ptr_channel->buffer, "%s]",
IRC_COLOR_CHAT_DELIMITERS);
//weechat_printf (ptr_channel->buffer, "%s]",
// IRC_COLOR_CHAT_DELIMITERS);
/* display number of nicks, ops, halfops & voices on the channel */
irc_nick_count (ptr_channel, &num_nicks, &num_op, &num_halfop, &num_voice,
@@ -5047,12 +5087,12 @@ irc_protocol_cmd_366 (struct t_irc_server *server, char *irc_message, char *host
{
if (!ignore)
{
weechat_printf (server->buffer,
"%s%s%s: %s",
IRC_COLOR_CHAT_CHANNEL,
pos,
IRC_COLOR_CHAT,
pos2);
//weechat_printf (server->buffer,
// "%s%s%s: %s",
// IRC_COLOR_CHAT_CHANNEL,
// pos,
// IRC_COLOR_CHAT,
// pos2);
}
return WEECHAT_RC_OK;
}
@@ -5259,13 +5299,12 @@ irc_protocol_cmd_368 (struct t_irc_server *server, char *irc_message, char *host
*/
int
irc_protocol_cmd_432 (struct t_irc_server *server, char *irc_message, char *host,
char *nick, char *arguments, int ignore, int highlight)
irc_protocol_cmd_432 (struct t_irc_server *server, int argc, char **argv,
char **argv_eol, int ignore, int highlight)
{
/* Note: this IRC command can not be ignored */
irc_protocol_cmd_error (server, irc_message, host, nick, arguments,
ignore, highlight);
irc_protocol_cmd_error (server, argc, argv, argv_eol, ignore, highlight);
if (!server->is_connected)
{
@@ -5326,8 +5365,8 @@ irc_protocol_cmd_432 (struct t_irc_server *server, char *irc_message, char *host
*/
int
irc_protocol_cmd_433 (struct t_irc_server *server, char *irc_message, char *host,
char *nick, char *arguments, int ignore, int highlight)
irc_protocol_cmd_433 (struct t_irc_server *server, int argc, char **argv,
char **argv_eol, int ignore, int highlight)
{
/* Note: this IRC command can not be ignored */
@@ -5382,8 +5421,8 @@ irc_protocol_cmd_433 (struct t_irc_server *server, char *irc_message, char *host
irc_server_sendf (server, "NICK %s", server->nick);
}
else
return irc_protocol_cmd_error (server, irc_message, host, nick, arguments,
ignore, highlight);
return irc_protocol_cmd_error (server, argc, argv, argv_eol, ignore,
highlight);
return WEECHAT_RC_OK;
}
+9 -5
View File
@@ -25,19 +25,23 @@
typedef int (t_irc_recv_func)(struct t_irc_server *server, char *irc_message,
char *host, char *nick, char *arguments,
int ignore, int highlight);
typedef int (t_irc_recv_func2)(struct t_irc_server *server, int argc,
char **argv, char **argv_eol,
int ignore, int highlight);
struct t_irc_protocol_msg
{
char *name; /* IRC message name */
char *description; /* message description */
t_irc_recv_func *recv_function; /* function called when msg is received */
t_irc_recv_func2 *recv_function2; /* function called when msg is received */
};
extern int irc_protocol_is_highlight (char *, char *);
extern int irc_protocol_recv_command (struct t_irc_server *, char *, char *, char *, char *);
extern int irc_protocol_cmd_error (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_invite (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_join (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_error (struct t_irc_server *server, int argc, char **argv, char **argv_eol, int ignore, int highlight);
extern int irc_protocol_cmd_invite (struct t_irc_server *server, int argc, char **argv, char **argv_eol, int ignore, int highlight);
extern int irc_protocol_cmd_join (struct t_irc_server *server, int argc, char **argv, char **argv_eol, int ignore, int highlight);
extern int irc_protocol_cmd_kick (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_kill (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_mode (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
@@ -91,8 +95,8 @@ extern int irc_protocol_cmd_365 (struct t_irc_server *server, char *irc_message,
extern int irc_protocol_cmd_366 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_367 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_368 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_432 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_433 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_432 (struct t_irc_server *server, int argc, char **argv, char **argv_eol, int ignore, int highlight);
extern int irc_protocol_cmd_433 (struct t_irc_server *server, int argc, char **argv, char **argv_eol, int ignore, int highlight);
extern int irc_protocol_cmd_438 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
extern int irc_protocol_cmd_671 (struct t_irc_server *server, char *irc_message, char *host, char *nick, char *arguments, int ignore, int highlight);
+57 -36
View File
@@ -47,6 +47,7 @@
#include "irc.h"
#include "irc-server.h"
#include "irc-channel.h"
#include "irc-command.h"
#include "irc-config.h"
#include "irc-nick.h"
#include "irc-protocol.h"
@@ -632,18 +633,23 @@ irc_server_new (char *name, int autoconnect, int autoreconnect,
if (!name || !address || (port < 0))
return NULL;
#ifdef DEBUG
weechat_log_printf ("Creating new server (name:%s, address:%s, port:%d, pwd:%s, "
"nick1:%s, nick2:%s, nick3:%s, username:%s, realname:%s, "
"hostname: %s, command:%s, autojoin:%s, autorejoin:%s, "
"notify_levels:%s)",
name, address, port, (password) ? password : "",
(nick1) ? nick1 : "", (nick2) ? nick2 : "", (nick3) ? nick3 : "",
(username) ? username : "", (realname) ? realname : "",
(hostname) ? hostname : "", (command) ? command : "",
(autojoin) ? autojoin : "", (autorejoin) ? "on" : "off",
(notify_levels) ? notify_levels : "");
#endif
if (irc_debug)
{
weechat_log_printf ("Creating new server (name:%s, address:%s, "
"port:%d, pwd:%s, nick1:%s, nick2:%s, nick3:%s, "
"username:%s, realname:%s, hostname: %s, "
"command:%s, autojoin:%s, autorejoin:%s, "
"notify_levels:%s)",
name, address, port, (password) ? password : "",
(nick1) ? nick1 : "", (nick2) ? nick2 : "",
(nick3) ? nick3 : "", (username) ? username : "",
(realname) ? realname : "",
(hostname) ? hostname : "",
(command) ? command : "",
(autojoin) ? autojoin : "",
(autorejoin) ? "on" : "off",
(notify_levels) ? notify_levels : "");
}
if ((new_server = irc_server_alloc ()))
{
@@ -850,12 +856,13 @@ irc_server_send_one_msg (struct t_irc_server *server, char *message)
time_t time_now;
rc = 1;
#ifdef DEBUG
weechat_printf (server->buffer,
"[DEBUG] Sending to server >>> %s",
message);
#endif
if (irc_debug)
{
weechat_printf (server->buffer,
"[DEBUG] Sending to server >>> %s",
message);
}
/*new_msg = plugin_modifier_exec (PLUGIN_MODIFIER_IRC_OUT,
server->name,
message)
@@ -1169,11 +1176,12 @@ irc_server_msgq_flush ()
{
if (irc_recv_msgq->data)
{
#ifdef DEBUG
weechat_printf (irc_recv_msgq->server->buffer,
"[DEBUG] %s",
irc_recv_msgq->data);
#endif
if (irc_debug)
{
weechat_printf (irc_recv_msgq->server->buffer,
"[DEBUG] %s",
irc_recv_msgq->data);
}
ptr_data = irc_recv_msgq->data;
while (ptr_data[0] == ' ')
ptr_data++;
@@ -1182,11 +1190,12 @@ irc_server_msgq_flush ()
{
//gui_chat_printf_raw_data (irc_recv_msgq->server, 0, 0,
// ptr_data);
#ifdef DEBUG
weechat_printf (irc_recv_msgq->server->buffer,
"[DEBUG] data received from server: %s",
ptr_data);
#endif
if (irc_debug)
{
weechat_printf (irc_recv_msgq->server->buffer,
"[DEBUG] data received from server: %s",
ptr_data);
}
/*new_msg = plugin_modifier_exec (PLUGIN_MODIFIER_IRC_IN,
irc_recv_msgq->server->name,
ptr_data);*/
@@ -1293,7 +1302,7 @@ irc_server_recv_cb (void *arg_server)
static char buffer[4096 + 2];
int num_read;
if (!server)
return WEECHAT_RC_ERROR;
@@ -1319,7 +1328,7 @@ irc_server_recv_cb (void *arg_server)
weechat_prefix ("error"), "irc");
irc_server_disconnect (server, 1);
}
return WEECHAT_RC_OK;
}
@@ -1443,6 +1452,11 @@ irc_server_child_kill (struct t_irc_server *server)
void
irc_server_close_connection (struct t_irc_server *server)
{
if (server->hook_fd)
{
weechat_unhook (server->hook_fd);
server->hook_fd = NULL;
}
irc_server_child_kill (server);
/* close network socket */
@@ -1555,9 +1569,9 @@ irc_server_child_read (void *arg_server)
}
#endif
/* kill child and login to server */
weechat_unhook (server->hook_fd);
irc_server_child_kill (server);
irc_server_login (server);
weechat_unhook (server->hook_fd);
server->hook_fd = weechat_hook_fd (server->sock,
1, 0, 0,
irc_server_recv_cb,
@@ -2260,9 +2274,9 @@ irc_server_connect (struct t_irc_server *server, int disable_autojoin)
/* create socket and set options */
if (config_proxy_use)
server->sock = socket ((config_proxy_ipv6) ? AF_INET6 : AF_INET, SOCK_STREAM, 0);
server->sock = socket ((config_proxy_ipv6) ? AF_INET6 : AF_INET, SOCK_STREAM, 0);
else
server->sock = socket ((server->ipv6) ? AF_INET6 : AF_INET, SOCK_STREAM, 0);
server->sock = socket ((server->ipv6) ? AF_INET6 : AF_INET, SOCK_STREAM, 0);
if (server->sock == -1)
{
weechat_printf (server->buffer,
@@ -2473,8 +2487,8 @@ irc_server_autojoin_channels (struct t_irc_server *server)
else
{
/* auto-join when connecting to server for first time */
//if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
// irc_cmd_join_server (server, server->autojoin);
if (!server->disable_autojoin && server->autojoin && server->autojoin[0])
irc_command_join_server (server, server->autojoin);
}
server->disable_autojoin = 0;
@@ -2713,7 +2727,8 @@ void
irc_server_print_log ()
{
struct t_irc_server *ptr_server;
struct t_irc_channel *ptr_channel;
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
{
@@ -2774,5 +2789,11 @@ irc_server_print_log ()
weechat_log_printf (" last_channel. . . . : 0x%X", ptr_server->last_channel);
weechat_log_printf (" prev_server . . . . : 0x%X", ptr_server->prev_server);
weechat_log_printf (" next_server . . . . : 0x%X", ptr_server->next_server);
for (ptr_channel = ptr_server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
irc_channel_print_log (ptr_channel);
}
}
}
+23 -25
View File
@@ -45,9 +45,11 @@ char plugin_description[] = "IRC (Internet Relay Chat)";
struct t_weechat_plugin *weechat_irc_plugin = NULL;
struct t_hook *irc_hook_timer = NULL;
struct t_hook *irc_hook_timer = NULL;
struct t_hook *irc_hook_timer_check_away = NULL;
int irc_debug = 0;
#ifdef HAVE_GNUTLS
gnutls_certificate_credentials gnutls_xcred; /* gnutls client credentials */
#endif
@@ -60,10 +62,6 @@ gnutls_certificate_credentials gnutls_xcred; /* gnutls client credentials */
int
irc_dump_data_cb (void *data, char *signal, void *pointer)
{
struct t_irc_server *ptr_server;
struct t_irc_channel *ptr_channel;
struct t_irc_nick *ptr_nick;
/* make C compiler happy */
(void) data;
(void) signal;
@@ -72,23 +70,7 @@ irc_dump_data_cb (void *data, char *signal, void *pointer)
weechat_log_printf ("");
weechat_log_printf ("***** IRC plugin dump *****");
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
{
irc_server_print_log (ptr_server);
for (ptr_channel = ptr_server->channels; ptr_channel;
ptr_channel = ptr_channel->next_channel)
{
irc_channel_print_log (ptr_channel);
for (ptr_nick = ptr_channel->nicks; ptr_nick;
ptr_nick = ptr_nick->next_nick)
{
irc_nick_print_log (ptr_nick);
}
}
}
irc_server_print_log ();
//irc_dcc_print_log ();
@@ -120,7 +102,6 @@ irc_create_directories ()
free (dir1);
if (dir2)
free (dir2);
free (weechat_dir);
}
}
@@ -147,6 +128,22 @@ irc_quit_cb (void *data, char *signal, void *pointer)
return WEECHAT_RC_OK;
}
/*
* irc_debug_cb: callback for "debug" signal
*/
int
irc_debug_cb (void *data, char *signal, void *pointer)
{
/* make C compiler happy */
(void) data;
(void) signal;
if (weechat_strcasecmp ((char *)pointer, "irc") == 0)
irc_debug ^= 1;
return WEECHAT_RC_OK;
}
/*
* weechat_plugin_init: initialize IRC plugin
@@ -178,12 +175,13 @@ weechat_plugin_init (struct t_weechat_plugin *plugin)
weechat_hook_signal ("dump_data", &irc_dump_data_cb, NULL);
weechat_hook_signal ("config_reload", &irc_config_reload_cb, NULL);
weechat_hook_signal ("quit", &irc_quit_cb, NULL);
weechat_hook_signal ("debug", &irc_debug_cb, NULL);
/* hook completions */
irc_completion_init ();
//irc_server_auto_connect (1, 0);
irc_server_auto_connect (1, 0);
/*
irc_timer = weechat_hook_timer (1 * 1000, 0,
&irc_server_timer,
+3
View File
@@ -55,6 +55,7 @@
#define IRC_COLOR_CHAT_HIGHLIGHT weechat_color("color_chat_highlight")
#define IRC_COLOR_CHAT_HOST weechat_color("color_chat_host")
#define IRC_COLOR_CHAT_NICK weechat_color("color_chat_nick")
#define IRC_COLOR_CHAT_NICK_SELF weechat_color("color_chat_nick_self")
#define IRC_COLOR_CHAT_NICK_OTHER weechat_color("color_chat_nick_other")
#define IRC_COLOR_CHAT_SERVER weechat_color("color_chat_server")
#define IRC_COLOR_INFOBAR_HIGHLIGHT weechat_color("color_infobar_highlight")
@@ -67,6 +68,8 @@
extern struct t_weechat_plugin *weechat_irc_plugin;
extern struct t_hook *irc_hook_timer_check_away;
extern int irc_debug;
extern gnutls_certificate_credentials gnutls_xcred;
#endif /* irc.h */
-9
View File
@@ -147,7 +147,6 @@ logger_create_directory ()
}
else
rc = 0;
free (weechat_dir);
}
else
rc = 0;
@@ -226,10 +225,6 @@ logger_get_filename (struct t_gui_buffer *buffer)
}
}
if (dir_separator)
free (dir_separator);
if (weechat_dir)
free (weechat_dir);
if (log_path)
free (log_path);
if (log_path2)
@@ -267,8 +262,6 @@ logger_write_line (struct t_logger_buffer *logger_buffer, char *format, ...)
logger_buffer->log_filename);
free (logger_buffer->log_filename);
logger_buffer->log_filename = NULL;
if (charset)
free (charset);
return;
}
@@ -304,8 +297,6 @@ logger_write_line (struct t_logger_buffer *logger_buffer, char *format, ...)
fflush (logger_buffer->log_file);
if (message)
free (message);
if (charset)
free (charset);
}
}
+12 -48
View File
@@ -310,50 +310,48 @@ plugin_api_command (struct t_weechat_plugin *plugin,
/*
* plugin_api_info_get: get info about WeeChat
* WARNING: caller has to free string returned
* by this function after use
*/
char *
plugin_api_info_get (struct t_weechat_plugin *plugin, char *info)
{
time_t inactivity;
char *return_str;
static char keyboard_inactivity[32];
if (!plugin || !info)
return NULL;
if (string_strcasecmp (info, "version") == 0)
{
return strdup (PACKAGE_VERSION);
return PACKAGE_VERSION;
}
if (string_strcasecmp (info, "date") == 0)
{
return strdup (__DATE__);
return __DATE__;
}
else if (string_strcasecmp (info, "dir_separator") == 0)
{
return strdup (DIR_SEPARATOR);
return DIR_SEPARATOR;
}
else if (string_strcasecmp (info, "weechat_dir") == 0)
{
return strdup (weechat_home);
return weechat_home;
}
else if (string_strcasecmp (info, "weechat_libdir") == 0)
{
return strdup (WEECHAT_LIBDIR);
return WEECHAT_LIBDIR;
}
else if (string_strcasecmp (info, "weechat_sharedir") == 0)
{
return strdup (WEECHAT_SHAREDIR);
return WEECHAT_SHAREDIR;
}
else if (string_strcasecmp (info, "charset_terminal") == 0)
{
return strdup (local_charset);
return local_charset;
}
else if (string_strcasecmp (info, "charset_internal") == 0)
{
return strdup (WEECHAT_INTERNAL_CHARSET);
return WEECHAT_INTERNAL_CHARSET;
}
else if (string_strcasecmp (info, "inactivity") == 0)
{
@@ -361,43 +359,9 @@ plugin_api_info_get (struct t_weechat_plugin *plugin, char *info)
inactivity = 0;
else
inactivity = time (NULL) - gui_keyboard_last_activity_time;
return_str = (char *)malloc (32);
if (!return_str)
return NULL;
snprintf (return_str, 32, "%ld", (long int)inactivity);
return return_str;
}
else if (string_strcasecmp (info, "input") == 0)
{
if (gui_current_window->buffer->input)
{
return_str = string_iconv_from_internal (plugin->charset,
gui_current_window->buffer->input_buffer);
return (return_str) ? return_str : strdup ("");
}
else
return strdup ("");
}
else if (string_strcasecmp (info, "input_mask") == 0)
{
if (gui_current_window->buffer->input)
return strdup (gui_current_window->buffer->input_buffer_color_mask);
else
return strdup ("");
}
else if (string_strcasecmp (info, "input_pos") == 0)
{
if (gui_current_window->buffer->input)
{
return_str = (char *)malloc (32);
if (!return_str)
return NULL;
snprintf (return_str, 32, "%d",
gui_current_window->buffer->input_buffer_pos);
return return_str;
}
else
return strdup ("");
snprintf (keyboard_inactivity, sizeof (keyboard_inactivity),
"%ld", (long int)inactivity);
return keyboard_inactivity;
}
/* info not found */
+2 -1
View File
@@ -40,7 +40,8 @@ extern int plugin_api_config_set_plugin (struct t_weechat_plugin *plugin,
/* display */
extern char *plugin_api_prefix (char *prefix);
extern char *plugin_api_color (char *color_name);
extern void plugin_api_infobar_printf (int delay, char *color_name,
extern void plugin_api_infobar_printf (struct t_weechat_plugin *plugin,
int delay, char *color_name,
char *format, ...);
extern void plugin_api_infobar_remove (int how_many);
+9 -2
View File
@@ -238,6 +238,7 @@ plugin_load (char *filename)
new_plugin->list_search = &weelist_search;
new_plugin->list_casesearch = &weelist_casesearch;
new_plugin->list_get = &weelist_get;
new_plugin->list_set = &weelist_set;
new_plugin->list_next = &weelist_next;
new_plugin->list_prev = &weelist_prev;
new_plugin->list_string = &weelist_string;
@@ -289,8 +290,14 @@ plugin_load (char *filename)
new_plugin->buffer_close = &gui_buffer_close;
new_plugin->buffer_get = &gui_buffer_get;
new_plugin->buffer_set = &gui_buffer_set;
new_plugin->buffer_nick_add = &gui_nicklist_add;
new_plugin->buffer_nick_remove = &gui_nicklist_remove;
new_plugin->nicklist_add_group = &gui_nicklist_add_group;
new_plugin->nicklist_search_group = &gui_nicklist_search_group;
new_plugin->nicklist_add_nick = &gui_nicklist_add_nick;
new_plugin->nicklist_search_nick = &gui_nicklist_search_nick;
new_plugin->nicklist_remove_group = &gui_nicklist_remove_group;
new_plugin->nicklist_remove_nick = &gui_nicklist_remove_nick;
new_plugin->nicklist_remove_all = &gui_nicklist_remove_all;
new_plugin->command = &plugin_api_command;
+51 -8
View File
@@ -115,6 +115,7 @@ struct t_weechat_plugin
char *data);
struct t_weelist_item *(*list_get) (struct t_weelist *weelist,
int position);
void (*list_set) (struct t_weelist_item *item, char *new_value);
struct t_weelist_item *(*list_next) (struct t_weelist_item *item);
struct t_weelist_item *(*list_prev) (struct t_weelist_item *item);
char *(*list_string) (struct t_weelist_item *item);
@@ -176,7 +177,8 @@ struct t_weechat_plugin
void (*printf_date) (struct t_gui_buffer *buffer, time_t date,
char *message, ...);
void (*log_printf) (char *message, ...);
void (*infobar_printf) (int delay, char *color_name, char *format, ...);
void (*infobar_printf) (struct t_weechat_plugin *plugin, int delay,
char *color_name, char *format, ...);
void (*infobar_remove) (int how_many);
/* hooks */
@@ -238,11 +240,28 @@ struct t_weechat_plugin
void *(*buffer_get) (struct t_gui_buffer *buffer, char *property);
void (*buffer_set) (struct t_gui_buffer *buffer, char *property,
char *value);
struct t_gui_nick *(*buffer_nick_add) (struct t_gui_buffer *buffer,
char *nick, int sort_index,
char *color_nick, char prefix,
char *color_prefix);
int (*buffer_nick_remove) (struct t_gui_buffer *buffer, char *nick);
/* nicklist */
struct t_gui_nick_group *(*nicklist_add_group) (struct t_gui_buffer *buffer,
struct t_gui_nick_group *parent_group,
char *name, char *color,
int visible);
struct t_gui_nick_group *(*nicklist_search_group) (struct t_gui_buffer *buffer,
struct t_gui_nick_group *from_group,
char *name);
struct t_gui_nick *(*nicklist_add_nick) (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group,
char *name, char *color,
char prefix, char *prefix_color,
int visible);
struct t_gui_nick *(*nicklist_search_nick) (struct t_gui_buffer *buffer,
struct t_gui_nick_group *from_group,
char *name);
void (*nicklist_remove_group) (struct t_gui_buffer *buffer,
struct t_gui_nick_group *group);
void (*nicklist_remove_nick) (struct t_gui_buffer *buffer,
struct t_gui_nick *nick);
void (*nicklist_remove_all) (struct t_gui_buffer *buffer);
/* command */
void (*command) (struct t_weechat_plugin *plugin,
@@ -356,6 +375,8 @@ struct t_weechat_plugin
weechat_plugin->list_casesearch(__list, __string)
#define weechat_list_get(__list, __index) \
weechat_plugin->list_get(__list, __index)
#define weechat_list_set(__item, __new_value) \
weechat_plugin->list_set(__item, __new_value)
#define weechat_list_next(__item) \
weechat_plugin->list_next(__item)
#define weechat_list_prev(__item) \
@@ -434,8 +455,8 @@ struct t_weechat_plugin
weechat_plugin->log_printf(__message, ##__argz)
#define weechat_infobar_printf(__delay, __color_name, __message, \
__argz...) \
weechat_plugin->infobar_printf(__delay, __color_name, __message, \
##__argz)
weechat_plugin->infobar_printf(weechat_plugin, __delay, \
__color_name, __message, ##__argz)
#define weechat_infobar_remove(__how_many) \
weechat_plugin->infobar_remove(__how_many)
@@ -491,6 +512,28 @@ struct t_weechat_plugin
#define weechat_buffer_set(__buffer, __property, __value) \
weechat_plugin->buffer_set(__buffer, __property, __value)
/* nicklist */
#define weechat_nicklist_add_group(__buffer, __parent_group, __name, \
__color, __visible) \
weechat_plugin->nicklist_add_group(__buffer, __parent_group, \
__name, __color, __visible)
#define weechat_nicklist_search_group(__buffer, __from_group, __name) \
weechat_plugin->nicklist_search_group(__buffer, __from_group, \
__name)
#define weechat_nicklist_add_nick(__buffer, __group, __name, __color, \
__prefix, __prefix_color, __visible) \
weechat_plugin->nicklist_add_nick(__buffer, __group, __name, \
__color, __prefix, __prefix_color, \
__visible)
#define weechat_nicklist_search_nick(__buffer, __from_group, __name) \
weechat_plugin->nicklist_search_nick(__buffer, __from_group, __name)
#define weechat_nicklist_remove_group(__buffer, __group) \
weechat_plugin->nicklist_remove_group(__buffer, __group)
#define weechat_nicklist_remove_nick(__buffer, __nick) \
weechat_plugin->nicklist_remove_nick(__buffer, __nick)
#define weechat_nicklist_remove_all(__buffer) \
weechat_plugin->nicklist_remove_all(__buffer)
/* command */
#define weechat_command(__buffer, __command) \
weechat_plugin->command(weechat_plugin, __buffer, __command)