diff options
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/irc/irc-command.c | 70 | ||||
-rw-r--r-- | src/plugins/irc/irc-ignore.c | 15 | ||||
-rw-r--r-- | src/plugins/irc/irc-ignore.h | 1 | ||||
-rw-r--r-- | src/plugins/plugin.c | 1 | ||||
-rw-r--r-- | src/plugins/weechat-plugin.h | 3 |
5 files changed, 64 insertions, 26 deletions
diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index ee7a42ed0..417554955 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -1303,6 +1303,27 @@ irc_command_halfop (void *data, struct t_gui_buffer *buffer, int argc, } /* + * irc_command_ignore_display: display a ignore + */ + +void +irc_command_ignore_display (struct t_irc_ignore *ignore) +{ + weechat_printf (NULL, + _(" %s[%s%d%s]%s mask: %s / server: %s / channel: %s"), + IRC_COLOR_CHAT_DELIMITERS, + IRC_COLOR_CHAT, + ignore->number, + IRC_COLOR_CHAT_DELIMITERS, + IRC_COLOR_CHAT, + ignore->mask, + (ignore->server) ? + ignore->server : "*", + (ignore->channel) ? + ignore->channel : "*"); +} + +/* * irc_command_ignore: add or remove ignore */ @@ -1310,9 +1331,8 @@ int irc_command_ignore (void *data, struct t_gui_buffer *buffer, int argc, char **argv, char **argv_eol) { - int i; struct t_irc_ignore *ptr_ignore; - char *mask, *server, *channel, *error; + char *mask, *regex, *ptr_regex, *server, *channel, *error; long number; /* make C compiler happy */ @@ -1328,23 +1348,10 @@ irc_command_ignore (void *data, struct t_gui_buffer *buffer, int argc, { weechat_printf (NULL, ""); weechat_printf (NULL, _("%s: ignore list:"), IRC_PLUGIN_NAME); - i = 0; for (ptr_ignore = irc_ignore_list; ptr_ignore; ptr_ignore = ptr_ignore->next_ignore) { - i++; - weechat_printf (NULL, - _(" %s[%s%d%s]%s mask: %s / server: %s / channel: %s"), - IRC_COLOR_CHAT_DELIMITERS, - IRC_COLOR_CHAT, - i, - IRC_COLOR_CHAT_DELIMITERS, - IRC_COLOR_CHAT, - ptr_ignore->mask, - (ptr_ignore->server) ? - ptr_ignore->server : "*", - (ptr_ignore->channel) ? - ptr_ignore->channel : "*"); + irc_command_ignore_display (ptr_ignore); } } else @@ -1370,7 +1377,18 @@ irc_command_ignore (void *data, struct t_gui_buffer *buffer, int argc, server = (argc > 3) ? argv[3] : NULL; channel = (argc > 4) ? argv[4] : NULL; - if (irc_ignore_search (mask, server, channel)) + if (strncmp (mask, "re:", 3) == 0) + { + regex = NULL; + ptr_regex = mask + 3; + } + else + { + regex = weechat_string_mask_to_regex (mask); + ptr_regex = (regex) ? regex : mask; + } + + if (irc_ignore_search (ptr_regex, server, channel)) { weechat_printf (NULL, _("%s%s: ignore already exists"), @@ -1378,9 +1396,16 @@ irc_command_ignore (void *data, struct t_gui_buffer *buffer, int argc, return WEECHAT_RC_ERROR; } - if (irc_ignore_new (mask, server, channel)) + ptr_ignore = irc_ignore_new (ptr_regex, server, channel); + + if (regex) + free (regex); + + if (ptr_ignore) { - weechat_printf (NULL, _("%s: ignore added"), IRC_PLUGIN_NAME); + weechat_printf (NULL, ""); + weechat_printf (NULL, _("%s: ignore added:"), IRC_PLUGIN_NAME); + irc_command_ignore_display (ptr_ignore); } else { @@ -3845,7 +3870,7 @@ irc_command_init () NULL, &irc_command_halfop, NULL); weechat_hook_command ("ignore", N_("ignore nicks/hosts from servers or channels"), - N_("[list] | [add nick/host [server [channel]]] | " + N_("[list] | [add [re:]nick/host [server [channel]]] | " "[del number|-all]"), N_(" list: list all ignore\n" " add: add a ignore\n" @@ -3853,8 +3878,9 @@ irc_command_init () " number: number of ignore to delete (look at " "list to find it)\n" " -all: delete all ignore\n" - "nick/host: nick or host to ignore (regular " - "expression allowed)\n" + "nick/host: nick or host to ignore: syntax is " + "\"re:regex\" or \"mask\" (a mask is a string with " + "some \"*\" to replace one or more chars)\n" " server: internal server name where ignore " "is working\n" " channel: channel name where ignore is " diff --git a/src/plugins/irc/irc-ignore.c b/src/plugins/irc/irc-ignore.c index d69b05edf..f4434d3e9 100644 --- a/src/plugins/irc/irc-ignore.c +++ b/src/plugins/irc/irc-ignore.c @@ -96,15 +96,12 @@ struct t_irc_ignore * irc_ignore_search_by_number (int number) { struct t_irc_ignore *ptr_ignore; - int i; - i = 1; for (ptr_ignore = irc_ignore_list; ptr_ignore; ptr_ignore = ptr_ignore->next_ignore) { - if (i == number) + if (ptr_ignore->number == number) return ptr_ignore; - i++; } /* ignore not found */ @@ -137,6 +134,7 @@ irc_ignore_new (const char *mask, const char *server, const char *channel) new_ignore = malloc (sizeof (*new_ignore)); if (new_ignore) { + new_ignore->number = (last_irc_ignore) ? last_irc_ignore->number + 1 : 1; new_ignore->mask = strdup (mask); new_ignore->regex_mask = regex; new_ignore->server = (server) ? strdup (server) : strdup ("*"); @@ -212,9 +210,18 @@ irc_ignore_check (struct t_irc_server *server, struct t_irc_channel *channel, void irc_ignore_free (struct t_irc_ignore *ignore) { + struct t_irc_ignore *ptr_ignore; + weechat_hook_signal_send ("irc_ignore_removing", WEECHAT_HOOK_SIGNAL_POINTER, ignore); + /* decrement number for all ignore after this one */ + for (ptr_ignore = ignore->next_ignore; ptr_ignore; + ptr_ignore = ptr_ignore->next_ignore) + { + ptr_ignore->number--; + } + /* free data */ if (ignore->mask) free (ignore->mask); diff --git a/src/plugins/irc/irc-ignore.h b/src/plugins/irc/irc-ignore.h index ba9ac7c55..660b80bc4 100644 --- a/src/plugins/irc/irc-ignore.h +++ b/src/plugins/irc/irc-ignore.h @@ -27,6 +27,7 @@ struct t_irc_channel; struct t_irc_ignore { + int number; /* ignore number */ char *mask; /* nick / host mask */ regex_t *regex_mask; /* regex for mask */ char *server; /* server name */ diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index e4a34cd82..07df6adee 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -312,6 +312,7 @@ plugin_load (const char *filename) new_plugin->string_remove_quotes = &string_remove_quotes; new_plugin->string_strip = &string_strip; new_plugin->string_has_highlight = &string_has_highlight; + new_plugin->string_mask_to_regex = &string_mask_to_regex; new_plugin->string_explode = &string_explode; new_plugin->string_free_exploded = &string_free_exploded; new_plugin->string_split_command = &string_split_command; diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index 6a63fd4ae..d88609547 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -146,6 +146,7 @@ struct t_weechat_plugin const char *chars); int (*string_has_highlight) (const char *string, const char *highlight_words); + char *(*string_mask_to_regex) (const char *mask); char **(*string_explode) (const char *string, const char *separators, int keep_eol, int num_items_max, int *num_items); void (*string_free_exploded) (char **exploded_string); @@ -616,6 +617,8 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); weechat_plugin->string_strip(__string, __left, __right, __chars) #define weechat_string_has_highlight(__string, __highlight_words) \ weechat_plugin->string_has_highlight(__string, __highlight_words) +#define weechat_string_mask_to_regex(__mask) \ + weechat_plugin->string_mask_to_regex(__mask) #define weechat_string_explode(__string, __separator, __eol, __max, \ __num_items) \ weechat_plugin->string_explode(__string, __separator, __eol, \ |