diff --git a/interface.c b/interface.c index 303426d..16c3c33 100644 --- a/interface.c +++ b/interface.c @@ -1970,7 +1970,7 @@ void print_chat_info_gw (struct tgl_state *TLSR, void *extra, int success, struc } void print_user_status (struct tgl_user_status *S, struct in_ev *ev) { - if (enable_json) { return; } + assert(!enable_json); //calling functions print_user_info_gw() and user_status_upd() already check. if (S->online > 0) { mprintf (ev, "online (was online "); print_date_full (ev, S->when); @@ -2561,16 +2561,26 @@ void user_status_upd (struct tgl_state *TLS, struct tgl_user *U) { if (disable_output && !notify_ev) { return; } if (!binlog_read) { return; } if (log_level < 3) { return; } - if (enable_json) { return; } struct in_ev *ev = notify_ev; mprint_start (ev); - mpush_color (ev, COLOR_YELLOW); - mprintf (ev, "User "); - print_user_name (ev, U->id, (void *)U); - mprintf (ev, " "); - print_user_status (&U->status, ev); - mprintf (ev, "\n"); - mpop_color (ev); + if (!enable_json) + { + mpush_color (ev, COLOR_YELLOW); + mprintf (ev, "User "); + print_user_name(ev, U->id, (void *) U); + mprintf (ev, " "); + print_user_status(&U->status, ev); + mprintf (ev, "\n"); + mpop_color (ev); + } else { + #ifdef USE_JSON + json_t *res = json_pack_user_status(&U->status); + char *s = json_dumps (res, 0); + mprintf (ev, "%s\n", s); + json_decref (res); + free (s); + #endif + } mprint_end (ev); } diff --git a/json-tg.c b/json-tg.c index 376708c..3d201d6 100644 --- a/json-tg.c +++ b/json-tg.c @@ -6,6 +6,8 @@ #include #include #include +//format time: +#include #ifndef json_boolean #define json_boolean(val) ((val) ? json_true() : json_false()) @@ -381,4 +383,32 @@ json_t *json_pack_read (struct tgl_message *M) { return res; } +int str_format_time(long when, char* string) +{ + struct tm *tm = localtime ((void *)&when); + return sprintf (string, "%04d-%02d-%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); +} + +json_t *json_pack_user_status (struct tgl_user_status *S) { + json_t *res = json_object (); + assert (json_object_set (res, "online", json_boolean (S->online == 1)) >= 0); + assert (json_object_set (res, "state", json_integer (S->online)) >= 0); + if (S->online > 0 || S->online == -1) { + static char s[20]; + str_format_time(S->when, s); + assert (json_object_set (res, "when", json_string (s)) >= 0); + } else if (S->online == 0) { + assert (json_object_set(res, "when", json_string("long time ago")) >= 0); + } else if (S->online == -2) { + assert (json_object_set(res, "when", json_string("recently")) >= 0); + } else if (S->online == -3) { + assert (json_object_set(res, "when", json_string("last week")) >= 0); + } else if (S->online == -4) { + assert (json_object_set (res, "when", json_string ("last month")) >= 0); + } + assert (json_object_set (res, "event", json_string ("online-status")) >= 0); + //this will overwrite "event":"message" to "event":"read". + return res; +} + #endif diff --git a/json-tg.h b/json-tg.h index bafad9b..8ceaf4e 100644 --- a/json-tg.h +++ b/json-tg.h @@ -3,11 +3,12 @@ #include "config.h" #ifdef USE_JSON #include -#include -#include +#include +#include json_t *json_pack_message (struct tgl_message *M); json_t *json_pack_updates (unsigned flags); json_t *json_pack_peer (tgl_peer_id_t id, tgl_peer_t *P); json_t *json_pack_read (struct tgl_message *M); +json_t *json_pack_user_status (struct tgl_user_status *S); #endif #endif