Add basic log replay

weechat-hashes
Curtis McEnroe 2018-11-29 18:20:24 -05:00
parent 5881a97c33
commit d7659376d1
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
4 changed files with 23 additions and 2 deletions

1
chat.h
View File

@ -181,6 +181,7 @@ void logOpen(const char *path);
void logFmt( void logFmt(
struct Tag tag, const time_t *ts, const char *format, ... struct Tag tag, const time_t *ts, const char *format, ...
) __attribute__((format(printf, 3, 4))); ) __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 *wcsnchr(const wchar_t *wcs, size_t len, wchar_t chr);
wchar_t *wcsnrchr(const wchar_t *wcs, size_t len, wchar_t chr); wchar_t *wcsnrchr(const wchar_t *wcs, size_t len, wchar_t chr);

View File

@ -196,6 +196,7 @@ static void handleJoin(char *prefix, char *params) {
if (isSelf(nick, user)) { if (isSelf(nick, user)) {
tabTouch(TagNone, chan); tabTouch(TagNone, chan);
uiViewTag(tag); uiViewTag(tag);
logReplay(tag);
} }
tabTouch(tag, nick); tabTouch(tag, nick);

View File

@ -80,6 +80,7 @@ static void inputQuery(struct Tag tag, char *params) {
if (!nick) return; if (!nick) return;
tabTouch(TagNone, nick); tabTouch(TagNone, nick);
uiViewTag(tagFor(nick)); uiViewTag(tagFor(nick));
logReplay(tagFor(nick));
} }
static void inputWho(struct Tag tag, char *params) { static void inputWho(struct Tag tag, char *params) {

22
log.c
View File

@ -80,11 +80,11 @@ static FILE *logFile(struct Tag tag, const struct tm *time) {
char path[sizeof("YYYY-MM-DD.log")]; char path[sizeof("YYYY-MM-DD.log")];
strftime(path, sizeof(path), "%F.log", time); strftime(path, sizeof(path), "%F.log", time);
int fd = openat( 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); 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); if (!log->file) err(EX_CANTCREAT, "%s/%s", tag.name, path);
setlinebuf(log->file); setlinebuf(log->file);
@ -119,3 +119,21 @@ void logFmt(struct Tag tag, const time_t *ts, const char *format, ...) {
fprintf(file, "\n"); fprintf(file, "\n");
if (ferror(file)) err(EX_IOERR, "%s", tag.name); 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);
}