about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chat_log.c67
1 files changed, 62 insertions, 5 deletions
diff --git a/src/chat_log.c b/src/chat_log.c
index 78689048..7db3c13f 100644
--- a/src/chat_log.c
+++ b/src/chat_log.c
@@ -32,7 +32,13 @@
 static GHashTable *logs;
 static GTimeZone *tz;
 
+struct dated_chat_log {
+    gpointer logpp;
+    GDateTime *date;
+};
+
 static void _close_file(gpointer key, gpointer value, gpointer user_data);
+static gboolean _log_roll_needed(struct dated_chat_log *dated_log);
 
 void
 chat_log_init(void)
@@ -46,10 +52,11 @@ 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);
+    struct dated_chat_log *dated_log = g_hash_table_lookup(logs, other);
     FILE *logp;
     
-    if (logpp == NULL) {
+    // no log for user
+    if (dated_log == NULL) {
         GString *log_file = g_string_new(getenv("HOME"));
         g_string_append(log_file, "/.profanity/log");
         create_dir(log_file->str);
@@ -69,12 +76,48 @@ chat_log_chat(const gchar * const login, gchar *other,
         logp = fopen(log_file->str, "a");
         
         free(other_file);
-        g_date_time_unref(dt);
         g_string_free(log_file, TRUE);
+
+        struct dated_chat_log *new_log = malloc(sizeof(struct dated_chat_log));
+        new_log->logpp = logp;
+        new_log->date = dt;
+        
+        g_hash_table_insert(logs, other, new_log);
+
+    // log exists but needs rolling
+    } else if (_log_roll_needed(dated_log)) {
+        fclose(dated_log->logpp);        
+
+        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);
+
+        GDateTime *dt = g_date_time_new_now_local();
+        gchar *date = g_date_time_format(dt, "_%d_%m_%Y.log");
+        g_string_append_printf(log_file, date);
+
+        logp = fopen(log_file->str, "a");
         
-        g_hash_table_insert(logs, other, logp);
+        free(other_file);
+        g_string_free(log_file, TRUE);
+
+        struct dated_chat_log *new_log = malloc(sizeof(struct dated_chat_log));
+        new_log->logpp = logp;
+        new_log->date = dt;
+
+        g_hash_table_replace(logs, other, new_log);
+
+    // log exists for user
     } else {
-        logp = (FILE *) logpp;
+        logp = (FILE *) dated_log->logpp;
     }
 
     GDateTime *dt = g_date_time_new_now(tz);
@@ -90,6 +133,20 @@ chat_log_chat(const gchar * const login, gchar *other,
     g_date_time_unref(dt);
 }
 
+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;
+}
+
 void
 chat_log_close(void)
 {