1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-09-22 19:45:54 -04:00

Added groupchat logs

closes #168
This commit is contained in:
James Booth 2013-05-05 00:16:10 +01:00
parent c1cf0b433e
commit 8c5866ff52
7 changed files with 149 additions and 1 deletions

View File

@ -115,6 +115,7 @@ static gboolean _cmd_set_intype(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_flash(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_splash(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_chlog(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_grlog(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_history(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_states(gchar **args, struct cmd_help_t help);
static gboolean _cmd_set_outtype(gchar **args, struct cmd_help_t help);
@ -597,6 +598,16 @@ static struct cmd_t setting_commands[] =
"Switch chat logging on or off.",
"This setting will be enabled if /history is set to on.",
"When disabling this option, /history will also be disabled.",
"See the /grlog setting for enabling logging of chat room (groupchat) messages.",
NULL } } },
{ "/grlog",
_cmd_set_grlog, parse_args, 1, 1,
{ "/grlog on|off", "Chat logging of chat rooms to file",
{ "/grlog on|off",
"-------------",
"Switch chat room logging on or off.",
"See the /chlog setting for enabling logging of one to one chat.",
NULL } } },
{ "/states",
@ -1107,6 +1118,8 @@ _cmd_complete_parameters(char *input, int *size)
prefs_autocomplete_boolean_choice);
_parameter_autocomplete(input, size, "/chlog",
prefs_autocomplete_boolean_choice);
_parameter_autocomplete(input, size, "/grlog",
prefs_autocomplete_boolean_choice);
_parameter_autocomplete(input, size, "/mouse",
prefs_autocomplete_boolean_choice);
_parameter_autocomplete(input, size, "/history",
@ -2783,6 +2796,15 @@ _cmd_set_chlog(gchar **args, struct cmd_help_t help)
return result;
}
static gboolean
_cmd_set_grlog(gchar **args, struct cmd_help_t help)
{
gboolean result = _cmd_set_boolean_preference(args[0], help,
"Groupchat logging", PREF_GRLOG);
return result;
}
static gboolean
_cmd_set_mouse(gchar **args, struct cmd_help_t help)
{

View File

@ -303,6 +303,7 @@ _get_group(preference_t pref)
case PREF_NOTIFY_SUB:
return "notifications";
case PREF_CHLOG:
case PREF_GRLOG:
return "logging";
case PREF_AUTOAWAY_CHECK:
case PREF_AUTOAWAY_MODE:
@ -352,6 +353,8 @@ _get_key(preference_t pref)
return "sub";
case PREF_CHLOG:
return "chlog";
case PREF_GRLOG:
return "grlog";
case PREF_AUTOAWAY_CHECK:
return "autoaway.check";
case PREF_AUTOAWAY_MODE:

View File

@ -53,6 +53,7 @@ typedef enum {
PREF_NOTIFY_INVITE,
PREF_NOTIFY_SUB,
PREF_CHLOG,
PREF_GRLOG,
PREF_AUTOAWAY_CHECK,
PREF_AUTOAWAY_MODE,
PREF_AUTOAWAY_MESSAGE

108
src/log.c
View File

@ -49,6 +49,7 @@ static GDateTime *dt;
static log_level_t level_filter;
static GHashTable *logs;
static GHashTable *groupchat_logs;
static GDateTime *session_started;
struct dated_chat_log {
@ -57,11 +58,14 @@ struct dated_chat_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 struct dated_chat_log * _create_groupchat_log(char *room, 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 char * _get_groupchat_log_filename(const char * const room,
const char * const login, GDateTime *dt, gboolean create);
static gchar * _get_chatlog_dir(void);
static gchar * _get_log_file(void);
static void _rotate_log_file(void);
@ -209,6 +213,15 @@ chat_log_init(void)
(GDestroyNotify)_free_chat_log);
}
void
groupchat_log_init(void)
{
session_started = g_date_time_new_now_local();
log_info("Initialising groupchat logs");
groupchat_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)
@ -262,6 +275,47 @@ chat_log_chat(const gchar * const login, gchar *other,
g_date_time_unref(dt);
}
void
groupchat_log_chat(const gchar * const login, const gchar * const room,
const gchar * const nick, const gchar * const msg)
{
gchar *room_copy = strdup(room);
struct dated_chat_log *dated_log = g_hash_table_lookup(groupchat_logs, room_copy);
// no log for room
if (dated_log == NULL) {
dated_log = _create_groupchat_log(room_copy, login);
g_hash_table_insert(groupchat_logs, room_copy, dated_log);
// log exists but needs rolling
} else if (_log_roll_needed(dated_log)) {
dated_log = _create_groupchat_log(room_copy, login);
g_hash_table_replace(logs, room_copy, dated_log);
}
GDateTime *dt = g_date_time_new_now_local();
gchar *date_fmt = g_date_time_format(dt, "%H:%M:%S");
FILE *logp = fopen(dated_log->filename, "a");
if (strncmp(msg, "/me ", 4) == 0) {
fprintf(logp, "%s - *%s %s\n", date_fmt, nick, msg + 4);
} else {
fprintf(logp, "%s - %s: %s\n", date_fmt, nick, 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)
@ -315,6 +369,7 @@ void
chat_log_close(void)
{
g_hash_table_remove_all(logs);
g_hash_table_remove_all(groupchat_logs);
g_date_time_unref(session_started);
}
@ -333,6 +388,21 @@ _create_log(char *other, const char * const login)
return new_log;
}
static struct dated_chat_log *
_create_groupchat_log(char *room, const char * const login)
{
GDateTime *now = g_date_time_new_now_local();
char *filename = _get_groupchat_log_filename(room, 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)
{
@ -403,6 +473,42 @@ _get_log_filename(const char * const other, const char * const login,
return result;
}
static char *
_get_groupchat_log_filename(const char * const room, const char * const login,
GDateTime *dt, gboolean create)
{
gchar *chatlogs_dir = _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);
g_string_append(log_file, "/rooms");
if (create) {
create_dir(log_file->str);
}
gchar *room_file = str_replace(room, "@", "_at_");
g_string_append_printf(log_file, "/%s", room_file);
if (create) {
create_dir(log_file->str);
}
free(room_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;
}
static gchar *
_get_chatlog_dir(void)
{

View File

@ -53,4 +53,8 @@ void chat_log_chat(const gchar * const login, gchar *other,
void chat_log_close(void);
GSList * chat_log_get_previous(const gchar * const login,
const gchar * const recipient, GSList *history);
void groupchat_log_init(void);
void groupchat_log_chat(const gchar * const login, const gchar * const room,
const gchar * const nick, const gchar * const msg);
#endif

View File

@ -259,6 +259,12 @@ prof_handle_room_message(const char * const room_jid, const char * const nick,
{
ui_room_message(room_jid, nick, message);
ui_current_page_off();
if (prefs_get_boolean(PREF_GRLOG)) {
Jid *jid = jid_create(jabber_get_jid());
groupchat_log_chat(jid->barejid, room_jid, nick, message);
jid_destroy(jid);
}
}
void
@ -560,6 +566,7 @@ _init(const int disable_tls, char *log_level)
log_info("Starting Profanity (%s)...", PACKAGE_VERSION);
}
chat_log_init();
groupchat_log_init();
prefs_load();
accounts_load();
gchar *theme = prefs_get_string(PREF_THEME);

View File

@ -1000,6 +1000,11 @@ cons_show_log_prefs(void)
else
cons_show("Chat logging (/chlog) : OFF");
if (prefs_get_boolean(PREF_GRLOG))
cons_show("Groupchat logging (/grlog) : ON");
else
cons_show("Groupchat logging (/grlog) : OFF");
ui_console_dirty();
_cons_alert();
}