diff options
Diffstat (limited to 'src')
50 files changed, 1524 insertions, 477 deletions
diff --git a/src/core/hook/wee-hook-line.c b/src/core/hook/wee-hook-line.c index 1d29be96a..d3414ea9f 100644 --- a/src/core/hook/wee-hook-line.c +++ b/src/core/hook/wee-hook-line.c @@ -168,7 +168,9 @@ hook_line_exec (struct t_gui_line *line) gui_buffer_type_string[line->data->buffer->type]); HASHTABLE_SET_INT("y", line->data->y); HASHTABLE_SET_TIME("date", line->data->date); + HASHTABLE_SET_INT("date_usec", line->data->date_usec); HASHTABLE_SET_TIME("date_printed", line->data->date_printed); + HASHTABLE_SET_INT("date_usec_printed", line->data->date_usec_printed); HASHTABLE_SET_STR_NOT_NULL("str_time", line->data->str_time); HASHTABLE_SET_INT("tags_count", line->data->tags_count); str_tags = string_rebuild_split_string ( diff --git a/src/core/hook/wee-hook-print.c b/src/core/hook/wee-hook-print.c index 6c95e3e11..bea7bf2ff 100644 --- a/src/core/hook/wee-hook-print.c +++ b/src/core/hook/wee-hook-print.c @@ -168,6 +168,7 @@ hook_print_exec (struct t_gui_buffer *buffer, struct t_gui_line *line) ptr_hook->callback_data, buffer, line->data->date, + line->data->date_usec, line->data->tags_count, (const char **)line->data->tags_array, (int)line->data->displayed, (int)line->data->highlight, diff --git a/src/core/hook/wee-hook-print.h b/src/core/hook/wee-hook-print.h index 8eeb1eb0f..d32334d17 100644 --- a/src/core/hook/wee-hook-print.h +++ b/src/core/hook/wee-hook-print.h @@ -31,10 +31,10 @@ struct t_gui_line; typedef int (t_hook_callback_print)(const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, int tags_count, - const char **tags, int displayed, - int highlight, const char *prefix, - const char *message); + time_t date, int date_usec, + int tags_count, const char **tags, + int displayed, int highlight, + const char *prefix, const char *message); struct t_hook_print { diff --git a/src/core/hook/wee-hook-timer.c b/src/core/hook/wee-hook-timer.c index 418d22304..a68e115c6 100644 --- a/src/core/hook/wee-hook-timer.c +++ b/src/core/hook/wee-hook-timer.c @@ -415,9 +415,7 @@ hook_timer_add_to_infolist (struct t_infolist_item *item, void hook_timer_print_log (struct t_hook *hook) { - struct tm *local_time; - time_t seconds; - char text_time[1024]; + char text_time[128]; if (!hook || !hook->hook_data) return; @@ -427,30 +425,18 @@ hook_timer_print_log (struct t_hook *hook) log_printf (" interval. . . . . . . : %ld", HOOK_TIMER(hook, interval)); log_printf (" align_second. . . . . : %d", HOOK_TIMER(hook, align_second)); log_printf (" remaining_calls . . . : %d", HOOK_TIMER(hook, remaining_calls)); - text_time[0] = '\0'; - seconds = HOOK_TIMER(hook, last_exec).tv_sec; - local_time = localtime (&seconds); - if (local_time) - { - if (strftime (text_time, sizeof (text_time), - "%d/%m/%Y %H:%M:%S", local_time) == 0) - text_time[0] = '\0'; - } - log_printf (" last_exec.tv_sec. . . : %lld (%s)", - (long long)(HOOK_TIMER(hook, last_exec.tv_sec)), - text_time); - log_printf (" last_exec.tv_usec . . : %ld", HOOK_TIMER(hook, last_exec.tv_usec)); - text_time[0] = '\0'; - seconds = HOOK_TIMER(hook, next_exec).tv_sec; - local_time = localtime (&seconds); - if (local_time) - { - if (strftime (text_time, sizeof (text_time), - "%d/%m/%Y %H:%M:%S", local_time) == 0) - text_time[0] = '\0'; - } - log_printf (" next_exec.tv_sec. . . : %lld (%s)", - (long long)(HOOK_TIMER(hook, next_exec.tv_sec)), - text_time); - log_printf (" next_exec.tv_usec . . : %ld", HOOK_TIMER(hook, next_exec.tv_usec)); + util_strftimeval (text_time, sizeof (text_time), + "%Y-%m-%dT%H:%M:%S.%f", &(HOOK_TIMER(hook, last_exec))); + log_printf (" last_exec . . . . . . : %s", text_time); + log_printf (" tv_sec. . . . . . . : %lld", + (long long)(HOOK_TIMER(hook, last_exec.tv_sec))); + log_printf (" tv_usec. . . . . . : %ld", + HOOK_TIMER(hook, last_exec.tv_usec)); + util_strftimeval (text_time, sizeof (text_time), + "%Y-%m-%dT%H:%M:%S.%f", &(HOOK_TIMER(hook, next_exec))); + log_printf (" last_exec . . . . . . : %s", text_time); + log_printf (" tv_sec. . . . . . . : %lld", + (long long)(HOOK_TIMER(hook, next_exec.tv_sec))); + log_printf (" tv_usec. . . . . . : %ld", + HOOK_TIMER(hook, next_exec.tv_usec)); } diff --git a/src/core/wee-config.c b/src/core/wee-config.c index 0b380c669..f269ba18f 100644 --- a/src/core/wee-config.c +++ b/src/core/wee-config.c @@ -3170,8 +3170,9 @@ config_weechat_init_options () config_look_bare_display_time_format = config_file_new_option ( weechat_config_file, weechat_config_section_look, "bare_display_time_format", "string", - N_("time format in bare display mode (see man strftime for " - "date/time specifiers)"), + N_("time format in bare display mode (see API man strftime for " + "date/time specifiers, extra specifiers are supported, see " + "function util_strftimeval in Plugin API reference)"), NULL, 0, 0, "%H:%M", NULL, 0, NULL, NULL, NULL, &config_change_buffer_content, NULL, NULL, @@ -3250,10 +3251,14 @@ config_weechat_init_options () "buffer_time_format", "string", /* TRANSLATORS: string "${color:xxx}" must NOT be translated */ N_("time format for each line displayed in buffers (see man " - "strftime for date/time specifiers) (note: content is evaluated, " - "so you can use colors with format \"${color:xxx}\", see /help " - "eval); for example time using grayscale: " - "\"${color:252}%H${color:243}%M${color:237}%S\""), + "strftime for date/time specifiers, extra specifiers are " + "supported, see function util_strftimeval in Plugin API reference) " + "(note: content is evaluated, so you can use colors with format " + "\"${color:xxx}\", see /help eval); " + "for example time using grayscale: " + "\"${color:252}%H${color:243}%M${color:237}%S\", " + "the same with milliseconds: " + "\"${color:252}%H${color:243}%M${color:237}%S.%.3\""), NULL, 0, 0, "%H:%M:%S", NULL, 0, NULL, NULL, NULL, &config_change_buffer_time_format, NULL, NULL, @@ -4060,7 +4065,9 @@ config_weechat_init_options () config_look_quote_time_format = config_file_new_option ( weechat_config_file, weechat_config_section_look, "quote_time_format", "string", - N_("time format when quoting a message (see /help cursor)"), + N_("time format when quoting a message (see /help cursor) " + "(see man strftime for date/time specifiers, extra specifiers " + "are supported, see function util_strftimeval in Plugin API reference)"), NULL, 0, 0, "%H:%M:%S", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); config_look_read_marker = config_file_new_option ( diff --git a/src/core/wee-upgrade.c b/src/core/wee-upgrade.c index 266cde9b3..9e9408b85 100644 --- a/src/core/wee-upgrade.c +++ b/src/core/wee-upgrade.c @@ -636,13 +636,16 @@ upgrade_weechat_read_buffer_line (struct t_infolist *infolist) switch (upgrade_current_buffer->type) { case GUI_BUFFER_TYPE_FORMATTED: - new_line = gui_line_new (upgrade_current_buffer, - -1, - infolist_time (infolist, "date"), - infolist_time (infolist, "date_printed"), - infolist_string (infolist, "tags"), - infolist_string (infolist, "prefix"), - infolist_string (infolist, "message")); + new_line = gui_line_new ( + upgrade_current_buffer, + -1, + infolist_time (infolist, "date"), + infolist_integer (infolist, "date_usec"), + infolist_time (infolist, "date_printed"), + infolist_integer (infolist, "date_usec_printed"), + infolist_string (infolist, "tags"), + infolist_string (infolist, "prefix"), + infolist_string (infolist, "message")); if (new_line) { new_line->data->id = infolist_integer (infolist, "id"); @@ -654,13 +657,16 @@ upgrade_weechat_read_buffer_line (struct t_infolist *infolist) } break; case GUI_BUFFER_TYPE_FREE: - new_line = gui_line_new (upgrade_current_buffer, - infolist_integer (infolist, "y"), - infolist_time (infolist, "date"), - infolist_time (infolist, "date_printed"), - infolist_string (infolist, "tags"), - NULL, - infolist_string (infolist, "message")); + new_line = gui_line_new ( + upgrade_current_buffer, + infolist_integer (infolist, "y"), + infolist_time (infolist, "date"), + infolist_integer (infolist, "date_usec"), + infolist_time (infolist, "date_printed"), + infolist_integer (infolist, "date_usec_printed"), + infolist_string (infolist, "tags"), + NULL, + infolist_string (infolist, "message")); if (new_line) { new_line->data->id = infolist_integer (infolist, "id"); diff --git a/src/core/wee-util.c b/src/core/wee-util.c index 783d4ccf9..cad92ef42 100644 --- a/src/core/wee-util.c +++ b/src/core/wee-util.c @@ -164,6 +164,79 @@ util_get_time_string (const time_t *date) } /* + * Formats date and time like strftime and adds additional formats for support + * of microseconds: "%.N" where N is an integer between 1 and 6: first N + * digits of microseconds (for example "%.3" is milliseconds, on 3 digits). + * Format "%f" is an alias of "%.6" (microseconds, zero-padded to 6 digits). + */ + +int +util_strftimeval (char *string, int max, const char *format, struct timeval *tv) +{ + char **format2, str_usec[32]; + const char *ptr_format; + struct tm *local_time; + int length, bytes; + + if (!string || (max <= 0) || !format || !tv) + return 0; + + string[0] = '\0'; + + if (!format[0]) + return 0; + + format2 = string_dyn_alloc (strlen (format) + 1); + if (!format2) + return 0; + + ptr_format = format; + while (ptr_format && ptr_format[0]) + { + if ((ptr_format[0] == '%') && (ptr_format[1] == '%')) + { + string_dyn_concat (format2, "%%", -1); + ptr_format += 2; + } + else if ((ptr_format[0] == '%') && (ptr_format[1] == '.') + && (ptr_format[2] >= '1') && (ptr_format[2] <= '6')) + { + snprintf (str_usec, sizeof (str_usec), + "%06ld", (long)(tv->tv_usec)); + length = ptr_format[2] - '1' + 1; + str_usec[length] = '\0'; + string_dyn_concat (format2, str_usec, -1); + ptr_format += 3; + } + else if ((ptr_format[0] == '%') && (ptr_format[1] == 'f')) + { + snprintf (str_usec, sizeof (str_usec), + "%06ld", (long)(tv->tv_usec)); + string_dyn_concat (format2, str_usec, -1); + ptr_format += 2; + } + else + { + string_dyn_concat (format2, ptr_format, 1); + ptr_format++; + } + } + + local_time = localtime (&(tv->tv_sec)); + if (!local_time) + { + string_dyn_free (format2, 1); + return 0; + } + + bytes = strftime (string, max, *format2, local_time); + + string_dyn_free (format2, 1); + + return bytes; +} + +/* * Returns difference between two times. * * The following variables are set, if pointer is not NULL: diff --git a/src/core/wee-util.h b/src/core/wee-util.h index 17ed980d1..d6d9eb40a 100644 --- a/src/core/wee-util.h +++ b/src/core/wee-util.h @@ -31,6 +31,8 @@ extern void util_timeval_add (struct timeval *tv, long long interval); /* time */ extern char *util_get_microseconds_string (long long diff); extern const char *util_get_time_string (const time_t *date); +extern int util_strftimeval (char *string, int max, const char *format, + struct timeval *tv); extern void util_get_time_diff (time_t time1, time_t time2, time_t *total_seconds, int *days, int *hours, int *minutes, diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c index 4ada70146..bb239ff8d 100644 --- a/src/gui/curses/gui-curses-chat.c +++ b/src/gui/curses/gui-curses-chat.c @@ -35,6 +35,7 @@ #include "../../core/wee-hook.h" #include "../../core/wee-string.h" #include "../../core/wee-utf8.h" +#include "../../core/wee-util.h" #include "../../plugins/plugin.h" #include "../gui-buffer.h" #include "../gui-chat.h" @@ -2103,7 +2104,7 @@ gui_chat_get_bare_line (struct t_gui_line *line) { char *prefix, *message, str_time[256], *str_line; const char *tag_prefix_nick; - struct tm *local_time; + struct timeval tv; int length; prefix = NULL; @@ -2125,11 +2126,11 @@ gui_chat_get_bare_line (struct t_gui_line *line) && CONFIG_STRING(config_look_bare_display_time_format) && CONFIG_STRING(config_look_bare_display_time_format)[0]) { - local_time = localtime (&line->data->date); - if (strftime (str_time, sizeof (str_time), - CONFIG_STRING(config_look_bare_display_time_format), - local_time) == 0) - str_time[0] = '\0'; + tv.tv_sec = line->data->date; + tv.tv_usec = line->data->date_usec; + util_strftimeval (str_time, sizeof (str_time), + CONFIG_STRING(config_look_bare_display_time_format), + &tv); } tag_prefix_nick = gui_line_search_tag_starting_with (line, "prefix_nick_"); diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index c0232d927..ffda02c3d 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -5299,12 +5299,14 @@ gui_buffer_dump_hexa (struct t_gui_buffer *buffer) free (tags); snprintf (buf, sizeof (buf), "%s", ctime (&ptr_line->data->date)); buf[strlen (buf) - 1] = '\0'; - log_printf (" date: %lld = %s", + log_printf (" date: %lld = %s", (long long)(ptr_line->data->date), buf); + log_printf (" date_usec: %d", ptr_line->data->date_usec); snprintf (buf, sizeof (buf), "%s", ctime (&ptr_line->data->date_printed)); buf[strlen (buf) - 1] = '\0'; log_printf (" date_printed: %lld = %s", (long long)ptr_line->data->date_printed, buf); + log_printf (" date_usec_printed: %d", ptr_line->data->date_usec_printed); /* display raw message for line */ if (ptr_line->data->message) diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c index 5c4e1a085..964485cfc 100644 --- a/src/gui/gui-chat.c +++ b/src/gui/gui-chat.c @@ -29,6 +29,7 @@ #include <stdarg.h> #include <ctype.h> #include <time.h> +#include <sys/time.h> #include <regex.h> #include "../core/weechat.h" @@ -38,6 +39,7 @@ #include "../core/wee-hook.h" #include "../core/wee-string.h" #include "../core/wee-utf8.h" +#include "../core/wee-util.h" #include "../plugins/plugin.h" #include "gui-chat.h" #include "gui-buffer.h" @@ -388,12 +390,12 @@ gui_chat_get_word_info (struct t_gui_window *window, */ char * -gui_chat_get_time_string (time_t date) +gui_chat_get_time_string (time_t date, int date_usec) { char text_time[128], text_time2[(128*3)+16], text_time_char[2]; char *text_with_color; int i, time_first_digit, time_last_digit, last_color; - struct tm *local_time; + struct timeval tv; if (date == 0) return NULL; @@ -402,12 +404,11 @@ gui_chat_get_time_string (time_t date) || !CONFIG_STRING(config_look_buffer_time_format)[0]) return NULL; - local_time = localtime (&date); - if (!local_time) - return NULL; - if (strftime (text_time, sizeof (text_time), - CONFIG_STRING(config_look_buffer_time_format), - local_time) == 0) + tv.tv_sec = date; + tv.tv_usec = date_usec; + if (util_strftimeval (text_time, sizeof (text_time), + CONFIG_STRING(config_look_buffer_time_format), + &tv) == 0) return NULL; if (strstr (text_time, "${")) @@ -499,7 +500,7 @@ gui_chat_get_time_string (time_t date) int gui_chat_get_time_length () { - time_t date; + struct timeval tv_now; char *text_time; int length; @@ -508,8 +509,8 @@ gui_chat_get_time_length () return 0; length = 0; - date = time (NULL); - text_time = gui_chat_get_time_string (date); + gettimeofday (&tv_now, NULL); + text_time = gui_chat_get_time_string (tv_now.tv_sec, tv_now.tv_usec); if (text_time) { @@ -540,7 +541,9 @@ gui_chat_change_time_format () { if (ptr_line->data->str_time) free (ptr_line->data->str_time); - ptr_line->data->str_time = gui_chat_get_time_string (ptr_line->data->date); + ptr_line->data->str_time = gui_chat_get_time_string ( + ptr_line->data->date, + ptr_line->data->date_usec); } } } @@ -586,11 +589,13 @@ gui_chat_buffer_valid (struct t_gui_buffer *buffer, */ void -gui_chat_printf_date_tags_internal (struct t_gui_buffer *buffer, - time_t date, - time_t date_printed, - const char *tags, - char *message) +gui_chat_printf_datetime_tags_internal (struct t_gui_buffer *buffer, + time_t date, + int date_usec, + time_t date_printed, + int date_usec_printed, + const char *tags, + char *message) { int display_time, length_data, length_str; char *ptr_msg, *pos_prefix, *pos_tab; @@ -639,7 +644,9 @@ gui_chat_printf_date_tags_internal (struct t_gui_buffer *buffer, new_line = gui_line_new (buffer, -1, (display_time) ? date : 0, + (display_time) ? date_usec : 0, date_printed, + date_usec_printed, tags, pos_prefix, ptr_msg); @@ -734,7 +741,10 @@ gui_chat_printf_date_tags_internal (struct t_gui_buffer *buffer, } } if ((new_line->data->date == 0) && display_time) + { new_line->data->date = new_line->data->date_printed; + new_line->data->date_usec = new_line->data->date_usec_printed; + } if (new_line->data->prefix) string_shared_free (new_line->data->prefix); if (pos_prefix) @@ -860,10 +870,11 @@ gui_chat_print_lines_waiting_buffer (FILE *f) */ void -gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date, - const char *tags, const char *message, ...) +gui_chat_printf_datetime_tags (struct t_gui_buffer *buffer, + time_t date, int date_usec, + const char *tags, const char *message, ...) { - time_t date_printed; + struct timeval tv_date_printed; char *pos, *pos_end; int one_line; @@ -884,9 +895,12 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date, utf8_normalize (vbuffer, '?'); - date_printed = time (NULL); + gettimeofday (&tv_date_printed, NULL); if (date <= 0) - date = date_printed; + { + date = tv_date_printed.tv_sec; + date_usec = tv_date_printed.tv_usec; + } one_line = 0; pos = vbuffer; @@ -907,8 +921,13 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date, if (gui_init_ok) { - gui_chat_printf_date_tags_internal (buffer, date, date_printed, - tags, pos); + gui_chat_printf_datetime_tags_internal (buffer, + date, + date_usec, + tv_date_printed.tv_sec, + tv_date_printed.tv_usec, + tags, + pos); } else { @@ -932,11 +951,12 @@ gui_chat_printf_date_tags (struct t_gui_buffer *buffer, time_t date, */ void -gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, - const char *tags, const char *message, ...) +gui_chat_printf_y_datetime_tags (struct t_gui_buffer *buffer, int y, + time_t date, int date_usec, + const char *tags, const char *message, ...) { struct t_gui_line *ptr_line, *new_line, *new_line_empty; - time_t date_printed; + struct timeval tv_date_printed; int i, last_y, num_lines_to_add; if (!message) @@ -958,12 +978,22 @@ gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, utf8_normalize (vbuffer, '?'); - date_printed = time (NULL); + gettimeofday (&tv_date_printed, NULL); if (date <= 0) - date = date_printed; + { + date = tv_date_printed.tv_sec; + date_usec = tv_date_printed.tv_usec; + } - new_line = gui_line_new (buffer, y, date, date_printed, tags, - NULL, vbuffer); + new_line = gui_line_new (buffer, + y, + date, + date_usec, + tv_date_printed.tv_sec, + tv_date_printed.tv_usec, + tags, + NULL, + vbuffer); if (!new_line) goto end; @@ -1000,7 +1030,8 @@ gui_chat_printf_y_date_tags (struct t_gui_buffer *buffer, int y, time_t date, for (i = y - num_lines_to_add; i < y; i++) { new_line_empty = gui_line_new (new_line->data->buffer, - i, 0, 0, NULL, NULL, ""); + i, 0, 0, 0, 0, NULL, NULL, + ""); if (new_line_empty) gui_line_add_y (new_line_empty); } @@ -1056,14 +1087,13 @@ gui_chat_hsignal_quote_line_cb (const void *pointer, void *data, const char *signal, struct t_hashtable *hashtable) { - const char *date, *line, *prefix, *ptr_prefix, *message; + const char *ptr_date, *ptr_date_usec, *line, *prefix, *ptr_prefix, *message; unsigned long value; long number; - struct tm *local_time; + struct timeval tv; struct t_gui_line *ptr_line; int is_nick, length_time, length_nick_prefix, length_prefix; int length_nick_suffix, length_message, length, rc; - time_t line_date; char str_time[128], *str, *error; /* make C compiler happy */ @@ -1075,23 +1105,28 @@ gui_chat_hsignal_quote_line_cb (const void *pointer, void *data, /* get time */ str_time[0] = '\0'; - date = (strstr (signal, "time")) ? + ptr_date = (strstr (signal, "time")) ? hashtable_get (hashtable, "_chat_line_date") : NULL; - if (date) + if (ptr_date) { error = NULL; - number = strtol (date, &error, 10); + number = strtol (ptr_date, &error, 10); if (error && !error[0]) { - line_date = (time_t)number; - local_time = localtime (&line_date); - if (local_time) + tv.tv_sec = (time_t)number; + tv.tv_usec = 0; + ptr_date_usec = (strstr (signal, "time")) ? + hashtable_get (hashtable, "_chat_line_date_usec") : NULL; + if (ptr_date_usec) { - if (strftime (str_time, sizeof (str_time), - CONFIG_STRING(config_look_quote_time_format), - local_time) == 0) - str_time[0] = '\0'; + error = NULL; + number = strtol (ptr_date_usec, &error, 10); + if (error && !error[0]) + tv.tv_usec = (int)number; } + util_strftimeval (str_time, sizeof (str_time), + CONFIG_STRING(config_look_quote_time_format), + &tv); } } diff --git a/src/gui/gui-chat.h b/src/gui/gui-chat.h index 0971b93f9..6e184da98 100644 --- a/src/gui/gui-chat.h +++ b/src/gui/gui-chat.h @@ -28,11 +28,17 @@ struct t_gui_window; struct t_gui_buffer; struct t_gui_line; -#define gui_chat_printf(buffer, argz...) \ - gui_chat_printf_date_tags(buffer, 0, NULL, ##argz) +#define gui_chat_printf(buffer, argz...) \ + gui_chat_printf_datetime_tags(buffer, 0, 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_printf_date_tags(buffer, date, tags, argz...) \ + gui_chat_printf_datetime_tags(buffer, date, 0, tags, ##argz) + +#define gui_chat_printf_y(buffer, y, argz...) \ + gui_chat_printf_y_datetime_tags(buffer, y, 0, 0, NULL, ##argz) + +#define gui_chat_printf_y_date_tags(buffer, y, date, tags, argz...) \ + gui_chat_printf_y_datetime_tags(buffer, y, date, 0, tags, ##argz) #define GUI_CHAT_TAG_NO_HIGHLIGHT "no_highlight" @@ -84,17 +90,20 @@ extern void gui_chat_get_word_info (struct t_gui_window *window, int *word_end_offset, int *word_length_with_spaces, int *word_length); -extern char *gui_chat_get_time_string (time_t date); +extern char *gui_chat_get_time_string (time_t date, int date_usec); extern int gui_chat_get_time_length (); extern void gui_chat_change_time_format (); extern int gui_chat_buffer_valid (struct t_gui_buffer *buffer, int buffer_type); -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_date_tags (struct t_gui_buffer *buffer, int y, - time_t date, const char *tags, - const char *message, ...); +extern void gui_chat_printf_datetime_tags (struct t_gui_buffer *buffer, + time_t date, int date_usec, + const char *tags, + const char *message, ...); +extern void gui_chat_printf_y_datetime_tags (struct t_gui_buffer *buffer, + int y, + time_t date, int date_usec, + 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-focus.c b/src/gui/gui-focus.c index d00e091c5..24b206331 100644 --- a/src/gui/gui-focus.c +++ b/src/gui/gui-focus.c @@ -218,7 +218,9 @@ gui_focus_to_hashtable (struct t_gui_focus_info *focus_info, const char *key) HASHTABLE_SET_INT("_chat_line_x", focus_info->chat_line_x); HASHTABLE_SET_INT("_chat_line_y", ((focus_info->chat_line)->data)->y); HASHTABLE_SET_TIME("_chat_line_date", ((focus_info->chat_line)->data)->date); + HASHTABLE_SET_INT("_chat_line_date_usec", ((focus_info->chat_line)->data)->date_usec); HASHTABLE_SET_TIME("_chat_line_date_printed", ((focus_info->chat_line)->data)->date_printed); + HASHTABLE_SET_INT("_chat_line_date_usec_printed", ((focus_info->chat_line)->data)->date_usec_printed); HASHTABLE_SET_STR_NOT_NULL("_chat_line_time", str_time); HASHTABLE_SET_STR_NOT_NULL("_chat_line_tags", str_tags); HASHTABLE_SET_STR_NOT_NULL("_chat_line_nick", nick); @@ -239,7 +241,9 @@ gui_focus_to_hashtable (struct t_gui_focus_info *focus_info, const char *key) HASHTABLE_SET_STR("_chat_line_x", "-1"); HASHTABLE_SET_STR("_chat_line_y", "-1"); HASHTABLE_SET_STR("_chat_line_date", "-1"); + HASHTABLE_SET_STR("_chat_line_date_usec", "-1"); HASHTABLE_SET_STR("_chat_line_date_printed", "-1"); + HASHTABLE_SET_STR("_chat_line_date_usec_printed", "-1"); HASHTABLE_SET_STR("_chat_line_time", ""); HASHTABLE_SET_STR("_chat_line_tags", ""); HASHTABLE_SET_STR("_chat_line_nick", ""); diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c index adfee35b5..9b511f7b2 100644 --- a/src/gui/gui-line.c +++ b/src/gui/gui-line.c @@ -1480,8 +1480,10 @@ gui_line_set_highlight (struct t_gui_line *line, int max_notify_level) */ struct t_gui_line * -gui_line_new (struct t_gui_buffer *buffer, int y, time_t date, - time_t date_printed, const char *tags, +gui_line_new (struct t_gui_buffer *buffer, int y, + time_t date, int date_usec, + time_t date_printed, int date_usec_printed, + const char *tags, const char *prefix, const char *message) { struct t_gui_line *new_line; @@ -1523,8 +1525,10 @@ gui_line_new (struct t_gui_buffer *buffer, int y, time_t date, 0 : buffer->next_line_id + 1; new_line->data->y = -1; new_line->data->date = date; + new_line->data->date_usec = date_usec; new_line->data->date_printed = date_printed; - new_line->data->str_time = gui_chat_get_time_string (date); + new_line->data->date_usec_printed = date_usec_printed; + new_line->data->str_time = gui_chat_get_time_string (date, date_usec); gui_line_tags_alloc (new_line->data, tags); new_line->data->refresh_needed = 0; new_line->data->prefix = (prefix) ? @@ -1542,7 +1546,9 @@ gui_line_new (struct t_gui_buffer *buffer, int y, time_t date, new_line->data->id = y; new_line->data->y = y; new_line->data->date = date; + new_line->data->date_usec = date_usec; new_line->data->date_printed = date_printed; + new_line->data->date_usec_printed = date_usec_printed; new_line->data->str_time = NULL; gui_line_tags_alloc (new_line->data, tags); new_line->data->refresh_needed = 1; @@ -1646,7 +1652,25 @@ gui_line_hook_update (struct t_gui_line *line, line->data->date = (time_t)value; if (line->data->str_time) free (line->data->str_time); - line->data->str_time = gui_chat_get_time_string (line->data->date); + line->data->str_time = gui_chat_get_time_string ( + line->data->date, + line->data->date_usec); + } + } + + ptr_value2 = hashtable_get (hashtable2, "date_usec"); + if (ptr_value2) + { + error = NULL; + value = strtol (ptr_value2, &error, 10); + if (error && !error[0] && (value >= 0) && (value <= 999999)) + { + line->data->date_usec = (int)value; + if (line->data->str_time) + free (line->data->str_time); + line->data->str_time = gui_chat_get_time_string ( + line->data->date, + line->data->date_usec); } } @@ -1659,6 +1683,15 @@ gui_line_hook_update (struct t_gui_line *line, line->data->date_printed = (time_t)value; } + ptr_value2 = hashtable_get (hashtable2, "date_usec_printed"); + if (ptr_value2) + { + error = NULL; + value = strtol (ptr_value2, &error, 10); + if (error && !error[0] && (value >= 0) && (value <= 999999)) + line->data->date_usec_printed = (int)value; + } + ptr_value = hashtable_get (hashtable, "str_time"); ptr_value2 = hashtable_get (hashtable2, "str_time"); if (ptr_value2 && (!ptr_value || (strcmp (ptr_value, ptr_value2) != 0))) @@ -1977,7 +2010,9 @@ void gui_line_clear (struct t_gui_line *line) { line->data->date = 0; + line->data->date_usec = 0; line->data->date_printed = 0; + line->data->date_usec_printed = 0; if (line->data->str_time) { free (line->data->str_time); @@ -2178,7 +2213,25 @@ gui_line_hdata_line_data_update_cb (void *data, hdata_set (hdata, pointer, "date", value); if (line_data->str_time) free (line_data->str_time); - line_data->str_time = gui_chat_get_time_string (line_data->date); + line_data->str_time = gui_chat_get_time_string ( + line_data->date, + line_data->date_usec); + rc++; + update_coords = 1; + } + } + + if (hashtable_has_key (hashtable, "date_usec")) + { + value = hashtable_get (hashtable, "date_usec"); + if (value) + { + hdata_set (hdata, pointer, "date_usec", value); + if (line_data->str_time) + free (line_data->str_time); + line_data->str_time = gui_chat_get_time_string ( + line_data->date, + line_data->date_usec); rc++; update_coords = 1; } @@ -2194,6 +2247,16 @@ gui_line_hdata_line_data_update_cb (void *data, } } + if (hashtable_has_key (hashtable, "date_usec_printed")) + { + value = hashtable_get (hashtable, "date_usec_printed"); + if (value) + { + hdata_set (hdata, pointer, "date_usec_printed", value); + rc++; + } + } + if (hashtable_has_key (hashtable, "tags_array")) { value = hashtable_get (hashtable, "tags_array"); @@ -2269,7 +2332,9 @@ gui_line_hdata_line_data_cb (const void *pointer, void *data, HDATA_VAR(struct t_gui_line_data, id, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, y, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, date, TIME, 1, NULL, NULL); + HDATA_VAR(struct t_gui_line_data, date_usec, INTEGER, 1, NULL, NULL); HDATA_VAR(struct t_gui_line_data, date_printed, TIME, 1, NULL, NULL); + HDATA_VAR(struct t_gui_line_data, date_usec_printed, INTEGER, 1, NULL, NULL); HDATA_VAR(struct t_gui_line_data, str_time, STRING, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, tags_count, INTEGER, 0, NULL, NULL); HDATA_VAR(struct t_gui_line_data, tags_array, SHARED_STRING, 1, "*,tags_count", NULL); @@ -2314,8 +2379,12 @@ gui_line_add_to_infolist (struct t_infolist *infolist, return 0; if (!infolist_new_var_time (ptr_item, "date", line->data->date)) return 0; + if (!infolist_new_var_integer (ptr_item, "date_usec", line->data->date_usec)) + return 0; if (!infolist_new_var_time (ptr_item, "date_printed", line->data->date_printed)) return 0; + if (!infolist_new_var_integer (ptr_item, "date_usec_printed", line->data->date_usec_printed)) + return 0; if (!infolist_new_var_string (ptr_item, "str_time", line->data->str_time)) return 0; diff --git a/src/gui/gui-line.h b/src/gui/gui-line.h index ba4d7fdee..5cf9d45b9 100644 --- a/src/gui/gui-line.h +++ b/src/gui/gui-line.h @@ -35,7 +35,9 @@ struct t_gui_line_data /* free buffer: equals to "y" */ int y; /* line position (for free buffer) */ time_t date; /* date/time of line (may be past) */ + int date_usec; /* microseconds for date */ time_t date_printed; /* date/time when weechat print it */ + int date_usec_printed; /* microseconds for date printed */ char *str_time; /* time string (for display) */ int tags_count; /* number of tags for line */ char **tags_array; /* tags for line */ @@ -124,7 +126,9 @@ extern void gui_line_set_highlight (struct t_gui_line *line, extern struct t_gui_line *gui_line_new (struct t_gui_buffer *buffer, int y, time_t date, + int date_usec, time_t date_printed, + int date_usec_printed, const char *tags, const char *prefix, const char *message); diff --git a/src/plugins/guile/weechat-guile-api.c b/src/plugins/guile/weechat-guile-api.c index ff2c051cb..6f48f548a 100644 --- a/src/plugins/guile/weechat-guile-api.c +++ b/src/plugins/guile/weechat-guile-api.c @@ -2005,6 +2005,28 @@ weechat_guile_api_print_date_tags (SCM buffer, SCM date, SCM tags, SCM message) } SCM +weechat_guile_api_print_datetime_tags (SCM buffer, SCM date, SCM date_usec, + SCM tags, SCM message) +{ + API_INIT_FUNC(1, "print_datetime_tags", API_RETURN_ERROR); + if (!scm_is_string (buffer) || !scm_is_integer (date) + || !scm_is_integer (date_usec) || !scm_is_string (tags) + || !scm_is_string (message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + plugin_script_api_printf_datetime_tags ( + weechat_guile_plugin, + guile_current_script, + API_STR2PTR(API_SCM_TO_STRING(buffer)), + (time_t)scm_to_long (date), + scm_to_int (date_usec), + API_SCM_TO_STRING(tags), + "%s", API_SCM_TO_STRING(message)); + + API_RETURN_OK; +} + +SCM weechat_guile_api_print_y (SCM buffer, SCM y, SCM message) { API_INIT_FUNC(1, "print_y", API_RETURN_ERROR); @@ -2043,6 +2065,29 @@ weechat_guile_api_print_y_date_tags (SCM buffer, SCM y, SCM date, SCM tags, } SCM +weechat_guile_api_print_y_datetime_tags (SCM buffer, SCM y, SCM date, + SCM date_usec, SCM tags, SCM message) +{ + API_INIT_FUNC(1, "print_y_datetime_tags", API_RETURN_ERROR); + if (!scm_is_string (buffer) || !scm_is_integer (y) + || !scm_is_integer (date) || !scm_is_integer (date_usec) + || !scm_is_string (tags) || !scm_is_string (message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + plugin_script_api_printf_y_datetime_tags ( + weechat_guile_plugin, + guile_current_script, + API_STR2PTR(API_SCM_TO_STRING(buffer)), + scm_to_int (y), + (time_t)scm_to_long (date), + scm_to_int (date_usec), + 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); @@ -2743,7 +2788,7 @@ weechat_guile_api_hook_line (SCM buffer_type, SCM buffer_name, SCM tags, int weechat_guile_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -2756,6 +2801,7 @@ weechat_guile_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -5353,8 +5399,10 @@ weechat_guile_api_module_init (void *data) API_DEF_FUNC(color, 1); API_DEF_FUNC(print, 2); API_DEF_FUNC(print_date_tags, 4); + API_DEF_FUNC(print_datetime_tags, 5); API_DEF_FUNC(print_y, 3); API_DEF_FUNC(print_y_date_tags, 5); + API_DEF_FUNC(print_y_datetime_tags, 6); API_DEF_FUNC(log_print, 1); API_DEF_FUNC(hook_command, 7); API_DEF_FUNC(hook_completion, 4); diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index 61d977332..b08fe0bb0 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -388,6 +388,7 @@ irc_command_me_channel_message (struct t_irc_server *server, irc_input_user_message_display ( server, 0, /* date */ + 0, /* date_usec */ channel_name, NULL, /* address */ "privmsg", @@ -1974,6 +1975,7 @@ IRC_COMMAND_CALLBACK(ctcp) irc_input_user_message_display ( ptr_server, 0, /* date */ + 0, /* date_usec */ ctcp_target, NULL, /* address */ "privmsg", @@ -3841,6 +3843,7 @@ IRC_COMMAND_CALLBACK(msg) irc_input_user_message_display ( ptr_server, 0, /* date */ + 0, /* date_usec */ ptr_channel->name, NULL, /* address */ "privmsg", @@ -3864,6 +3867,7 @@ IRC_COMMAND_CALLBACK(msg) irc_input_user_message_display ( ptr_server, 0, /* date */ + 0, /* date_usec */ targets[i], NULL, /* address */ "privmsg", @@ -4065,6 +4069,7 @@ IRC_COMMAND_CALLBACK(notice) irc_input_user_message_display ( ptr_server, 0, /* date */ + 0, /* date_usec */ argv[arg_target], NULL, /* address */ "notice", @@ -4595,6 +4600,7 @@ IRC_COMMAND_CALLBACK(query) irc_input_user_message_display ( ptr_server, 0, /* date */ + 0, /* date_usec */ ptr_channel->name, NULL, /* address */ "privmsg", @@ -7799,8 +7805,9 @@ irc_command_init () "condition \"xxx\", using following variables: output of function " "irc_message_parse (like nick, command, channel, text, etc., see " "function info_get_hashtable in plugin API reference for the list " - "of all variables), date (format: \"yyyy-mm-dd hh:mm:ss\"), server, " - "recv, sent, modified, redirected"), + "of all variables), date (format: \"%FT%T.%f\", see function " + "util_strftimeval in Plugin API reference), server, recv, sent, " + "modified, redirected"), "", N_("Examples:"), AI(" /server listfull"), diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index ad12fe87b..8c2995cdd 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -3114,7 +3114,8 @@ irc_config_init () irc_config_file, irc_config_section_look, "ctcp_time_format", "string", N_("time format used in answer to message CTCP TIME (see man " - "strftime for date/time specifiers)"), + "strftime for date/time specifiers, extra specifiers are supported, " + "see function util_strftimeval in Plugin API reference)"), NULL, 0, 0, "%a, %d %b %Y %T %z", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); irc_config_look_display_account_message = weechat_config_new_option ( diff --git a/src/plugins/irc/irc-ctcp.c b/src/plugins/irc/irc-ctcp.c index 3e8b94416..59a1910f7 100644 --- a/src/plugins/irc/irc-ctcp.c +++ b/src/plugins/irc/irc-ctcp.c @@ -185,11 +185,12 @@ irc_ctcp_display_request (struct t_irc_protocol_ctxt *ctxt, && !weechat_config_boolean (irc_config_look_display_ctcp_blocked)) return; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->nick, NULL, "ctcp", (channel) ? channel->buffer : NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "irc_ctcp"), _("%sCTCP requested by %s%s%s: %s%s%s%s%s%s"), weechat_prefix ("network"), @@ -252,10 +253,11 @@ irc_ctcp_display_reply_from_nick (struct t_irc_protocol_ctxt *ctxt, difftime = ((sec2 * 1000000) + usec2) - ((sec1 * 1000000) + usec1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->nick, NULL, "ctcp", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "irc_ctcp"), /* TRANSLATORS: %.3fs is a float number + "s" ("seconds") */ _("%sCTCP reply from %s%s%s: %s%s%s %.3fs"), @@ -272,10 +274,11 @@ irc_ctcp_display_reply_from_nick (struct t_irc_protocol_ctxt *ctxt, } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->nick, NULL, "ctcp", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "irc_ctcp"), _("%sCTCP reply from %s%s%s: %s%s%s%s%s"), weechat_prefix ("network"), @@ -291,10 +294,11 @@ irc_ctcp_display_reply_from_nick (struct t_irc_protocol_ctxt *ctxt, } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->nick, NULL, "ctcp", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sCTCP reply from %s%s%s: %s%s%s%s%s"), weechat_prefix ("network"), @@ -545,8 +549,7 @@ irc_ctcp_eval_reply (struct t_irc_server *server, const char *format) struct t_hashtable *extra_vars; char *info, *info_version, *info_version_git, *username, *realname; char buf[4096], *value; - time_t now; - struct tm *local_time; + struct timeval tv_now; struct utsname *buf_uname; if (!server || !format) @@ -661,13 +664,12 @@ irc_ctcp_eval_reply (struct t_irc_server *server, const char *format) * ${time}: local date/time of user, example: * Sat, 08 Jul 2023 21:11:19 +0200 */ - now = time (NULL); - local_time = localtime (&now); + gettimeofday (&tv_now, NULL); setlocale (LC_ALL, "C"); - if (strftime (buf, sizeof (buf), - weechat_config_string (irc_config_look_ctcp_time_format), - local_time) == 0) - buf[0] = '\0'; + weechat_util_strftimeval ( + buf, sizeof (buf), + weechat_config_string (irc_config_look_ctcp_time_format), + &tv_now); setlocale (LC_ALL, ""); weechat_hashtable_set (extra_vars, "time", buf); @@ -1389,9 +1391,10 @@ irc_ctcp_recv (struct t_irc_protocol_ctxt *ctxt, ctxt->params[0][0])) { /* STATUSMSG action */ - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me) ? @@ -1414,9 +1417,10 @@ irc_ctcp_recv (struct t_irc_protocol_ctxt *ctxt, else { /* standard action */ - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me) ? @@ -1456,9 +1460,10 @@ irc_ctcp_recv (struct t_irc_protocol_ctxt *ctxt, if (!ptr_channel->topic) irc_channel_set_topic (ptr_channel, ctxt->address); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me) ? @@ -1535,11 +1540,12 @@ irc_ctcp_recv (struct t_irc_protocol_ctxt *ctxt, { if (weechat_config_boolean (irc_config_look_display_ctcp_unknown)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->nick, NULL, "ctcp", (channel) ? channel->buffer : NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "irc_ctcp"), _("%sUnknown CTCP requested by %s%s%s: %s%s%s%s%s"), weechat_prefix ("network"), diff --git a/src/plugins/irc/irc-input.c b/src/plugins/irc/irc-input.c index 72820cc8a..a3f87445c 100644 --- a/src/plugins/irc/irc-input.c +++ b/src/plugins/irc/irc-input.c @@ -64,6 +64,7 @@ void irc_input_user_message_display (struct t_irc_server *server, time_t date, + int date_usec, const char *target, const char *address, const char *command, @@ -86,6 +87,7 @@ irc_input_user_message_display (struct t_irc_server *server, memset (&ctxt, 0, sizeof (ctxt)); ctxt.server = server; ctxt.date = date; + ctxt.date_usec = date_usec; ctxt.address = (char *)address; ctxt.command = (char *)command; @@ -317,6 +319,7 @@ irc_input_send_user_message (struct t_gui_buffer *buffer, int flags, irc_input_user_message_display ( ptr_server, 0, /* date */ + 0, /* date_usec */ ptr_channel->name, NULL, /* address */ "privmsg", diff --git a/src/plugins/irc/irc-input.h b/src/plugins/irc/irc-input.h index a01c404da..2c5faa782 100644 --- a/src/plugins/irc/irc-input.h +++ b/src/plugins/irc/irc-input.h @@ -26,6 +26,7 @@ struct t_gui_buffer; extern void irc_input_user_message_display (struct t_irc_server *server, time_t date, + int date_usec, const char *target, const char *address, const char *command, diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 2a42d5115..b646d9a9e 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -373,63 +373,105 @@ irc_protocol_nick_address (struct t_irc_server *server, } /* - * Parses date/time received in a "time" tag. - * - * Returns value of time (timestamp), 0 if error. + * Parses date/time received in a "time" tag and sets *date to the date/time + * and *date_usec to the microseconds of date (value is set to 0 for both in + * case of error). */ -time_t -irc_protocol_parse_time (const char *time) +void +irc_protocol_parse_time (const char *time, time_t *date, int *date_usec) { - time_t time_value, time_msg, time_gm, time_local; + time_t time_msg, time_gm, time_local; struct tm tm_date, tm_date_gm, tm_date_local; + char *time2, *pos, *pos2, *pos_msec, *error, str_msec[16]; long value; - char *time2, *pos, *error; + int length; + + if (!date || !date_usec) + return; + + *date = 0; + *date_usec = 0; if (!time || !time[0]) - return 0; + return; - time_value = 0; + time2 = strdup (time); + if (!time2) + return; + + pos_msec = NULL; - if (strchr (time, '-')) + if (strchr (time2, '-')) { /* date is with ISO 8601 format: "2012-11-24T07:41:02.018Z" */ /* initialize structure, because strptime does not do it */ memset (&tm_date, 0, sizeof (struct tm)); - if (strptime (time, "%Y-%m-%dT%H:%M:%S", &tm_date)) - { - if (tm_date.tm_year > 0) + pos = strptime (time2, "%Y-%m-%dT%H:%M:%S", &tm_date); + if (pos && (tm_date.tm_year > 0)) + { + time_msg = mktime (&tm_date); + gmtime_r (&time_msg, &tm_date_gm); + localtime_r (&time_msg, &tm_date_local); + time_gm = mktime (&tm_date_gm); + time_local = mktime (&tm_date_local); + *date = mktime (&tm_date_local) + (time_local - time_gm); + if (pos[0] == '.') { - time_msg = mktime (&tm_date); - gmtime_r (&time_msg, &tm_date_gm); - localtime_r (&time_msg, &tm_date_local); - time_gm = mktime (&tm_date_gm); - time_local = mktime (&tm_date_local); - time_value = mktime (&tm_date_local) + (time_local - time_gm); + pos++; + pos2 = strchr (pos, 'Z'); + if (pos2) + pos2[0] = '\0'; + pos_msec = pos; } } } else { - /* date is with timestamp format: "1353403519.478" */ - time2 = strdup (time); - if (time2) + /* date is with timestamp format: "1353403519.478" or "1353403519,478" */ + pos = strchr (time2, '.'); + if (pos) + { + pos[0] = '\0'; + } + else { - pos = strchr (time2, '.'); - if (pos) - pos[0] = '\0'; pos = strchr (time2, ','); if (pos) pos[0] = '\0'; - error = NULL; - value = strtol (time2, &error, 10); - if (error && !error[0] && (value >= 0)) - time_value = (int)value; - free (time2); } + error = NULL; + value = strtol (time2, &error, 10); + if (error && !error[0] && (value >= 0)) + *date = (int)value; + if (pos && pos[1]) + pos_msec = pos + 1; } - return time_value; + if (pos_msec) + { + length = strlen (pos_msec); + if (length > 6) + length = 6; + memcpy (str_msec, pos_msec, length); + str_msec[length] = '\0'; + while (strlen (str_msec) < 6) + { + strcat (str_msec, "0"); + } + error = NULL; + value = strtol (str_msec, &error, 10); + if (error && !error[0]) + { + if (value < 0) + value = 0; + else if (value > 999999) + value = 999999; + *date_usec = (int)value; + } + } + + free (time2); } /* @@ -476,9 +518,10 @@ irc_protocol_print_error_warning_msg (struct t_irc_protocol_ctxt *ctxt, str_context = (ctxt->num_params > 2) ? irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 2) : NULL; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s%s%s[%s%s%s]%s %s", (prefix) ? prefix : "", @@ -544,10 +587,11 @@ IRC_PROTOCOL_CALLBACK(account) && (irc_server_strcasecmp (ctxt->server, ptr_channel->name, ctxt->nick) == 0)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), (pos_account) ? _("%s%s%s%s has identified as %s") : _("%s%s%s%s has unidentified"), weechat_prefix ("network"), @@ -572,10 +616,11 @@ IRC_PROTOCOL_CALLBACK(account) && weechat_config_boolean (irc_config_look_smart_filter_account) && !ptr_nick_speaking); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (smart_filter) ? "irc_smart_filter" : NULL), @@ -1108,8 +1153,11 @@ IRC_PROTOCOL_CALLBACK(cap) weechat_hashtable_map_string (ctxt->server->cap_ls, irc_protocol_cap_print_cb, str_caps); - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, server supports: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, @@ -1194,8 +1242,11 @@ IRC_PROTOCOL_CALLBACK(cap) weechat_hashtable_map_string (ctxt->server->cap_list, irc_protocol_cap_print_cb, str_caps); - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, currently enabled: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, @@ -1259,24 +1310,33 @@ IRC_PROTOCOL_CALLBACK(cap) } if (*str_caps_enabled[0] && *str_caps_disabled[0]) { - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, enabled: %s, disabled: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, *str_caps_enabled, *str_caps_disabled); } else if (*str_caps_enabled[0]) { - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, enabled: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, *str_caps_enabled); } else if (*str_caps_disabled[0]) { - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, disabled: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, *str_caps_disabled); @@ -1319,8 +1379,11 @@ IRC_PROTOCOL_CALLBACK(cap) return WEECHAT_RC_OK; str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, refused: %s"), weechat_prefix ("error"), IRC_PLUGIN_NAME, str_params); if (str_params) @@ -1335,8 +1398,11 @@ IRC_PROTOCOL_CALLBACK(cap) return WEECHAT_RC_OK; str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, now available: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, str_params); if (str_params) @@ -1387,8 +1453,11 @@ IRC_PROTOCOL_CALLBACK(cap) return WEECHAT_RC_OK; str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( - ctxt->server->buffer, ctxt->date, "irc_cap,log3", + weechat_printf_datetime_tags ( + ctxt->server->buffer, + ctxt->date, + ctxt->date_usec, + "irc_cap,log3", _("%s%s: client capability, removed: %s"), weechat_prefix ("network"), IRC_PLUGIN_NAME, str_params); if (str_params) @@ -1469,10 +1538,11 @@ IRC_PROTOCOL_CALLBACK(chghost) { snprintf (str_tags, sizeof (str_tags), "new_host_%s", str_host); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), _("%s%s%s%s (%s%s%s)%s has changed host to %s%s"), weechat_prefix ("network"), @@ -1505,10 +1575,11 @@ IRC_PROTOCOL_CALLBACK(chghost) str_host, (smart_filter) ? "," : "", (smart_filter) ? "irc_smart_filter" : ""); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), _("%s%s%s%s (%s%s%s)%s has changed host to %s%s"), weechat_prefix ("network"), @@ -1548,9 +1619,10 @@ IRC_PROTOCOL_CALLBACK(error) str_error = irc_protocol_string_params (ctxt->params, 0, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("error"), @@ -1645,13 +1717,14 @@ IRC_PROTOCOL_CALLBACK(generic_error) str_error = irc_protocol_string_params (ctxt->params, arg_error, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, pos_nick, ctxt->command, ((strcmp (ctxt->command, "401") == 0) || (strcmp (ctxt->command, "402") == 0)) ? "whois" : NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s", weechat_prefix ("network"), @@ -1708,9 +1781,10 @@ IRC_PROTOCOL_CALLBACK(invite) if (irc_server_strcasecmp (ctxt->server, ctxt->params[0], ctxt->server->nick) == 0) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->nick, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "notify_highlight"), _("%sYou have been invited to %s%s%s by %s%s%s"), weechat_prefix ("network"), @@ -1725,9 +1799,10 @@ IRC_PROTOCOL_CALLBACK(invite) { /* CAP invite-notify */ /* imitate numeric 341 output */ - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->nick, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has invited %s%s%s to %s%s%s"), weechat_prefix ("network"), @@ -1875,10 +1950,11 @@ IRC_PROTOCOL_CALLBACK(join) && !ptr_nick_speaking); /* display the join */ - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, (smart_filter) ? "irc_smart_filter" : NULL), _("%s%s%s%s%s%s%s%s%s%s%s%s has joined %s%s%s"), @@ -1974,10 +2050,11 @@ IRC_PROTOCOL_CALLBACK(kick) if (pos_comment) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has kicked %s%s%s %s(%s%s%s)"), weechat_prefix ("quit"), @@ -1994,10 +2071,11 @@ IRC_PROTOCOL_CALLBACK(kick) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has kicked %s%s%s"), weechat_prefix ("quit"), @@ -2094,10 +2172,11 @@ IRC_PROTOCOL_CALLBACK(kill) if (pos_comment) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%sYou were killed by %s%s%s %s(%s%s%s)"), weechat_prefix ("quit"), @@ -2112,10 +2191,11 @@ IRC_PROTOCOL_CALLBACK(kill) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%sYou were killed by %s%s%s"), weechat_prefix ("quit"), @@ -2170,9 +2250,10 @@ IRC_PROTOCOL_CALLBACK(knock_reply) str_message = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->params[0], ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s: %s", weechat_prefix ("network"), @@ -2222,10 +2303,11 @@ IRC_PROTOCOL_CALLBACK(mode) ptr_nick = irc_nick_search (ctxt->server, ptr_channel, ctxt->nick); ptr_buffer = (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer; modes_args = irc_mode_get_arguments (msg_modes_args); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (smart_filter && !ctxt->nick_is_me) ? "irc_smart_filter" : NULL), @@ -2247,9 +2329,10 @@ IRC_PROTOCOL_CALLBACK(mode) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sUser mode %s[%s%s%s]%s by %s%s"), weechat_prefix ("network"), @@ -2308,9 +2391,10 @@ IRC_PROTOCOL_CALLBACK(nick) "irc_nick1_%s,irc_nick2_%s", ctxt->nick, ctxt->params[0]); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ctxt->server->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), _("%sYou are now known as %s%s%s"), weechat_prefix ("network"), @@ -2371,9 +2455,10 @@ IRC_PROTOCOL_CALLBACK(nick) "irc_nick1_%s,irc_nick2_%s", ctxt->nick, ctxt->params[0]); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), _("%s%s%s%s is now known as %s%s%s"), weechat_prefix ("network"), @@ -2412,16 +2497,17 @@ IRC_PROTOCOL_CALLBACK(nick) "irc_nick1_%s,irc_nick2_%s", ctxt->nick, ctxt->params[0]); - weechat_printf_date_tags (ptr_channel->buffer, - ctxt->date, - irc_protocol_tags ( - ctxt, str_tags), - _("%sYou are now known as " - "%s%s%s"), - weechat_prefix ("network"), - IRC_COLOR_CHAT_NICK_SELF, - ctxt->params[0], - IRC_COLOR_RESET); + weechat_printf_datetime_tags ( + ptr_channel->buffer, + ctxt->date, + ctxt->date_usec, + irc_protocol_tags ( + ctxt, str_tags), + _("%sYou are now known as %s%s%s"), + weechat_prefix ("network"), + IRC_COLOR_CHAT_NICK_SELF, + ctxt->params[0], + IRC_COLOR_RESET); /* enable hotlist */ weechat_buffer_set (NULL, "hotlist", "+"); @@ -2442,9 +2528,10 @@ IRC_PROTOCOL_CALLBACK(nick) (smart_filter) ? "irc_smart_filter," : "", ctxt->nick, ctxt->params[0]); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), _("%s%s%s%s is now known as %s%s%s"), weechat_prefix ("network"), @@ -2640,9 +2727,10 @@ IRC_PROTOCOL_CALLBACK(notice) "notify_message" : weechat_config_string (irc_config_look_notice_welcome_tags)); } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), "%s%s%s%s%s(%s%s%s%s)%s%s%s%s%s: %s", weechat_prefix ("network"), @@ -2719,9 +2807,10 @@ IRC_PROTOCOL_CALLBACK(notice) if (!ptr_channel->topic) irc_channel_set_topic (ptr_channel, ctxt->address); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "notify_private"), "%s%s%s%s: %s", weechat_prefix ("network"), @@ -2746,9 +2835,10 @@ IRC_PROTOCOL_CALLBACK(notice) */ if (ctxt->nick && ctxt->nick_is_me) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (notify_private) ? "notify_private" : NULL), @@ -2773,9 +2863,10 @@ IRC_PROTOCOL_CALLBACK(notice) NULL, ctxt->nick, (display_host) ? ctxt->address : NULL); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (notify_private) ? "notify_private" : NULL), @@ -2840,10 +2931,11 @@ IRC_PROTOCOL_CALLBACK(part) display_host = weechat_config_boolean (irc_config_look_display_host_quit); if (str_comment && str_comment[0]) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me @@ -2873,10 +2965,11 @@ IRC_PROTOCOL_CALLBACK(part) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me @@ -3012,9 +3105,10 @@ IRC_PROTOCOL_CALLBACK(pong) { str_params = (ctxt->num_params > 1) ? irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1) : NULL; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "PONG%s%s", (str_params) ? ": " : "", @@ -3063,6 +3157,7 @@ irc_protocol_privmsg_display_ctcp_send (struct t_irc_protocol_ctxt *ctxt, irc_input_user_message_display ( ctxt->server, ctxt->date, + ctxt->date_usec, target, ctxt->address, "privmsg", @@ -3167,9 +3262,10 @@ IRC_PROTOCOL_CALLBACK(privmsg) if (status_msg) { /* message to channel ops/voiced (to "@#channel" or "+#channel") */ - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me) ? @@ -3213,9 +3309,10 @@ IRC_PROTOCOL_CALLBACK(privmsg) } if (str_color) free (str_color); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_channel->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), "%s%s", irc_nick_as_prefix (ctxt->server, ptr_nick, @@ -3351,6 +3448,7 @@ IRC_PROTOCOL_CALLBACK(privmsg) irc_input_user_message_display ( ctxt->server, ctxt->date, + ctxt->date_usec, remote_nick, ctxt->address, "privmsg", @@ -3360,9 +3458,10 @@ IRC_PROTOCOL_CALLBACK(privmsg) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), "%s%s", irc_nick_as_prefix ( @@ -3444,10 +3543,11 @@ IRC_PROTOCOL_CALLBACK(quit) display_host = weechat_config_boolean (irc_config_look_display_host_quit); if (str_quit_msg && str_quit_msg[0]) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me @@ -3476,10 +3576,11 @@ IRC_PROTOCOL_CALLBACK(quit) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (ctxt->nick_is_me @@ -3559,10 +3660,11 @@ IRC_PROTOCOL_CALLBACK(setname) && (irc_server_strcasecmp (ctxt->server, ptr_channel->name, ctxt->nick) == 0)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has changed real name to %s\"%s%s%s\"%s"), weechat_prefix ("network"), @@ -3590,10 +3692,11 @@ IRC_PROTOCOL_CALLBACK(setname) && weechat_config_boolean (irc_config_look_smart_filter_setname) && !ptr_nick_speaking); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags ( ctxt, (smart_filter) ? "irc_smart_filter" : NULL), @@ -3621,9 +3724,10 @@ IRC_PROTOCOL_CALLBACK(setname) if (!ctxt->ignore_remove && ctxt->nick_is_me) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%sYour real name has been set to %s\"%s%s%s\"%s"), weechat_prefix ("network"), @@ -3724,9 +3828,10 @@ IRC_PROTOCOL_CALLBACK(server_mode_reason) str_params = irc_protocol_string_params (ctxt->params, arg_text, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s", weechat_prefix ("network"), @@ -3759,9 +3864,10 @@ IRC_PROTOCOL_CALLBACK(numeric) if (str_params) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -3822,10 +3928,11 @@ IRC_PROTOCOL_CALLBACK(topic) old_topic_color = irc_color_decode ( ptr_channel->topic, weechat_config_boolean (irc_config_network_colors_receive)); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has changed topic for %s%s%s from \"%s%s%s\" to " "\"%s%s%s\""), @@ -3847,10 +3954,11 @@ IRC_PROTOCOL_CALLBACK(topic) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has changed topic for %s%s%s to \"%s%s%s\""), weechat_prefix ("network"), @@ -3875,10 +3983,11 @@ IRC_PROTOCOL_CALLBACK(topic) old_topic_color = irc_color_decode ( ptr_channel->topic, weechat_config_boolean (irc_config_network_colors_receive)); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has unset topic for %s%s%s (old topic: " "\"%s%s%s\")"), @@ -3897,10 +4006,11 @@ IRC_PROTOCOL_CALLBACK(topic) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s%s%s has unset topic for %s%s%s"), weechat_prefix ("network"), @@ -3953,9 +4063,10 @@ IRC_PROTOCOL_CALLBACK(wallops) str_message = irc_protocol_string_params (ctxt->params, 0, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->nick, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "notify_private"), _("%sWallops from %s: %s"), weechat_prefix ("network"), @@ -4262,9 +4373,10 @@ IRC_PROTOCOL_CALLBACK(008) str_params = irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->params[0], ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sServer notice mask for %s%s%s: %s"), weechat_prefix ("network"), @@ -4294,9 +4406,10 @@ IRC_PROTOCOL_CALLBACK(221) str_modes = irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->params[0], ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sUser mode for %s%s%s is %s[%s%s%s]"), weechat_prefix ("network"), @@ -4350,10 +4463,11 @@ IRC_PROTOCOL_CALLBACK(301) || (strcmp (ptr_channel->away_message, str_away_msg) != 0)) { ptr_buffer = (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s]%s is away: %s"), weechat_prefix ("network"), @@ -4391,9 +4505,10 @@ IRC_PROTOCOL_CALLBACK(303) str_nicks = irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sUsers online: %s%s"), weechat_prefix ("network"), @@ -4422,10 +4537,11 @@ IRC_PROTOCOL_CALLBACK(305) if (ctxt->num_params > 1) { str_away_msg = irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "unaway", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -4458,10 +4574,11 @@ IRC_PROTOCOL_CALLBACK(306) if (ctxt->num_params > 1) { str_away_msg = irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "away", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -4497,10 +4614,11 @@ IRC_PROTOCOL_CALLBACK(whois_nick_msg) if (ctxt->num_params >= 3) { str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s", weechat_prefix ("network"), @@ -4541,10 +4659,11 @@ IRC_PROTOCOL_CALLBACK(whowas_nick_msg) if (ctxt->num_params >= 3) { str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whowas", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s", weechat_prefix ("network"), @@ -4589,10 +4708,11 @@ IRC_PROTOCOL_CALLBACK(311) else { str_realname = irc_protocol_string_params (ctxt->params, 5, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] (%s%s@%s%s)%s: %s", weechat_prefix ("network"), @@ -4633,10 +4753,11 @@ IRC_PROTOCOL_CALLBACK(312) else { str_server = irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s %s(%s%s%s)", weechat_prefix ("network"), @@ -4677,10 +4798,11 @@ IRC_PROTOCOL_CALLBACK(314) else { str_realname = irc_protocol_string_params (ctxt->params, 5, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whowas", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] (%s%s@%s%s)%s was %s"), weechat_prefix ("network"), @@ -4723,10 +4845,11 @@ IRC_PROTOCOL_CALLBACK(315) else { str_text = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "who", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s %s", weechat_prefix ("network"), @@ -4771,9 +4894,10 @@ IRC_PROTOCOL_CALLBACK(317) if (day > 0) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s]%s idle: %s%d %s%s, %s%02d %s%s %s%02d %s%s %s%02d " "%s%s, signon at: %s%s"), @@ -4804,9 +4928,10 @@ IRC_PROTOCOL_CALLBACK(317) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s]%s idle: %s%02d %s%s %s%02d %s%s %s%02d %s%s, " "signon at: %s%s"), @@ -4850,10 +4975,11 @@ IRC_PROTOCOL_CALLBACK(321) str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "list", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s", weechat_prefix ("network"), @@ -4884,10 +5010,11 @@ IRC_PROTOCOL_CALLBACK(322) (regexec (ctxt->server->cmd_list_regexp, ctxt->params[1], 0, NULL, 0) == 0)) { str_topic = irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "list", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s(%s%s%s)%s%s%s", weechat_prefix ("network"), @@ -4922,9 +5049,10 @@ IRC_PROTOCOL_CALLBACK(323) str_params = irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, "list", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -4969,11 +5097,12 @@ IRC_PROTOCOL_CALLBACK(324) || (weechat_hashtable_has_key (ptr_channel->join_msg_received, ctxt->command) || weechat_hashtable_has_key (irc_config_hashtable_display_join_message, ctxt->command))) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, (ptr_channel) ? ptr_channel->buffer : NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sMode %s%s %s[%s%s%s]"), weechat_prefix ("network"), @@ -5024,9 +5153,10 @@ IRC_PROTOCOL_CALLBACK(327) if (str_realname && str_realname[0]) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s %s %s(%s%s%s)", weechat_prefix ("network"), @@ -5044,9 +5174,10 @@ IRC_PROTOCOL_CALLBACK(327) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s %s", weechat_prefix ("network"), @@ -5084,10 +5215,11 @@ IRC_PROTOCOL_CALLBACK(328) if (ptr_channel) { str_url = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sURL for %s%s%s: %s"), weechat_prefix ("network"), @@ -5125,10 +5257,11 @@ IRC_PROTOCOL_CALLBACK(329) if (weechat_hashtable_has_key (ptr_channel->join_msg_received, ctxt->command) || weechat_hashtable_has_key (irc_config_hashtable_display_join_message, ctxt->command)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "created on" is a date */ _("%sChannel created on %s"), @@ -5138,9 +5271,10 @@ IRC_PROTOCOL_CALLBACK(329) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "created on" is a date */ _("%sChannel %s%s%s created on %s"), @@ -5178,10 +5312,11 @@ IRC_PROTOCOL_CALLBACK(330_343) if (ctxt->num_params >= 4) { str_text = irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s %s%s", weechat_prefix ("network"), @@ -5202,10 +5337,11 @@ IRC_PROTOCOL_CALLBACK(330_343) irc_channel_search (ctxt->server, ctxt->params[1]) : NULL; ptr_buffer = (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer; str_text = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s", weechat_prefix ("network"), @@ -5238,10 +5374,11 @@ IRC_PROTOCOL_CALLBACK(331) ptr_channel = irc_channel_search (ctxt->server, ctxt->params[1]); ptr_buffer = (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sNo topic set for channel %s%s"), weechat_prefix ("network"), @@ -5299,10 +5436,11 @@ IRC_PROTOCOL_CALLBACK(332) || (weechat_hashtable_has_key (ptr_channel->join_msg_received, ctxt->command)) || weechat_hashtable_has_key (irc_config_hashtable_display_join_message, ctxt->command)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sTopic for %s%s%s is \"%s%s%s\""), weechat_prefix ("network"), @@ -5364,10 +5502,11 @@ IRC_PROTOCOL_CALLBACK(333) { if (topic_nick) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%sTopic set by %s%s%s%s%s%s%s%s%s on %s"), @@ -5385,10 +5524,11 @@ IRC_PROTOCOL_CALLBACK(333) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%sTopic set on %s"), @@ -5401,10 +5541,11 @@ IRC_PROTOCOL_CALLBACK(333) { if (topic_nick) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%sTopic for %s%s%s set by %s%s%s%s%s%s%s%s%s on %s"), @@ -5425,10 +5566,11 @@ IRC_PROTOCOL_CALLBACK(333) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%sTopic for %s%s%s set on %s"), @@ -5469,10 +5611,11 @@ IRC_PROTOCOL_CALLBACK(338) else { str_text = irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s %s %s%s", weechat_prefix ("network"), @@ -5507,9 +5650,10 @@ IRC_PROTOCOL_CALLBACK(341) snprintf (str_tags, sizeof (str_tags), "nick_%s", ctxt->params[0]); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->params[0], ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), _("%s%s%s%s has invited %s%s%s to %s%s%s"), weechat_prefix ("network"), @@ -5546,9 +5690,10 @@ IRC_PROTOCOL_CALLBACK(344) { /* channel reop (IRCnet) */ str_host = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, "reop", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sChannel reop %s%s%s: %s%s"), weechat_prefix ("network"), @@ -5569,10 +5714,11 @@ IRC_PROTOCOL_CALLBACK(344) ctxt->params, (ctxt->num_params >= 4) ? 3 : 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s%s%s%s", weechat_prefix ("network"), @@ -5613,9 +5759,10 @@ IRC_PROTOCOL_CALLBACK(345) str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, "reop", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s: %s", weechat_prefix ("network"), @@ -5683,10 +5830,11 @@ IRC_PROTOCOL_CALLBACK(346) datetime = (time_t)(atol (ctxt->params[4])); if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], ctxt->params[3], datetime); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "invitelist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%s%s[%s%s%s] %s%s%s%s invited by %s on %s"), @@ -5706,10 +5854,11 @@ IRC_PROTOCOL_CALLBACK(346) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], ctxt->params[3], 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "invitelist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] %s%s%s%s invited by %s"), weechat_prefix ("network"), @@ -5728,10 +5877,11 @@ IRC_PROTOCOL_CALLBACK(346) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], NULL, 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "invitelist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] %s%s%s%s invited"), weechat_prefix ("network"), @@ -5783,10 +5933,11 @@ IRC_PROTOCOL_CALLBACK(347) } ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED; } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "invitelist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s%s%s", weechat_prefix ("network"), @@ -5856,10 +6007,11 @@ IRC_PROTOCOL_CALLBACK(348) datetime = (time_t)(atol (ctxt->params[4])); if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], ctxt->params[3], datetime); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "exceptionlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%s%s[%s%s%s]%s%s exception %s%s%s by %s on %s"), @@ -5880,10 +6032,11 @@ IRC_PROTOCOL_CALLBACK(348) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], ctxt->params[3], 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "exceptionlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s]%s%s exception %s%s%s by %s"), weechat_prefix ("network"), @@ -5903,10 +6056,11 @@ IRC_PROTOCOL_CALLBACK(348) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], NULL, 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "exceptionlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s]%s%s exception %s%s"), weechat_prefix ("network"), @@ -5958,10 +6112,11 @@ IRC_PROTOCOL_CALLBACK(349) } ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED; } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "exceptionlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s%s%s", weechat_prefix ("network"), @@ -6013,10 +6168,11 @@ IRC_PROTOCOL_CALLBACK(350) IRC_COLOR_CHAT_DELIMITERS); } str_params = irc_protocol_string_params (ctxt->params, 4, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, ctxt->params[1], ctxt->command, "whois", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s%s", weechat_prefix ("network"), @@ -6060,9 +6216,10 @@ IRC_PROTOCOL_CALLBACK(351) if (ctxt->num_params > 3) { str_params = irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s %s (%s)", weechat_prefix ("network"), @@ -6074,9 +6231,10 @@ IRC_PROTOCOL_CALLBACK(351) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s %s", weechat_prefix ("network"), @@ -6165,10 +6323,11 @@ IRC_PROTOCOL_CALLBACK(352) /* display output of who (manual who from user) */ if (!ptr_channel || (ptr_channel->checking_whox <= 0)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "who", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s %s(%s%s@%s%s)%s %s%s%s%s%s(%s%s%s)", weechat_prefix ("network"), @@ -6337,10 +6496,11 @@ IRC_PROTOCOL_CALLBACK(353) if (!ptr_channel && str_nicks) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "names", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sNicks %s%s%s: %s[%s%s%s]"), weechat_prefix ("network"), @@ -6391,10 +6551,11 @@ IRC_PROTOCOL_CALLBACK(354) if (!ptr_channel || (ptr_channel->checking_whox <= 0)) { str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "who", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s%s%s", weechat_prefix ("network"), @@ -6462,10 +6623,11 @@ IRC_PROTOCOL_CALLBACK(354) /* display output of who (manual who from user) */ if (!ptr_channel || (ptr_channel->checking_whox <= 0)) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "who", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s] %s%s %s[%s%s%s] (%s%s@%s%s)%s %s %s %s(%s%s%s)", weechat_prefix ("network"), @@ -6755,10 +6917,11 @@ IRC_PROTOCOL_CALLBACK(366) { str_filter[0] = '\0'; } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "names", ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sNicks %s%s%s%s: %s[%s%s]"), weechat_prefix ("network"), @@ -6781,10 +6944,11 @@ IRC_PROTOCOL_CALLBACK(366) ptr_channel); if (string) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "names", ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%sChannel %s%s%s: %s%d%s %s %s(%s%s)"), weechat_prefix ("network"), @@ -6820,10 +6984,11 @@ IRC_PROTOCOL_CALLBACK(366) else { str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "names", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s%s%s: %s", weechat_prefix ("network"), @@ -6901,10 +7066,11 @@ IRC_PROTOCOL_CALLBACK(367) irc_modelist_item_new (ptr_modelist, ctxt->params[2], ctxt->params[3], datetime); } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "banlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%s%s[%s%s%s] %s%s%s%s banned by %s on %s"), @@ -6924,10 +7090,11 @@ IRC_PROTOCOL_CALLBACK(367) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], ctxt->params[3], 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "banlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] %s%s%s%s banned by %s"), weechat_prefix ("network"), @@ -6946,10 +7113,11 @@ IRC_PROTOCOL_CALLBACK(367) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[2], NULL, 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "banlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] %s%s%s%s banned"), weechat_prefix ("network"), @@ -7004,10 +7172,11 @@ IRC_PROTOCOL_CALLBACK(368) ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED; } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "banlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s%s%s", weechat_prefix ("network"), @@ -7050,8 +7219,11 @@ IRC_PROTOCOL_CALLBACK(432) alternate_nick = irc_server_get_alternate_nick (ctxt->server); if (!alternate_nick) { - weechat_printf_date_tags ( - ptr_buffer, ctxt->date, NULL, + weechat_printf_datetime_tags ( + ptr_buffer, + ctxt->date, + ctxt->date_usec, + NULL, _("%s%s: all declared nicknames are already in use or " "invalid, closing connection with server"), weechat_prefix ("error"), IRC_PLUGIN_NAME); @@ -7059,8 +7231,11 @@ IRC_PROTOCOL_CALLBACK(432) return WEECHAT_RC_OK; } - weechat_printf_date_tags ( - ptr_buffer, ctxt->date, NULL, + weechat_printf_datetime_tags ( + ptr_buffer, + ctxt->date, + ctxt->date_usec, + NULL, _("%s%s: nickname \"%s\" is invalid, trying nickname \"%s\""), weechat_prefix ("error"), IRC_PLUGIN_NAME, ctxt->server->nick, alternate_nick); @@ -7100,8 +7275,11 @@ IRC_PROTOCOL_CALLBACK(433) alternate_nick = irc_server_get_alternate_nick (ctxt->server); if (!alternate_nick) { - weechat_printf_date_tags ( - ptr_buffer, ctxt->date, NULL, + weechat_printf_datetime_tags ( + ptr_buffer, + ctxt->date, + ctxt->date_usec, + NULL, _("%s%s: all declared nicknames are already in use, closing " "connection with server"), weechat_prefix ("error"), IRC_PLUGIN_NAME); @@ -7109,8 +7287,11 @@ IRC_PROTOCOL_CALLBACK(433) return WEECHAT_RC_OK; } - weechat_printf_date_tags ( - ptr_buffer, ctxt->date, NULL, + weechat_printf_datetime_tags ( + ptr_buffer, + ctxt->date, + ctxt->date_usec, + NULL, _("%s%s: nickname \"%s\" is already in use, trying nickname " "\"%s\""), weechat_prefix ("network"), IRC_PLUGIN_NAME, @@ -7157,8 +7338,11 @@ IRC_PROTOCOL_CALLBACK(437) alternate_nick = irc_server_get_alternate_nick (ctxt->server); if (!alternate_nick) { - weechat_printf_date_tags ( - ptr_buffer, ctxt->date, NULL, + weechat_printf_datetime_tags ( + ptr_buffer, + ctxt->date, + ctxt->date_usec, + NULL, _("%s%s: all declared nicknames are already in use or " "invalid, closing connection with server"), weechat_prefix ("error"), IRC_PLUGIN_NAME); @@ -7166,8 +7350,11 @@ IRC_PROTOCOL_CALLBACK(437) return WEECHAT_RC_OK; } - weechat_printf_date_tags ( - ptr_buffer, ctxt->date, NULL, + weechat_printf_datetime_tags ( + ptr_buffer, + ctxt->date, + ctxt->date_usec, + NULL, _("%s%s: nickname \"%s\" is unavailable, trying nickname " "\"%s\""), weechat_prefix ("error"), IRC_PLUGIN_NAME, @@ -7206,9 +7393,10 @@ IRC_PROTOCOL_CALLBACK(438) if (ctxt->num_params >= 3) { str_params = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s (%s => %s)", weechat_prefix ("network"), @@ -7220,9 +7408,10 @@ IRC_PROTOCOL_CALLBACK(438) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( ptr_buffer, ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s %s", weechat_prefix ("network"), @@ -7366,9 +7555,10 @@ IRC_PROTOCOL_CALLBACK(help) str_message = irc_protocol_string_params (ctxt->params, 2, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, ctxt->nick, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, "notify_private"), "%s%s", weechat_prefix ("network"), @@ -7414,10 +7604,11 @@ IRC_PROTOCOL_CALLBACK(710) str_message = irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, NULL, ptr_channel->buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, str_tags), "%s%s %s", weechat_prefix ("network"), @@ -7486,10 +7677,11 @@ IRC_PROTOCOL_CALLBACK(728) irc_modelist_item_new (ptr_modelist, ctxt->params[3], ctxt->params[4], datetime); } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "quietlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), /* TRANSLATORS: "%s" after "on" is a date */ _("%s%s[%s%s%s] %s%s%s%s quieted by %s on %s"), @@ -7509,10 +7701,11 @@ IRC_PROTOCOL_CALLBACK(728) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[3], ctxt->params[4], 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "quietlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] %s%s%s%s quieted by %s"), weechat_prefix ("network"), @@ -7531,10 +7724,11 @@ IRC_PROTOCOL_CALLBACK(728) { if (ptr_modelist) irc_modelist_item_new (ptr_modelist, ctxt->params[3], NULL, 0); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "quietlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), _("%s%s[%s%s%s] %s%s%s%s quieted"), weechat_prefix ("network"), @@ -7589,10 +7783,11 @@ IRC_PROTOCOL_CALLBACK(729) ptr_modelist->state = IRC_MODELIST_STATE_RECEIVED; } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "quietlist", ptr_buffer), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s[%s%s%s]%s%s%s", weechat_prefix ("network"), @@ -7742,10 +7937,11 @@ IRC_PROTOCOL_CALLBACK(732) str_nicks = (ctxt->num_params > 1) ? irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1) : NULL; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "monitor", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -7773,10 +7969,11 @@ IRC_PROTOCOL_CALLBACK(733) str_params = (ctxt->num_params > 1) ? irc_protocol_string_params (ctxt->params, 1, ctxt->num_params - 1) : NULL; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "monitor", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -7804,10 +8001,11 @@ IRC_PROTOCOL_CALLBACK(734) str_params = (ctxt->num_params > 3) ? irc_protocol_string_params (ctxt->params, 3, ctxt->num_params - 1) : NULL; - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer ( ctxt->server, NULL, ctxt->command, "monitor", NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s (%s)", weechat_prefix ("error"), @@ -7841,9 +8039,10 @@ IRC_PROTOCOL_CALLBACK(900) if (pos_nick_host) { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s %s(%s%s%s)", weechat_prefix ("network"), @@ -7855,9 +8054,10 @@ IRC_PROTOCOL_CALLBACK(900) } else { - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -7883,9 +8083,10 @@ IRC_PROTOCOL_CALLBACK(901) { IRC_PROTOCOL_MIN_PARAMS(3); - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL, NULL), ctxt->date, + ctxt->date_usec, irc_protocol_tags (ctxt, NULL), "%s%s", weechat_prefix ("network"), @@ -8175,6 +8376,7 @@ irc_protocol_recv_command (struct t_irc_server *server, ctxt.server = server; ctxt.date = 0; + ctxt.date_usec = 0; ctxt.irc_message = NULL; ctxt.tags = NULL; ctxt.nick = NULL; @@ -8207,8 +8409,10 @@ irc_protocol_recv_command (struct t_irc_server *server, if (ctxt.tags) { irc_tag_parse (tags, ctxt.tags, NULL); - ctxt.date = irc_protocol_parse_time ( - weechat_hashtable_get (ctxt.tags, "time")); + irc_protocol_parse_time ( + weechat_hashtable_get (ctxt.tags, "time"), + &(ctxt.date), + &(ctxt.date_usec)); } free (tags); } diff --git a/src/plugins/irc/irc-protocol.h b/src/plugins/irc/irc-protocol.h index f287f29ed..93b6efd71 100644 --- a/src/plugins/irc/irc-protocol.h +++ b/src/plugins/irc/irc-protocol.h @@ -63,6 +63,7 @@ struct t_irc_protocol_ctxt { struct t_irc_server *server; /* IRC server */ time_t date; /* message date */ + int date_usec; /* microseconds of date */ char *irc_message; /* whole raw IRC message */ struct t_hashtable *tags; /* IRC tags */ char *nick; /* nick of sender */ @@ -88,7 +89,6 @@ struct t_irc_protocol_msg extern const char *irc_protocol_tags (struct t_irc_protocol_ctxt *ctxt, const char *extra_tags); -extern time_t irc_protocol_parse_time (const char *time); extern void irc_protocol_recv_command (struct t_irc_server *server, const char *irc_message, const char *msg_command, diff --git a/src/plugins/irc/irc-raw.c b/src/plugins/irc/irc-raw.c index 43918cd10..9313213af 100644 --- a/src/plugins/irc/irc-raw.c +++ b/src/plugins/irc/irc-raw.c @@ -23,6 +23,7 @@ #include <stdio.h> #include <string.h> #include <time.h> +#include <sys/time.h> #include "../weechat-plugin.h" #include "irc.h" @@ -80,7 +81,7 @@ irc_raw_message_match_filter (struct t_irc_raw_message *raw_message, int match; char *command, *result, str_date[128]; struct t_hashtable *hashtable; - struct tm *date_tmp; + struct timeval tv; if (!filter || !filter[0]) return 1; @@ -92,12 +93,10 @@ irc_raw_message_match_filter (struct t_irc_raw_message *raw_message, raw_message->message); if (hashtable) { - date_tmp = localtime (&(raw_message->date)); - if (strftime (str_date, sizeof (str_date), - "%Y-%m-%d %H:%M:%S", date_tmp) == 0) - { - str_date[0] = '\0'; - } + tv.tv_sec = raw_message->date; + tv.tv_usec = raw_message->date_usec; + weechat_util_strftimeval (str_date, sizeof (str_date), + "%FT%T.%f", &tv); weechat_hashtable_set (hashtable, "date", str_date); weechat_hashtable_set (hashtable, "server", raw_message->server->name); @@ -301,9 +300,11 @@ irc_raw_message_print (struct t_irc_raw_message *raw_message) (raw_message->server) ? (raw_message->server)->name : ""); } - weechat_printf_date_tags ( + weechat_printf_datetime_tags ( irc_raw_buffer, - raw_message->date, NULL, + raw_message->date, + raw_message->date_usec, + NULL, "%s\t%s", prefix, (buf2) ? buf2 : ((buf) ? buf : raw_message->message)); @@ -532,7 +533,8 @@ irc_raw_message_remove_old () */ struct t_irc_raw_message * -irc_raw_message_add_to_list (time_t date, struct t_irc_server *server, +irc_raw_message_add_to_list (time_t date, int date_usec, + struct t_irc_server *server, int flags, const char *message) { struct t_irc_raw_message *new_raw_message; @@ -546,6 +548,7 @@ irc_raw_message_add_to_list (time_t date, struct t_irc_server *server, if (new_raw_message) { new_raw_message->date = date; + new_raw_message->date_usec = date_usec; new_raw_message->server = server; new_raw_message->flags = flags; new_raw_message->message = strdup (message); @@ -574,7 +577,7 @@ irc_raw_print (struct t_irc_server *server, int flags, const char *message) { struct t_irc_raw_message *new_raw_message; - time_t now; + struct timeval tv_now; if (!message) return; @@ -583,10 +586,9 @@ irc_raw_print (struct t_irc_server *server, int flags, if (!irc_raw_buffer && (weechat_irc_plugin->debug >= 1)) irc_raw_open (0); - now = time (NULL); - - new_raw_message = irc_raw_message_add_to_list (now, server, flags, - message); + gettimeofday (&tv_now, NULL); + new_raw_message = irc_raw_message_add_to_list ( + tv_now.tv_sec, tv_now.tv_usec, server, flags, message); if (new_raw_message) { if (irc_raw_buffer) @@ -598,7 +600,8 @@ irc_raw_print (struct t_irc_server *server, int flags, if (weechat_irc_plugin->debug >= 2) { new_raw_message = irc_raw_message_add_to_list ( - now, + tv_now.tv_sec, + tv_now.tv_usec, server, flags | IRC_RAW_FLAG_BINARY, message); @@ -635,6 +638,8 @@ irc_raw_add_to_infolist (struct t_infolist *infolist, if (!weechat_infolist_new_var_time (ptr_item, "date", raw_message->date)) return 0; + if (!weechat_infolist_new_var_integer (ptr_item, "date_usec", raw_message->date_usec)) + return 0; if (!weechat_infolist_new_var_string (ptr_item, "server", raw_message->server->name)) return 0; if (!weechat_infolist_new_var_integer (ptr_item, "flags", raw_message->flags)) diff --git a/src/plugins/irc/irc-raw.h b/src/plugins/irc/irc-raw.h index b846e7b96..ddbcca723 100644 --- a/src/plugins/irc/irc-raw.h +++ b/src/plugins/irc/irc-raw.h @@ -41,6 +41,7 @@ struct t_irc_server; struct t_irc_raw_message { time_t date; /* date/time of message */ + int date_usec; /* microseconds of date */ struct t_irc_server *server; /* server */ int flags; /* flags */ char *message; /* message */ @@ -59,6 +60,7 @@ extern void irc_raw_open (int switch_to_buffer); extern void irc_raw_set_filter (const char *filter); extern void irc_raw_filter_options (const char *filter); extern struct t_irc_raw_message *irc_raw_message_add_to_list (time_t date, + int date_usec, struct t_irc_server *server, int flags, const char *message); diff --git a/src/plugins/irc/irc-upgrade.c b/src/plugins/irc/irc-upgrade.c index 8745477d1..43745f947 100644 --- a/src/plugins/irc/irc-upgrade.c +++ b/src/plugins/irc/irc-upgrade.c @@ -969,6 +969,7 @@ irc_upgrade_read_cb (const void *pointer, void *data, { irc_raw_message_add_to_list ( weechat_infolist_time (infolist, "date"), + weechat_infolist_integer (infolist, "date_usec"), ptr_server, weechat_infolist_integer (infolist, "flags"), weechat_infolist_string (infolist, "message")); diff --git a/src/plugins/javascript/weechat-js-api.cpp b/src/plugins/javascript/weechat-js-api.cpp index 0475672e3..483303938 100644 --- a/src/plugins/javascript/weechat-js-api.cpp +++ b/src/plugins/javascript/weechat-js-api.cpp @@ -1903,6 +1903,31 @@ API_FUNC(print_date_tags) API_RETURN_OK; } +API_FUNC(print_datetime_tags) +{ + long date; + int date_usec; + + API_INIT_FUNC(1, "print_datetime_tags", "sniss", API_RETURN_ERROR); + + v8::String::Utf8Value buffer(args[0]); + date = args[1]->IntegerValue(); + date_usec = args[2]->IntegerValue(); + v8::String::Utf8Value tags(args[3]); + v8::String::Utf8Value message(args[4]); + + plugin_script_api_printf_datetime_tags ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + (time_t)date, + date_usec, + *tags, + "%s", *message); + + API_RETURN_OK; +} + API_FUNC(print_y) { int y; @@ -1913,11 +1938,12 @@ API_FUNC(print_y) y = args[1]->IntegerValue(); v8::String::Utf8Value message(args[2]); - plugin_script_api_printf_y (weechat_js_plugin, - js_current_script, - (struct t_gui_buffer *)API_STR2PTR(*buffer), - y, - "%s", *message); + plugin_script_api_printf_y ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + y, + "%s", *message); API_RETURN_OK; } @@ -1935,13 +1961,41 @@ API_FUNC(print_y_date_tags) 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, - (time_t)date, - *tags, - "%s", *message); + plugin_script_api_printf_y_date_tags ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + y, + (time_t)date, + *tags, + "%s", *message); + + API_RETURN_OK; +} + +API_FUNC(print_y_datetime_tags) +{ + int y, date_usec; + long date; + + API_INIT_FUNC(1, "print_y_datetime_tags", "siniss", API_RETURN_ERROR); + + v8::String::Utf8Value buffer(args[0]); + y = args[1]->IntegerValue(); + date = args[2]->IntegerValue(); + date_usec = args[3]->IntegerValue(); + v8::String::Utf8Value tags(args[4]); + v8::String::Utf8Value message(args[5]); + + plugin_script_api_printf_y_datetime_tags ( + weechat_js_plugin, + js_current_script, + (struct t_gui_buffer *)API_STR2PTR(*buffer), + y, + (time_t)date, + date_usec, + *tags, + "%s", *message); API_RETURN_OK; } @@ -2667,7 +2721,7 @@ API_FUNC(hook_line) int weechat_js_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -2680,6 +2734,7 @@ weechat_js_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -5297,8 +5352,10 @@ WeechatJsV8::loadLibs() API_DEF_FUNC(color); API_DEF_FUNC(print); API_DEF_FUNC(print_date_tags); + API_DEF_FUNC(print_datetime_tags); API_DEF_FUNC(print_y); API_DEF_FUNC(print_y_date_tags); + API_DEF_FUNC(print_y_datetime_tags); API_DEF_FUNC(log_print); API_DEF_FUNC(hook_command); API_DEF_FUNC(hook_completion); diff --git a/src/plugins/logger/logger-buffer.c b/src/plugins/logger/logger-buffer.c index dcbd8b7e3..5ad85acd1 100644 --- a/src/plugins/logger/logger-buffer.c +++ b/src/plugins/logger/logger-buffer.c @@ -27,6 +27,8 @@ #include <string.h> #include <stdio.h> #include <errno.h> +#include <time.h> +#include <sys/time.h> #include <sys/stat.h> #include "../weechat-plugin.h" @@ -236,8 +238,7 @@ logger_buffer_create_log_file (struct t_logger_buffer *logger_buffer) { char *charset, *message, buf_time[256], buf_beginning[1024]; int log_level, rc; - time_t seconds; - struct tm *date_tmp; + struct timeval tv_now; struct stat statbuf; if (logger_buffer->log_file) @@ -311,16 +312,11 @@ logger_buffer_create_log_file (struct t_logger_buffer *logger_buffer) if (weechat_config_boolean (logger_config_file_info_lines) && logger_buffer->write_start_info_line) { - buf_time[0] = '\0'; - seconds = time (NULL); - date_tmp = localtime (&seconds); - if (date_tmp) - { - if (strftime (buf_time, sizeof (buf_time) - 1, - weechat_config_string (logger_config_file_time_format), - date_tmp) == 0) - buf_time[0] = '\0'; - } + gettimeofday (&tv_now, NULL); + weechat_util_strftimeval ( + buf_time, sizeof (buf_time), + weechat_config_string (logger_config_file_time_format), + &tv_now); snprintf (buf_beginning, sizeof (buf_beginning), _("%s\t**** Beginning of log ****"), buf_time); @@ -663,8 +659,7 @@ logger_buffer_write_line (struct t_logger_buffer *logger_buffer, void logger_buffer_stop (struct t_logger_buffer *logger_buffer, int write_info_line) { - time_t seconds; - struct tm *date_tmp; + struct timeval tv_now; char buf_time[256]; if (!logger_buffer) @@ -674,16 +669,11 @@ logger_buffer_stop (struct t_logger_buffer *logger_buffer, int write_info_line) { if (write_info_line && weechat_config_boolean (logger_config_file_info_lines)) { - buf_time[0] = '\0'; - seconds = time (NULL); - date_tmp = localtime (&seconds); - if (date_tmp) - { - if (strftime (buf_time, sizeof (buf_time) - 1, - weechat_config_string (logger_config_file_time_format), - date_tmp) == 0) - buf_time[0] = '\0'; - } + gettimeofday (&tv_now, NULL); + weechat_util_strftimeval ( + buf_time, sizeof (buf_time), + weechat_config_string (logger_config_file_time_format), + &tv_now); logger_buffer_write_line (logger_buffer, _("%s\t**** End of log ****"), buf_time); diff --git a/src/plugins/logger/logger-config.c b/src/plugins/logger/logger-config.c index 0a5810234..5ab376721 100644 --- a/src/plugins/logger/logger-config.c +++ b/src/plugins/logger/logger-config.c @@ -716,7 +716,8 @@ logger_config_init () logger_config_file, logger_config_section_file, "time_format", "string", N_("timestamp used in log files (see man strftime for date/time " - "specifiers)"), + "specifiers, extra specifiers are supported, see function " + "util_strftimeval in Plugin API reference)"), NULL, 0, 0, "%Y-%m-%d %H:%M:%S", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); } diff --git a/src/plugins/logger/logger.c b/src/plugins/logger/logger.c index 6489ef1ec..bc3121ea8 100644 --- a/src/plugins/logger/logger.c +++ b/src/plugins/logger/logger.c @@ -25,6 +25,7 @@ #include <string.h> #include <ctype.h> #include <time.h> +#include <sys/time.h> #include "../weechat-plugin.h" #include "logger.h" @@ -150,7 +151,7 @@ logger_get_file_path () seconds = time (NULL); date_tmp = localtime (&seconds); path2[0] = '\0'; - if (strftime (path2, length - 1, path, date_tmp) == 0) + if (strftime (path2, length, path, date_tmp) == 0) path2[0] = '\0'; if (weechat_logger_plugin->debug) @@ -378,7 +379,7 @@ logger_get_mask_expanded (struct t_gui_buffer *buffer, const char *mask) seconds = time (NULL); date_tmp = localtime (&seconds); mask2[0] = '\0'; - if (strftime (mask2, length - 1, mask, date_tmp) == 0) + if (strftime (mask2, length, mask, date_tmp) == 0) mask2[0] = '\0'; /* @@ -695,13 +696,13 @@ logger_get_line_tag_info (int tags_count, const char **tags, int logger_print_cb (const void *pointer, void *data, - struct t_gui_buffer *buffer, time_t date, + struct t_gui_buffer *buffer, time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) { struct t_logger_buffer *ptr_logger_buffer; - struct tm *date_tmp; + struct timeval tv; char buf_time[256], *prefix_ansi, *message_ansi; const char *ptr_prefix, *ptr_message; int line_log_level, prefix_is_nick, color_lines; @@ -740,15 +741,12 @@ logger_print_cb (const void *pointer, void *data, ptr_prefix = prefix; ptr_message = message; } - buf_time[0] = '\0'; - date_tmp = localtime (&date); - if (date_tmp) - { - if (strftime (buf_time, sizeof (buf_time) - 1, - weechat_config_string (logger_config_file_time_format), - date_tmp) == 0) - buf_time[0] = '\0'; - } + tv.tv_sec = date; + tv.tv_usec = date_usec; + weechat_util_strftimeval ( + buf_time, sizeof (buf_time), + weechat_config_string (logger_config_file_time_format), + &tv); logger_buffer_write_line ( ptr_logger_buffer, diff --git a/src/plugins/logger/logger.h b/src/plugins/logger/logger.h index 2b94acab4..c2d9ac5d7 100644 --- a/src/plugins/logger/logger.h +++ b/src/plugins/logger/logger.h @@ -41,7 +41,8 @@ extern char *logger_build_option_name (struct t_gui_buffer *buffer); extern int logger_get_level_for_buffer (struct t_gui_buffer *buffer); extern char *logger_get_filename (struct t_gui_buffer *buffer); extern int logger_print_cb (const void *pointer, void *data, - struct t_gui_buffer *buffer, time_t date, + struct t_gui_buffer *buffer, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message); diff --git a/src/plugins/lua/weechat-lua-api.c b/src/plugins/lua/weechat-lua-api.c index 749ce5acf..b67bd82b2 100644 --- a/src/plugins/lua/weechat-lua-api.c +++ b/src/plugins/lua/weechat-lua-api.c @@ -2107,6 +2107,33 @@ API_FUNC(print_date_tags) API_RETURN_OK; } +API_FUNC(print_datetime_tags) +{ + const char *buffer, *tags, *message; + long date; + int date_usec; + + API_INIT_FUNC(1, "print_datetime_tags", API_RETURN_ERROR); + if (lua_gettop (L) < 5) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = lua_tostring (L, -5); + date = lua_tonumber (L, -4); + date_usec = lua_tonumber (L, -3); + tags = lua_tostring (L, -2); + message = lua_tostring (L, -1); + + plugin_script_api_printf_datetime_tags (weechat_lua_plugin, + lua_current_script, + API_STR2PTR(buffer), + (time_t)date, + date_usec, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(print_y) { const char *buffer, *message; @@ -2156,6 +2183,35 @@ API_FUNC(print_y_date_tags) API_RETURN_OK; } +API_FUNC(print_y_datetime_tags) +{ + const char *buffer, *tags, *message; + int y, date_usec; + long date; + + API_INIT_FUNC(1, "print_y_datetime_tags", API_RETURN_ERROR); + if (lua_gettop (L) < 6) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = lua_tostring (L, -6); + y = lua_tonumber (L, -5); + date = lua_tonumber (L, -4); + date_usec = lua_tonumber (L, -3); + tags = lua_tostring (L, -2); + message = lua_tostring (L, -1); + + plugin_script_api_printf_y_datetime_tags (weechat_lua_plugin, + lua_current_script, + API_STR2PTR(buffer), + y, + (time_t)date, + date_usec, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { const char *message; @@ -2891,7 +2947,7 @@ API_FUNC(hook_line) int weechat_lua_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -2904,6 +2960,7 @@ weechat_lua_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -5662,8 +5719,10 @@ const struct luaL_Reg weechat_lua_api_funcs[] = { API_DEF_FUNC(color), API_DEF_FUNC(print), API_DEF_FUNC(print_date_tags), + API_DEF_FUNC(print_datetime_tags), API_DEF_FUNC(print_y), API_DEF_FUNC(print_y_date_tags), + API_DEF_FUNC(print_y_datetime_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 0e28070eb..6d89d68a6 100644 --- a/src/plugins/perl/weechat-perl-api.c +++ b/src/plugins/perl/weechat-perl-api.c @@ -2015,6 +2015,30 @@ API_FUNC(print_date_tags) API_RETURN_OK; } +API_FUNC(print_datetime_tags) +{ + char *buffer, *tags, *message; + dXSARGS; + + API_INIT_FUNC(1, "print_datetime_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_datetime_tags (weechat_perl_plugin, + perl_current_script, + API_STR2PTR(buffer), + (time_t)(SvIV (ST (1))), /* date */ + SvIV (ST (2)), /* date_usec */ + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(print_y) { char *buffer, *message; @@ -2030,7 +2054,7 @@ API_FUNC(print_y) plugin_script_api_printf_y (weechat_perl_plugin, perl_current_script, API_STR2PTR(buffer), - SvIV (ST (1)), + SvIV (ST (1)), /* y */ "%s", message); API_RETURN_OK; @@ -2060,6 +2084,31 @@ API_FUNC(print_y_date_tags) API_RETURN_OK; } +API_FUNC(print_y_datetime_tags) +{ + char *buffer, *tags, *message; + dXSARGS; + + API_INIT_FUNC(1, "print_y_datetime_tags", API_RETURN_ERROR); + if (items < 5) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = SvPV_nolen (ST (0)); + tags = SvPV_nolen (ST (4)); + message = SvPV_nolen (ST (5)); + + plugin_script_api_printf_y_datetime_tags (weechat_perl_plugin, + perl_current_script, + API_STR2PTR(buffer), + SvIV (ST (1)), /* y */ + (time_t)(SvIV (ST (2))), /* date */ + SvIV (ST (3)), /* date_usec */ + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { dXSARGS; @@ -2777,7 +2826,7 @@ API_FUNC(hook_line) int weechat_perl_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -2790,6 +2839,7 @@ weechat_perl_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -5606,8 +5656,10 @@ weechat_perl_api_init (pTHX) API_DEF_FUNC(color); API_DEF_FUNC(print); API_DEF_FUNC(print_date_tags); + API_DEF_FUNC(print_datetime_tags); API_DEF_FUNC(print_y); API_DEF_FUNC(print_y_date_tags); + API_DEF_FUNC(print_y_datetime_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 fbd1ce5db..b23c86bf9 100644 --- a/src/plugins/php/weechat-php-api.c +++ b/src/plugins/php/weechat-php-api.c @@ -2183,6 +2183,38 @@ API_FUNC(print_date_tags) API_RETURN_OK; } +API_FUNC(print_datetime_tags) +{ + zend_string *z_buffer, *z_tags, *z_message; + zend_long z_date, z_date_usec; + struct t_gui_buffer *buffer; + time_t date; + int date_usec; + char *tags, *message; + + API_INIT_FUNC(1, "print_datetime_tags", API_RETURN_ERROR); + if (zend_parse_parameters (ZEND_NUM_ARGS(), "SllSS", &z_buffer, &z_date, + &z_date_usec, &z_tags, &z_message) == FAILURE) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = (struct t_gui_buffer *)API_STR2PTR(ZSTR_VAL(z_buffer)); + date = (time_t)z_date; + date_usec = (int)z_date_usec; + tags = ZSTR_VAL(z_tags); + message = ZSTR_VAL(z_message); + + plugin_script_api_printf_datetime_tags (weechat_php_plugin, + php_current_script, + buffer, + date, + date_usec, + (const char *)tags, + "%s", + message); + + API_RETURN_OK; +} + API_FUNC(print_y) { zend_string *z_buffer, *z_message; @@ -2242,6 +2274,41 @@ API_FUNC(print_y_date_tags) API_RETURN_OK; } +API_FUNC(print_y_datetime_tags) +{ + zend_string *z_buffer, *z_tags, *z_message; + zend_long z_y, z_date, z_date_usec; + struct t_gui_buffer *buffer; + int y, date_usec; + time_t date; + char *tags, *message; + + API_INIT_FUNC(1, "print_y_datetime_tags", API_RETURN_ERROR); + if (zend_parse_parameters (ZEND_NUM_ARGS(), "SlllSS", &z_buffer, &z_y, + &z_date, &z_date_usec, &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; + date_usec = (int)z_date_usec; + tags = ZSTR_VAL(z_tags); + message = ZSTR_VAL(z_message); + + plugin_script_api_printf_y_datetime_tags (weechat_php_plugin, + php_current_script, + buffer, + y, + date, + date_usec, + (const char *)tags, + "%s", + message); + + API_RETURN_OK; +} + API_FUNC(log_print) { zend_string *z_message; @@ -2871,7 +2938,8 @@ API_FUNC(hook_line) static int weechat_php_api_hook_print_cb (const void *pointer, void *data, - struct t_gui_buffer *buffer, time_t date, + struct t_gui_buffer *buffer, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -2879,6 +2947,9 @@ weechat_php_api_hook_print_cb (const void *pointer, void *data, int rc; void *func_argv[9]; + /* make C compiler happy */ + (void) date_usec; + func_argv[1] = (char *)API_PTR2STR(buffer); func_argv[2] = &date; func_argv[3] = &tags_count; diff --git a/src/plugins/php/weechat-php-api.h b/src/plugins/php/weechat-php-api.h index d223b6f56..0d0057705 100644 --- a/src/plugins/php/weechat-php-api.h +++ b/src/plugins/php/weechat-php-api.h @@ -129,8 +129,10 @@ PHP_FUNCTION(weechat_prefix); PHP_FUNCTION(weechat_color); PHP_FUNCTION(weechat_print); PHP_FUNCTION(weechat_print_date_tags); +PHP_FUNCTION(weechat_print_datetime_tags); PHP_FUNCTION(weechat_print_y); PHP_FUNCTION(weechat_print_y_date_tags); +PHP_FUNCTION(weechat_print_y_datetime_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 8a5534916..e97abaf03 100644 --- a/src/plugins/php/weechat-php.c +++ b/src/plugins/php/weechat-php.c @@ -187,8 +187,10 @@ const zend_function_entry weechat_functions[] = { PHP_FE(weechat_color, arginfo_weechat_color) PHP_FE(weechat_print, arginfo_weechat_print) PHP_FE(weechat_print_date_tags, arginfo_weechat_print_date_tags) + PHP_FE(weechat_print_datetime_tags, arginfo_weechat_print_datetime_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_print_y_datetime_tags, arginfo_weechat_print_y_datetime_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 9343075af..3fa47053b 100644 --- a/src/plugins/php/weechat-php.stub.php +++ b/src/plugins/php/weechat-php.stub.php @@ -95,8 +95,10 @@ function weechat_prefix(string $p0): string {} function weechat_color(string $p0): string {} function weechat_print(string $p0, string $p1): int {} function weechat_print_date_tags(string $p0, int $p1, string $p2, string $p3): int {} +function weechat_print_datetime_tags(string $p0, int $p1, int $p2, string $p3, string $p4): int {} function weechat_print_y(string $p0, int $p1, string $p2): int {} function weechat_print_y_date_tags(string $p0, int $p1, int $p2, string $p3, string $p4): int {} +function weechat_print_y_datetime_tags(string $p0, int $p1, int $p2, int $p3, string $p4, string $p5): int {} function weechat_log_print(string $p0): int {} function weechat_hook_command(string $p0, string $p1, string $p2, string $p3, string $p4, mixed $p5, string $p6): string {} function weechat_hook_completion(string $p0, string $p1, mixed $p2, string $p3): string {} diff --git a/src/plugins/php/weechat-php_arginfo.h b/src/plugins/php/weechat-php_arginfo.h index e2b345a3e..250d2ea5f 100644 --- a/src/plugins/php/weechat-php_arginfo.h +++ b/src/plugins/php/weechat-php_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 614392b6be26030a5d7b12437562aec08ad7052c */ + * Stub hash: b6e9e3f12ed24566eb77aa0c08bf3e7c5d866b76 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_weechat_register, 0, 7, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, p0, IS_STRING, 0) @@ -239,18 +239,29 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_weechat_print_date_tags, 0, 4, I ZEND_ARG_TYPE_INFO(0, p3, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_weechat_print_datetime_tags, 0, 5, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, p0, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, p1, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, p2, IS_LONG, 0) + ZEND_ARG_TYPE_INFO(0, p3, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, p4, IS_STRING, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_weechat_print_y, 0, 3, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, p0, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, p1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, p2, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_weechat_print_y_date_tags, 0, 5, IS_LONG, 0) +#define arginfo_weechat_print_y_date_tags arginfo_weechat_print_datetime_tags + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_weechat_print_y_datetime_tags, 0, 6, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, p0, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, p1, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, p2, IS_LONG, 0) - ZEND_ARG_TYPE_INFO(0, p3, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, p3, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, p4, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, p5, IS_STRING, 0) ZEND_END_ARG_INFO() #define arginfo_weechat_log_print arginfo_weechat_charset_set diff --git a/src/plugins/php/weechat-php_legacy_arginfo.h b/src/plugins/php/weechat-php_legacy_arginfo.h index de2cb031e..2622d66b0 100644 --- a/src/plugins/php/weechat-php_legacy_arginfo.h +++ b/src/plugins/php/weechat-php_legacy_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 614392b6be26030a5d7b12437562aec08ad7052c */ + * Stub hash: b6e9e3f12ed24566eb77aa0c08bf3e7c5d866b76 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_weechat_register, 0, 0, 7) ZEND_ARG_INFO(0, p0) @@ -192,14 +192,25 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_print_date_tags arginfo_weechat_string_eval_expression +ZEND_BEGIN_ARG_INFO_EX(arginfo_weechat_print_datetime_tags, 0, 0, 5) + ZEND_ARG_INFO(0, p0) + ZEND_ARG_INFO(0, p1) + ZEND_ARG_INFO(0, p2) + ZEND_ARG_INFO(0, p3) + ZEND_ARG_INFO(0, p4) +ZEND_END_ARG_INFO() + #define arginfo_weechat_print_y arginfo_weechat_ngettext -ZEND_BEGIN_ARG_INFO_EX(arginfo_weechat_print_y_date_tags, 0, 0, 5) +#define arginfo_weechat_print_y_date_tags arginfo_weechat_print_datetime_tags + +ZEND_BEGIN_ARG_INFO_EX(arginfo_weechat_print_y_datetime_tags, 0, 0, 6) ZEND_ARG_INFO(0, p0) ZEND_ARG_INFO(0, p1) ZEND_ARG_INFO(0, p2) ZEND_ARG_INFO(0, p3) ZEND_ARG_INFO(0, p4) + ZEND_ARG_INFO(0, p5) ZEND_END_ARG_INFO() #define arginfo_weechat_log_print arginfo_weechat_plugin_get_name @@ -214,28 +225,21 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_hook_command_run arginfo_weechat_ngettext -#define arginfo_weechat_hook_timer arginfo_weechat_print_y_date_tags +#define arginfo_weechat_hook_timer arginfo_weechat_print_datetime_tags -ZEND_BEGIN_ARG_INFO_EX(arginfo_weechat_hook_fd, 0, 0, 6) - ZEND_ARG_INFO(0, p0) - ZEND_ARG_INFO(0, p1) - ZEND_ARG_INFO(0, p2) - ZEND_ARG_INFO(0, p3) - ZEND_ARG_INFO(0, p4) - ZEND_ARG_INFO(0, p5) -ZEND_END_ARG_INFO() +#define arginfo_weechat_hook_fd arginfo_weechat_print_y_datetime_tags #define arginfo_weechat_hook_process arginfo_weechat_string_eval_expression -#define arginfo_weechat_hook_process_hashtable arginfo_weechat_print_y_date_tags +#define arginfo_weechat_hook_process_hashtable arginfo_weechat_print_datetime_tags -#define arginfo_weechat_hook_url arginfo_weechat_print_y_date_tags +#define arginfo_weechat_hook_url arginfo_weechat_print_datetime_tags #define arginfo_weechat_hook_connect arginfo_weechat_list_new -#define arginfo_weechat_hook_line arginfo_weechat_print_y_date_tags +#define arginfo_weechat_hook_line arginfo_weechat_print_datetime_tags -#define arginfo_weechat_hook_print arginfo_weechat_hook_fd +#define arginfo_weechat_hook_print arginfo_weechat_print_y_datetime_tags #define arginfo_weechat_hook_signal arginfo_weechat_ngettext @@ -251,11 +255,11 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_hook_modifier_exec arginfo_weechat_ngettext -#define arginfo_weechat_hook_info arginfo_weechat_print_y_date_tags +#define arginfo_weechat_hook_info arginfo_weechat_print_datetime_tags #define arginfo_weechat_hook_info_hashtable arginfo_weechat_register -#define arginfo_weechat_hook_infolist arginfo_weechat_hook_fd +#define arginfo_weechat_hook_infolist arginfo_weechat_print_y_datetime_tags #define arginfo_weechat_hook_focus arginfo_weechat_ngettext @@ -265,9 +269,9 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_unhook_all arginfo_weechat_plugin_get_name -#define arginfo_weechat_buffer_new arginfo_weechat_print_y_date_tags +#define arginfo_weechat_buffer_new arginfo_weechat_print_datetime_tags -#define arginfo_weechat_buffer_new_props arginfo_weechat_hook_fd +#define arginfo_weechat_buffer_new_props arginfo_weechat_print_y_datetime_tags #define arginfo_weechat_buffer_search arginfo_weechat_iconv_to_internal @@ -307,7 +311,7 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_window_set_title arginfo_weechat_plugin_get_name -#define arginfo_weechat_nicklist_add_group arginfo_weechat_print_y_date_tags +#define arginfo_weechat_nicklist_add_group arginfo_weechat_print_datetime_tags #define arginfo_weechat_nicklist_search_group arginfo_weechat_ngettext @@ -441,7 +445,7 @@ ZEND_END_ARG_INFO() #define arginfo_weechat_hdata_hashtable arginfo_weechat_ngettext -#define arginfo_weechat_hdata_compare arginfo_weechat_print_y_date_tags +#define arginfo_weechat_hdata_compare arginfo_weechat_print_datetime_tags #define arginfo_weechat_hdata_update arginfo_weechat_ngettext diff --git a/src/plugins/plugin-script-api.c b/src/plugins/plugin-script-api.c index 85ee30430..5a3e39bc5 100644 --- a/src/plugins/plugin-script-api.c +++ b/src/plugins/plugin-script-api.c @@ -391,6 +391,34 @@ plugin_script_api_printf_date_tags (struct t_weechat_plugin *weechat_plugin, } /* + * Prints a message, with optional date/time (with microseconds) and tags. + */ + +void +plugin_script_api_printf_datetime_tags (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + struct t_gui_buffer *buffer, + time_t date, int date_usec, + 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_datetime_tags (buffer, date, date_usec, tags, + "%s", (buf2) ? buf2 : vbuffer); + if (buf2) + free (buf2); + + free (vbuffer); +} + +/* * Prints a message on a buffer with free content. */ @@ -443,6 +471,35 @@ plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weechat_plugin, } /* + * Prints a message on a buffer with free content, with optional date/time + * (with microseconds) and tags. + */ + +void +plugin_script_api_printf_y_datetime_tags (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + struct t_gui_buffer *buffer, int y, + time_t date, int date_usec, + 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_datetime_tags (buffer, y, date, date_usec, tags, + "%s", (buf2) ? buf2 : vbuffer); + if (buf2) + free (buf2); + + free (vbuffer); +} + +/* * Prints a message in WeeChat log file. */ @@ -857,6 +914,7 @@ plugin_script_api_hook_print (struct t_weechat_plugin *weechat_plugin, void *data, struct t_gui_buffer *buffer, time_t date, + int date_usec, int tags_count, const char **tags, int displayed, int highlight, diff --git a/src/plugins/plugin-script-api.h b/src/plugins/plugin-script-api.h index a69b3435a..dae298193 100644 --- a/src/plugins/plugin-script-api.h +++ b/src/plugins/plugin-script-api.h @@ -126,6 +126,12 @@ extern void plugin_script_api_printf_date_tags (struct t_weechat_plugin *weechat struct t_gui_buffer *buffer, time_t date, const char *tags, const char *format, ...); +extern void plugin_script_api_printf_datetime_tags (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + struct t_gui_buffer *buffer, + time_t date, int date_usec, + const char *tags, + const char *format, ...); extern void plugin_script_api_printf_y (struct t_weechat_plugin *weechat_plugin, struct t_plugin_script *script, struct t_gui_buffer *buffer, @@ -136,6 +142,13 @@ extern void plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weech int y, time_t date, const char *tags, const char *format, ...); +extern void plugin_script_api_printf_y_datetime_tags (struct t_weechat_plugin *weechat_plugin, + struct t_plugin_script *script, + struct t_gui_buffer *buffer, + int y, + time_t date, int date_usec, + 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, ...); @@ -256,6 +269,7 @@ extern struct t_hook *plugin_script_api_hook_print (struct t_weechat_plugin *wee void *data, struct t_gui_buffer *buffer, time_t date, + int date_usec, int tags_count, const char **tags, int displayed, diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index e496d547a..aa9a87856 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -694,6 +694,7 @@ plugin_load (const char *filename, int init_plugin, int argc, char **argv) new_plugin->util_timeval_diff = &util_timeval_diff; new_plugin->util_timeval_add = &util_timeval_add; new_plugin->util_get_time_string = &util_get_time_string; + new_plugin->util_strftimeval = &util_strftimeval; new_plugin->util_version_number = &util_version_number; new_plugin->list_new = &weelist_new; @@ -789,8 +790,8 @@ 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_date_tags = &gui_chat_printf_y_date_tags; + new_plugin->printf_datetime_tags = &gui_chat_printf_datetime_tags; + new_plugin->printf_y_datetime_tags = &gui_chat_printf_y_datetime_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 15c1a41ee..b08b178b8 100644 --- a/src/plugins/python/weechat-python-api.c +++ b/src/plugins/python/weechat-python-api.c @@ -2012,6 +2012,33 @@ API_FUNC(prnt_date_tags) API_RETURN_OK; } +API_FUNC(prnt_datetime_tags) +{ + char *buffer, *tags, *message; + long date; + int date_usec; + + API_INIT_FUNC(1, "prnt_datetime_tags", API_RETURN_ERROR); + buffer = NULL; + date = 0; + date_usec = 0; + tags = NULL; + message = NULL; + if (!PyArg_ParseTuple (args, "sliss", &buffer, &date, &date_usec, &tags, + &message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + plugin_script_api_printf_datetime_tags (weechat_python_plugin, + python_current_script, + API_STR2PTR(buffer), + (time_t)date, + date_usec, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(prnt_y) { char *buffer, *message; @@ -2059,6 +2086,36 @@ API_FUNC(prnt_y_date_tags) API_RETURN_OK; } +API_FUNC(prnt_y_datetime_tags) +{ + char *buffer, *tags, *message; + int y; + long date; + int date_usec; + + API_INIT_FUNC(1, "prnt_y_datetime_tags", API_RETURN_ERROR); + buffer = NULL; + y = 0; + date = 0; + date_usec = 0; + tags = NULL; + message = NULL; + if (!PyArg_ParseTuple (args, "siliss", &buffer, &y, &date, &date_usec, + &tags, &message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + plugin_script_api_printf_y_datetime_tags (weechat_python_plugin, + python_current_script, + API_STR2PTR(buffer), + y, + (time_t)date, + date_usec, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { char *message; @@ -2797,7 +2854,7 @@ API_FUNC(hook_line) int weechat_python_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -2810,6 +2867,7 @@ weechat_python_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -5527,8 +5585,10 @@ PyMethodDef weechat_python_funcs[] = API_DEF_FUNC(color), API_DEF_FUNC(prnt), API_DEF_FUNC(prnt_date_tags), + API_DEF_FUNC(prnt_datetime_tags), API_DEF_FUNC(prnt_y), API_DEF_FUNC(prnt_y_date_tags), + API_DEF_FUNC(prnt_y_datetime_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 db2b5ceae..8bb4ad8e4 100644 --- a/src/plugins/python/weechat.pyi +++ b/src/plugins/python/weechat.pyi @@ -1156,6 +1156,20 @@ def prnt_date_tags(buffer: str, date: int, tags: str, message: str) -> int: ... +def prnt_datetime_tags(buffer: str, date: int, date_usec: int, tags: str, message: str) -> int: + """`prnt_datetime_tags in WeeChat plugin API reference <https://weechat.org/doc/weechat/api/#_prnt_datetime_tags>`_ + :: + + # example + now = time.time() + time_sec = int(now) + time_usec = int((now * 1000000) % 1000000) + weechat.prnt_datetime_tags("", time_sec - 120, time_usec, "notify_message", + "Message 2 minutes ago, with a tag 'notify_message'") + """ + ... + + def prnt_y(buffer: str, y: int, message: str) -> int: """`prnt_y in WeeChat plugin API reference <https://weechat.org/doc/weechat/api/#_prnt_y>`_ :: @@ -1176,6 +1190,16 @@ def prnt_y_date_tags(buffer: str, y: int, date: int, tags: str, message: str) -> ... +def prnt_y_datetime_tags(buffer: str, y: int, date: int, date_usec: int, tags: str, message: str) -> int: + """`prnt_y_datetime_tags in WeeChat plugin API reference <https://weechat.org/doc/weechat/api/#_prnt_y_datetime_tags>`_ + :: + + # example + weechat.prnt_y_datetime_tags("", 2, 0, 0, "my_tag", "My message on third line with a tag") + """ + ... + + def log_print(message: str) -> int: """`log_print in WeeChat plugin API reference <https://weechat.org/doc/weechat/api/#_log_print>`_ :: diff --git a/src/plugins/relay/weechat/relay-weechat-protocol.c b/src/plugins/relay/weechat/relay-weechat-protocol.c index 4966f19ae..d5bdd83dc 100644 --- a/src/plugins/relay/weechat/relay-weechat-protocol.c +++ b/src/plugins/relay/weechat/relay-weechat-protocol.c @@ -1143,11 +1143,11 @@ relay_weechat_protocol_signal_buffer_cb (const void *pointer, void *data, snprintf (cmd_hdata, sizeof (cmd_hdata), "line_data:0x%lx", (unsigned long)ptr_line_data); - relay_weechat_msg_add_hdata (msg, cmd_hdata, - "buffer,date,date_printed," - "displayed,notify_level," - "highlight,tags_array,prefix," - "message"); + relay_weechat_msg_add_hdata ( + msg, cmd_hdata, + "buffer,date,date_usec,date_printed,date_usec_printed," + "displayed,notify_level,highlight,tags_array," + "prefix,message"); relay_weechat_msg_send (ptr_client, msg); relay_weechat_msg_free (msg); } diff --git a/src/plugins/ruby/weechat-ruby-api.c b/src/plugins/ruby/weechat-ruby-api.c index 9716dc5be..0dc20e24a 100644 --- a/src/plugins/ruby/weechat-ruby-api.c +++ b/src/plugins/ruby/weechat-ruby-api.c @@ -2487,6 +2487,43 @@ weechat_ruby_api_print_date_tags (VALUE class, VALUE buffer, VALUE date, } static VALUE +weechat_ruby_api_print_datetime_tags (VALUE class, VALUE buffer, VALUE date, + VALUE date_usec, VALUE tags, + VALUE message) +{ + char *c_buffer, *c_tags, *c_message; + time_t c_date; + int c_date_usec; + + API_INIT_FUNC(1, "print_datetime_tags", API_RETURN_ERROR); + if (NIL_P (buffer) || NIL_P (date) || NIL_P (date_usec) || NIL_P (tags) + || NIL_P (message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + Check_Type (buffer, T_STRING); + CHECK_INTEGER(date); + CHECK_INTEGER(date_usec); + Check_Type (tags, T_STRING); + Check_Type (message, T_STRING); + + c_buffer = StringValuePtr (buffer); + c_date = NUM2ULONG (date); + c_date_usec = NUM2INT (date_usec); + c_tags = StringValuePtr (tags); + c_message = StringValuePtr (message); + + plugin_script_api_printf_datetime_tags (weechat_ruby_plugin, + ruby_current_script, + API_STR2PTR(c_buffer), + c_date, + c_date_usec, + c_tags, + "%s", c_message); + + API_RETURN_OK; +} + +static VALUE weechat_ruby_api_print_y (VALUE class, VALUE buffer, VALUE y, VALUE message) { char *c_buffer, *c_message; @@ -2550,6 +2587,46 @@ weechat_ruby_api_print_y_date_tags (VALUE class, VALUE buffer, VALUE y, } static VALUE +weechat_ruby_api_print_y_datetime_tags (VALUE class, VALUE buffer, VALUE y, + VALUE date, VALUE date_usec, VALUE tags, + VALUE message) +{ + char *c_buffer, *c_tags, *c_message; + int c_y, c_date_usec; + time_t c_date; + + API_INIT_FUNC(1, "print_y_datetime_tags", API_RETURN_ERROR); + if (NIL_P (buffer) || NIL_P (y) || NIL_P (date) || NIL_P (date_usec) + || NIL_P (tags) || NIL_P (message)) + API_WRONG_ARGS(API_RETURN_ERROR); + + Check_Type (buffer, T_STRING); + CHECK_INTEGER(y); + CHECK_INTEGER(date); + CHECK_INTEGER(date_usec); + Check_Type (tags, T_STRING); + Check_Type (message, T_STRING); + + c_buffer = StringValuePtr (buffer); + c_y = NUM2INT (y); + c_date = NUM2ULONG (date); + c_date_usec = NUM2INT (date_usec); + c_tags = StringValuePtr (tags); + c_message = StringValuePtr (message); + + plugin_script_api_printf_y_datetime_tags (weechat_ruby_plugin, + ruby_current_script, + API_STR2PTR(c_buffer), + c_y, + c_date, + c_date_usec, + c_tags, + "%s", c_message); + + API_RETURN_OK; +} + +static VALUE weechat_ruby_api_log_print (VALUE class, VALUE message) { char *c_message; @@ -3400,7 +3477,7 @@ weechat_ruby_api_hook_line (VALUE class, VALUE buffer_type, VALUE buffer_name, int weechat_ruby_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -3413,6 +3490,7 @@ weechat_ruby_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -6838,8 +6916,10 @@ weechat_ruby_api_init (VALUE ruby_mWeechat) API_DEF_FUNC(color, 1); API_DEF_FUNC(print, 2); API_DEF_FUNC(print_date_tags, 4); + API_DEF_FUNC(print_datetime_tags, 5); API_DEF_FUNC(print_y, 3); API_DEF_FUNC(print_y_date_tags, 5); + API_DEF_FUNC(print_y_datetime_tags, 6); 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 9414ad27b..88438a64a 100644 --- a/src/plugins/tcl/weechat-tcl-api.c +++ b/src/plugins/tcl/weechat-tcl-api.c @@ -2277,6 +2277,38 @@ API_FUNC(print_date_tags) API_RETURN_OK; } +API_FUNC(print_datetime_tags) +{ + Tcl_Obj *objp; + char *buffer, *tags, *message; + int i, date_usec; + long date; + + API_INIT_FUNC(1, "print_datetime_tags", API_RETURN_ERROR); + if (objc < 6) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetLongFromObj (interp, objv[2], &date) != TCL_OK) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetIntFromObj (interp, objv[3], &date_usec) != 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_datetime_tags (weechat_tcl_plugin, + tcl_current_script, + API_STR2PTR(buffer), + (time_t)date, + date_usec, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(print_y) { Tcl_Obj *objp; @@ -2334,6 +2366,42 @@ API_FUNC(print_y_date_tags) API_RETURN_OK; } +API_FUNC(print_y_datetime_tags) +{ + Tcl_Obj *objp; + char *buffer, *tags, *message; + int i, y, date_usec; + long date; + + API_INIT_FUNC(1, "print_y_datetime_tags", API_RETURN_ERROR); + if (objc < 7) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetIntFromObj (interp, objv[2], &y) != TCL_OK) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetLongFromObj (interp, objv[3], &date) != TCL_OK) + API_WRONG_ARGS(API_RETURN_ERROR); + + if (Tcl_GetIntFromObj (interp, objv[4], &date_usec) != TCL_OK) + API_WRONG_ARGS(API_RETURN_ERROR); + + buffer = Tcl_GetStringFromObj (objv[1], &i); + tags = Tcl_GetStringFromObj (objv[5], &i); + message = Tcl_GetStringFromObj (objv[6], &i); + + plugin_script_api_printf_y_datetime_tags (weechat_tcl_plugin, + tcl_current_script, + API_STR2PTR(buffer), + y, + (time_t)date, + date_usec, + tags, + "%s", message); + + API_RETURN_OK; +} + API_FUNC(log_print) { Tcl_Obj *objp; @@ -3097,7 +3165,7 @@ API_FUNC(hook_line) int weechat_tcl_api_hook_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, + time_t date, int date_usec, int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) @@ -3110,6 +3178,7 @@ weechat_tcl_api_hook_print_cb (const void *pointer, void *data, int *rc, ret; /* make C compiler happy */ + (void) date_usec; (void) tags_count; script = (struct t_plugin_script *)pointer; @@ -6118,8 +6187,10 @@ void weechat_tcl_api_init (Tcl_Interp *interp) API_DEF_FUNC(color); API_DEF_FUNC(print); API_DEF_FUNC(print_date_tags); + API_DEF_FUNC(print_datetime_tags); API_DEF_FUNC(print_y); API_DEF_FUNC(print_y_date_tags); + API_DEF_FUNC(print_y_datetime_tags); API_DEF_FUNC(log_print); API_DEF_FUNC(hook_command); API_DEF_FUNC(hook_completion); diff --git a/src/plugins/trigger/trigger-callback.c b/src/plugins/trigger/trigger-callback.c index d9f307688..389f87cbd 100644 --- a/src/plugins/trigger/trigger-callback.c +++ b/src/plugins/trigger/trigger-callback.c @@ -1143,13 +1143,14 @@ end: int trigger_callback_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, int tags_count, const char **tags, + time_t date, int date_usec, + int tags_count, const char **tags, int displayed, int highlight, const char *prefix, const char *message) { char *str_tags, *str_tags2, str_temp[128], *str_no_color; int length; - struct tm *date_tmp; + struct timeval tv; TRIGGER_CALLBACK_CB_INIT(WEECHAT_RC_OK); @@ -1166,14 +1167,10 @@ trigger_callback_print_cb (const void *pointer, void *data, /* add data in hashtables used for conditions/replace/command */ trigger_callback_set_common_vars (trigger, ctx.extra_vars); weechat_hashtable_set (ctx.pointers, "buffer", buffer); - date_tmp = localtime (&date); - if (date_tmp) - { - if (strftime (str_temp, sizeof (str_temp), - "%Y-%m-%d %H:%M:%S", date_tmp) == 0) - str_temp[0] = '\0'; - weechat_hashtable_set (ctx.extra_vars, "tg_date", str_temp); - } + tv.tv_sec = date; + tv.tv_usec = date_usec; + weechat_util_strftimeval (str_temp, sizeof (str_temp), "%FT%T.%f", &tv); + weechat_hashtable_set (ctx.extra_vars, "tg_date", str_temp); snprintf (str_temp, sizeof (str_temp), "%d", displayed); weechat_hashtable_set (ctx.extra_vars, "tg_displayed", str_temp); snprintf (str_temp, sizeof (str_temp), "%d", highlight); @@ -1313,8 +1310,7 @@ trigger_callback_timer_cb (const void *pointer, void *data, { char str_temp[128]; int i; - time_t date; - struct tm *date_tmp; + struct timeval tv_now; TRIGGER_CALLBACK_CB_INIT(WEECHAT_RC_OK); @@ -1337,15 +1333,9 @@ trigger_callback_timer_cb (const void *pointer, void *data, trigger_callback_set_common_vars (trigger, ctx.extra_vars); snprintf (str_temp, sizeof (str_temp), "%d", remaining_calls); weechat_hashtable_set (ctx.extra_vars, "tg_remaining_calls", str_temp); - date = time (NULL); - date_tmp = localtime (&date); - if (date_tmp) - { - if (strftime (str_temp, sizeof (str_temp), - "%Y-%m-%d %H:%M:%S", date_tmp) == 0) - str_temp[0] = '\0'; - weechat_hashtable_set (ctx.extra_vars, "tg_date", str_temp); - } + gettimeofday (&tv_now, NULL); + weechat_util_strftimeval (str_temp, sizeof (str_temp), "%FT%T.%f", &tv_now); + weechat_hashtable_set (ctx.extra_vars, "tg_date", str_temp); /* execute the trigger (conditions, regex, command) */ if (!trigger_callback_execute (trigger, &ctx)) diff --git a/src/plugins/trigger/trigger-callback.h b/src/plugins/trigger/trigger-callback.h index b04eb1633..ad2d7cd7b 100644 --- a/src/plugins/trigger/trigger-callback.h +++ b/src/plugins/trigger/trigger-callback.h @@ -122,10 +122,10 @@ extern struct t_hashtable *trigger_callback_line_cb (const void *pointer, void struct t_hashtable *line); extern int trigger_callback_print_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, - time_t date, int tags_count, - const char **tags, int displayed, - int highlight, const char *prefix, - const char *message); + time_t date, int date_usec, + int tags_count, const char **tags, + int displayed, int highlight, + const char *prefix, const char *message); extern int trigger_callback_command_cb (const void *pointer, void *data, struct t_gui_buffer *buffer, diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h index e7a1c10f9..0d09416c8 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 "20231017-01" +#define WEECHAT_PLUGIN_API_VERSION "20231226-01" /* macros for defining plugin infos */ #define WEECHAT_PLUGIN_NAME(__name) \ @@ -240,8 +240,8 @@ struct timeval; #define WEECHAT_COMMAND_MIN_ARGS(__min_args, __option) \ if (argc < __min_args) \ { \ - weechat_printf_date_tags ( \ - NULL, 0, "no_filter", \ + weechat_printf_datetime_tags ( \ + NULL, 0, 0, "no_filter", \ _("%sToo few arguments for command \"%s%s%s\" " \ "(help on command: /help %s)"), \ weechat_prefix ("error"), \ @@ -255,8 +255,8 @@ struct timeval; /* macro to return error in callback of hook_command */ #define WEECHAT_COMMAND_ERROR \ { \ - weechat_printf_date_tags ( \ - NULL, 0, "no_filter", \ + weechat_printf_datetime_tags ( \ + NULL, 0, 0, "no_filter", \ _("%sError with command \"%s\" " \ "(help on command: /help %s)"), \ weechat_prefix ("error"), \ @@ -437,6 +437,8 @@ struct t_weechat_plugin long long (*util_timeval_diff) (struct timeval *tv1, struct timeval *tv2); void (*util_timeval_add) (struct timeval *tv, long long interval); const char *(*util_get_time_string) (const time_t *date); + int (*util_strftimeval) (char *string, int max, const char *format, + struct timeval *tv); int (*util_version_number) (const char *version); /* sorted lists */ @@ -695,11 +697,13 @@ struct t_weechat_plugin /* display */ const char *(*prefix) (const char *prefix); 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_date_tags) (struct t_gui_buffer *buffer, int y, - time_t date, const char *tags, - const char *message, ...); + void (*printf_datetime_tags) (struct t_gui_buffer *buffer, + time_t date, int date_usec, + const char *tags, const char *message, ...); + void (*printf_y_datetime_tags) (struct t_gui_buffer *buffer, int y, + time_t date, int date_usec, + const char *tags, + const char *message, ...); void (*log_printf) (const char *message, ...); /* hooks */ @@ -814,6 +818,7 @@ struct t_weechat_plugin void *data, struct t_gui_buffer *buffer, time_t date, + int date_usec, int tags_count, const char **tags, int displayed, @@ -1492,6 +1497,8 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); (weechat_plugin->util_timeval_add)(__time, __interval) #define weechat_util_get_time_string(__date) \ (weechat_plugin->util_get_time_string)(__date) +#define weechat_util_strftimeval(__string, __max, __format, __tv) \ + (weechat_plugin->util_strftimeval)(__string, __max, __format, __tv) #define weechat_util_version_number(__version) \ (weechat_plugin->util_version_number)(__version) @@ -1790,19 +1797,32 @@ extern int weechat_plugin_end (struct t_weechat_plugin *plugin); #define weechat_color(__color_name) \ (weechat_plugin->color)(__color_name) #define weechat_printf(__buffer, __message, __argz...) \ - (weechat_plugin->printf_date_tags)(__buffer, 0, NULL, __message, \ - ##__argz) + (weechat_plugin->printf_datetime_tags)(__buffer, 0, 0, NULL, \ + __message, ##__argz) #define weechat_printf_date_tags(__buffer, __date, __tags, __message, \ __argz...) \ - (weechat_plugin->printf_date_tags)(__buffer, __date, __tags, \ - __message, ##__argz) + (weechat_plugin->printf_datetime_tags)(__buffer, __date, 0, __tags, \ + __message, ##__argz) + +#define weechat_printf_datetime_tags(__buffer, __date, __date_usec, \ + __tags, __message, __argz...) \ + (weechat_plugin->printf_datetime_tags)(__buffer, __date, \ + __date_usec, __tags, \ + __message, ##__argz) #define weechat_printf_y(__buffer, __y, __message, __argz...) \ - (weechat_plugin->printf_y_date_tags)(__buffer, __y, 0, NULL, \ - __message, ##__argz) + (weechat_plugin->printf_y_datetime_tags)(__buffer, __y, 0, 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) + (weechat_plugin->printf_y_datetime_tags)(__buffer, __y, __date, 0, \ + __tags, __message, \ + ##__argz) +#define weechat_printf_y_datetime_tags(__buffer, __y, __date, \ + __date_usec, __tags, \ + __message, __argz...) \ + (weechat_plugin->printf_y_datetime_tags)(__buffer, __y, __date, \ + __date_usec, __tags, \ + __message, ##__argz) #define weechat_log_printf(__message, __argz...) \ (weechat_plugin->log_printf)(__message, ##__argz) |