summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2017-06-02 07:46:17 +0200
committerSébastien Helleu <flashcode@flashtux.org>2017-06-02 07:46:17 +0200
commit593eee869f47872dd8c512ab9ac74f3167ad50af (patch)
tree8def62153567113172a5d397accb6c58b6fb3e51 /src
parenteff373e73bdf204ff597b7ebcd074ee58e606d09 (diff)
downloadweechat-593eee869f47872dd8c512ab9ac74f3167ad50af.zip
trigger: add "irc_server" and "irc_channel" pointers in data for IRC signal/modifier hooks
Diffstat (limited to 'src')
-rw-r--r--src/plugins/trigger/trigger-callback.c104
1 files changed, 92 insertions, 12 deletions
diff --git a/src/plugins/trigger/trigger-callback.c b/src/plugins/trigger/trigger-callback.c
index c48a8d3fe..106888832 100644
--- a/src/plugins/trigger/trigger-callback.c
+++ b/src/plugins/trigger/trigger-callback.c
@@ -47,7 +47,7 @@ struct t_hashtable *trigger_callback_hashtable_options_regex = NULL;
struct t_hashtable *
trigger_callback_irc_message_parse (const char *irc_message,
- const char *irc_server)
+ const char *irc_server_name)
{
struct t_hashtable *hashtable_in, *hashtable_out;
@@ -60,7 +60,7 @@ trigger_callback_irc_message_parse (const char *irc_message,
if (hashtable_in)
{
weechat_hashtable_set (hashtable_in, "message", irc_message);
- weechat_hashtable_set (hashtable_in, "server", irc_server);
+ weechat_hashtable_set (hashtable_in, "server", irc_server_name);
hashtable_out = weechat_info_get_hashtable ("irc_message_parse",
hashtable_in);
weechat_hashtable_free (hashtable_in);
@@ -68,6 +68,63 @@ trigger_callback_irc_message_parse (const char *irc_message,
return hashtable_out;
}
+
+/*
+ * Gets the pointer to IRC server with its name.
+ *
+ * Returns pointer to IRC server, or NULL if not found.
+ */
+
+void
+trigger_callback_get_irc_server_channel (const char *irc_server_name,
+ const char *irc_channel_name,
+ void **irc_server, void **irc_channel)
+{
+ struct t_hdata *hdata_irc_server, *hdata_irc_channel;
+ const char *ptr_name;
+
+ *irc_server = NULL;
+ *irc_channel = NULL;
+
+ if (!irc_server_name)
+ return;
+
+ hdata_irc_server = weechat_hdata_get ("irc_server");
+ if (!hdata_irc_server)
+ return;
+
+ /* search the server by name in list of servers */
+ *irc_server = weechat_hdata_get_list (hdata_irc_server, "irc_servers");
+ while (*irc_server)
+ {
+ ptr_name = weechat_hdata_string (hdata_irc_server, *irc_server, "name");
+ if (strcmp (ptr_name, irc_server_name) == 0)
+ break;
+ *irc_server = weechat_hdata_move (hdata_irc_server, *irc_server, 1);
+ }
+ if (!*irc_server)
+ return;
+
+ if (!irc_channel_name)
+ return;
+
+ hdata_irc_channel = weechat_hdata_get ("irc_channel");
+ if (!hdata_irc_channel)
+ return;
+
+ /* search the channel by name in list of channels on the server */
+ *irc_channel = weechat_hdata_pointer (hdata_irc_server,
+ *irc_server, "channels");
+ while (*irc_channel)
+ {
+ ptr_name = weechat_hdata_string (hdata_irc_channel,
+ *irc_channel, "name");
+ if (strcmp (ptr_name, irc_channel_name) == 0)
+ break;
+ *irc_channel = weechat_hdata_move (hdata_irc_channel, *irc_channel, 1);
+ }
+}
+
/*
* Sets variables in "extra_vars" hashtable using tags from message.
*
@@ -370,13 +427,16 @@ trigger_callback_signal_cb (const void *pointer, void *data,
void *signal_data)
{
const char *ptr_signal_data;
- char str_data[128], *irc_server;
+ char str_data[128], *irc_server_name;
const char *pos, *ptr_irc_message;
+ void *ptr_irc_server, *ptr_irc_channel;
TRIGGER_CALLBACK_CB_INIT(WEECHAT_RC_OK);
+ TRIGGER_CALLBACK_CB_NEW_POINTERS;
+
/* split IRC message (if signal_data is an IRC message) */
- irc_server = NULL;
+ irc_server_name = NULL;
ptr_irc_message = NULL;
if (strcmp (type_data, WEECHAT_HOOK_SIGNAL_STRING) == 0)
{
@@ -390,7 +450,7 @@ trigger_callback_signal_cb (const void *pointer, void *data,
pos = strchr (signal, ',');
if (pos)
{
- irc_server = weechat_strndup (signal, pos - signal);
+ irc_server_name = weechat_strndup (signal, pos - signal);
ptr_irc_message = (const char *)signal_data;
}
}
@@ -399,22 +459,31 @@ trigger_callback_signal_cb (const void *pointer, void *data,
pos = strstr (signal, ",irc_outtags_");
if (pos)
{
- irc_server = weechat_strndup (signal, pos - signal);
+ irc_server_name = weechat_strndup (signal, pos - signal);
pos = strchr ((const char *)signal_data, ';');
if (pos)
ptr_irc_message = pos + 1;
}
}
}
- if (irc_server && ptr_irc_message)
+ if (irc_server_name && ptr_irc_message)
{
extra_vars = trigger_callback_irc_message_parse (ptr_irc_message,
- irc_server);
+ irc_server_name);
if (extra_vars)
- weechat_hashtable_set (extra_vars, "server", irc_server);
+ {
+ weechat_hashtable_set (extra_vars, "server", irc_server_name);
+ trigger_callback_get_irc_server_channel (
+ irc_server_name,
+ weechat_hashtable_get (extra_vars, "channel"),
+ &ptr_irc_server,
+ &ptr_irc_channel);
+ weechat_hashtable_set (pointers, "irc_server", ptr_irc_server);
+ weechat_hashtable_set (pointers, "irc_channel", ptr_irc_channel);
+ }
}
- if (irc_server)
- free (irc_server);
+ if (irc_server_name)
+ free (irc_server_name);
/* create hashtable (if not already created) */
if (!extra_vars)
@@ -520,9 +589,12 @@ trigger_callback_modifier_cb (const void *pointer, void *data,
char *string_modified, *pos, *pos2, *plugin_name, *buffer_name;
char *buffer_full_name, *str_tags, **tags, *prefix, *string_no_color;
int length, num_tags;
+ void *ptr_irc_server, *ptr_irc_channel;
TRIGGER_CALLBACK_CB_INIT(NULL);
+ TRIGGER_CALLBACK_CB_NEW_POINTERS;
+
buffer = NULL;
tags = NULL;
num_tags = 0;
@@ -537,10 +609,18 @@ trigger_callback_modifier_cb (const void *pointer, void *data,
extra_vars = trigger_callback_irc_message_parse (string,
modifier_data);
if (extra_vars)
+ {
weechat_hashtable_set (extra_vars, "server", modifier_data);
+ trigger_callback_get_irc_server_channel (
+ modifier_data,
+ weechat_hashtable_get (extra_vars, "channel"),
+ &ptr_irc_server,
+ &ptr_irc_channel);
+ weechat_hashtable_set (pointers, "irc_server", ptr_irc_server);
+ weechat_hashtable_set (pointers, "irc_channel", ptr_irc_channel);
+ }
}
- TRIGGER_CALLBACK_CB_NEW_POINTERS;
if (!extra_vars)
{
TRIGGER_CALLBACK_CB_NEW_EXTRA_VARS;