summaryrefslogtreecommitdiff
path: root/src/plugins/trigger/trigger-command.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/trigger/trigger-command.c')
-rw-r--r--src/plugins/trigger/trigger-command.c352
1 files changed, 352 insertions, 0 deletions
diff --git a/src/plugins/trigger/trigger-command.c b/src/plugins/trigger/trigger-command.c
new file mode 100644
index 000000000..a38ffcc28
--- /dev/null
+++ b/src/plugins/trigger/trigger-command.c
@@ -0,0 +1,352 @@
+/*
+ * trigger-command.c - trigger command
+ *
+ * Copyright (C) 2014 Sébastien Helleu <flashcode@flashtux.org>
+ *
+ * This file is part of WeeChat, the extensible chat client.
+ *
+ * WeeChat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * WeeChat is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with WeeChat. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "../weechat-plugin.h"
+#include "trigger.h"
+#include "trigger-buffer.h"
+#include "trigger-config.h"
+
+
+/*
+ * Callback for command "/trigger": manage triggers.
+ */
+
+int
+trigger_command_trigger (void *data, struct t_gui_buffer *buffer, int argc,
+ char **argv, char **argv_eol)
+{
+ struct t_trigger *ptr_trigger;
+ const char *option;
+ int i, type, count, index_option, enabled;
+
+ /* make C compiler happy */
+ (void) data;
+ (void) buffer;
+
+ /* list all triggers */
+ if ((argc == 1)
+ || ((argc == 2) && (weechat_strcasecmp (argv[1], "list") == 0)))
+ {
+ if (triggers)
+ {
+ weechat_printf_tags (NULL, "no_trigger", "");
+ weechat_printf_tags (NULL, "no_trigger", _("List of triggers:"));
+ for (ptr_trigger = triggers; ptr_trigger;
+ ptr_trigger = ptr_trigger->next_trigger)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ " %s: %s, \"%s\" (%d hooks, %d/%d) %s",
+ ptr_trigger->name,
+ weechat_config_string (ptr_trigger->options[TRIGGER_OPTION_HOOK]),
+ weechat_config_string (ptr_trigger->options[TRIGGER_OPTION_ARGUMENTS]),
+ ptr_trigger->hooks_count,
+ ptr_trigger->hook_count_cb,
+ ptr_trigger->hook_count_cmd,
+ weechat_config_boolean (ptr_trigger->options[TRIGGER_OPTION_ENABLED]) ?
+ "" : _("(disabled)"));
+ option = weechat_config_string (ptr_trigger->options[TRIGGER_OPTION_CONDITIONS]);
+ if (option && option[0])
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ " conditions: \"%s\"", option);
+ }
+ if (ptr_trigger->regex_count > 0)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ " %d regex:",
+ ptr_trigger->regex_count);
+ for (i = 0; i < ptr_trigger->regex_count; i++)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ " %d: %s%s %s-->%s %s",
+ i + 1,
+ weechat_color (weechat_config_string (trigger_config_color_regex)),
+ ptr_trigger->regex[i].str_regex,
+ weechat_color ("chat_delimiters"),
+ weechat_color (weechat_config_string (trigger_config_color_replace)),
+ ptr_trigger->regex[i].replace);
+ }
+ }
+ option = weechat_config_string (ptr_trigger->options[TRIGGER_OPTION_COMMAND]);
+ if (option && option[0])
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ " command: \"%s\"", option);
+ }
+ }
+ }
+ else
+ {
+ weechat_printf_tags (NULL, "no_trigger", _("No trigger defined"));
+ }
+ return WEECHAT_RC_OK;
+ }
+
+ /* add a trigger */
+ if (weechat_strcasecmp (argv[1], "add") == 0)
+ {
+ if (argc < 4)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sError: missing arguments for \"%s\" "
+ "command"),
+ weechat_prefix ("error"), "trigger");
+ return WEECHAT_RC_OK;
+ }
+ type = trigger_search_hook_type (argv[3]);
+ if (type < 0)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%s%s: invalid hook type \"%s\""),
+ weechat_prefix ("error"), TRIGGER_PLUGIN_NAME,
+ argv[3]);
+ return WEECHAT_RC_OK;
+ }
+ ptr_trigger = trigger_alloc (argv[2]);
+ if (!ptr_trigger)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%s%s: error creating trigger \"%s\""),
+ weechat_prefix ("error"), TRIGGER_PLUGIN_NAME,
+ argv[2]);
+ return WEECHAT_RC_OK;
+ }
+ if (trigger_new (argv[2], "on", argv[3],
+ (argc > 4) ? argv_eol[4] : "",
+ "", "", "", "ok"))
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("Trigger \"%s\" created"), argv[2]);
+ }
+ else
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sError: failed to create trigger \"%s\""),
+ weechat_prefix ("error"), argv[2]);
+ }
+ return WEECHAT_RC_OK;
+ }
+
+ /* set option in a trigger */
+ if (weechat_strcasecmp (argv[1], "set") == 0)
+ {
+ if (argc < 5)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sError: missing arguments for \"%s\" "
+ "command"),
+ weechat_prefix ("error"), "trigger");
+ return WEECHAT_RC_OK;
+ }
+ ptr_trigger = trigger_search (argv[2]);
+ if (!ptr_trigger)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sTrigger \"%s\" not found"),
+ weechat_prefix ("error"), argv[2]);
+ return WEECHAT_RC_OK;
+ }
+ if (weechat_strcasecmp (argv[3], "name") == 0)
+ {
+ trigger_rename (ptr_trigger, argv_eol[4]);
+ }
+ else
+ {
+ index_option = trigger_search_option (argv[3]);
+ if (index_option < 0)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sTrigger option \"%s\" not found"),
+ weechat_prefix ("error"), argv[3]);
+ return WEECHAT_RC_OK;
+ }
+ weechat_config_option_set (ptr_trigger->options[index_option],
+ argv_eol[4], 1);
+ }
+ weechat_printf_tags (NULL, "no_trigger",
+ _("Trigger \"%s\" updated"), ptr_trigger->name);
+ return WEECHAT_RC_OK;
+ }
+
+ /* delete a trigger */
+ if (weechat_strcasecmp (argv[1], "del") == 0)
+ {
+ if (argc < 3)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sError: missing arguments for \"%s\" "
+ "command"),
+ weechat_prefix ("error"), "trigger");
+ return WEECHAT_RC_OK;
+ }
+ if (weechat_strcasecmp (argv[2], "-all") == 0)
+ {
+ count = triggers_count;
+ trigger_free_all ();
+ if (count > 0)
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%d triggers removed"), count);
+ }
+ else
+ {
+ for (i = 2; i < argc; i++)
+ {
+ ptr_trigger = trigger_search (argv[i]);
+ if (ptr_trigger)
+ {
+ trigger_free (ptr_trigger);
+ weechat_printf_tags (NULL, "no_trigger",
+ _("Trigger \"%s\" removed"), argv[i]);
+ }
+ else
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sTrigger \"%s\" not found"),
+ weechat_prefix ("error"), argv[i]);
+ }
+ }
+ }
+ return WEECHAT_RC_OK;
+ }
+
+ /* enable/disable/toggle a trigger */
+ if ((weechat_strcasecmp (argv[1], "enable") == 0)
+ || (weechat_strcasecmp (argv[1], "disable") == 0)
+ || (weechat_strcasecmp (argv[1], "toggle") == 0))
+ {
+ if (argc < 3)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sError: missing arguments for \"%s\" "
+ "command"),
+ weechat_prefix ("error"), "trigger");
+ return WEECHAT_RC_OK;
+ }
+ ptr_trigger = trigger_search (argv[2]);
+ if (!ptr_trigger)
+ {
+ weechat_printf_tags (NULL, "no_trigger",
+ _("%sTrigger \"%s\" not found"),
+ weechat_prefix ("error"), argv[2]);
+ return WEECHAT_RC_OK;
+ }
+ if (weechat_strcasecmp (argv[1], "enable") == 0)
+ enabled = 1;
+ else if (weechat_strcasecmp (argv[1], "disable") == 0)
+ enabled = 0;
+ else
+ {
+ enabled = weechat_config_boolean (ptr_trigger->options[TRIGGER_OPTION_ENABLED]) ?
+ 0 : 1;
+ }
+ weechat_config_option_set (ptr_trigger->options[TRIGGER_OPTION_ENABLED],
+ (enabled) ? "on" : "off", 1);
+ weechat_printf_tags (NULL, "no_trigger",
+ (enabled) ?
+ _("Trigger \"%s\" enabled") :
+ _("Trigger \"%s\" disabled"),
+ ptr_trigger->name);
+ return WEECHAT_RC_OK;
+ }
+
+ /* open the trigger monitor buffer */
+ if (weechat_strcasecmp (argv[1], "monitor") == 0)
+ {
+ trigger_buffer_open (1);
+ return WEECHAT_RC_OK;
+ }
+
+ return WEECHAT_RC_OK;
+}
+
+/*
+ * Hooks trigger commands.
+ */
+
+void
+trigger_command_init ()
+{
+ weechat_hook_command (
+ "trigger",
+ N_("manage triggers"),
+ N_("list"
+ " || add <name> <hook> [<arguments>]"
+ " || set <name> <option> <value>"
+ " || del <name>|-all [<name>...]"
+ " || enable|disable|toggle <name>"
+ " || monitor"),
+ N_(" add: add a trigger\n"
+ " name: name of trigger\n"
+ " hook: signal, hsignal, modifier, print, timer\n"
+ "arguments: arguments for the hook, depending on hook:\n"
+ " signal: name of signal\n"
+ " hsignal: name of hsignal\n"
+ " modifier: name of modifier\n"
+ " print: buffer, tags, message, strip_colors\n"
+ " timer: interval, align_second, max_calls\n"
+ " set: set an option in a trigger\n"
+ " option: name of option: name, hook, arguments, conditions, regex, "
+ "command, return_code\n"
+ " (for help on option, you can do /help "
+ "trigger.trigger.<name>.<option>)\n"
+ " value: new value for the option\n"
+ " del: delete a trigger\n"
+ " -all: delete all triggers\n"
+ " enable: enable a trigger\n"
+ " disable: disable a trigger\n"
+ " toggle: toggle a trigger\n"
+ " monitor: open the trigger monitor buffer\n"
+ "\n"
+ "When a trigger callback is called, following actions are performed, "
+ "in this order:\n"
+ " 1. if no regex/command is defined, exit\n"
+ " 2. check conditions; if false, exit\n"
+ " 3. replace text using regex (if defined in trigger)\n"
+ " 4. execute command (if defined in trigger)\n"
+ "Note: on steps 1 and 2, the exit is made with the return code "
+ "defined in trigger (or NULL for a modifier).\n"
+ "\n"
+ "Examples:\n"
+ " send alert (BEL) on highlight or private message:\n"
+ " /trigger add beep print\n"
+ " /trigger set beep conditions ${tg_highlight} || ${tg_msg_pv}\n"
+ " /trigger set beep command /print -stderr \\a\n"
+ " replace password with '*' in /oper command (in command line and "
+ "command history):\n"
+ " /trigger add oper modifier input_text_display;history_add\n"
+ " /trigger set oper regex ==^(/oper +\\S+ +)(.*)==\\1\\*2\n"
+ " add text attributes in *bold*, _underline_ and /italic/:\n"
+ " /trigger add effects modifier weechat_print\n"
+ " /trigger set effects regex "
+ "==\\*(\\S+)\\*==*${color:bold}\\1${color:-bold}*"
+ "==_(\\S+)_==_${color:underline}\\1${color:-underline}_"
+ "==/(\\S+)/==/${color:italic}\\1${color:-italic}/"),
+ "list"
+ " || add %(trigger_names) %(trigger_hooks)"
+ " || set %(trigger_names) %(trigger_options)|name %(trigger_option_value)"
+ " || del %(trigger_names)|-all %(trigger_names)|%*"
+ " || enable|disable|toggle %(trigger_names)"
+ " || monitor",
+ &trigger_command_trigger, NULL);
+}