summaryrefslogtreecommitdiff
path: root/src/plugins/irc
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/irc')
-rw-r--r--src/plugins/irc/irc-info.c1
-rw-r--r--src/plugins/irc/irc-message.c3
-rw-r--r--src/plugins/irc/irc-protocol.c10
-rw-r--r--src/plugins/irc/irc-tag.c57
-rw-r--r--src/plugins/irc/irc-tag.h4
5 files changed, 47 insertions, 28 deletions
diff --git a/src/plugins/irc/irc-info.c b/src/plugins/irc/irc-info.c
index 31f5cc412..892c1f3ed 100644
--- a/src/plugins/irc/irc-info.c
+++ b/src/plugins/irc/irc-info.c
@@ -1183,6 +1183,7 @@ irc_info_init ()
N_("\"message\": IRC message, \"server\": server name (optional)"),
/* TRANSLATORS: please do not translate key names (enclosed by quotes) */
N_("\"tags\": tags, "
+ "\"tag_xxx\": unescaped value of tag \"xxx\" (one key per tag), "
"\"message_without_tags\": message without the tags, "
"\"nick\": nick, "
"\"user\": user, "
diff --git a/src/plugins/irc/irc-message.c b/src/plugins/irc/irc-message.c
index 36341defd..eeaf91d6a 100644
--- a/src/plugins/irc/irc-message.c
+++ b/src/plugins/irc/irc-message.c
@@ -31,6 +31,7 @@
#include "irc-config.h"
#include "irc-ignore.h"
#include "irc-server.h"
+#include "irc-tag.h"
/*
@@ -327,6 +328,7 @@ irc_message_parse (struct t_irc_server *server, const char *message,
/*
* Parses an IRC message and returns hashtable with keys:
* - tags
+ * - tag_xxx (one key per tag, with unescaped value)
* - message_without_tags
* - nick
* - host
@@ -365,6 +367,7 @@ irc_message_parse_to_hashtable (struct t_irc_server *server,
weechat_hashtable_set (hashtable, "tags",
(tags) ? tags : empty_str);
+ irc_tag_parse (tags, hashtable, "tag_");
weechat_hashtable_set (hashtable, "message_without_tags",
(message_without_tags) ? message_without_tags : empty_str);
weechat_hashtable_set (hashtable, "nick",
diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c
index 53631e1b2..140a662c0 100644
--- a/src/plugins/irc/irc-protocol.c
+++ b/src/plugins/irc/irc-protocol.c
@@ -6826,7 +6826,6 @@ irc_protocol_recv_command (struct t_irc_server *server,
message_colors_decoded = NULL;
argv = NULL;
argv_eol = NULL;
- hash_tags = NULL;
date = 0;
ptr_msg_after_tags = irc_message;
@@ -6841,11 +6840,16 @@ irc_protocol_recv_command (struct t_irc_server *server,
pos_space - (irc_message + 1));
if (tags)
{
- hash_tags = irc_tag_parse (tags);
+ hash_tags = weechat_hashtable_new (32,
+ WEECHAT_HASHTABLE_STRING,
+ WEECHAT_HASHTABLE_STRING,
+ NULL, NULL);
if (hash_tags)
{
+ irc_tag_parse (tags, hash_tags, NULL);
date = irc_protocol_parse_time (
weechat_hashtable_get (hash_tags, "time"));
+ weechat_hashtable_free (hash_tags);
}
free (tags);
}
@@ -7033,6 +7037,4 @@ end:
weechat_string_free_split (argv);
if (argv_eol)
weechat_string_free_split (argv_eol);
- if (hash_tags)
- weechat_hashtable_free (hash_tags);
}
diff --git a/src/plugins/irc/irc-tag.c b/src/plugins/irc/irc-tag.c
index a0534e0ad..05e4f3ff5 100644
--- a/src/plugins/irc/irc-tag.c
+++ b/src/plugins/irc/irc-tag.c
@@ -216,33 +216,34 @@ irc_tag_modifier_cb (const void *pointer, void *data,
}
/*
- * Parses tags received in an IRC message.
- * Returns a hashtable with tags and their unescaped values.
+ * Parses tags received in an IRC message and returns the number of tags
+ * set in the hasbtable "hashtable" (values are unescaped tag values).
+ *
+ * If prefix_key is not NULL, it is used as prefix before the name of keys.
*
* Example:
- * if tags == "aaa=bbb;ccc;example.com/ddd=eee",
- * hashtable will have following keys/values:
- * "aaa" => "bbb"
- * "ccc" => NULL
- * "example.com/ddd" => "eee"
+ *
+ * input:
+ * tags == "aaa=bbb;ccc;example.com/ddd=value\swith\sspaces"
+ * prefix_key == "tag_"
+ * output:
+ * hashtable is completed with the following keys/values:
+ * "tag_aaa" => "bbb"
+ * "tag_ccc" => NULL
+ * "tag_example.com/ddd" => "value with spaces"
*/
-struct t_hashtable *
-irc_tag_parse (const char *tags)
+int
+irc_tag_parse (const char *tags,
+ struct t_hashtable *hashtable, const char *prefix_key)
{
- struct t_hashtable *hashtable;
- char **items, *pos, *key, *unescaped;
- int num_items, i;
+ char **items, *pos, *key, str_key[4096], *unescaped;
+ int num_items, i, num_tags;
- if (!tags || !tags[0])
- return NULL;
+ if (!tags || !tags[0] || !hashtable)
+ return 0;
- hashtable = weechat_hashtable_new (32,
- WEECHAT_HASHTABLE_STRING,
- WEECHAT_HASHTABLE_STRING,
- NULL, NULL);
- if (!hashtable)
- return NULL;
+ num_tags = 0;
items = weechat_string_split (tags, ";", NULL,
WEECHAT_STRING_SPLIT_STRIP_LEFT
@@ -260,21 +261,31 @@ irc_tag_parse (const char *tags)
key = weechat_strndup (items[i], pos - items[i]);
if (key)
{
+ snprintf (str_key, sizeof (str_key),
+ "%s%s",
+ (prefix_key) ? prefix_key : "",
+ key);
unescaped = irc_tag_unescape_value (pos + 1);
- weechat_hashtable_set (hashtable, key, unescaped);
+ weechat_hashtable_set (hashtable, str_key, unescaped);
if (unescaped)
free (unescaped);
free (key);
+ num_tags++;
}
}
else
{
/* format: "tag" */
- weechat_hashtable_set (hashtable, items[i], NULL);
+ snprintf (str_key, sizeof (str_key),
+ "%s%s",
+ (prefix_key) ? prefix_key : "",
+ items[i]);
+ weechat_hashtable_set (hashtable, str_key, NULL);
+ num_tags++;
}
}
weechat_string_free_split (items);
}
- return hashtable;
+ return num_tags;
}
diff --git a/src/plugins/irc/irc-tag.h b/src/plugins/irc/irc-tag.h
index 2e70668af..1fe0aeb8d 100644
--- a/src/plugins/irc/irc-tag.h
+++ b/src/plugins/irc/irc-tag.h
@@ -27,6 +27,8 @@ extern char *irc_tag_modifier_cb (const void *pointer,
const char *modifier,
const char *modifier_data,
const char *string);
-extern struct t_hashtable *irc_tag_parse (const char *tags);
+extern int irc_tag_parse (const char *tags,
+ struct t_hashtable *hashtable,
+ const char *prefix_key);
#endif /* WEECHAT_PLUGIN_IRC_TAG_H */