summaryrefslogtreecommitdiff
path: root/replay.c
diff options
context:
space:
mode:
Diffstat (limited to 'replay.c')
-rw-r--r--replay.c42
1 files changed, 28 insertions, 14 deletions
diff --git a/replay.c b/replay.c
index 5e54f28..412ed7c 100644
--- a/replay.c
+++ b/replay.c
@@ -83,16 +83,21 @@ int striptimestamp(char *str) {
// 1557592901 :foo!bar@baz PRIVMSG foo :hello world
// And convert it to:
// :foo!bar@baz PRIVMSG foo :[17:41:41] hello world
+// Or the same but e.g. [DD/MM/YY HH:MM:SS] if replaydates == 1.
// Only inserts the formatted time for PRIVMSGs at the moment (and maybe only needs to!).
-void formattime(char *str) {
+void formattime(char *str, int replaydates) {
// Extract the timestamp for conversion into [HH:MM:SS]
char timestr[TIMELEN];
sprintf(timestr, "%d", gettimestamp(str)); // Convert int time to string time
struct tm tm;
strptime(timestr, "%s", &tm);
- char timestampf[TIMELEN]; // Formatted timestamp
- // Convert into [HH:MM:SS]
- strftime(timestampf, TIMELEN, "[%H:%M:%S]", &tm);
+ char timestampf[DATETIMELEN]; // Formatted timestamp
+ // Convert into [HH:MM:SS] or e.g. [DD/MM/YY HH:MM:SS]
+ if (replaydates) {
+ strftime(timestampf, DATETIMELEN, "[%x %H:%M:%S]", &tm);
+ } else {
+ strftime(timestampf, DATETIMELEN, "[%H:%M:%S]", &tm);
+ }
// Strip the original unixtimestamp
striptimestamp(str);
@@ -144,22 +149,30 @@ void formattime(char *str) {
// Second bit (:foo!bar@baz PRIVMSG foo :[HH:MM:SS])
int j = 0;
- for (int i = realpos; i < TIMELEN + realpos - 1; i++) { // -1 to avoid the null char from timestampf
+ for (size_t i = realpos; i < strlen(timestampf) + realpos; i++) {
newline[i] = timestampf[j];
j++;
}
// Insert a space after the formatted timestamp
- newline[TIMELEN + realpos - 1] = ' ';
+ newline[strlen(timestampf) + realpos] = ' ';
+ newline[strlen(timestampf) + realpos + 1] = '\0';
- // Final bit (the original PRIVMSG contents)
- for (int i = TIMELEN + realpos; i < len + TIMELEN; i++) {
- newline[i] = str[i - TIMELEN];
+ // Record length of temporary newline string and original real message (after the colon)
+ size_t newlinelen = strlen(newline);
+ size_t msglen = strlen(str) - realpos - 2; // - 2 to ignore leading colon and null terminator
+
+ // Append the real message to the temporary newline string
+ for (size_t i = 0; i < strlen(str) - realpos - 2; i++) {
+ newline[newlinelen + i] = str[realpos + i];
}
+ // Null terminate it
+ newline[newlinelen + msglen] = '\0';
+
// Copy the whole thing back to str and null terminate
- strncpy(str, newline, len + TIMELEN);
- str[len + TIMELEN] = '\0';
+ strncpy(str, newline, len + strlen(timestampf));
+ str[len + strlen(timestampf)] = '\0';
}
// Return the number of lines in the replay log since 'seconds' seconds ago, or -1 if there a problem.
@@ -208,10 +221,11 @@ int replaylines(int seconds, char *basedir) {
// Set 'str' to the line in the log with a timestamp of greater than 'seconds'
// seconds ago, plus however many lines 'linenum' is set to. 'basedir' is the
// directory in which to find 'replay.log'.
-// Also modify the line to include a timestamp in the form "[HH:MM:SS]".
+// Also modify the line to include a timestamp in the form "[HH:MM:SS]", or [DD/MM/YY HH:MM:SS]
+// if replaydates == 1.
// Returns 1 on success, or 0 on failure.
// TODO - This is horribly inefficient since it re-reads the entire file each call, rewrite this!
-int readreplayline(int seconds, int linenum, char *str, char *basedir) {
+int readreplayline(int seconds, int linenum, char *str, char *basedir, int replaydates) {
FILE *fp;
char line[MAXCHAR];
char filename[PATH_MAX];
@@ -246,7 +260,7 @@ int readreplayline(int seconds, int linenum, char *str, char *basedir) {
// ...and it is the current requested line then return it
if (count == linenum) {
// Insert our formatted [HH:MM:SS] timestamp into the message
- formattime(line);
+ formattime(line, replaydates);
strncpy(str, line, strlen(line));
str[strlen(line)] = '\0';