Add basic log replay
parent
5881a97c33
commit
d7659376d1
1
chat.h
1
chat.h
|
@ -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);
|
||||||
|
|
1
handle.c
1
handle.c
|
@ -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);
|
||||||
|
|
||||||
|
|
1
input.c
1
input.c
|
@ -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
22
log.c
|
@ -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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue