From d7659376d16380d862fe5b6b8a886a9115a0f2cf Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Thu, 29 Nov 2018 18:20:24 -0500 Subject: Add basic log replay --- chat.h | 1 + handle.c | 1 + input.c | 1 + log.c | 22 ++++++++++++++++++++-- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/chat.h b/chat.h index 1a56992..912bc90 100644 --- a/chat.h +++ b/chat.h @@ -181,6 +181,7 @@ void logOpen(const char *path); void logFmt( struct Tag tag, const time_t *ts, const char *format, ... ) __attribute__((format(printf, 3, 4))); +void logReplay(struct Tag tag); wchar_t *wcsnchr(const wchar_t *wcs, size_t len, wchar_t chr); wchar_t *wcsnrchr(const wchar_t *wcs, size_t len, wchar_t chr); diff --git a/handle.c b/handle.c index ae3dbfa..48e7a18 100644 --- a/handle.c +++ b/handle.c @@ -196,6 +196,7 @@ static void handleJoin(char *prefix, char *params) { if (isSelf(nick, user)) { tabTouch(TagNone, chan); uiViewTag(tag); + logReplay(tag); } tabTouch(tag, nick); diff --git a/input.c b/input.c index 85c240f..ffd0d10 100644 --- a/input.c +++ b/input.c @@ -80,6 +80,7 @@ static void inputQuery(struct Tag tag, char *params) { if (!nick) return; tabTouch(TagNone, nick); uiViewTag(tagFor(nick)); + logReplay(tagFor(nick)); } static void inputWho(struct Tag tag, char *params) { diff --git a/log.c b/log.c index af8f66e..9cd6557 100644 --- a/log.c +++ b/log.c @@ -80,11 +80,11 @@ static FILE *logFile(struct Tag tag, const struct tm *time) { char path[sizeof("YYYY-MM-DD.log")]; strftime(path, sizeof(path), "%F.log", time); int fd = openat( - log->dir, path, O_WRONLY | O_APPEND | O_CREAT | O_CLOEXEC, 0600 + log->dir, path, O_RDWR | O_APPEND | O_CREAT | O_CLOEXEC, 0600 ); if (fd < 0) err(EX_CANTCREAT, "%s/%s", tag.name, path); - log->file = fdopen(fd, "a"); + log->file = fdopen(fd, "a+"); if (!log->file) err(EX_CANTCREAT, "%s/%s", tag.name, path); setlinebuf(log->file); @@ -119,3 +119,21 @@ void logFmt(struct Tag tag, const time_t *ts, const char *format, ...) { fprintf(file, "\n"); if (ferror(file)) err(EX_IOERR, "%s", tag.name); } + +void logReplay(struct Tag tag) { + if (logRoot < 0) return; + + time_t t = time(NULL); + struct tm *time = localtime(&t); + if (!time) err(EX_SOFTWARE, "localtime"); + + FILE *file = logFile(tag, time); + rewind(file); + + size_t len; + char *line; + while (NULL != (line = fgetln(file, &len))) { + uiFmt(tag, UICold, "\3%d%.*s", IRCGray, (int)(len - 1), line); + } + if (ferror(file)) err(EX_IOERR, "%s", tag.name); +} -- cgit 1.4.1