From ce7f24ecc1add825ee5714ff09cbc5604c6e4c81 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sun, 19 Sep 2004 20:26:15 +0000 Subject: Log server/channel/private to file --- src/common/Makefile.am | 4 +- src/common/log.c | 149 +++++++++++++++++++++++++++++++++++++++++++ src/common/log.h | 31 +++++++++ src/common/weechat.c | 25 +++++--- src/common/weeconfig.c | 33 +++------- src/common/weeconfig.h | 6 +- src/gui/curses/gui-display.c | 9 ++- src/gui/gui-common.c | 16 +++++ src/gui/gui.h | 7 +- 9 files changed, 239 insertions(+), 41 deletions(-) create mode 100644 src/common/log.c create mode 100644 src/common/log.h (limited to 'src') diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 7ef59d69a..1500e96e8 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -30,4 +30,6 @@ lib_weechat_main_a_SOURCES = weechat.c \ history.c \ history.h \ hotlist.c \ - hotlist.h + hotlist.h \ + log.c \ + log.h diff --git a/src/common/log.c b/src/common/log.c new file mode 100644 index 000000000..62f7aefb7 --- /dev/null +++ b/src/common/log.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2004 by FlashCode + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* log.c: log buffers to files */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "weechat.h" +#include "log.h" +#include "weeconfig.h" + + +/* + * log_write_date: writes date to log file + */ + +void +log_write_date (t_gui_buffer *buffer) +{ + static char buf_time[256]; + static time_t seconds; + struct tm *date_tmp; + + if (buffer->log_file) + { + seconds = time (NULL); + date_tmp = localtime (&seconds); + if (date_tmp) + { + strftime (buf_time, sizeof (buf_time) - 1, cfg_log_timestamp, date_tmp); + fprintf (buffer->log_file, "%s ", buf_time); + fflush (buffer->log_file); + } + } +} + +/* + * log_write: writes a message to log file + */ + +void +log_write (t_gui_buffer *buffer, char *message) +{ + if (buffer->log_file) + { + fprintf (buffer->log_file, "%s", message); + fflush (buffer->log_file); + } +} + +/* + * log_start: starts a log + */ + +void +log_start (t_gui_buffer *buffer) +{ + int length; + char *ptr_home; + + ptr_home = getenv ("HOME"); + length = strlen (cfg_log_path) + + ((cfg_log_path[0] == '~') ? strlen (ptr_home) : 0) + + 64; + if (SERVER(buffer)) + length += strlen (SERVER(buffer)->name); + if (CHANNEL(buffer)) + length += strlen (CHANNEL(buffer)->name); + buffer->log_filename = (char *) malloc (length); + if (!buffer->log_filename) + { + wee_log_printf (_("Not enough memory to write log file for a buffer\n")); + return; + } + if (cfg_log_path[0] == '~') + { + strcpy (buffer->log_filename, ptr_home); + strcat (buffer->log_filename, cfg_log_path + 1); + } + else + strcpy (buffer->log_filename, cfg_log_path); + if (buffer->log_filename[strlen (buffer->log_filename) - 1] != DIR_SEPARATOR_CHAR) + strcat (buffer->log_filename, DIR_SEPARATOR); + + if (SERVER(buffer)) + { + strcat (buffer->log_filename, SERVER(buffer)->name); + strcat (buffer->log_filename, "."); + } + if (CHANNEL(buffer)) + { + strcat (buffer->log_filename, CHANNEL(buffer)->name); + strcat (buffer->log_filename, "."); + } + strcat (buffer->log_filename, "weechatlog"); + + buffer->log_file = fopen (buffer->log_filename, "a"); + if (!buffer->log_file) + { + wee_log_printf (_("Unable to write log file for a buffer\n")); + free (buffer->log_filename); + return; + } + log_write (buffer, _("**** Beginning of log ")); + log_write_date (buffer); + log_write (buffer, "****\n"); +} + +/* + * log_end: ends a log + */ + +void +log_end (t_gui_buffer *buffer) +{ + if (buffer->log_file) + { + log_write (buffer, _("**** End of log ")); + log_write_date (buffer); + log_write (buffer, "****\n"); + fclose (buffer->log_file); + buffer->log_file = NULL; + } + if (buffer->log_filename) + free (buffer->log_filename); +} diff --git a/src/common/log.h b/src/common/log.h new file mode 100644 index 000000000..de132b93e --- /dev/null +++ b/src/common/log.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2004 by FlashCode + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef __WEECHAT_LOG_H +#define __WEECHAT_LOG_H 1 + +#include "../irc/irc.h" + +extern void log_write_date (t_gui_buffer *); +extern void log_write (t_gui_buffer *, char *); +extern void log_start (t_gui_buffer *); +extern void log_end (t_gui_buffer *); + +#endif /* log.h */ diff --git a/src/common/weechat.c b/src/common/weechat.c index dc6eb9026..776ae4005 100644 --- a/src/common/weechat.c +++ b/src/common/weechat.c @@ -60,7 +60,7 @@ int quit_weechat; /* = 1 if quit request from user... why ? :'( */ char *weechat_home; /* WeeChat home dir. (example: /home/toto/.weechat) */ -FILE *log_file; /* WeeChat log file (~/.weechat/weechat.log) */ +FILE *weechat_log_file; /* WeeChat log file (~/.weechat/weechat.log) */ int server_cmd_line; /* at least one server on WeeChat command line */ @@ -88,7 +88,7 @@ wee_log_printf (char *message, ...) static time_t seconds; struct tm *date_tmp; - if (!log_file) + if (!weechat_log_file) return; va_start (argptr, message); @@ -98,13 +98,13 @@ wee_log_printf (char *message, ...) seconds = time (NULL); date_tmp = localtime (&seconds); if (date_tmp) - fprintf (log_file, "[%04d-%02d-%02d %02d:%02d:%02d] %s", + fprintf (weechat_log_file, "[%04d-%02d-%02d %02d:%02d:%02d] %s", date_tmp->tm_year + 1900, date_tmp->tm_mon + 1, date_tmp->tm_mday, date_tmp->tm_hour, date_tmp->tm_min, date_tmp->tm_sec, buffer); else - fprintf (log_file, "%s", buffer); - fflush (log_file); + fprintf (weechat_log_file, "%s", buffer); + fflush (weechat_log_file); } /* @@ -354,6 +354,15 @@ wee_create_home_dirs () } #endif + /* create "~/.weechat/logs" */ + snprintf (dir_name, dir_length, "%s%s%s", weechat_home, DIR_SEPARATOR, + "logs"); + if (!wee_create_dir (dir_name)) + { + fprintf (stderr, _("%s unable to create ~/.weechat/logs directory\n"), + WEECHAT_WARNING); + } + free (dir_name); } @@ -383,7 +392,7 @@ wee_init_log () filename = (char *) malloc (filename_length * sizeof (char)); snprintf (filename, filename_length, "%s/" WEECHAT_LOG_NAME, weechat_home); - if ((log_file = fopen (filename, "wt")) == NULL) + if ((weechat_log_file = fopen (filename, "wt")) == NULL) fprintf (stderr, _("%s unable to create/append to log file (~/.weechat/%s)"), WEECHAT_WARNING, WEECHAT_LOG_NAME); @@ -440,8 +449,8 @@ wee_shutdown () dcc_end (); server_free_all (); gui_end (); - if (log_file) - fclose (log_file); + if (weechat_log_file) + fclose (weechat_log_file); exit (EXIT_SUCCESS); } diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index 2416333a8..e08833175 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -412,19 +412,21 @@ t_config_option weechat_options_history[] = /* config, log section */ -int cfg_log_auto_channels; +int cfg_log_auto_server; +int cfg_log_auto_channel; int cfg_log_auto_private; char *cfg_log_path; -char *cfg_log_name; char *cfg_log_timestamp; -char *cfg_log_start_string; -char *cfg_log_end_string; t_config_option weechat_options_log[] = -{ { "log_auto_channels", N_("automatically log channel chats"), +{ { "log_auto_server", N_("automatically log server messages"), + N_("automatically log server messages"), + OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE, + NULL, NULL, &cfg_log_auto_server, NULL, NULL }, + { "log_auto_channel", N_("automatically log channel chats"), N_("automatically log channel chats"), OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE, - NULL, NULL, &cfg_log_auto_channels, NULL, NULL }, + NULL, NULL, &cfg_log_auto_channel, NULL, NULL }, { "log_auto_private", N_("automatically log private chats"), N_("automatically log private chats"), OPTION_TYPE_BOOLEAN, BOOL_FALSE, BOOL_TRUE, BOOL_TRUE, @@ -433,25 +435,10 @@ t_config_option weechat_options_log[] = N_("path for WeeChat log files"), OPTION_TYPE_STRING, 0, 0, 0, "~/.weechat/logs/", NULL, NULL, &cfg_log_path, NULL }, - { "log_name", N_("name for log files"), - N_("name for log files (%S == irc server name, " - "%N == channel name (or nickname if private chat)"), - OPTION_TYPE_STRING, 0, 0, 0, - "%S,%N.weechatlog", NULL, NULL, &cfg_log_name, NULL }, { "log_timestamp", N_("timestamp for log"), N_("timestamp for log (see man strftime for date/time specifiers)"), OPTION_TYPE_STRING, 0, 0, 0, - "~", NULL, NULL, &cfg_log_timestamp, NULL }, - { "log_start_string", N_("start string for log files"), - N_("text written when starting new log file " - "(see man strftime for date/time specifiers)"), - OPTION_TYPE_STRING, 0, 0, 0, - "--- Log started %a %b %d %Y %H:%M:%s", NULL, NULL, &cfg_log_start_string, NULL }, - { "log_end_string", N_("end string for log files"), - N_("text written when ending log file " - "(see man strftime for date/time specifiers)"), - OPTION_TYPE_STRING, 0, 0, 0, - "--- Log ended %a %b %d %Y %H:%M:%s", NULL, NULL, &cfg_log_end_string, NULL }, + "%Y %b %d %H:%M:%S", NULL, NULL, &cfg_log_timestamp, NULL }, { NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL } }; @@ -1305,7 +1292,7 @@ config_write (char *config_name) if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER)) { fprintf (file, "\n[%s]\n", config_sections[i].section_name); - if ((i == CONFIG_SECTION_LOG) || (i == CONFIG_SECTION_PROXY)) + if (i == CONFIG_SECTION_PROXY) fprintf (file, "# WARNING!!! Options for section \"%s\" are not developed!\n", config_sections[i].section_name); diff --git a/src/common/weeconfig.h b/src/common/weeconfig.h index 4f39b29c3..c90d287b7 100644 --- a/src/common/weeconfig.h +++ b/src/common/weeconfig.h @@ -139,13 +139,11 @@ extern int cfg_col_dcc_aborted; extern int cfg_history_max_lines; extern int cfg_history_max_commands; -extern int cfg_log_auto_channels; +extern int cfg_log_auto_server; +extern int cfg_log_auto_channel; extern int cfg_log_auto_private; extern char *cfg_log_path; -extern char *cfg_log_name; extern char *cfg_log_timestamp; -extern char *cfg_log_start_string; -extern char *cfg_log_end_string; extern int cfg_dcc_auto_accept_files; extern int cfg_dcc_auto_accept_chats; diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c index e57b7ba44..1f65fee8c 100644 --- a/src/gui/curses/gui-display.c +++ b/src/gui/curses/gui-display.c @@ -36,6 +36,7 @@ #include "../gui.h" #include "../../common/weeconfig.h" #include "../../common/hotlist.h" +#include "../../common/log.h" #include "../../irc/irc.h" @@ -1409,7 +1410,7 @@ gui_get_dcc_buffer () /* check if dcc buffer exists */ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) { - if (BUFFER_IS_DCC (ptr_buffer)) + if (ptr_buffer->dcc) break; } if (ptr_buffer) @@ -1433,7 +1434,7 @@ gui_switch_to_dcc_buffer () /* check if dcc buffer exists */ for (ptr_buffer = gui_buffers; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) { - if (BUFFER_IS_DCC (ptr_buffer)) + if (ptr_buffer->dcc) break; } if (ptr_buffer) @@ -2032,8 +2033,12 @@ gui_printf_color_type (t_gui_buffer *buffer, int type, int color, char *message, snprintf (timestamp, 16, "%02d", date_tmp->tm_sec); gui_add_message (buffer, MSG_TYPE_TIME, COLOR_WIN_CHAT_TIME, timestamp); gui_add_message (buffer, MSG_TYPE_TIME, COLOR_WIN_CHAT_DARK, "] "); + if (buffer->log_file) + log_write_date (buffer); } gui_add_message (buffer, type, color, pos + 1); + if (buffer->log_file) + log_write (buffer, pos + 1); pos = strchr (pos + 1, '\n'); if (pos && !pos[1]) pos = NULL; diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c index ac6b1cc54..43a6297ed 100644 --- a/src/gui/gui-common.c +++ b/src/gui/gui-common.c @@ -36,6 +36,7 @@ #include "gui.h" #include "../common/weeconfig.h" #include "../common/hotlist.h" +#include "../common/log.h" #include "../irc/irc.h" @@ -146,6 +147,8 @@ gui_buffer_new (t_gui_window *window, void *server, void *channel, int dcc, ((t_irc_channel *)(channel))->buffer = gui_buffers; SERVER(gui_buffers) = server; CHANNEL(gui_buffers) = channel; + if (cfg_log_auto_server) + log_start (gui_buffers); return gui_buffers; } @@ -179,6 +182,14 @@ gui_buffer_new (t_gui_window *window, void *server, void *channel, int dcc, new_buffer->num_lines = 0; new_buffer->line_complete = 1; + /* create/append to log file */ + new_buffer->log_filename = NULL; + new_buffer->log_file = NULL; + if ((cfg_log_auto_server && BUFFER_IS_SERVER(new_buffer)) + || (cfg_log_auto_channel && BUFFER_IS_CHANNEL(new_buffer)) + || (cfg_log_auto_private && BUFFER_IS_PRIVATE(new_buffer))) + log_start (new_buffer); + /* init input buffer */ new_buffer->input_buffer_alloc = INPUT_BUFFER_BLOCK_SIZE; new_buffer->input_buffer = (char *) malloc (INPUT_BUFFER_BLOCK_SIZE); @@ -390,6 +401,11 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) gui_line_free (buffer->lines); buffer->lines = ptr_line; } + + /* close log if opened */ + if (buffer->log_file) + log_end (buffer); + if (buffer->input_buffer) free (buffer->input_buffer); diff --git a/src/gui/gui.h b/src/gui/gui.h index ddf7422d2..20d561677 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -73,7 +73,6 @@ #define BUFFER_IS_SERVER(buffer) (SERVER(buffer) && !CHANNEL(buffer)) #define BUFFER_IS_CHANNEL(buffer) (CHANNEL(buffer) && (CHANNEL(buffer)->type == CHAT_CHANNEL)) #define BUFFER_IS_PRIVATE(buffer) (CHANNEL(buffer) && (CHANNEL(buffer)->type == CHAT_PRIVATE)) -#define BUFFER_IS_DCC(buffer) (!SERVER(buffer) && !CHANNEL(buffer)) #define MSG_TYPE_TIME 1 #define MSG_TYPE_NICK 2 @@ -143,8 +142,6 @@ struct t_gui_buffer /* server/channel */ void *server; /* buffer's server */ void *channel; /* buffer's channel */ - - /* dcc buffer */ int dcc; /* buffer is dcc status */ /* chat content (lines, line is composed by many messages) */ @@ -153,6 +150,10 @@ struct t_gui_buffer int num_lines; /* number of lines in the window */ int line_complete; /* current line complete ? (\n ending) */ + /* file to save buffer content */ + char *log_filename; /* filename for saving buffer content */ + FILE *log_file; /* for logging buffer to file */ + /* inupt buffer */ char *input_buffer; /* input buffer */ int input_buffer_alloc; /* input buffer: allocated size in mem */ -- cgit v1.2.3