about summary refs log tree commit diff stats
path: root/src/log.c
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2013-01-28 20:16:18 +0000
committerJames Booth <boothj5@gmail.com>2013-01-28 20:16:18 +0000
commitbf1cf0444702566d5b77a4e4e195ef7c8341a185 (patch)
tree911f8b1c738c75853fc2cef27ee86c903c7ddb9d /src/log.c
parent3e36753a1ccc33431d17873fa3332f5ea4295f06 (diff)
downloadprofani-tty-bf1cf0444702566d5b77a4e4e195ef7c8341a185.tar.gz
Joined log and chat_log modules
Diffstat (limited to 'src/log.c')
-rw-r--r--src/log.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/log.c b/src/log.c
index 1e71ff9b..05e2ec3d 100644
--- a/src/log.c
+++ b/src/log.c
@@ -20,6 +20,7 @@
  *
  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -46,6 +47,21 @@ static GTimeZone *tz;
 static GDateTime *dt;
 static log_level_t level_filter;
 
+static GHashTable *logs;
+static GDateTime *session_started;
+
+struct dated_chat_log {
+    gchar *filename;
+    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);
+static gboolean _key_equals(void *key1, void *key2);
+static char * _get_log_filename(const char * const other, const char * const login,
+    GDateTime *dt, gboolean create);
+
 static void _rotate_log_file(void);
 
 void
@@ -164,3 +180,206 @@ _rotate_log_file(void)
     g_free(log_file);
     log_info("Log has been rotated");
 }
+
+void
+chat_log_init(void)
+{
+    session_started = g_date_time_new_now_local();
+    log_info("Initialising chat logs");
+    logs = g_hash_table_new_full(g_str_hash, (GEqualFunc) _key_equals, 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, GTimeVal *tv_stamp)
+{
+    gchar *other_copy = strdup(other);
+    struct dated_chat_log *dated_log = g_hash_table_lookup(logs, other_copy);
+
+    // 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);
+    }
+
+    gchar *date_fmt = NULL;
+    GDateTime *dt = NULL;
+    if (tv_stamp == NULL) {
+        dt = g_date_time_new_now_local();
+    } else {
+        dt = g_date_time_new_from_timeval_utc(tv_stamp);
+    }
+
+    date_fmt = g_date_time_format(dt, "%H:%M:%S");
+
+    FILE *logp = fopen(dated_log->filename, "a");
+
+    if (direction == PROF_IN_LOG) {
+        if (strncmp(msg, "/me ", 4) == 0) {
+            fprintf(logp, "%s - *%s %s\n", date_fmt, other_copy, msg + 4);
+        } else {
+            fprintf(logp, "%s - %s: %s\n", date_fmt, other_copy, msg);
+        }
+    } else {
+        if (strncmp(msg, "/me ", 4) == 0) {
+            fprintf(logp, "%s - *me %s\n", date_fmt, msg + 4);
+        } else {
+            fprintf(logp, "%s - me: %s\n", date_fmt, msg);
+        }
+    }
+    fflush(logp);
+    int result = fclose(logp);
+    if (result == EOF) {
+        log_error("Error closing file %s, errno = %d", dated_log->filename, errno);
+    }
+
+    g_free(date_fmt);
+    g_date_time_unref(dt);
+}
+
+GSList *
+chat_log_get_previous(const gchar * const login, const gchar * const recipient,
+    GSList *history)
+{
+    GTimeZone *tz = g_time_zone_new_local();
+
+    GDateTime *now = g_date_time_new_now_local();
+    GDateTime *log_date = g_date_time_new(tz,
+        g_date_time_get_year(session_started),
+        g_date_time_get_month(session_started),
+        g_date_time_get_day_of_month(session_started),
+        g_date_time_get_hour(session_started),
+        g_date_time_get_minute(session_started),
+        g_date_time_get_second(session_started));
+
+    // get data from all logs from the day the session was started to today
+    while (g_date_time_compare(log_date, now) != 1) {
+        char *filename = _get_log_filename(recipient, login, log_date, FALSE);
+
+        FILE *logp = fopen(filename, "r");
+        char *line;
+        if (logp != NULL) {
+            GString *gs_header = g_string_new("");
+            g_string_append_printf(gs_header, "%d/%d/%d:",
+                g_date_time_get_day_of_month(log_date),
+                g_date_time_get_month(log_date),
+                g_date_time_get_year(log_date));
+            char *header = strdup(gs_header->str);
+            history = g_slist_append(history, header);
+            g_string_free(gs_header, TRUE);
+
+            while ((line = prof_getline(logp)) != NULL) {
+                history = g_slist_append(history, line);
+            }
+
+            fclose(logp);
+        }
+
+        free(filename);
+        GDateTime *next = g_date_time_add_days(log_date, 1);
+        g_date_time_unref(log_date);
+        log_date = g_date_time_ref(next);
+    }
+
+    g_time_zone_unref(tz);
+
+    return history;
+}
+
+void
+chat_log_close(void)
+{
+    g_hash_table_remove_all(logs);
+    g_date_time_unref(session_started);
+}
+
+static struct dated_chat_log *
+_create_log(char *other, const char * const login)
+{
+    GDateTime *now = g_date_time_new_now_local();
+    char *filename = _get_log_filename(other, login, now, TRUE);
+
+    struct dated_chat_log *new_log = malloc(sizeof(struct dated_chat_log));
+    new_log->filename = strdup(filename);
+    new_log->date = now;
+
+    free(filename);
+
+    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
+_free_chat_log(struct dated_chat_log *dated_log)
+{
+    if (dated_log != NULL) {
+        if (dated_log->filename != NULL) {
+            g_free(dated_log->filename);
+            dated_log->filename = NULL;
+        }
+        if (dated_log->date != NULL) {
+            g_date_time_unref(dated_log->date);
+            dated_log->date = NULL;
+        }
+    }
+    dated_log = NULL;
+}
+
+static
+gboolean _key_equals(void *key1, void *key2)
+{
+    gchar *str1 = (gchar *) key1;
+    gchar *str2 = (gchar *) key2;
+
+    return (g_strcmp0(str1, str2) == 0);
+}
+
+static char *
+_get_log_filename(const char * const other, const char * const login,
+    GDateTime *dt, gboolean create)
+{
+    gchar *chatlogs_dir = files_get_chatlog_dir();
+    GString *log_file = g_string_new(chatlogs_dir);
+    g_free(chatlogs_dir);
+
+    gchar *login_dir = str_replace(login, "@", "_at_");
+    g_string_append_printf(log_file, "/%s", login_dir);
+    if (create) {
+        create_dir(log_file->str);
+    }
+    free(login_dir);
+
+    gchar *other_file = str_replace(other, "@", "_at_");
+    g_string_append_printf(log_file, "/%s", other_file);
+    if (create) {
+        create_dir(log_file->str);
+    }
+    free(other_file);
+
+    gchar *date = g_date_time_format(dt, "/%Y_%m_%d.log");
+    g_string_append(log_file, date);
+
+    char *result = strdup(log_file->str);
+    g_string_free(log_file, TRUE);
+
+    return result;
+}