summary refs log tree commit diff
diff options
context:
space:
mode:
authorCurtis McEnroe2018-11-29 18:20:24 -0500
committerCurtis McEnroe2018-11-29 18:20:24 -0500
commitd7659376d16380d862fe5b6b8a886a9115a0f2cf (patch)
treeba708ddc4ca14943a470b874fcc05181fbf21c93
parent5881a97c33c2a02b038a504a9027b8843029ac6c (diff)
Add basic log replay
-rw-r--r--chat.h1
-rw-r--r--handle.c1
-rw-r--r--input.c1
-rw-r--r--log.c22
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);
+}