diff options
| -rw-r--r-- | chat.h | 1 | ||||
| -rw-r--r-- | handle.c | 1 | ||||
| -rw-r--r-- | input.c | 1 | ||||
| -rw-r--r-- | log.c | 22 | 
4 files changed, 23 insertions, 2 deletions
| @@ -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); @@ -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); @@ -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) { @@ -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); +} | 
