diff options
author | James Booth <boothj5@gmail.com> | 2012-10-09 00:50:36 +0100 |
---|---|---|
committer | James Booth <boothj5@gmail.com> | 2012-10-09 00:50:36 +0100 |
commit | 51cde2338bfe4a0baf6c99b377952b4dcbcedd7f (patch) | |
tree | 52a11259262b7f24a9d6b041cac8b1d859a2f446 /src | |
parent | f3881db1f9cd6effc2f6b1b97160f6f51b7ed067 (diff) | |
parent | 18c6bb9219507b726416c59048a1b866ca048ca3 (diff) | |
download | profani-tty-51cde2338bfe4a0baf6c99b377952b4dcbcedd7f.tar.gz |
Merge branch 'master' into type_out
Diffstat (limited to 'src')
-rw-r--r-- | src/chat_log.c | 123 | ||||
-rw-r--r-- | src/windows.c | 5 |
2 files changed, 91 insertions, 37 deletions
diff --git a/src/chat_log.c b/src/chat_log.c index 5ddfcec9..3a139d31 100644 --- a/src/chat_log.c +++ b/src/chat_log.c @@ -22,6 +22,7 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include "glib.h" @@ -30,69 +31,119 @@ #include "log.h" static GHashTable *logs; -static GTimeZone *tz; -static void _close_file(gpointer key, gpointer value, gpointer user_data); +struct dated_chat_log { + FILE *logp; + GDateTime *date; +}; + +static gboolean _log_roll_needed(struct dated_chat_log *dated_log); +static struct dated_chat_log *_create_log(char *other, const char * const login); +static void _free_chat_log(struct dated_chat_log *dated_log); void chat_log_init(void) { log_info("Initialising chat logs"); - tz = g_time_zone_new_local(); - logs = g_hash_table_new(NULL, (GEqualFunc) g_strcmp0); + logs = g_hash_table_new_full(NULL, (GEqualFunc) g_strcmp0, g_free, + (GDestroyNotify)_free_chat_log); } void chat_log_chat(const gchar * const login, gchar *other, const gchar * const msg, chat_log_direction_t direction) { - gpointer logpp = g_hash_table_lookup(logs, other); - FILE *logp; - - if (logpp == NULL) { - GString *log_file = g_string_new(getenv("HOME")); + gchar *other_copy = strdup(other); + struct dated_chat_log *dated_log = g_hash_table_lookup(logs, other_copy); - g_string_append(log_file, "/.profanity/log"); - create_dir(log_file->str); - - gchar *login_dir = str_replace(login, "@", "_at_"); - g_string_append_printf(log_file, "/%s", login_dir); - create_dir(log_file->str); - free(login_dir); - - gchar *other_file = str_replace(other, "@", "_at_"); - g_string_append_printf(log_file, "/%s.log", other_file); - logp = fopen(log_file->str, "a"); - free(other_file); - - g_string_free(log_file, TRUE); - g_hash_table_insert(logs, other, logp); - } else { - logp = (FILE *) logpp; + // no log for user + if (dated_log == NULL) { + dated_log = _create_log(other_copy, login); + g_hash_table_insert(logs, other_copy, dated_log); + + // log exists but needs rolling + } else if (_log_roll_needed(dated_log)) { + dated_log = _create_log(other_copy, login); + g_hash_table_replace(logs, other_copy, dated_log); } - GDateTime *dt = g_date_time_new_now(tz); - gchar *date_fmt = g_date_time_format(dt, "%d/%m/%Y %H:%M:%S"); + GDateTime *dt = g_date_time_new_now_local(); + gchar *date_fmt = g_date_time_format(dt, "%H:%M:%S"); if (direction == IN) { - fprintf(logp, "%s: %s: %s\n", date_fmt, other, msg); + fprintf(dated_log->logp, "%s - %s: %s\n", date_fmt, other_copy, msg); } else { - fprintf(logp, "%s: %s: %s\n", date_fmt, login, msg); + fprintf(dated_log->logp, "%s - me: %s\n", date_fmt, msg); } - fflush(logp); - + fflush(dated_log->logp); + + g_free(date_fmt); g_date_time_unref(dt); } void chat_log_close(void) { - g_hash_table_foreach(logs, (GHFunc) _close_file, NULL); - g_time_zone_unref(tz); + g_hash_table_remove_all(logs); +} + +static struct dated_chat_log * +_create_log(char *other, const char * const login) +{ + GString *log_file = g_string_new(getenv("HOME")); + g_string_append(log_file, "/.profanity/log"); + create_dir(log_file->str); + + gchar *login_dir = str_replace(login, "@", "_at_"); + g_string_append_printf(log_file, "/%s", login_dir); + create_dir(log_file->str); + free(login_dir); + + gchar *other_file = str_replace(other, "@", "_at_"); + g_string_append_printf(log_file, "/%s", other_file); + create_dir(log_file->str); + free(other_file); + + GDateTime *dt = g_date_time_new_now_local(); + gchar *date = g_date_time_format(dt, "/%Y_%m_%d.log"); + g_string_append_printf(log_file, date); + + struct dated_chat_log *new_log = malloc(sizeof(struct dated_chat_log)); + new_log->logp = fopen(log_file->str, "a"); + new_log->date = dt; + + g_string_free(log_file, TRUE); + + return new_log; +} + + +static gboolean +_log_roll_needed(struct dated_chat_log *dated_log) +{ + gboolean result = FALSE; + GDateTime *now = g_date_time_new_now_local(); + if (g_date_time_get_day_of_year(dated_log->date) != + g_date_time_get_day_of_year(now)) { + result = TRUE; + } + g_date_time_unref(now); + + return result; } static void -_close_file(gpointer key, gpointer value, gpointer user_data) +_free_chat_log(struct dated_chat_log *dated_log) { - fclose(value); + if (dated_log != NULL) { + if (dated_log->logp != NULL) { + fclose(dated_log->logp); + dated_log->logp = NULL; + } + if (dated_log->date != NULL) { + g_date_time_unref(dated_log->date); + dated_log->date = NULL; + } + } + dated_log = NULL; } diff --git a/src/windows.c b/src/windows.c index 0c249b9a..b36bea28 100644 --- a/src/windows.c +++ b/src/windows.c @@ -367,6 +367,7 @@ win_show_outgoing_msg(const char * const from, const char * const to, int win_index = _find_prof_win_index(to); WINDOW *win = NULL; + // create new window if (win_index == NUM_WINS) { win_index = _new_prof_win(to); win = _wins[win_index].win; @@ -376,6 +377,8 @@ win_show_outgoing_msg(const char * const from, const char * const to, const char const *status = p_contact_status(contact); _show_status_string(win, to, show, status, "--", "offline"); } + + // use existing window } else { win = _wins[win_index].win; } @@ -850,7 +853,7 @@ static void _win_show_time(WINDOW *win) { GDateTime *time = g_date_time_new_now_local(); - gchar *date_fmt = g_date_time_format(time, "%H:%M"); + gchar *date_fmt = g_date_time_format(time, "%H:%M:%S"); wprintw(win, "%s - ", date_fmt); g_date_time_unref(time); g_free(date_fmt); |