trigger: add "irc_server" and "irc_channel" pointers in data for IRC signal/modifier hooks

v2.8-utf8proc
Sébastien Helleu 2017-06-02 07:46:17 +02:00
parent eff373e73b
commit 593eee869f
8 changed files with 195 additions and 100 deletions

View File

@ -28,6 +28,7 @@ Improvements::
* core: allow index for hdata arrays in evaluation of expressions
* buflist: add support of char "~" in option buflist.look.sort for case insensitive comparison
* buflist: add variable `${current_buffer}` (boolean "0" / "1") in bar item evaluation
* trigger: add "irc_server" and "irc_channel" pointers in data for IRC signal/modifier hooks
Bug fixes::

View File

@ -3582,20 +3582,24 @@ und die Daten in einer Hashtable gesichert:
[width="100%",cols="3m,2,14",options="header"]
|===
| Variable | Typ | Beschreibung
| server | string | Name des Server (Beispiel: "freenode").
| tags | string | Tags in Nachricht (findet selten Verwendung).
| message_without_tags | string | Nachricht ohne Tags.
| nick | string | Nick.
| host | string | Hostname.
| command | string | IRC Befehl (Beispiel: "PRIVMSG", "NOTICE", ...).
| channel | string | IRC Channel.
| arguments | string | Argumente des Befehls (Beinhaltet Wert von _channel_).
| text | string | Text (zum Beipiel eine Nachricht eines Users).
| pos_command | string | Index von _command_ innerhalb einer Nachricht ("-1" falls _command_ nicht gefunden wird).
| pos_arguments | string | Index von_arguments_ innerhalb einer Nachricht ("-1" falls _arguments_ nicht gefunden wird).
| pos_channel | string | Index von _channel_ innerhalb einer Nachricht ("-1" falls _channel_ nicht gefunden wird).
| pos_text | string | Index von _text_ innerhalb einer Nachricht ("-1" falls _text_ nicht gefunden wird).
| Variable | Typ | Beschreibung
// TRANSLATION MISSING
| irc_server | pointer | Pointer to IRC server (variables in hdata of type "irc_server" can be used, like `${irc_server.name}`).
// TRANSLATION MISSING
| irc_channel | pointer | Pointer to IRC channel (variables in hdata of type "irc_channel" can be used, like `${irc_channel.name}`).
| server | string | Name des Server (Beispiel: "freenode").
| tags | string | Tags in Nachricht (findet selten Verwendung).
| message_without_tags | string | Nachricht ohne Tags.
| nick | string | Nick.
| host | string | Hostname.
| command | string | IRC Befehl (Beispiel: "PRIVMSG", "NOTICE", ...).
| channel | string | IRC Channel.
| arguments | string | Argumente des Befehls (Beinhaltet Wert von _channel_).
| text | string | Text (zum Beipiel eine Nachricht eines Users).
| pos_command | string | Index von _command_ innerhalb einer Nachricht ("-1" falls _command_ nicht gefunden wird).
| pos_arguments | string | Index von_arguments_ innerhalb einer Nachricht ("-1" falls _arguments_ nicht gefunden wird).
| pos_channel | string | Index von _channel_ innerhalb einer Nachricht ("-1" falls _channel_ nicht gefunden wird).
| pos_text | string | Index von _text_ innerhalb einer Nachricht ("-1" falls _text_ nicht gefunden wird).
|===
Sofern es sich bei den Daten um einen Pointer handelt, kann die Variable `tg_signal_data`

View File

@ -3488,20 +3488,22 @@ is added in hashtable:
[width="100%",cols="3m,2,14",options="header"]
|===
| Variable | Type | Description
| server | string | Name of server (example: "freenode").
| tags | string | Tags in message (rarely used).
| message_without_tags | string | Message without tags.
| nick | string | Nick.
| host | string | Hostname.
| command | string | IRC command (example: "PRIVMSG", "NOTICE", ...).
| channel | string | IRC channel.
| arguments | string | Arguments of command (includes value of _channel_).
| text | string | Text (for example user message).
| pos_command | string | The index of _command_ in message ("-1" if _command_ was not found).
| pos_arguments | string | The index of _arguments_ in message ("-1" if _arguments_ was not found).
| pos_channel | string | The index of _channel_ in message ("-1" if _channel_ was not found).
| pos_text | string | The index of _text_ in message ("-1" if _text_ was not found).
| Variable | Type | Description
| irc_server | pointer | Pointer to IRC server (variables in hdata of type "irc_server" can be used, like `${irc_server.name}`).
| irc_channel | pointer | Pointer to IRC channel (variables in hdata of type "irc_channel" can be used, like `${irc_channel.name}`).
| server | string | Name of server (example: "freenode").
| tags | string | Tags in message (rarely used).
| message_without_tags | string | Message without tags.
| nick | string | Nick.
| host | string | Hostname.
| command | string | IRC command (example: "PRIVMSG", "NOTICE", ...).
| channel | string | IRC channel.
| arguments | string | Arguments of command (includes value of _channel_).
| text | string | Text (for example user message).
| pos_command | string | The index of _command_ in message ("-1" if _command_ was not found).
| pos_arguments | string | The index of _arguments_ in message ("-1" if _arguments_ was not found).
| pos_channel | string | The index of _channel_ in message ("-1" if _channel_ was not found).
| pos_text | string | The index of _text_ in message ("-1" if _text_ was not found).
|===
When the data is a pointer, the variable `tg_signal_data` can be used like this

View File

@ -3606,20 +3606,22 @@ suivantes sont ajoutées dans la table de hachage :
[width="100%",cols="3m,2,14",options="header"]
|===
| Variable | Type | Description
| server | chaîne | Nom du serveur (exemple : "freenode").
| tags | chaîne | Étiquettes dans le message (rarement utilisées).
| message_without_tags | chaîne | Message sans les étiquettes.
| nick | chaîne | Pseudo.
| host | chaîne | Nom d'hôte.
| command | chaîne | Commande IRC (exemple : "PRIVMSG", "NOTICE", ...).
| channel | chaîne | Canal IRC.
| arguments | chaîne | Paramètres de la commande (inclut la valeur de _channel_).
| text | chaîne | Texte (par exemple message utilisateur).
| pos_command | chaîne | L'index de _command_ dans le message ("-1" si _command_ n'a pas été trouvé).
| pos_arguments | chaîne | L'index de _arguments_ dans le message ("-1" si _arguments_ n'a pas été trouvé).
| pos_channel | chaîne | L'index de _channel_ dans le message ("-1" si _channel_ n'a pas été trouvé).
| pos_text | chaîne | L'index de _text_ dans le message ("-1" si _text_ n'a pas été trouvé).
| Variable | Type | Description
| irc_server | pointeur | Pointeur vers le serveur IRC (les variables dans le hdata de type "irc_server" peuvent être utilisées, comme `${irc_server.name}`).
| irc_channel | pointeur | Pointeur vers le canal IRC (les variables dans le hdata de type "irc_channel" peuvent être utilisées, comme `${irc_channel.name}`).
| server | chaîne | Nom du serveur (exemple : "freenode").
| tags | chaîne | Étiquettes dans le message (rarement utilisées).
| message_without_tags | chaîne | Message sans les étiquettes.
| nick | chaîne | Pseudo.
| host | chaîne | Nom d'hôte.
| command | chaîne | Commande IRC (exemple : "PRIVMSG", "NOTICE", ...).
| channel | chaîne | Canal IRC.
| arguments | chaîne | Paramètres de la commande (inclut la valeur de _channel_).
| text | chaîne | Texte (par exemple message utilisateur).
| pos_command | chaîne | L'index de _command_ dans le message ("-1" si _command_ n'a pas été trouvé).
| pos_arguments | chaîne | L'index de _arguments_ dans le message ("-1" si _arguments_ n'a pas été trouvé).
| pos_channel | chaîne | L'index de _channel_ dans le message ("-1" si _channel_ n'a pas été trouvé).
| pos_text | chaîne | L'index de _text_ dans le message ("-1" si _text_ n'a pas été trouvé).
|===
Lorsque la donnée est un pointeur, la variable `tg_signal_data` peut être

View File

@ -3692,24 +3692,22 @@ is added in hashtable:
[width="100%",cols="3m,2,14",options="header"]
|===
| Variable | Type | Description
| server | string | Name of server (example: "freenode").
| tags | string | Tags in message (rarely used).
| message_without_tags | string | Message without tags.
| nick | string | Nick.
| host | string | Hostname.
| command | string | IRC command (example: "PRIVMSG", "NOTICE", ...).
| channel | string | IRC channel.
| arguments | string | Arguments of command (includes value of _channel_).
| text | string | Text (for example user message).
// TRANSLATION MISSING
| pos_command | string | The index of _command_ in message ("-1" if _command_ was not found).
// TRANSLATION MISSING
| pos_arguments | string | The index of _arguments_ in message ("-1" if _arguments_ was not found).
// TRANSLATION MISSING
| pos_channel | string | The index of _channel_ in message ("-1" if _channel_ was not found).
// TRANSLATION MISSING
| pos_text | string | The index of _text_ in message ("-1" if _text_ was not found).
| Variable | Type | Description
| irc_server | pointer | Pointer to IRC server (variables in hdata of type "irc_server" can be used, like `${irc_server.name}`).
| irc_channel | pointer | Pointer to IRC channel (variables in hdata of type "irc_channel" can be used, like `${irc_channel.name}`).
| server | string | Name of server (example: "freenode").
| tags | string | Tags in message (rarely used).
| message_without_tags | string | Message without tags.
| nick | string | Nick.
| host | string | Hostname.
| command | string | IRC command (example: "PRIVMSG", "NOTICE", ...).
| channel | string | IRC channel.
| arguments | string | Arguments of command (includes value of _channel_).
| text | string | Text (for example user message).
| pos_command | string | The index of _command_ in message ("-1" if _command_ was not found).
| pos_arguments | string | The index of _arguments_ in message ("-1" if _arguments_ was not found).
| pos_channel | string | The index of _channel_ in message ("-1" if _channel_ was not found).
| pos_text | string | The index of _text_ in message ("-1" if _text_ was not found).
|===
When the data is a pointer, the variable `tg_signal_data` can be used like this

View File

@ -3482,20 +3482,24 @@ _var_
[width="100%",cols="3m,2,14",options="header"]
|===
| 変数 | 型 | 説明
| server | string | サーバの名前 (例: "freenode")
| tags | string | メッセージ内のタグ (使われることはまれです)
| message_without_tags | string | タグを含まないメッセージ
| nick | string | ニックネーム
| host | string | ホスト名
| command | string | IRC コマンド (例: "PRIVMSG"、"NOTICE"、...)
| channel | string | IRC チャンネル
| arguments | string | コマンドの引数 (_channel_ の値を含みます)
| text | string | テキスト (例えばユーザメッセージ)
| pos_command | string | メッセージ内における _command_ のインデックス (_command_ が見つからない場合 "-1")
| pos_arguments | string | メッセージ内における _arguments_ のインデックス (_arguments_ が見つからない場合 "-1")
| pos_channel | string | メッセージ内における _channel_ のインデックス (_channel_ が見つからない場合 "-1")
| pos_text | string | メッセージ内における _text_ のインデックス (_text_ が見つからない場合 "-1")
| 変数 | 型 | 説明
// TRANSLATION MISSING
| irc_server | pointer | Pointer to IRC server (variables in hdata of type "irc_server" can be used, like `${irc_server.name}`).
// TRANSLATION MISSING
| irc_channel | pointer | Pointer to IRC channel (variables in hdata of type "irc_channel" can be used, like `${irc_channel.name}`).
| server | string | サーバの名前 (例: "freenode")
| tags | string | メッセージ内のタグ (使われることはまれです)
| message_without_tags | string | タグを含まないメッセージ
| nick | string | ニックネーム
| host | string | ホスト名
| command | string | IRC コマンド (例: "PRIVMSG"、"NOTICE"、...)
| channel | string | IRC チャンネル
| arguments | string | コマンドの引数 (_channel_ の値を含みます)
| text | string | テキスト (例えばユーザメッセージ)
| pos_command | string | メッセージ内における _command_ のインデックス (_command_ が見つからない場合 "-1")
| pos_arguments | string | メッセージ内における _arguments_ のインデックス (_arguments_ が見つからない場合 "-1")
| pos_channel | string | メッセージ内における _channel_ のインデックス (_channel_ が見つからない場合 "-1")
| pos_text | string | メッセージ内における _text_ のインデックス (_text_ が見つからない場合 "-1")
|===
データがポインタの場合、hdata の属性を読むために変数 `tg_signal_data`

View File

@ -3526,20 +3526,24 @@ są dodawane do tablicy hashy:
[width="100%",cols="3m,2,14",options="header"]
|===
| Zmienna | Typ | Opis
| server | ciąg | Nazwa serwera (przykład: "freenode").
| tags | ciąg | Tagi w wiadomości (rzadko używane).
| message_without_tags | ciąg | Wiadomość bez tagów.
| nick | ciąg | Nick.
| host | ciąg | Nazwa hosta.
| command | ciąg | Komendy IRC (na przykład: "PRIVMSG", "NOTICE", ...).
| channel | ciąg | Kanał IRC.
| arguments | ciąg | Argumenty komendy (razem z wartością _channel_).
| text | ciąg | Tekst (na przykład wiadomość użytkownika).
| pos_command | ciąg | Indeks _command_ w wiadomości ("-1" jeśli _command_ nie zostanie znalezione).
| pos_arguments | ciąg | Indeks _arguments_ w wiadomości ("-1" jeśli _arguments_ nie zostaną znalezione).
| pos_channel | ciąg | Indeks _channel_ w wiadomości ("-1" jeśli _channel_ nie został znaleziony).
| pos_text | ciąg | Indeks _text_ w wiadomości ("-1" jeśli _text_ nie został znaleziony).
| Zmienna | Typ | Opis
// TRANSLATION MISSING
| irc_server | pointer | Pointer to IRC server (variables in hdata of type "irc_server" can be used, like `${irc_server.name}`).
// TRANSLATION MISSING
| irc_channel | pointer | Pointer to IRC channel (variables in hdata of type "irc_channel" can be used, like `${irc_channel.name}`).
| server | ciąg | Nazwa serwera (przykład: "freenode").
| tags | ciąg | Tagi w wiadomości (rzadko używane).
| message_without_tags | ciąg | Wiadomość bez tagów.
| nick | ciąg | Nick.
| host | ciąg | Nazwa hosta.
| command | ciąg | Komendy IRC (na przykład: "PRIVMSG", "NOTICE", ...).
| channel | ciąg | Kanał IRC.
| arguments | ciąg | Argumenty komendy (razem z wartością _channel_).
| text | ciąg | Tekst (na przykład wiadomość użytkownika).
| pos_command | ciąg | Indeks _command_ w wiadomości ("-1" jeśli _command_ nie zostanie znalezione).
| pos_arguments | ciąg | Indeks _arguments_ w wiadomości ("-1" jeśli _arguments_ nie zostaną znalezione).
| pos_channel | ciąg | Indeks _channel_ w wiadomości ("-1" jeśli _channel_ nie został znaleziony).
| pos_text | ciąg | Indeks _text_ w wiadomości ("-1" jeśli _text_ nie został znaleziony).
|===
Kiedy dane są wskaźnikiem, zmienna `tg_signal_data` może zostać użyta do

View File

@ -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;