diff options
43 files changed, 752 insertions, 60 deletions
diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 941f960d0..04b955873 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -20,6 +20,7 @@ https://weechat.org/files/releasenotes/ReleaseNotes-devel.html[release notes] New features:: + * core: add support of date and tags in messages displayed in buffers with free content, add function printf_y_date_tags (issue #1746) * irc: add IRC message tags in messages displayed (issue #1680) * relay: add `zstd` (https://facebook.github.io/zstd/[Zstandard]) compression in weechat protocol, remove option `compression` from `init` command, rename option relay.network.compression_level to relay.network.compression * trigger: add variables `${tg_tag_irc_xxx}` containing IRC message tags (issue #1680) diff --git a/doc/de/weechat_scripting.de.adoc b/doc/de/weechat_scripting.de.adoc index b4f1bf245..6202b0af7 100644 --- a/doc/de/weechat_scripting.de.adoc +++ b/doc/de/weechat_scripting.de.adoc @@ -660,6 +660,7 @@ Liste der Skript API Funktionen: print (für Python: prnt) + print_date_tags (für Python: prnt_date_tags) + print_y (für Python: prnt_y) + + print_y_date_tags (für Python: prnt_y_date_tags) + log_print | Hooks | diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index b6ed02676..a42ce5503 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -8637,6 +8637,52 @@ weechat.prnt_y("", 2, "My message on third line") [NOTE] Function is called "print_y" in scripts ("prnt_y" in Python). +==== printf_y_date_tags + +_WeeChat ≥ 3.5._ + +Display a message on a line of a buffer with free content, using a custom +date and tags. + +Prototype: + +[source,c] +---- +void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, + const char *tags, const char *message, ...); +---- + +Arguments: + +* _buffer_: buffer pointer +* _y_: line number (first line is 0); a negative value adds a line after last + line displayed: absolute value of _y_ is the number of lines after last line + (for example -1 is immediately after last line, -2 is 2 lines after last line) +* _date_: date for message (0 means current date/time) +* _tags_: comma separated list of tags (NULL means no tags) +* _message_: message to display + +C example: + +[source,c] +---- +weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag"); +---- + +Script (Python): + +[source,python] +---- +# prototype +def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ... + +# example +weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag") +---- + +[NOTE] +Function is called "print_y_date_tags" in scripts ("prnt_y_date_tags" in Python). + ==== log_printf Write a message in WeeChat log file (weechat.log). diff --git a/doc/en/weechat_scripting.en.adoc b/doc/en/weechat_scripting.en.adoc index 8cea11500..78e1b5d46 100644 --- a/doc/en/weechat_scripting.en.adoc +++ b/doc/en/weechat_scripting.en.adoc @@ -644,6 +644,7 @@ List of functions in script API: print (for python: prnt) + print_date_tags (for python: prnt_date_tags) + print_y (for python: prnt_y) + + print_y_date_tags (for python: prnt_y_date_tags) + log_print | hooks | diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index 9ecce83e6..81d6b9ad6 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -8773,6 +8773,55 @@ weechat.prnt_y("", 2, "Mon message sur la 3ème ligne") [NOTE] La fonction s'appelle "print_y" dans les scripts ("prnt_y" en Python). +==== printf_y_date_tags + +_WeeChat ≥ 3.5._ + +Afficher un message sur une ligne d'un tampon avec contenu libre, en utilisant +une date et des étiquettes personnalisées. + +Prototype : + +[source,c] +---- +void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, + const char *tags, const char *message, ...); +---- + +Paramètres : + +* _buffer_ : pointeur vers le tampon +* _y_ : numéro de ligne (la première ligne est 0); une valeur négative affiche + une ligne après la dernière ligne affichée : la valeur absolue de _y_ est le + nombre de lignes après la dernière ligne (par exemple -1 est immédiatement + après la dernière ligne, -2 est 2 lignes après la dernière ligne) +* _date_ : date pour le message (0 signifie la date/heure courante) +* _tags_ : liste d'étiquettes séparées par des virgules (NULL signifie aucune + étiquette) +* _message_ : message à afficher + +Exemple en C : + +[source,c] +---- +weechat_printf_y_date_tags (buffer, 2, 0, "mon_etiquette", "Mon message sur la 3ème ligne avec une étiquette"); +---- + +Script (Python) : + +[source,python] +---- +# prototype +def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ... + +# exemple +weechat.prnt_y_date_tags("", 2, 0, "mon_etiquette", "Mon message sur la 3ème ligne avec une étiquette") +---- + +[NOTE] +La fonction s'appelle "print_y_date_tags" dans les scripts ("prnt_y_date_tags" +en Python). + ==== log_printf Écrire un message dans le fichier de log WeeChat (weechat.log). diff --git a/doc/fr/weechat_scripting.fr.adoc b/doc/fr/weechat_scripting.fr.adoc index 14f6f1833..c6e436c56 100644 --- a/doc/fr/weechat_scripting.fr.adoc +++ b/doc/fr/weechat_scripting.fr.adoc @@ -663,6 +663,7 @@ Liste des fonctions de l'API script : print (pour python : prnt) + print_date_tags (pour python : prnt_date_tags) + print_y (pour python : prnt_y) + + print_y_date_tags (pour python : prnt_y_date_tags) + log_print | hooks | diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index 1568bf06c..688d408bc 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -8910,6 +8910,56 @@ weechat.prnt_y("", 2, "Mio messaggio sulla terza riga") [NOTE] La funzione è chiamata "print_y" negli script ("prnt_y in Python). +==== printf_y_date_tags + +_WeeChat ≥ 3.5._ + +// TRANSLATION MISSING +Display a message on a line of a buffer with free content, using a custom +date and tags. + +Prototipo: + +[source,c] +---- +void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, + const char *tags, const char *message, ...); +---- + +Argomenti: + +* _buffer_: puntatore al buffer +// TRANSLATION MISSING +* _y_: numero di riga (la prima riga è 0); a negative value adds a line after + last line displayed: absolute value of _y_ is the number of lines after last + line (for example -1 is immediately after last line, -2 is 2 lines after last + line) +* _date_: data per il messaggio (0 indica data/ora corrente) +// TRANSLATION MISSING +* _tags_: lista di tag separati da virgole (NULL means no tags) +* _message_: messaggio da visualizzare + +Esempio in C: + +[source,c] +---- +weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag"); +---- + +Script (Python): + +[source,python] +---- +# prototipo +def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ... + +# esempio +weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag") +---- + +[NOTE] +La funzione è chiamata "print_y_date_tags" negli script ("prnt_y_date_tags in Python). + ==== log_printf Scrive un messaggio nel file di log di WeeChat (weechat.log). diff --git a/doc/it/weechat_scripting.it.adoc b/doc/it/weechat_scripting.it.adoc index 68c9976c0..f54dcdaef 100644 --- a/doc/it/weechat_scripting.it.adoc +++ b/doc/it/weechat_scripting.it.adoc @@ -676,6 +676,8 @@ Elenco di funzioni nelle API per gli script: print_date_tags (for python: prnt_date_tags) + // TRANSLATION MISSING print_y (for python: prnt_y) + +// TRANSLATION MISSING + print_y_date_tags (for python: prnt_y_date_tags) + log_print | hook | diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index 5c455d9d9..b18f938d1 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -8659,6 +8659,53 @@ weechat.prnt_y("", 2, "My message on third line") [NOTE] この関数をスクリプトの中で実行するには "print_y" (Python の場合は "prnt_y") と書きます。 +==== printf_y_date_tags + +_WeeChat ≥ 3.5._ + +// TRANSLATION MISSING +Display a message on a line of a buffer with free content, using a custom +date and tags. + +プロトタイプ: + +[source,c] +---- +void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, + const char *tags, const char *message, ...); +---- + +引数: + +* _buffer_: バッファへのポインタ +* _y_: 行番号 (1 行目は 0); 負数の場合は表示された最後の行の後に行を追加する: + _y_ の絶対値で最後の行の後に追加する行数を指定 (例えば + -1 は最後の行のすぐ後、-2 は 最後の行の 2 行後) +* _date_: メッセージの日付 (0 は現在の日付/時間を意味する) +* _tags_: タグのコンマ区切りリスト (タグを指定しない場合は NULL) +* _message_: 表示するメッセージ + +C 言語での使用例: + +[source,c] +---- +weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag"); +---- + +スクリプト (Python) での使用例: + +[source,python] +---- +# プロトタイプ +def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ... + +# 例 +weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag") +---- + +[NOTE] +この関数をスクリプトの中で実行するには "print_y_date_tags" (Python の場合は "prnt_y_date_tags") と書きます。 + ==== log_printf WeeChat ログファイル (weechat.log) にメッセージを書き込む。 diff --git a/doc/ja/weechat_scripting.ja.adoc b/doc/ja/weechat_scripting.ja.adoc index bc3987b45..7a0ffcf0c 100644 --- a/doc/ja/weechat_scripting.ja.adoc +++ b/doc/ja/weechat_scripting.ja.adoc @@ -665,6 +665,7 @@ link:weechat_plugin_api.ja.html[WeeChat プラグイン API リファレンス] print (python では prnt) + print_date_tags (python では prnt_date_tags) + print_y (python では prnt_y) + + print_y_date_tags (python では prnt_y_date_tags) + log_print | フック | diff --git a/doc/pl/weechat_scripting.pl.adoc b/doc/pl/weechat_scripting.pl.adoc index ec7668082..98b33d4db 100644 --- a/doc/pl/weechat_scripting.pl.adoc +++ b/doc/pl/weechat_scripting.pl.adoc @@ -649,6 +649,7 @@ Lista funkcji w API skryptów: print (dla pythona: prnt) + print_date_tags (dla pythona: prnt_date_tags) + print_y (dla pythona: prnt_y) + + print_y_date_tags (dla pythona: prnt_y_date_tags) + log_print | hooks | diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc index 04e144c1b..471eccfe6 100644 --- a/doc/sr/weechat_plugin_api.sr.adoc +++ b/doc/sr/weechat_plugin_api.sr.adoc @@ -8377,6 +8377,51 @@ weechat.prnt_y("", 2, "My message on third line") [NOTE] У скриптама се функција зове „print_y” („prnt_y” у језику Python). +==== printf_y_date_tags + +_WeeChat ≥ 3.5._ + +// TRANSLATION MISSING +Display a message on a line of a buffer with free content, using a custom +date and tags. + +Прототип: + +[source,c] +---- +void weechat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, + const char *tags, const char *message, ...); +---- + +Аргументи: + +* _buffer_: показивач на бафер +* _y_: број линије (прва линија је 0); негативна вредност додаје линију иза последње приказане линије: апсолутна вредност _y_ је број линија након последње линије (на пример -1 је непосредно након последње линије, -2 је 2 линије након последње линије) +* _date_: датум за поруку (0 значи текући датум/време) +* _tags_: листа ознака раздвојених запетама (NULL значи да нема ознака) +* _message_: порука која треба да се прикаже + +C пример: + +[source,c] +---- +weechat_printf_y_date_tags (buffer, 2, 0, "my_tag", "My message on third line with a tag"); +---- + +Скрипта (Python): + +[source,python] +---- +# прототип +def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: ... + +# пример +weechat.prnt_y_date_tags("", 2, 0, "my_tag", "My message on third line with a tag") +---- + +[NOTE] +У скриптама се функција зове „print_y_date_tags” („prnt_y_date_tags” у језику Python). + ==== log_printf Уписује поруку у WeeChat лог фајл (weechat.log). diff --git a/doc/sr/weechat_scripting.sr.adoc b/doc/sr/weechat_scripting.sr.adoc index a0a97f744..3f8f4ade0 100644 --- a/doc/sr/weechat_scripting.sr.adoc +++ b/doc/sr/weechat_scripting.sr.adoc @@ -602,6 +602,7 @@ weechat_hook_timer(1000, 0, 1, $timer_cb, 'test'); print (за python: prnt) + print_date_tags (за python: prnt_date_tags) + print_y (за python: prnt_y) + + print_y_date_tags (за python: prnt_y_date_tags) + log_print | куке | diff --git a/src/core/wee-command.c b/src/core/wee-command.c index 6d916f0a4..219c0400e 100644 --- a/src/core/wee-command.c +++ b/src/core/wee-command.c @@ -5170,10 +5170,10 @@ COMMAND_CALLBACK(print) { if (free_content) { - gui_chat_printf_y (ptr_buffer, y, - "%s%s", - (prefix) ? prefix : "", - text2); + gui_chat_printf_y_date_tags (ptr_buffer, y, date, tags, + "%s%s", + (prefix) ? prefix : "", + text2); } else { diff --git a/src/core/wee-upgrade.c b/src/core/wee-upgrade.c index 090c5be9a..48c859416 100644 --- a/src/core/wee-upgrade.c +++ b/src/core/wee-upgrade.c @@ -659,7 +659,10 @@ upgrade_weechat_read_buffer_line (struct t_infolist *infolist) case GUI_BUFFER_TYPE_FREE: new_line = gui_line_new (upgrade_current_buffer, infolist_integer (infolist, "y"), - 0, 0, NULL, NULL, + infolist_time (infolist, "date"), + infolist_time (infolist, "date_printed"), + infolist_string (infolist, "tags"), + NULL, infolist_string (infolist, "message")); if (new_line) gui_line_add_y (new_line); diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c index a91fc549b..d05204ab1 100644 --- a/src/gui/curses/gui-curses-chat.c +++ b/src/gui/curses/gui-curses-chat.c @@ -1421,7 +1421,9 @@ gui_chat_display_line (struct t_gui_window *window, struct t_gui_line *line, if (line->data->message && line->data->message[0]) { message_with_tags = (gui_chat_display_tags) ? - gui_line_build_string_message_tags (line) : NULL; + gui_line_build_string_message_tags (line->data->message, + line->data->tags_count, + line->data->tags_array) : NULL; ptr_data = (message_with_tags) ? message_with_tags : line->data->message; message_with_search = NULL; @@ -1639,7 +1641,10 @@ void gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line, int y) { - char *ptr_data, *message_with_search; + char *ptr_data, *message_with_search, *message_with_tags; + + message_with_search = NULL; + message_with_tags = NULL; /* reset color & style for a new line */ gui_chat_reset_style (window, line, 0, 1, @@ -1653,9 +1658,9 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line, gui_chat_clrtoeol (window); - /* emphasize text (if searching text) */ ptr_data = line->data->message; - message_with_search = NULL; + + /* emphasize text (if searching text) */ if ((window->buffer->text_search != GUI_TEXT_SEARCH_DISABLED) && (window->buffer->text_search_where & GUI_TEXT_SEARCH_IN_MESSAGE) && (!window->buffer->text_search_regex @@ -1669,6 +1674,17 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line, ptr_data = message_with_search; } + /* add tags if debug of tags is enabled */ + if (gui_chat_display_tags) + { + message_with_tags = gui_line_build_string_message_tags ( + ptr_data, + line->data->tags_count, + line->data->tags_array); + if (message_with_tags) + ptr_data = message_with_tags; + } + /* display the line */ if (gui_chat_display_word_raw (window, line, ptr_data, window->win_chat_width, 0, @@ -1680,6 +1696,8 @@ gui_chat_display_line_y (struct t_gui_window *window, struct t_gui_line *line, if (message_with_search) free (message_with_search); + if (message_with_tags) + free (message_with_tags); } /* diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c index fdc4e1363..3d12b51aa 100644 --- a/src/gui/gui-chat.c +++ b/src/gui/gui-chat.c @@ -941,9 +941,11 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date, */ void -gui_chat_printf_y (struct t_gui_buffer *buffer, int y, const char *message, ...) +gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, + const char *tags, const char *message, ...) { struct t_gui_line *ptr_line, *new_line, *new_line_empty; + time_t date_printed; int i, last_y, num_lines_to_add; if (gui_init_ok && !gui_chat_buffer_valid (buffer, GUI_BUFFER_TYPE_FREE)) @@ -962,7 +964,12 @@ gui_chat_printf_y (struct t_gui_buffer *buffer, int y, const char *message, ...) utf8_normalize (vbuffer, '?'); - new_line = gui_line_new (buffer, y, 0, 0, NULL, NULL, vbuffer); + date_printed = time (NULL); + if (date <= 0) + date = date_printed; + + new_line = gui_line_new (buffer, y, date, date_printed, tags, + NULL, vbuffer); if (!new_line) goto end; diff --git a/src/gui/gui-chat.h b/src/gui/gui-chat.h index 80903fbab..6a5e7b194 100644 --- a/src/gui/gui-chat.h +++ b/src/gui/gui-chat.h @@ -31,6 +31,9 @@ struct t_gui_line; #define gui_chat_printf(buffer, argz...) \ gui_chat_printf_date_tags(buffer, 0, NULL, ##argz) +#define gui_chat_printf_y(buffer, y, argz...) \ + gui_chat_printf_y_date_tags(buffer, y, 0, NULL, ##argz) + #define GUI_CHAT_TAG_NO_HIGHLIGHT "no_highlight" #define GUI_CHAT_PREFIX_ERROR_DEFAULT "=!=" @@ -90,8 +93,9 @@ extern int gui_chat_buffer_valid (struct t_gui_buffer *buffer, extern void gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date, const char *tags, const char *message, ...); -extern void gui_chat_printf_y (struct t_gui_buffer *buffer, int y, - const char *message, ...); +extern void gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, + time_t date, const char *tags, + const char *message, ...); extern void gui_chat_print_lines_waiting_buffer (FILE *f); extern int gui_chat_hsignal_quote_line_cb (const void *pointer, void *data, const char *signal, diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c index 9f1fad71e..3dafe90eb 100644 --- a/src/gui/gui-line.c +++ b/src/gui/gui-line.c @@ -379,7 +379,7 @@ gui_line_get_align (struct t_gui_buffer *buffer, struct t_gui_line *line, */ char * -gui_line_build_string_prefix_message (struct t_gui_line *line) +gui_line_build_string_prefix_message (const char *prefix, const char *message) { char **string, *string_without_colors; @@ -387,11 +387,11 @@ gui_line_build_string_prefix_message (struct t_gui_line *line) if (!string) return NULL; - if (line->data->prefix) - string_dyn_concat (string, line->data->prefix, -1); + if (prefix) + string_dyn_concat (string, prefix, -1); string_dyn_concat (string, "\t", -1); - if (line->data->message) - string_dyn_concat (string, line->data->message, -1); + if (message) + string_dyn_concat (string, message, -1); string_without_colors = gui_color_decode (*string, NULL); @@ -407,24 +407,28 @@ gui_line_build_string_prefix_message (struct t_gui_line *line) */ char * -gui_line_build_string_message_tags (struct t_gui_line *line) +gui_line_build_string_message_tags (const char *message, + int tags_count, char **tags_array) { int i; char **string, *result; + if ((tags_count < 0) || ((tags_count > 0) && !tags_array)) + return NULL; + string = string_dyn_alloc (256); if (!string) return NULL; - if (line->data->message) - string_dyn_concat (string, line->data->message, -1); + if (message) + string_dyn_concat (string, message, -1); string_dyn_concat (string, GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), -1); string_dyn_concat (string, " [", -1); string_dyn_concat (string, GUI_COLOR(GUI_COLOR_CHAT_TAGS), -1); - for (i = 0; i < line->data->tags_count; i++) + for (i = 0; i < tags_count; i++) { - string_dyn_concat (string, line->data->tags_array[i], -1); - if (i < line->data->tags_count - 1) + string_dyn_concat (string, tags_array[i], -1); + if (i < tags_count - 1) string_dyn_concat (string, ",", -1); } string_dyn_concat (string, GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), -1); @@ -1434,11 +1438,10 @@ gui_line_new (struct t_gui_buffer *buffer, int y, time_t date, else { new_line->data->y = y; - new_line->data->date = 0; - new_line->data->date_printed = 0; + new_line->data->date = date; + new_line->data->date_printed = date_printed; new_line->data->str_time = NULL; - new_line->data->tags_count = 0; - new_line->data->tags_array = NULL; + gui_line_tags_alloc (new_line->data, tags); new_line->data->refresh_needed = 1; new_line->data->prefix = NULL; new_line->data->prefix_length = 0; @@ -1688,7 +1691,8 @@ gui_line_add (struct t_gui_line *line) GUI_HOTLIST_HIGHLIGHT, NULL); if (!weechat_upgrading) { - message_for_signal = gui_line_build_string_prefix_message (line); + message_for_signal = gui_line_build_string_prefix_message ( + line->data->prefix, line->data->message); if (message_for_signal) { (void) hook_signal_send ("weechat_highlight", @@ -1703,7 +1707,8 @@ gui_line_add (struct t_gui_line *line) if (!weechat_upgrading && (line->data->notify_level == GUI_HOTLIST_PRIVATE)) { - message_for_signal = gui_line_build_string_prefix_message (line); + message_for_signal = gui_line_build_string_prefix_message ( + line->data->prefix, line->data->message); if (message_for_signal) { (void) hook_signal_send ("weechat_pv", @@ -1852,11 +1857,22 @@ gui_line_add_y (struct t_gui_line *line) void gui_line_clear (struct t_gui_line *line) { + line->data->date = 0; + line->data->date_printed = 0; + if (line->data->str_time) + { + free (line->data->str_time); + line->data->str_time = NULL; + } + gui_line_tags_free (line->data); if (line->data->prefix) { string_shared_free (line->data->prefix); line->data->prefix = NULL; } + line->data->prefix_length = 0; + line->data->notify_level = 0; + line->data->highlight = 0; if (line->data->message) free (line->data->message); line->data->message = strdup (""); diff --git a/src/gui/gui-line.h b/src/gui/gui-line.h index ffc0a42ee..11c2f18b9 100644 --- a/src/gui/gui-line.h +++ b/src/gui/gui-line.h @@ -80,8 +80,11 @@ extern void gui_line_get_prefix_for_display (struct t_gui_line *line, extern int gui_line_get_align (struct t_gui_buffer *buffer, struct t_gui_line *line, int with_suffix, int first_line); -extern char *gui_line_build_string_prefix_message (struct t_gui_line *line); -extern char *gui_line_build_string_message_tags (struct t_gui_line *line); +extern char *gui_line_build_string_prefix_message (const char *prefix, + const char *message); +extern char *gui_line_build_string_message_tags (const char *message, + int tags_count, + char **tags_array); extern int gui_line_is_displayed (struct t_gui_line *line); extern struct t_gui_line *gui_line_get_first_displayed (struct t_gui_buffer *buffer); extern struct t_gui_line *gui_line_get_last_displayed (struct t_gui_buffer *buffer); diff --git a/src/plugins/guile/weechat-guile-api.c b/src/plugins/guile/weechat-guile-api.c index bb3ae7341..a48a37d19 100644 --- a/src/plugins/guile/weechat-guile-api.c +++ b/src/plugins/guile/weechat-guile-api.c @@ -1923,6 +1923,27 @@ weechat_guile_api_print_y (SCM buffer, SCM y, SCM message) } SCM +weechat_guile_api_print_y_date_tags (SCM buffer, SCM y, SCM date, SCM tags, + SCM message) +{ + API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR); + if (!scm_is_string (buffer) || !scm_is_integer (y) + || !scm_is_integer (date) || !scm_is_string (tags) + || !scm_is_string (message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + plugin_script_api_printf_y_date_tags (weechat_guile_plugin, + guile_current_script, + API_STR2PTR(API_SCM_TO_STRING(buffer)), + scm_to_int (y), + scm_to_int (date), + API_SCM_TO_STRING(tags), + "%s", API_SCM_TO_STRING(message)); + + API_RETURN_OK; +} + +SCM weechat_guile_api_log_print (SCM message) { API_INIT_FUNC(1, "log_print", API_RETURN_ERROR); @@ -5121,6 +5142,7 @@ weechat_guile_api_module_init (void *data) API_DEF_FUNC(print, 2); API_DEF_FUNC(print_date_tags, 4); API_DEF_FUNC(print_y, 3); + API_DEF_FUNC(print_y_date_tags, 5); API_DEF_FUNC(log_print, 1); API_DEF_FUNC(hook_command, 7); API_DEF_FUNC(hook_completion, 4); diff --git a/src/plugins/javascript/weechat-js-api.cpp b/src/plugins/javascript/weechat-js-api.cpp index b2e264652..7acf0002a 100644 --- a/src/plugins/javascript/weechat-js-api.cpp +++ b/src/plugins/javascript/weechat-js-api.cpp @@ -1812,6 +1812,29 @@ API_FUNC(print_y) API_RETURN_OK; } +API_FUNC(print_y_date_tags) +{ + int y, date; + + API_INIT_FUNC(1, "print_y_date_tags", "siiss", API_RETURN_ERROR); + + v8::String::Utf8Value buffer(args[0]); + y = args[1]->IntegerValue(); + date = args[2]->IntegerValue(); + v8::String::Utf8Value tags(args[3]); + v8::String::Utf8Value message(args[4]); + + plugin_script_api_printf_y_date_tags (weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + y, + date, + *tags, + "%s", *message); + + API_RETURN_OK; +} + API_FUNC(log_print) { API_INIT_FUNC(1, "log_print", "s", API_RETURN_ERROR); @@ -5051,6 +5074,7 @@ WeechatJsV8::loadLibs() API_DEF_FUNC(print); API_DEF_FUNC(print_date_tags); API_DEF_FUNC(print_y); + API_DEF_FUNC(print_y_date_tags); API_DEF_FUNC(log_print); API_DEF_FUNC(hook_command); API_DEF_FUNC(hook_completion); diff --git a/src/plugins/lua/weechat-lua-api.c b/src/plugins/lua/weechat-lua-api.c index 3942d5b66..ee26fbe10 100644 --- a/src/plugins/lua/weechat-lua-api.c +++ b/src/plugins/lua/weechat-lua-api.c @@ -2024,6 +2024,32 @@ API_FUNC(print_y) API_RETURN_OK; } +API_FUNC(print_y_date_tags) +{ + const char *buffer, *tags, *message; + int y, date; + + API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR); + if (lua_gettop (L) < 5) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = lua_tostring (L, -5); + y = lua_tonumber (L, -4); + date = lua_tonumber (L, -3); + tags = lua_tostring (L, -2); + message = lua_tostring (L, -1); + + plugin_script_api_printf_y_date_tags (weechat_lua_plugin, + lua_current_script, + API_STR2PTR(buffer), + y, + date, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { const char *message; @@ -5415,6 +5441,7 @@ const struct luaL_Reg weechat_lua_api_funcs[] = { API_DEF_FUNC(print), API_DEF_FUNC(print_date_tags), API_DEF_FUNC(print_y), + API_DEF_FUNC(print_y_date_tags), API_DEF_FUNC(log_print), API_DEF_FUNC(hook_command), API_DEF_FUNC(hook_completion), diff --git a/src/plugins/perl/weechat-perl-api.c b/src/plugins/perl/weechat-perl-api.c index 7b1d8e1db..5112fbc50 100644 --- a/src/plugins/perl/weechat-perl-api.c +++ b/src/plugins/perl/weechat-perl-api.c @@ -1937,6 +1937,30 @@ API_FUNC(print_y) API_RETURN_OK; } +API_FUNC(print_y_date_tags) +{ + char *buffer, *tags, *message; + dXSARGS; + + API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR); + if (items < 5) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = SvPV_nolen (ST (0)); + tags = SvPV_nolen (ST (3)); + message = SvPV_nolen (ST (4)); + + plugin_script_api_printf_y_date_tags (weechat_perl_plugin, + perl_current_script, + API_STR2PTR(buffer), + SvIV (ST (1)), + SvIV (ST (2)), + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { dXSARGS; @@ -5370,6 +5394,7 @@ weechat_perl_api_init (pTHX) API_DEF_FUNC(print); API_DEF_FUNC(print_date_tags); API_DEF_FUNC(print_y); + API_DEF_FUNC(print_y_date_tags); API_DEF_FUNC(log_print); API_DEF_FUNC(hook_command); API_DEF_FUNC(hook_completion); diff --git a/src/plugins/php/weechat-php-api.c b/src/plugins/php/weechat-php-api.c index ccbf9b2d6..c48a6fec1 100644 --- a/src/plugins/php/weechat-php-api.c +++ b/src/plugins/php/weechat-php-api.c @@ -2097,6 +2097,38 @@ API_FUNC(print_y) API_RETURN_OK; } +API_FUNC(print_y_date_tags) +{ + zend_string *z_buffer, *z_tags, *z_message; + zend_long z_y, z_date; + struct t_gui_buffer *buffer; + int y; + time_t date; + char *tags, *message; + + API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR); + if (zend_parse_parameters (ZEND_NUM_ARGS(), "SllSS", &z_buffer, &z_y, + &z_date, &z_tags, &z_message) == FAILURE) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = (struct t_gui_buffer *)API_STR2PTR(ZSTR_VAL(z_buffer)); + y = (int)z_y; + date = (time_t)z_date; + tags = ZSTR_VAL(z_tags); + message = ZSTR_VAL(z_message); + + plugin_script_api_printf_y_date_tags (weechat_php_plugin, + php_current_script, + buffer, + y, + date, + (const char *)tags, + "%s", + message); + + API_RETURN_OK; +} + API_FUNC(log_print) { zend_string *z_message; diff --git a/src/plugins/php/weechat-php-api.h b/src/plugins/php/weechat-php-api.h index f1ea273d9..283e4baed 100644 --- a/src/plugins/php/weechat-php-api.h +++ b/src/plugins/php/weechat-php-api.h @@ -126,6 +126,7 @@ PHP_FUNCTION(weechat_color); PHP_FUNCTION(weechat_print); PHP_FUNCTION(weechat_print_date_tags); PHP_FUNCTION(weechat_print_y); +PHP_FUNCTION(weechat_print_y_date_tags); PHP_FUNCTION(weechat_log_print); PHP_FUNCTION(weechat_hook_command); PHP_FUNCTION(weechat_hook_completion); diff --git a/src/plugins/php/weechat-php.c b/src/plugins/php/weechat-php.c index cbe30deae..092113195 100644 --- a/src/plugins/php/weechat-php.c +++ b/src/plugins/php/weechat-php.c @@ -184,6 +184,7 @@ const zend_function_entry weechat_functions[] = { PHP_FE(weechat_print, arginfo_weechat_print) PHP_FE(weechat_print_date_tags, arginfo_weechat_print_date_tags) PHP_FE(weechat_print_y, arginfo_weechat_print_y) + PHP_FE(weechat_print_y_date_tags, arginfo_weechat_print_y_date_tags) PHP_FE(weechat_log_print, arginfo_weechat_log_print) PHP_FE(weechat_hook_command, arginfo_weechat_hook_command) PHP_FE(weechat_hook_completion, arginfo_weechat_hook_completion) diff --git a/src/plugins/php/weechat-php.stub.php b/src/plugins/php/weechat-php.stub.php index 7ecae6086..b5488d14f 100644 --- a/src/plugins/php/weechat-php.stub.php +++ b/src/plugins/php/weechat-php.stub.php @@ -87,6 +87,7 @@ function weechat_color(): mixed {} function weechat_print(): mixed {} function weechat_print_date_tags(): mixed {} function weechat_print_y(): mixed {} +function weechat_print_y_date_tags(): mixed {} function weechat_log_print(): mixed {} function weechat_hook_command(): mixed {} function weechat_hook_completion(): mixed {} diff --git a/src/plugins/php/weechat-php_arginfo.h b/src/plugins/php/weechat-php_arginfo.h index d61320f3e..8067b169b 100644 --- a/src/plugins/php/weechat-php_arginfo.h +++ b/src/plugins/php/weechat-php_arginfo.h @@ -164,6 +164,8 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_print_y arginfo_weechat_register +#define arginfo_weechat_print_y_date_tags arginfo_weechat_register + #define arginfo_weechat_log_print arginfo_weechat_register #define arginfo_weechat_hook_command arginfo_weechat_register diff --git a/src/plugins/php/weechat-php_legacy_arginfo.h b/src/plugins/php/weechat-php_legacy_arginfo.h index da2882aa3..c96907041 100644 --- a/src/plugins/php/weechat-php_legacy_arginfo.h +++ b/src/plugins/php/weechat-php_legacy_arginfo.h @@ -164,6 +164,8 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_print_y arginfo_weechat_register +#define arginfo_weechat_print_y_date_tags arginfo_weechat_register + #define arginfo_weechat_log_print arginfo_weechat_register #define arginfo_weechat_hook_command arginfo_weechat_register diff --git a/src/plugins/plugin-script-api.c b/src/plugins/plugin-script-api.c index 5b4f854c2..157d0b181 100644 --- a/src/plugins/plugin-script-api.c +++ b/src/plugins/plugin-script-api.c @@ -326,7 +326,7 @@ plugin_script_api_printf (struct t_weechat_plugin *weechat_plugin, } /* - * Prints a message with optional date and tags. + * Prints a message, with optional date and tags. */ void @@ -378,6 +378,33 @@ plugin_script_api_printf_y (struct t_weechat_plugin *weechat_plugin, } /* + * Prints a message on a buffer with free content, with optional date and tags. + */ + +void +plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + struct t_gui_buffer *buffer, int y, + time_t date, const char *tags, + const char *format, ...) +{ + char *buf2; + + weechat_va_format (format); + if (!vbuffer) + return; + + buf2 = (script && script->charset && script->charset[0]) ? + weechat_iconv_to_internal (script->charset, vbuffer) : NULL; + weechat_printf_y_date_tags (buffer, y, date, tags, + "%s", (buf2) ? buf2 : vbuffer); + if (buf2) + free (buf2); + + free (vbuffer); +} + +/* * Prints a message in WeeChat log file. */ diff --git a/src/plugins/plugin-script-api.h b/src/plugins/plugin-script-api.h index 0707d2eef..0c01db775 100644 --- a/src/plugins/plugin-script-api.h +++ b/src/plugins/plugin-script-api.h @@ -119,6 +119,12 @@ extern void plugin_script_api_printf_y (struct t_weechat_plugin *weechat_plugin, struct t_plugin_script *script, struct t_gui_buffer *buffer, int y, const char *format, ...); +extern void plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + struct t_gui_buffer *buffer, + int y, time_t date, + const char *tags, + const char *format, ...); extern void plugin_script_api_log_printf (struct t_weechat_plugin *weechat_plugin, struct t_plugin_script *script, const char *format, ...); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index e265102b7..e1c4cde0b 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -772,7 +772,7 @@ plugin_load (const char *filename, int init_plugin, int argc, char **argv) new_plugin->prefix = &plugin_api_prefix; new_plugin->color = &plugin_api_color; new_plugin->printf_date_tags = &gui_chat_printf_date_tags; - new_plugin->printf_y = &gui_chat_printf_y; + new_plugin->printf_y_date_tags = &gui_chat_printf_y_date_tags; new_plugin->log_printf = &log_printf; new_plugin->hook_command = &hook_command; diff --git a/src/plugins/python/weechat-python-api.c b/src/plugins/python/weechat-python-api.c index 14d4984d4..0decc1f80 100644 --- a/src/plugins/python/weechat-python-api.c +++ b/src/plugins/python/weechat-python-api.c @@ -1930,6 +1930,31 @@ API_FUNC(prnt_y) API_RETURN_OK; } +API_FUNC(prnt_y_date_tags) +{ + char *buffer, *tags, *message; + int y, date; + + API_INIT_FUNC(1, "prnt_y_date_tags", API_RETURN_ERROR); + buffer = NULL; + y = 0; + date = 0; + tags = NULL; + message = NULL; + if (!PyArg_ParseTuple (args, "siiss", &buffer, &y, &date, &tags, &message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + plugin_script_api_printf_y_date_tags (weechat_python_plugin, + python_current_script, + API_STR2PTR(buffer), + y, + date, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { char *message; @@ -5279,6 +5304,7 @@ PyMethodDef weechat_python_funcs[] = API_DEF_FUNC(prnt), API_DEF_FUNC(prnt_date_tags), API_DEF_FUNC(prnt_y), + API_DEF_FUNC(prnt_y_date_tags), API_DEF_FUNC(log_print), API_DEF_FUNC(hook_command), API_DEF_FUNC(hook_completion), diff --git a/src/plugins/python/weechat.pyi b/src/plugins/python/weechat.pyi index f98b7071c..595a007c4 100644 --- a/src/plugins/python/weechat.pyi +++ b/src/plugins/python/weechat.pyi @@ -444,6 +444,11 @@ def prnt_y(buffer: str, y: int, message: str) -> int: ... +def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> int: + """`prnt_y_date_tags in WeeChat plugin API reference <https://weechat.org/doc/api#_prnt_y_date_tags>`_""" + ... + + def log_print(message: str) -> int: """`log_print in WeeChat plugin API reference <https://weechat.org/doc/api#_log_print>`_""" ... diff --git a/src/plugins/ruby/weechat-ruby-api.c b/src/plugins/ruby/weechat-ruby-api.c index c1c5cdc00..09aad9968 100644 --- a/src/plugins/ruby/weechat-ruby-api.c +++ b/src/plugins/ruby/weechat-ruby-api.c @@ -2388,6 +2388,42 @@ weechat_ruby_api_print_y (VALUE class, VALUE buffer, VALUE y, VALUE message) } static VALUE +weechat_ruby_api_print_y_date_tags (VALUE class, VALUE buffer, VALUE y, + VALUE date, VALUE tags, VALUE message) +{ + char *c_buffer, *c_tags, *c_message; + int c_y; + time_t c_date; + + API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR); + if (NIL_P (buffer) || NIL_P (y) || NIL_P (date) || NIL_P (tags) + || NIL_P (message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + Check_Type (buffer, T_STRING); + CHECK_INTEGER(y); + CHECK_INTEGER(date); + Check_Type (tags, T_STRING); + Check_Type (message, T_STRING); + + c_buffer = StringValuePtr (buffer); + c_y = NUM2INT (y); + c_date = NUM2ULONG (date); + c_tags = StringValuePtr (tags); + c_message = StringValuePtr (message); + + plugin_script_api_printf_y_date_tags (weechat_ruby_plugin, + ruby_current_script, + API_STR2PTR(c_buffer), + c_y, + c_date, + c_tags, + "%s", c_message); + + API_RETURN_OK; +} + +static VALUE weechat_ruby_api_log_print (VALUE class, VALUE message) { char *c_message; @@ -6540,6 +6576,7 @@ weechat_ruby_api_init (VALUE ruby_mWeechat) API_DEF_FUNC(print, 2); API_DEF_FUNC(print_date_tags, 4); API_DEF_FUNC(print_y, 3); + API_DEF_FUNC(print_y_date_tags, 5); API_DEF_FUNC(log_print, 1); API_DEF_FUNC(hook_command, 7); API_DEF_FUNC(hook_completion, 4); diff --git a/src/plugins/tcl/weechat-tcl-api.c b/src/plugins/tcl/weechat-tcl-api.c index 2e4ca610b..cff12283d 100644 --- a/src/plugins/tcl/weechat-tcl-api.c +++ b/src/plugins/tcl/weechat-tcl-api.c @@ -2134,13 +2134,13 @@ API_FUNC(print_date_tags) { Tcl_Obj *objp; char *buffer, *tags, *message; - int i, tdate; + int i, date; API_INIT_FUNC(1, "print_date_tags", API_RETURN_ERROR); if (objc < 5) API_WRONG_ARGS(API_RETURN_ERROR); - if (Tcl_GetIntFromObj (interp, objv[2], &tdate) != TCL_OK) + if (Tcl_GetIntFromObj (interp, objv[2], &date) != TCL_OK) API_WRONG_ARGS(API_RETURN_ERROR); buffer = Tcl_GetStringFromObj (objv[1], &i); @@ -2150,7 +2150,7 @@ API_FUNC(print_date_tags) plugin_script_api_printf_date_tags (weechat_tcl_plugin, tcl_current_script, API_STR2PTR(buffer), - tdate, + date, tags, "%s", message); @@ -2182,6 +2182,37 @@ API_FUNC(print_y) API_RETURN_OK; } +API_FUNC(print_y_date_tags) +{ + Tcl_Obj *objp; + char *buffer, *tags, *message; + int i, y, date; + + API_INIT_FUNC(1, "print_y_date_tags", API_RETURN_ERROR); + if (objc < 6) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetIntFromObj (interp, objv[2], &y) != TCL_OK) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetIntFromObj (interp, objv[3], &date) != TCL_OK) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = Tcl_GetStringFromObj (objv[1], &i); + tags = Tcl_GetStringFromObj (objv[4], &i); + message = Tcl_GetStringFromObj (objv[5], &i); + + plugin_script_api_printf_y_date_tags (weechat_tcl_plugin, + tcl_current_script, + API_STR2PTR(buffer), + y, + date, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { Tcl_Obj *objp; @@ -5843,6 +5874,7 @@ void weechat_tcl_api_init (Tcl_Interp *interp) API_DEF_FUNC(print); API_DEF_FUNC(print_date_tags); API_DEF_FUNC(print_y); + API_DEF_FUNC(print_y_date_tags); API_DEF_FUNC(log_print); API_DEF_FUNC(hook_command); API_DEF_FUNC(hook_completion); diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index d84336fbb..c45ad250a 100644 --- a/src/plugins/weechat-plugin.h +++ b/src/plugins/weechat-plugin.h @@ -68,7 +68,7 @@ struct timeval; * please change the date with current one; for a second change at same * date, increment the 01, otherwise please keep 01. */ -#define WEECHAT_PLUGIN_API_VERSION "20211106-01" +#define WEECHAT_PLUGIN_API_VERSION "20220130-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -653,8 +653,9 @@ struct t_weechat_plugin const char *(*color) (const char *color_name); void (*printf_date_tags) (struct t_gui_buffer *buffer, time_t date, const char *tags, const char *message, ...); - void (*printf_y) (struct t_gui_buffer *buffer, int y, - const char *message, ...); + void (*printf_y_date_tags) (struct t_gui_buffer *buffer, int y, + time_t date, const char *tags, + const char *message, ...); void (*log_printf) (const char *message, ...); /* hooks */ @@ -1689,7 +1690,12 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); (weechat_plugin->printf_date_tags)(__buffer, __date, __tags, \ __message, ##__argz) #define weechat_printf_y(__buffer, __y, __message, __argz...) \ - (weechat_plugin->printf_y)(__buffer, __y, __message, ##__argz) + (weechat_plugin->printf_y_date_tags)(__buffer, __y, 0, NULL, \ + __message, ##__argz) +#define weechat_printf_y_date_tags(__buffer, __y, __date, __tags, \ + __message, __argz...) \ + (weechat_plugin->printf_y_date_tags)(__buffer, __y, __date, __tags, \ + __message, ##__argz) #define weechat_log_printf(__message, __argz...) \ (weechat_plugin->log_printf)(__message, ##__argz) diff --git a/tests/scripts/python/testapi.py b/tests/scripts/python/testapi.py index 634370c22..4be516319 100644 --- a/tests/scripts/python/testapi.py +++ b/tests/scripts/python/testapi.py @@ -148,6 +148,16 @@ def test_key(): check(weechat.key_unbind('mouse', 'quiet:area:chat(plugin.test)') == 3) +def buffer_input_cb(data, buffer, input_data): + """Buffer input callback.""" + return weechat.WEECHAT_RC_OK + + +def buffer_close_cb(data, buffer): + """Buffer close callback.""" + return weechat.WEECHAT_RC_OK + + def test_display(): """Test display functions.""" check(weechat.prefix('action') != '') @@ -158,6 +168,12 @@ def test_display(): check(weechat.prefix('unknown') == '') check(weechat.color('green') != '') check(weechat.color('unknown') == '') + weechat.prnt('', '## test prnt') + weechat.prnt_date_tags('', 946681200, 'tag1,tag2', '## test prnt_date_tags') + buffer = weechat.buffer_new('test_free', 'buffer_input_cb', '', 'buffer_close_cb', '') + weechat.prnt_y(buffer, 0, '## test prnt_y') + weechat.prnt_y_date_tags(buffer, 0, 946681200, 'tag1,tag2', '## test prnt_y_date_tags') + weechat.buffer_close(buffer) def completion_cb(data, completion_item, buf, completion): diff --git a/tests/scripts/python/testapigen.py b/tests/scripts/python/testapigen.py index 4a63c8f1f..3d529ea4c 100755 --- a/tests/scripts/python/testapigen.py +++ b/tests/scripts/python/testapigen.py @@ -111,6 +111,7 @@ class WeechatScript(object): # pylint: disable=too-many-instance-attributes 'prnt': 'print', 'prnt_date_tags': 'print_date_tags', 'prnt_y': 'print_y', + 'prnt_y_date_tags': 'print_y_date_tags', } for node in ast.walk(self.tree): if isinstance(node, ast.Call) and \ diff --git a/tests/scripts/test-scripts.cpp b/tests/scripts/test-scripts.cpp index 33eaa3818..1dfc38f71 100644 --- a/tests/scripts/test-scripts.cpp +++ b/tests/scripts/test-scripts.cpp @@ -89,8 +89,11 @@ TEST_GROUP(Scripts) api_tests_errors++; else if (strstr (message, "TESTS END")) api_tests_end++; - else if ((message[0] != '>') && (message[0] != ' ')) + else if ((message[0] != '>') && (message[0] != ' ') + && (strncmp (message, "## ", 3) != 0)) + { api_tests_other++; + } } return WEECHAT_RC_OK; diff --git a/tests/unit/gui/test-gui-chat.cpp b/tests/unit/gui/test-gui-chat.cpp index 385c14b91..e359595e3 100644 --- a/tests/unit/gui/test-gui-chat.cpp +++ b/tests/unit/gui/test-gui-chat.cpp @@ -520,6 +520,27 @@ TEST(GuiChat, PrintDateTags) LONGS_EQUAL(4, ptr_data->prefix_length); STRCMP_EQUAL("this is a test", ptr_data->message); + /* message with empty tags */ + ptr_last_line = gui_buffers->own_lines->last_line; + gui_chat_printf_date_tags (gui_buffers, 0, "", "nick\tthis is a test"); + CHECK(ptr_last_line != gui_buffers->own_lines->last_line); + ptr_data = gui_buffers->own_lines->last_line->data; + CHECK(ptr_data); + POINTERS_EQUAL(gui_buffers, ptr_data->buffer); + LONGS_EQUAL(-1, ptr_data->y); + CHECK(ptr_data->date > 0); + CHECK(ptr_data->date == ptr_data->date_printed); + CHECK(ptr_data->str_time && ptr_data->str_time[0]); + LONGS_EQUAL(0, ptr_data->tags_count); + POINTERS_EQUAL(NULL, ptr_data->tags_array); + LONGS_EQUAL(1, ptr_data->displayed); + LONGS_EQUAL(0, ptr_data->notify_level); + LONGS_EQUAL(0, ptr_data->highlight); + LONGS_EQUAL(0, ptr_data->refresh_needed); + STRCMP_EQUAL("nick", ptr_data->prefix); + LONGS_EQUAL(4, ptr_data->prefix_length); + STRCMP_EQUAL("this is a test", ptr_data->message); + /* message with 3 tags */ ptr_last_line = gui_buffers->own_lines->last_line; gui_chat_printf_date_tags (gui_buffers, 0, "tag1,tag2,tag3", "nick\tthis is a test"); @@ -547,10 +568,10 @@ TEST(GuiChat, PrintDateTags) /* * Tests functions: - * gui_chat_printf_y + * gui_chat_printf_y_date_tags */ -TEST(GuiChat, PrintY) +TEST(GuiChat, PrintYDateTags) { struct t_gui_buffer *buffer; struct t_gui_line_data *ptr_data; @@ -560,30 +581,70 @@ TEST(GuiChat, PrintY) gui_buffer_set (buffer, "type", "free"); /* invalid buffer pointer */ - gui_chat_printf_y ((struct t_gui_buffer *)0x1, 0, "test"); + gui_chat_printf_y_date_tags ((struct t_gui_buffer *)0x1, 0, 0, NULL, "test"); POINTERS_EQUAL(NULL, buffer->own_lines->last_line); /* invalid buffer: not with free content */ - gui_chat_printf_y (gui_buffers, 0, "test"); + gui_chat_printf_y_date_tags (gui_buffers, 0, 0, NULL, "test"); POINTERS_EQUAL(NULL, buffer->own_lines->last_line); /* NULL message */ - gui_chat_printf_y (buffer, 0, NULL); + gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, NULL); POINTERS_EQUAL(NULL, buffer->own_lines->last_line); /* empty message */ - gui_chat_printf_y (buffer, 0, ""); + gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, ""); POINTERS_EQUAL(NULL, buffer->own_lines->last_line); /* message on first line */ - gui_chat_printf_y (buffer, 0, "this is a test on line 1"); + gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, "this is a test on line 1"); CHECK(buffer->own_lines->last_line); ptr_data = buffer->own_lines->last_line->data; CHECK(ptr_data); POINTERS_EQUAL(buffer, ptr_data->buffer); LONGS_EQUAL(0, ptr_data->y); - LONGS_EQUAL(0, ptr_data->date); - LONGS_EQUAL(0, ptr_data->date_printed); + CHECK(ptr_data->date > 0); + CHECK(ptr_data->date == ptr_data->date_printed); + POINTERS_EQUAL(NULL, ptr_data->str_time); + LONGS_EQUAL(0, ptr_data->tags_count); + POINTERS_EQUAL(NULL, ptr_data->tags_array); + LONGS_EQUAL(1, ptr_data->displayed); + LONGS_EQUAL(0, ptr_data->notify_level); + LONGS_EQUAL(0, ptr_data->highlight); + LONGS_EQUAL(1, ptr_data->refresh_needed); + POINTERS_EQUAL(NULL, ptr_data->prefix); + LONGS_EQUAL(0, ptr_data->prefix_length); + STRCMP_EQUAL("this is a test on line 1", ptr_data->message); + + /* message on first line with past date */ + gui_chat_printf_y_date_tags (buffer, 0, 946681200, NULL, "this is a test on line 1"); + CHECK(buffer->own_lines->last_line); + ptr_data = buffer->own_lines->last_line->data; + CHECK(ptr_data); + POINTERS_EQUAL(buffer, ptr_data->buffer); + LONGS_EQUAL(0, ptr_data->y); + LONGS_EQUAL(946681200, ptr_data->date); + CHECK(ptr_data->date < ptr_data->date_printed); + POINTERS_EQUAL(NULL, ptr_data->str_time); + LONGS_EQUAL(0, ptr_data->tags_count); + POINTERS_EQUAL(NULL, ptr_data->tags_array); + LONGS_EQUAL(1, ptr_data->displayed); + LONGS_EQUAL(0, ptr_data->notify_level); + LONGS_EQUAL(0, ptr_data->highlight); + LONGS_EQUAL(1, ptr_data->refresh_needed); + POINTERS_EQUAL(NULL, ptr_data->prefix); + LONGS_EQUAL(0, ptr_data->prefix_length); + STRCMP_EQUAL("this is a test on line 1", ptr_data->message); + + /* message on first line with empty tags */ + gui_chat_printf_y_date_tags (buffer, 0, 0, "", "this is a test on line 1"); + CHECK(buffer->own_lines->last_line); + ptr_data = buffer->own_lines->last_line->data; + CHECK(ptr_data); + POINTERS_EQUAL(buffer, ptr_data->buffer); + LONGS_EQUAL(0, ptr_data->y); + CHECK(ptr_data->date > 0); + CHECK(ptr_data->date == ptr_data->date_printed); POINTERS_EQUAL(NULL, ptr_data->str_time); LONGS_EQUAL(0, ptr_data->tags_count); POINTERS_EQUAL(NULL, ptr_data->tags_array); @@ -595,15 +656,38 @@ TEST(GuiChat, PrintY) LONGS_EQUAL(0, ptr_data->prefix_length); STRCMP_EQUAL("this is a test on line 1", ptr_data->message); + /* message on first line with 3 tags */ + gui_chat_printf_y_date_tags (buffer, 0, 0, "tag1,tag2,tag3", "this is a test on line 1"); + CHECK(buffer->own_lines->last_line); + ptr_data = buffer->own_lines->last_line->data; + CHECK(ptr_data); + POINTERS_EQUAL(buffer, ptr_data->buffer); + LONGS_EQUAL(0, ptr_data->y); + CHECK(ptr_data->date > 0); + CHECK(ptr_data->date == ptr_data->date_printed); + POINTERS_EQUAL(NULL, ptr_data->str_time); + LONGS_EQUAL(3, ptr_data->tags_count); + CHECK(ptr_data->tags_array); + STRCMP_EQUAL("tag1", ptr_data->tags_array[0]); + STRCMP_EQUAL("tag2", ptr_data->tags_array[1]); + STRCMP_EQUAL("tag3", ptr_data->tags_array[2]); + LONGS_EQUAL(1, ptr_data->displayed); + LONGS_EQUAL(0, ptr_data->notify_level); + LONGS_EQUAL(0, ptr_data->highlight); + LONGS_EQUAL(1, ptr_data->refresh_needed); + POINTERS_EQUAL(NULL, ptr_data->prefix); + LONGS_EQUAL(0, ptr_data->prefix_length); + STRCMP_EQUAL("this is a test on line 1", ptr_data->message); + /* message on third line */ - gui_chat_printf_y (buffer, 2, "this is a test on line 3"); + gui_chat_printf_y_date_tags (buffer, 2, 0, NULL, "this is a test on line 3"); CHECK(buffer->own_lines->last_line); ptr_data = buffer->own_lines->last_line->data; CHECK(ptr_data); POINTERS_EQUAL(buffer, ptr_data->buffer); LONGS_EQUAL(2, ptr_data->y); - LONGS_EQUAL(0, ptr_data->date); - LONGS_EQUAL(0, ptr_data->date_printed); + CHECK(ptr_data->date > 0); + CHECK(ptr_data->date == ptr_data->date_printed); POINTERS_EQUAL(NULL, ptr_data->str_time); LONGS_EQUAL(0, ptr_data->tags_count); POINTERS_EQUAL(NULL, ptr_data->tags_array); @@ -616,7 +700,7 @@ TEST(GuiChat, PrintY) STRCMP_EQUAL("this is a test on line 3", ptr_data->message); /* delete first line */ - gui_chat_printf_y (buffer, 0, ""); + gui_chat_printf_y_date_tags (buffer, 0, 0, NULL, ""); ptr_data = buffer->own_lines->first_line->data; CHECK(ptr_data); POINTERS_EQUAL(buffer, ptr_data->buffer); @@ -635,13 +719,13 @@ TEST(GuiChat, PrintY) STRCMP_EQUAL("", ptr_data->message); /* delete third line */ - gui_chat_printf_y (buffer, 2, ""); + gui_chat_printf_y_date_tags (buffer, 2, 0, NULL, ""); CHECK(buffer->own_lines->first_line); CHECK(buffer->own_lines->first_line->next_line); POINTERS_EQUAL(NULL, buffer->own_lines->first_line->next_line->next_line); - /* delete secondline */ - gui_chat_printf_y (buffer, 1, ""); + /* delete second line */ + gui_chat_printf_y_date_tags (buffer, 1, 0, NULL, ""); CHECK(buffer->own_lines->first_line); POINTERS_EQUAL(NULL, buffer->own_lines->first_line->next_line); diff --git a/tests/unit/gui/test-gui-line.cpp b/tests/unit/gui/test-gui-line.cpp index 6032301c1..14e37a03f 100644 --- a/tests/unit/gui/test-gui-line.cpp +++ b/tests/unit/gui/test-gui-line.cpp @@ -36,7 +36,8 @@ extern "C" #define WEE_BUILD_STR_PREFIX_MSG(__result, __prefix, __message) \ line = gui_line_new (gui_buffers, -1, 0, 0, "tag1,tag2", \ __prefix, __message); \ - str = gui_line_build_string_prefix_message (line); \ + str = gui_line_build_string_prefix_message (line->data->prefix, \ + line->data->message); \ STRCMP_EQUAL(__result, str); \ free (str); \ gui_line_free_data (line); \ @@ -45,7 +46,9 @@ extern "C" #define WEE_BUILD_STR_MSG_TAGS(__tags, __message) \ line = gui_line_new (gui_buffers, -1, 0, 0, __tags, \ NULL, __message); \ - str = gui_line_build_string_message_tags (line); \ + str = gui_line_build_string_message_tags (line->data->message, \ + line->data->tags_count, \ + line->data->tags_array); \ STRCMP_EQUAL(str_result, str); \ free (str); \ gui_line_free_data (line); \ @@ -213,6 +216,18 @@ TEST(GuiLine, BuildStringMessageTags) struct t_gui_line *line; char *str, str_result[256]; + line = gui_line_new (gui_buffers, -1, 0, 0, "tag1,tag2", NULL, "test"); + POINTERS_EQUAL(NULL, + gui_line_build_string_message_tags (line->data->message, + -1, + line->data->tags_array)); + POINTERS_EQUAL(NULL, + gui_line_build_string_message_tags (line->data->message, + 1, + NULL)); + gui_line_free_data (line); + free (line); + snprintf (str_result, sizeof (str_result), "message%s [%s%s]", GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), |