]> jfr.im git - irc/weechat/weechat.git/commitdiff
core: allow wildcard in command `/filter` (issue #1956)
authorSébastien Helleu <redacted>
Fri, 13 Oct 2023 19:46:22 +0000 (21:46 +0200)
committerSébastien Helleu <redacted>
Sun, 15 Oct 2023 14:18:02 +0000 (16:18 +0200)
A mask with wildcards is now allowed in the following commands:

- `/filter enable`
- `/filter disable`
- `/filter toggle`
- `/filter del`

src/core/wee-command.c

index 7520570a78e46a862ad1fd36587e8c04515aa186..9d7ae3273c1884e241311202bc37fec784fdd5cb 100644 (file)
@@ -2488,8 +2488,8 @@ command_filter_display (struct t_gui_filter *filter)
 
 COMMAND_CALLBACK(filter)
 {
-    struct t_gui_filter *ptr_filter;
-    char str_command[4096], str_pos[16];
+    struct t_gui_filter *ptr_filter, *ptr_next_filter;
+    char str_command[4096], str_pos[16], *name;
     int i, update;
 
     /* make C compiler happy */
@@ -2530,42 +2530,37 @@ COMMAND_CALLBACK(filter)
     {
         if (argc > 2)
         {
-            if (strcmp (argv[2], "@") == 0)
-            {
-                /* enable filters in buffer */
-                if (!buffer->filter)
-                {
-                    buffer->filter = 1;
-                    gui_filter_buffer (buffer, NULL);
-                    (void) hook_signal_send (
-                        "buffer_filters_enabled",
-                        WEECHAT_HOOK_SIGNAL_POINTER, buffer);
-                }
-            }
-            else
+            for (i = 2; i < argc; i++)
             {
-                /* enable a filter */
-                ptr_filter = gui_filter_search_by_name (argv[2]);
-                if (ptr_filter)
+                if (strcmp (argv[i], "@") == 0)
                 {
-                    if (!ptr_filter->enabled)
+                    /* enable filters in buffer */
+                    if (!buffer->filter)
                     {
-                        ptr_filter->enabled = 1;
-                        gui_filter_all_buffers (ptr_filter);
-                        gui_chat_printf_date_tags (NULL, 0,
-                                                   GUI_FILTER_TAG_NO_FILTER,
-                                                   _("Filter \"%s\" enabled"),
-                                                   ptr_filter->name);
+                        buffer->filter = 1;
+                        gui_filter_buffer (buffer, NULL);
+                        (void) hook_signal_send (
+                            "buffer_filters_enabled",
+                            WEECHAT_HOOK_SIGNAL_POINTER, buffer);
                     }
                 }
                 else
                 {
-                    gui_chat_printf_date_tags (NULL, 0,
-                                               GUI_FILTER_TAG_NO_FILTER,
-                                               _("%sFilter \"%s\" not found"),
-                                               gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
-                                               argv[2]);
-                    return WEECHAT_RC_OK;
+                    for (ptr_filter = gui_filters; ptr_filter;
+                         ptr_filter = ptr_filter->next_filter)
+                    {
+                        if (!ptr_filter->enabled
+                            && string_match (ptr_filter->name, argv[i], 1))
+                        {
+                            /* enable a filter */
+                            ptr_filter->enabled = 1;
+                            gui_filter_all_buffers (ptr_filter);
+                            gui_chat_printf_date_tags (NULL, 0,
+                                                       GUI_FILTER_TAG_NO_FILTER,
+                                                       _("Filter \"%s\" enabled"),
+                                                       ptr_filter->name);
+                        }
+                    }
                 }
             }
         }
@@ -2587,42 +2582,37 @@ COMMAND_CALLBACK(filter)
     {
         if (argc > 2)
         {
-            if (strcmp (argv[2], "@") == 0)
-            {
-                /* disable filters in buffer */
-                if (buffer->filter)
-                {
-                    buffer->filter = 0;
-                    gui_filter_buffer (buffer, NULL);
-                    (void) hook_signal_send (
-                        "buffer_filters_disabled",
-                        WEECHAT_HOOK_SIGNAL_POINTER, buffer);
-                }
-            }
-            else
+            for (i = 2; i < argc; i++)
             {
-                /* disable a filter */
-                ptr_filter = gui_filter_search_by_name (argv[2]);
-                if (ptr_filter)
+                if (strcmp (argv[i], "@") == 0)
                 {
-                    if (ptr_filter->enabled)
+                    /* disable filters in buffer */
+                    if (buffer->filter)
                     {
-                        ptr_filter->enabled = 0;
-                        gui_filter_all_buffers (ptr_filter);
-                        gui_chat_printf_date_tags (NULL, 0,
-                                                   GUI_FILTER_TAG_NO_FILTER,
-                                                   _("Filter \"%s\" disabled"),
-                                                   ptr_filter->name);
+                        buffer->filter = 0;
+                        gui_filter_buffer (buffer, NULL);
+                        (void) hook_signal_send (
+                            "buffer_filters_disabled",
+                            WEECHAT_HOOK_SIGNAL_POINTER, buffer);
                     }
                 }
                 else
                 {
-                    gui_chat_printf_date_tags (NULL, 0,
-                                               GUI_FILTER_TAG_NO_FILTER,
-                                               _("%sFilter \"%s\" not found"),
-                                               gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
-                                               argv[2]);
-                    return WEECHAT_RC_OK;
+                    for (ptr_filter = gui_filters; ptr_filter;
+                         ptr_filter = ptr_filter->next_filter)
+                    {
+                        if (ptr_filter->enabled
+                            && string_match (ptr_filter->name, argv[i], 1))
+                        {
+                            /* disable a filter */
+                            ptr_filter->enabled = 0;
+                            gui_filter_all_buffers (ptr_filter);
+                            gui_chat_printf_date_tags (NULL, 0,
+                                                       GUI_FILTER_TAG_NO_FILTER,
+                                                       _("Filter \"%s\" disabled"),
+                                                       ptr_filter->name);
+                        }
+                    }
                 }
             }
         }
@@ -2644,33 +2634,37 @@ COMMAND_CALLBACK(filter)
     {
         if (argc > 2)
         {
-            if (strcmp (argv[2], "@") == 0)
-            {
-                /* toggle filters in buffer */
-                buffer->filter ^= 1;
-                gui_filter_buffer (buffer, NULL);
-                (void) hook_signal_send (
-                    (buffer->filter) ?
-                    "buffer_filters_enabled" : "buffer_filters_disabled",
-                    WEECHAT_HOOK_SIGNAL_POINTER, buffer);
-            }
-            else
+            for (i = 2; i < argc; i++)
             {
-                /* toggle a filter */
-                ptr_filter = gui_filter_search_by_name (argv[2]);
-                if (ptr_filter)
+                if (strcmp (argv[i], "@") == 0)
                 {
-                    ptr_filter->enabled ^= 1;
-                    gui_filter_all_buffers (ptr_filter);
+                    /* toggle filters in buffer */
+                    buffer->filter ^= 1;
+                    gui_filter_buffer (buffer, NULL);
+                    (void) hook_signal_send (
+                        (buffer->filter) ?
+                        "buffer_filters_enabled" : "buffer_filters_disabled",
+                        WEECHAT_HOOK_SIGNAL_POINTER, buffer);
                 }
                 else
                 {
-                    gui_chat_printf_date_tags (NULL, 0,
-                                               GUI_FILTER_TAG_NO_FILTER,
-                                               _("%sFilter \"%s\" not found"),
-                                               gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
-                                               argv[2]);
-                    return WEECHAT_RC_OK;
+                    for (ptr_filter = gui_filters; ptr_filter;
+                         ptr_filter = ptr_filter->next_filter)
+                    {
+                        if (string_match (ptr_filter->name, argv[i], 1))
+                        {
+                            /* toggle a filter */
+                            ptr_filter->enabled ^= 1;
+                            gui_filter_all_buffers (ptr_filter);
+                            gui_chat_printf_date_tags (
+                                NULL, 0,
+                                GUI_FILTER_TAG_NO_FILTER,
+                                (ptr_filter->enabled) ?
+                                _("Filter \"%s\" enabled") :
+                                _("Filter \"%s\" disabled"),
+                                ptr_filter->name);
+                        }
+                    }
                 }
             }
         }
@@ -2793,45 +2787,27 @@ COMMAND_CALLBACK(filter)
     if (string_strcmp (argv[1], "del") == 0)
     {
         COMMAND_MIN_ARGS(3, "del");
-        if (string_strcmp (argv[2], "-all") == 0)
-        {
-            if (gui_filters)
-            {
-                gui_filter_free_all ();
-                gui_filter_all_buffers (NULL);
-                gui_chat_printf_date_tags (NULL, 0, GUI_FILTER_TAG_NO_FILTER,
-                                           _("All filters have been deleted"));
-            }
-            else
-            {
-                gui_chat_printf_date_tags (NULL, 0, GUI_FILTER_TAG_NO_FILTER,
-                                           _("No message filter defined"));
-            }
-        }
-        else
+        for (i = 2; i < argc; i++)
         {
-            for (i = 2; i < argc; i++)
+            ptr_filter = gui_filters;
+            while (ptr_filter)
             {
-                ptr_filter = gui_filter_search_by_name (argv[i]);
-                if (ptr_filter)
+                ptr_next_filter = ptr_filter->next_filter;
+                if (string_match (ptr_filter->name, argv[i], 1))
                 {
                     /* disable filter and apply before removing it */
+                    name = strdup (ptr_filter->name);
                     ptr_filter->enabled = 0;
                     gui_filter_all_buffers (ptr_filter);
                     gui_filter_free (ptr_filter);
                     gui_chat_printf_date_tags (
                         NULL, 0, GUI_FILTER_TAG_NO_FILTER,
                         _("Filter \"%s\" deleted"),
-                        argv[i]);
-                }
-                else
-                {
-                    gui_chat_printf_date_tags (
-                        NULL, 0, GUI_FILTER_TAG_NO_FILTER,
-                        _("%sFilter \"%s\" not found"),
-                        gui_chat_prefix[GUI_CHAT_PREFIX_ERROR],
-                        argv[i]);
+                        name);
+                    if (name)
+                        free (name);
                 }
+                ptr_filter = ptr_next_filter;
             }
         }
         return WEECHAT_RC_OK;
@@ -8463,23 +8439,23 @@ command_init ()
            "regex"),
         /* TRANSLATORS: only text between angle brackets (eg: "<name>") must be translated */
         N_("list"
-           " || enable|disable|toggle [<name>|@]"
+           " || enable|disable|toggle [<name>|<mask>|@ [<name>|<mask>|@...]]"
            " || add|addreplace <name> <buffer>[,<buffer>...] <tags> <regex>"
            " || rename <name> <new_name>"
            " || recreate <name>"
-           " || del <name>|-all [<name>...]"),
+           " || del <name>|<mask> [<name>|<mask>...]"),
         N_("      list: list all filters\n"
            "    enable: enable filters (filters are enabled by default)\n"
            "   disable: disable filters\n"
            "    toggle: toggle filters\n"
-           "      name: filter name (\"@\" = enable/disable all filters in "
-           "current buffer)\n"
+           "      mask: name where wildcard \"*\" is allowed "
+           "(\"@\" = enable/disable all filters in current buffer)\n"
            "       add: add a filter\n"
            "addreplace: add or replace an existing filter\n"
+           "      name: filter name\n"
            "    rename: rename a filter\n"
            "  recreate: set input with the command used to edit the filter\n"
-           "       del: delete a filter\n"
-           "      -all: delete all filters\n"
+           "       del: delete filters\n"
            "    buffer: comma separated list of buffers where filter "
            "is active:\n"
            "            - this is full name including plugin (example: \"irc."
@@ -8540,13 +8516,13 @@ command_init ()
            "all buffers:\n"
            "    /filter add sucks2 * * (?-i)^WeeChat sucks$"),
         "list"
-        " || enable %(filters_names_disabled)|@"
-        " || disable %(filters_names_enabled)|@"
-        " || toggle %(filters_names)|@"
+        " || enable %(filters_names_disabled)|@|%+"
+        " || disable %(filters_names_enabled)|@|%+"
+        " || toggle %(filters_names)|@|%+"
         " || add|addreplace %(filters_names) %(buffers_plugins_names)|*"
         " || rename %(filters_names) %(filters_names)"
         " || recreate %(filters_names)"
-        " || del %(filters_names)|-all %(filters_names)|%*",
+        " || del %(filters_names)|%*",
         &command_filter, NULL, NULL);
     hook_command (
         NULL, "help",