about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-10-09 00:50:36 +0100
committerJames Booth <boothj5@gmail.com>2012-10-09 00:50:36 +0100
commit51cde2338bfe4a0baf6c99b377952b4dcbcedd7f (patch)
tree52a11259262b7f24a9d6b041cac8b1d859a2f446
parentf3881db1f9cd6effc2f6b1b97160f6f51b7ed067 (diff)
parent18c6bb9219507b726416c59048a1b866ca048ca3 (diff)
downloadprofani-tty-51cde2338bfe4a0baf6c99b377952b4dcbcedd7f.tar.gz
Merge branch 'master' into type_out
-rw-r--r--src/chat_log.c123
-rw-r--r--src/windows.c5
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);