1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Merge branch 'master' into type_out

This commit is contained in:
James Booth 2012-10-14 17:52:35 +01:00
commit 5d49993151
6 changed files with 165 additions and 37 deletions

View File

@ -20,6 +20,7 @@
* *
*/ */
#include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -29,23 +30,29 @@
#include "chat_log.h" #include "chat_log.h"
#include "common.h" #include "common.h"
#include "log.h" #include "log.h"
#include "ui.h"
static GHashTable *logs; static GHashTable *logs;
static GDateTime *session_started;
struct dated_chat_log { struct dated_chat_log {
FILE *logp; gchar *filename;
GDateTime *date; GDateTime *date;
}; };
static gboolean _log_roll_needed(struct dated_chat_log *dated_log); 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 struct dated_chat_log *_create_log(char *other, const char * const login);
static void _free_chat_log(struct dated_chat_log *dated_log); static void _free_chat_log(struct dated_chat_log *dated_log);
static gboolean _key_equals(void *key1, void *key2);
static char * _get_log_filename(char *other, const char * const login,
GDateTime *dt);
void void
chat_log_init(void) chat_log_init(void)
{ {
session_started = g_date_time_new_now_local();
log_info("Initialising chat logs"); log_info("Initialising chat logs");
logs = g_hash_table_new_full(NULL, (GEqualFunc) g_strcmp0, g_free, logs = g_hash_table_new_full(g_str_hash, (GEqualFunc) _key_equals, g_free,
(GDestroyNotify)_free_chat_log); (GDestroyNotify)_free_chat_log);
} }
@ -70,54 +77,102 @@ chat_log_chat(const gchar * const login, gchar *other,
GDateTime *dt = g_date_time_new_now_local(); GDateTime *dt = g_date_time_new_now_local();
gchar *date_fmt = g_date_time_format(dt, "%H:%M:%S"); gchar *date_fmt = g_date_time_format(dt, "%H:%M:%S");
if (direction == IN) { FILE *logp = fopen(dated_log->filename, "a");
fprintf(dated_log->logp, "%s - %s: %s\n", date_fmt, other_copy, msg);
} else {
fprintf(dated_log->logp, "%s - me: %s\n", date_fmt, msg);
}
fflush(dated_log->logp);
if (direction == IN) {
fprintf(logp, "%s - %s: %s\n", date_fmt, other_copy, msg);
} 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_free(date_fmt);
g_date_time_unref(dt); g_date_time_unref(dt);
} }
GSList *
chat_log_get_previous(const gchar * const login, gchar *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_get_day_of_year(log_date) <= g_date_time_get_day_of_year(now)) {
char *filename = _get_log_filename(recipient, login, log_date);
FILE *logp = fopen(filename, "r");
char *line = NULL;
size_t read = 0;
if (logp != NULL) {
GString *gs_header = g_string_new("Log ");
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);
size_t length = getline(&line, &read, logp);
while (length != -1) {
char *copy = malloc(length);
copy = strncpy(copy, line, length);
copy[length -1] = '\0';
history = g_slist_append(history, copy);
free(line);
line = NULL;
read = 0;
length = getline(&line, &read, logp);
}
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 void
chat_log_close(void) chat_log_close(void)
{ {
g_hash_table_remove_all(logs); g_hash_table_remove_all(logs);
g_date_time_unref(session_started);
} }
static struct dated_chat_log * static struct dated_chat_log *
_create_log(char *other, const char * const login) _create_log(char *other, const char * const login)
{ {
GString *log_file = g_string_new(getenv("HOME")); GDateTime *now = g_date_time_new_now_local();
g_string_append(log_file, "/.profanity/log"); char *filename = _get_log_filename(other, login, now);
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)); struct dated_chat_log *new_log = malloc(sizeof(struct dated_chat_log));
new_log->logp = fopen(log_file->str, "a"); new_log->filename = strdup(filename);
new_log->date = dt; new_log->date = now;
g_string_free(log_file, TRUE); free(filename);
return new_log; return new_log;
} }
static gboolean static gboolean
_log_roll_needed(struct dated_chat_log *dated_log) _log_roll_needed(struct dated_chat_log *dated_log)
{ {
@ -136,9 +191,9 @@ static void
_free_chat_log(struct dated_chat_log *dated_log) _free_chat_log(struct dated_chat_log *dated_log)
{ {
if (dated_log != NULL) { if (dated_log != NULL) {
if (dated_log->logp != NULL) { if (dated_log->filename != NULL) {
fclose(dated_log->logp); g_free(dated_log->filename);
dated_log->logp = NULL; dated_log->filename = NULL;
} }
if (dated_log->date != NULL) { if (dated_log->date != NULL) {
g_date_time_unref(dated_log->date); g_date_time_unref(dated_log->date);
@ -147,3 +202,38 @@ _free_chat_log(struct dated_chat_log *dated_log)
} }
dated_log = 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(char *other, const char * const login, GDateTime *dt)
{
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);
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;
}

View File

@ -34,5 +34,7 @@ void chat_log_init(void);
void chat_log_chat(const gchar * const login, gchar *other, void chat_log_chat(const gchar * const login, gchar *other,
const gchar * const msg, chat_log_direction_t direction); const gchar * const msg, chat_log_direction_t direction);
void chat_log_close(void); void chat_log_close(void);
GSList * chat_log_get_previous(const gchar * const login, gchar *recipient,
GSList *history);
#endif #endif

View File

@ -653,13 +653,13 @@ _cmd_msg(const char * const inp, struct cmd_help_t help)
if (msg != NULL) { if (msg != NULL) {
jabber_send(msg, usr); jabber_send(msg, usr);
win_show_outgoing_msg("me", usr, msg);
if (prefs_get_chlog()) { if (prefs_get_chlog()) {
const char *jid = jabber_get_jid(); const char *jid = jabber_get_jid();
chat_log_chat(jid, usr, msg, OUT); chat_log_chat(jid, usr, msg, OUT);
} }
win_show_outgoing_msg("me", usr, msg);
} else { } else {
cons_show("Usage: %s", help.usage); cons_show("Usage: %s", help.usage);
} }

View File

@ -57,6 +57,7 @@ struct prof_win {
int y_pos; int y_pos;
int paged; int paged;
int unread; int unread;
int history_shown;
}; };
// gui startup and shutdown, resize // gui startup and shutdown, resize

View File

@ -36,6 +36,7 @@
#include <ncurses/ncurses.h> #include <ncurses/ncurses.h>
#endif #endif
#include "chat_log.h"
#include "command.h" #include "command.h"
#include "contact.h" #include "contact.h"
#include "contact_list.h" #include "contact_list.h"
@ -44,7 +45,7 @@
#include "ui.h" #include "ui.h"
#define CONS_WIN_TITLE "_cons" #define CONS_WIN_TITLE "_cons"
#define PAD_SIZE 200 #define PAD_SIZE 1000
#define NUM_WINS 10 #define NUM_WINS 10
// holds console at index 0 and chat wins 1 through to 9 // holds console at index 0 and chat wins 1 through to 9
@ -172,6 +173,7 @@ win_close_win(void)
// reset the chat win to unused // reset the chat win to unused
strcpy(_wins[_curr_prof_win].from, ""); strcpy(_wins[_curr_prof_win].from, "");
wclear(_wins[_curr_prof_win].win); wclear(_wins[_curr_prof_win].win);
_wins[_curr_prof_win].history_shown = 0;
// set it as inactive in the status bar // set it as inactive in the status bar
status_bar_inactive(_curr_prof_win); status_bar_inactive(_curr_prof_win);
@ -262,12 +264,12 @@ win_show_incomming_msg(const char * const from, const char * const message)
win_index = _new_prof_win(short_from); win_index = _new_prof_win(short_from);
WINDOW *win = _wins[win_index].win; WINDOW *win = _wins[win_index].win;
_win_show_time(win);
_win_show_user(win, short_from, 1);
_win_show_message(win, message);
// currently viewing chat window with sender // currently viewing chat window with sender
if (win_index == _curr_prof_win) { if (win_index == _curr_prof_win) {
_win_show_time(win);
_win_show_user(win, short_from, 1);
_win_show_message(win, message);
title_bar_set_typing(FALSE); title_bar_set_typing(FALSE);
title_bar_draw(); title_bar_draw();
status_bar_active(win_index); status_bar_active(win_index);
@ -281,6 +283,21 @@ win_show_incomming_msg(const char * const from, const char * const message)
flash(); flash();
_wins[win_index].unread++; _wins[win_index].unread++;
if (prefs_get_chlog()) {
if (!_wins[win_index].history_shown) {
GSList *history = NULL;
history = chat_log_get_previous(jabber_get_jid(), short_from, history);
while (history != NULL) {
wprintw(win, "%s\n", history->data);
history = g_slist_next(history);
}
_wins[win_index].history_shown = 1;
}
}
_win_show_time(win);
_win_show_user(win, short_from, 1);
_win_show_message(win, message);
} }
if (prefs_get_beep()) if (prefs_get_beep())
@ -372,6 +389,18 @@ win_show_outgoing_msg(const char * const from, const char * const to,
win_index = _new_prof_win(to); win_index = _new_prof_win(to);
win = _wins[win_index].win; win = _wins[win_index].win;
if (prefs_get_chlog()) {
if (!_wins[win_index].history_shown) {
GSList *history = NULL;
history = chat_log_get_previous(jabber_get_jid(), to, history);
while (history != NULL) {
wprintw(win, "%s\n", history->data);
history = g_slist_next(history);
}
_wins[win_index].history_shown = 1;
}
}
if (strcmp(p_contact_show(contact), "offline") == 0) { if (strcmp(p_contact_show(contact), "offline") == 0) {
const char const *show = p_contact_show(contact); const char const *show = p_contact_show(contact);
const char const *status = p_contact_status(contact); const char const *status = p_contact_status(contact);
@ -703,6 +732,7 @@ _create_windows(void)
cons.y_pos = 0; cons.y_pos = 0;
cons.paged = 0; cons.paged = 0;
cons.unread = 0; cons.unread = 0;
cons.history_shown = 0;
scrollok(cons.win, TRUE); scrollok(cons.win, TRUE);
_wins[0] = cons; _wins[0] = cons;
@ -746,6 +776,7 @@ _create_windows(void)
chat.y_pos = 0; chat.y_pos = 0;
chat.paged = 0; chat.paged = 0;
chat.unread = 0; chat.unread = 0;
chat.history_shown = 0;
scrollok(chat.win, TRUE); scrollok(chat.win, TRUE);
_wins[i] = chat; _wins[i] = chat;
} }
@ -864,9 +895,13 @@ _win_show_user(WINDOW *win, const char * const user, const int colour)
{ {
if (colour) if (colour)
wattron(win, COLOUR_ONLINE); wattron(win, COLOUR_ONLINE);
else
wattron(win, COLOUR_INC);
wprintw(win, "%s: ", user); wprintw(win, "%s: ", user);
if (colour) if (colour)
wattroff(win, COLOUR_ONLINE); wattroff(win, COLOUR_ONLINE);
else
wattroff(win, COLOUR_INC);
} }
static void static void