diff options
author | Luke Bratch <luke@bratch.co.uk> | 2019-05-16 00:15:47 +0100 |
---|---|---|
committer | Luke Bratch <luke@bratch.co.uk> | 2019-05-16 00:15:47 +0100 |
commit | a299b62e913df71bdd1c4b41d61d3fb098f12be7 (patch) | |
tree | 4e3061c884ef8636a94a773de30893bbff84cd52 /logging.c | |
parent | 0cebf7c6d557d0b76d069af908a2a47366033fde (diff) |
Implement normal logging (file per channel/user).
Diffstat (limited to 'logging.c')
-rw-r--r-- | logging.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/logging.c b/logging.c new file mode 100644 index 0000000..e0f5f1f --- /dev/null +++ b/logging.c @@ -0,0 +1,90 @@ +#include "logging.h" + +// Write the line 'str' to the relevant log file such as +// '#channel.log' or 'nickname.log'. 'ournick' is our own +// nick and is used to determine which log file to write to. +// Expects a string in the format: +// :from!bar@baz PRIVMSG to :hello world +// With the ":foo!bar@baz "prefix being important. +// Returns 1 on success or 0 on failure. +int logprivmsg(char *str, char *ournick) { + // First, extract the "from" nick and the "to" nick or channel by splitting up the string + + // Track which space-separated token within this response we're on + int counter = 0; + // Build array of each space-separated token (TODO - Use counter to stop splitting once we reach some reasonable value - i.e. once we're definitely past commands and into just free text) + char tokens[MAXTOKENS][MAXDATASIZE]; + char *token; + + // Split out the first three space-separated parts of the string, leaving the rest. + // This gets us the prefix (containing the "from" nick), the PRIVMSG command (not needed), + // and the "to" nick or channel. Plus the rest of the string intact (which is the actual + // message). + for (int i = 0; i < 3; i++) { + // Try to split + if ((token = strsep(&str, " ")) == NULL) { + printf("Error splitting string for logging, exiting!\n"); + exit(1); + } + // Copy into the token array (strlen + 1 to get the NULL terminator) + strncpy(tokens[i], token, strlen(token) + 1); + counter++; + } + + // Extract the username from the prefix + extractnickfromprefix(tokens[0]); + + // Remove the leading ":" from the real message + stripprefix(str); + + // Build the log filename + char filename[MAXCHAR]; + // If the message was sent to us, then log it in the sender's log file + if (strncmp(tokens[2], ournick, strlen(tokens[0])) == 0) { + snprintf(filename, MAXCHAR, "%s.log", tokens[0]); + } else { + // Otherwise log it in the "to" log file + snprintf(filename, MAXCHAR, "%s.log", tokens[2]); + } + + printf("logprivmsg(): Logging from '%s' to '%s' message '%s' in filename '%s'.\n", tokens[0], tokens[2], str, filename); + + FILE *fp; + char line[MAXCHAR]; + + int bytes = 0; + + fp = fopen(filename, "a"); + + if (fp == NULL) { + printf("error: could not open log file '%s' for writing.\n", filename); + exit(1); + } + + // Get a current time string to prepend - TODO - Make this customisable. + time_t rawtime; + struct tm * timeinfo; + time(&rawtime); + timeinfo = localtime(&rawtime); + // Strip the trailing newline + char timestr[MAXCHAR]; + snprintf(timestr, MAXCHAR, "%s", asctime(timeinfo)); + timestr[strlen(timestr) - 1] = '\0'; + + // Prepend the time string and "from" nick + if (!snprintf(line, MAXCHAR, "%s <%s> %s", timestr, tokens[0], str)) { + fprintf(stderr, "Error while log string to write!\n"); + exit(1); + } + + printf("Complete log string to write: '%s', length '%ld'.\n", line, strlen(line)); + + // Write complete line to file + if ((bytes = fprintf(fp, line)) < 0) { + printf("error: could not write to log file.\n"); + exit(1); + } + + fclose(fp); + return bytes; +} |