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:
commit
5d49993151
154
src/chat_log.c
154
src/chat_log.c
@ -20,6 +20,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -29,23 +30,29 @@
|
||||
#include "chat_log.h"
|
||||
#include "common.h"
|
||||
#include "log.h"
|
||||
#include "ui.h"
|
||||
|
||||
static GHashTable *logs;
|
||||
static GDateTime *session_started;
|
||||
|
||||
struct dated_chat_log {
|
||||
FILE *logp;
|
||||
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(char *other, const char * const login,
|
||||
GDateTime *dt);
|
||||
|
||||
void
|
||||
chat_log_init(void)
|
||||
{
|
||||
session_started = g_date_time_new_now_local();
|
||||
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);
|
||||
}
|
||||
|
||||
@ -70,54 +77,102 @@ chat_log_chat(const gchar * const login, gchar *other,
|
||||
GDateTime *dt = g_date_time_new_now_local();
|
||||
gchar *date_fmt = g_date_time_format(dt, "%H:%M:%S");
|
||||
|
||||
if (direction == IN) {
|
||||
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);
|
||||
FILE *logp = fopen(dated_log->filename, "a");
|
||||
|
||||
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_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
|
||||
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)
|
||||
{
|
||||
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);
|
||||
GDateTime *now = g_date_time_new_now_local();
|
||||
char *filename = _get_log_filename(other, login, now);
|
||||
|
||||
struct dated_chat_log *new_log = malloc(sizeof(struct dated_chat_log));
|
||||
new_log->logp = fopen(log_file->str, "a");
|
||||
new_log->date = dt;
|
||||
new_log->filename = strdup(filename);
|
||||
new_log->date = now;
|
||||
|
||||
g_string_free(log_file, TRUE);
|
||||
free(filename);
|
||||
|
||||
return new_log;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
_log_roll_needed(struct dated_chat_log *dated_log)
|
||||
{
|
||||
@ -136,9 +191,9 @@ static void
|
||||
_free_chat_log(struct dated_chat_log *dated_log)
|
||||
{
|
||||
if (dated_log != NULL) {
|
||||
if (dated_log->logp != NULL) {
|
||||
fclose(dated_log->logp);
|
||||
dated_log->logp = 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);
|
||||
@ -147,3 +202,38 @@ _free_chat_log(struct dated_chat_log *dated_log)
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
@ -34,5 +34,7 @@ void chat_log_init(void);
|
||||
void chat_log_chat(const gchar * const login, gchar *other,
|
||||
const gchar * const msg, chat_log_direction_t direction);
|
||||
void chat_log_close(void);
|
||||
GSList * chat_log_get_previous(const gchar * const login, gchar *recipient,
|
||||
GSList *history);
|
||||
|
||||
#endif
|
||||
|
@ -653,13 +653,13 @@ _cmd_msg(const char * const inp, struct cmd_help_t help)
|
||||
|
||||
if (msg != NULL) {
|
||||
jabber_send(msg, usr);
|
||||
win_show_outgoing_msg("me", usr, msg);
|
||||
|
||||
if (prefs_get_chlog()) {
|
||||
const char *jid = jabber_get_jid();
|
||||
chat_log_chat(jid, usr, msg, OUT);
|
||||
}
|
||||
|
||||
win_show_outgoing_msg("me", usr, msg);
|
||||
} else {
|
||||
cons_show("Usage: %s", help.usage);
|
||||
}
|
||||
|
1
src/ui.h
1
src/ui.h
@ -57,6 +57,7 @@ struct prof_win {
|
||||
int y_pos;
|
||||
int paged;
|
||||
int unread;
|
||||
int history_shown;
|
||||
};
|
||||
|
||||
// gui startup and shutdown, resize
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include <ncurses/ncurses.h>
|
||||
#endif
|
||||
|
||||
#include "chat_log.h"
|
||||
#include "command.h"
|
||||
#include "contact.h"
|
||||
#include "contact_list.h"
|
||||
@ -44,7 +45,7 @@
|
||||
#include "ui.h"
|
||||
|
||||
#define CONS_WIN_TITLE "_cons"
|
||||
#define PAD_SIZE 200
|
||||
#define PAD_SIZE 1000
|
||||
#define NUM_WINS 10
|
||||
|
||||
// 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
|
||||
strcpy(_wins[_curr_prof_win].from, "");
|
||||
wclear(_wins[_curr_prof_win].win);
|
||||
_wins[_curr_prof_win].history_shown = 0;
|
||||
|
||||
// set it as inactive in the status bar
|
||||
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);
|
||||
|
||||
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
|
||||
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_draw();
|
||||
status_bar_active(win_index);
|
||||
@ -281,6 +283,21 @@ win_show_incomming_msg(const char * const from, const char * const message)
|
||||
flash();
|
||||
|
||||
_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())
|
||||
@ -372,6 +389,18 @@ win_show_outgoing_msg(const char * const from, const char * const to,
|
||||
win_index = _new_prof_win(to);
|
||||
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) {
|
||||
const char const *show = p_contact_show(contact);
|
||||
const char const *status = p_contact_status(contact);
|
||||
@ -703,6 +732,7 @@ _create_windows(void)
|
||||
cons.y_pos = 0;
|
||||
cons.paged = 0;
|
||||
cons.unread = 0;
|
||||
cons.history_shown = 0;
|
||||
scrollok(cons.win, TRUE);
|
||||
|
||||
_wins[0] = cons;
|
||||
@ -746,6 +776,7 @@ _create_windows(void)
|
||||
chat.y_pos = 0;
|
||||
chat.paged = 0;
|
||||
chat.unread = 0;
|
||||
chat.history_shown = 0;
|
||||
scrollok(chat.win, TRUE);
|
||||
_wins[i] = chat;
|
||||
}
|
||||
@ -864,9 +895,13 @@ _win_show_user(WINDOW *win, const char * const user, const int colour)
|
||||
{
|
||||
if (colour)
|
||||
wattron(win, COLOUR_ONLINE);
|
||||
else
|
||||
wattron(win, COLOUR_INC);
|
||||
wprintw(win, "%s: ", user);
|
||||
if (colour)
|
||||
wattroff(win, COLOUR_ONLINE);
|
||||
else
|
||||
wattroff(win, COLOUR_INC);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user