From bf3decb0deda6f17ecf1fbcd1f11be82ff0dd0e4 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Sun, 12 Jul 2020 13:42:48 -0400 Subject: Add topic to events page --- events.c | 37 ++++++++++++++++++++++++++++++++++++- server.h | 4 ++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/events.c b/events.c index c516631..5dbb6b7 100644 --- a/events.c +++ b/events.c @@ -66,6 +66,18 @@ dateForm(struct khtmlreq *html, struct Scope scope, const char *_time) { || khtml_closeelem(html, 1); } +const char *EventsTopicQuery = SQL( + SELECT topics.topic + FROM topics + JOIN contexts USING (context) + WHERE contexts.network = :network + AND contexts.name = :context + AND contexts.query <= NOT :public + AND topics.time <= strftime('%s', :time) + ORDER BY topics.time DESC + LIMIT 1; +); + const char *EventsAfterQuery = SQL( SELECT events.event, @@ -147,6 +159,30 @@ enum kcgi_err eventsPage(struct kreq *req) { || khtml_elem(&html, KELEM_TABLE); if (error) return error; + sqlite3_reset(stmt.eventsTopic); + dbBindText(stmt.eventsTopic, ":network", scope.network); + dbBindText(stmt.eventsTopic, ":context", scope.context); + dbBindText(stmt.eventsTopic, ":time", time); + dbBindInt(stmt.eventsTopic, ":public", contextsPublic); + + int result = sqlite3_step(stmt.eventsTopic); + if (result == SQLITE_ROW) { + error = 0 + || khtml_elem(&html, KELEM_THEAD) + || khtml_elem(&html, KELEM_TR) + || khtml_attr( + &html, KELEM_TH, + KATTR_CLASS, "topic", + KATTR_COLSPAN, "3", + KATTR__MAX + ) + || khtml_puts(&html, sqlite3_column_text(stmt.eventsTopic, 0)) + || khtml_closeelem(&html, 3); + if (error) return error; + result = sqlite3_step(stmt.eventsTopic); + } + if (result != SQLITE_DONE) errx(EX_SOFTWARE, "%s", sqlite3_errmsg(db)); + sqlite3_stmt *events = stmt.eventsAfter; if (req->fieldmap[Before]) events = stmt.eventsBefore; @@ -158,7 +194,6 @@ enum kcgi_err eventsPage(struct kreq *req) { dbBindInt(events, ":limit", eventsLimit); int rows; - int result; time_t prevTime = 0; int64_t prevEvent = 0; for (rows = 0; SQLITE_ROW == (result = sqlite3_step(events)); ++rows) { diff --git a/server.h b/server.h index eee5419..4a18ef0 100644 --- a/server.h +++ b/server.h @@ -90,6 +90,7 @@ enum kcgi_err contextsPage(struct kreq *req); extern int eventsGap; extern int eventsOverlap; extern int eventsLimit; +extern const char *EventsTopicQuery; extern const char *EventsAfterQuery; extern const char *EventsBeforeQuery; extern const char *SearchQuery; @@ -102,6 +103,7 @@ extern struct Statements { sqlite3_stmt *networks; sqlite3_stmt *contexts; sqlite3_stmt *contextsMOTD; + sqlite3_stmt *eventsTopic; sqlite3_stmt *eventsAfter; sqlite3_stmt *eventsBefore; sqlite3_stmt *search; @@ -118,6 +120,7 @@ static inline void dbPrepareAll(void) { dbPrepare(&stmt.networks, NetworksQuery); dbPrepare(&stmt.contexts, ContextsQuery); dbPrepare(&stmt.contextsMOTD, ContextsMOTDQuery); + dbPrepare(&stmt.eventsTopic, EventsTopicQuery); dbPrepare(&stmt.eventsAfter, EventsAfterQuery); dbPrepare(&stmt.eventsBefore, EventsBeforeQuery); dbPrepare(&stmt.search, SearchQuery); @@ -127,6 +130,7 @@ static inline void dbClose(void) { sqlite3_finalize(stmt.networks); sqlite3_finalize(stmt.contexts); sqlite3_finalize(stmt.contextsMOTD); + sqlite3_finalize(stmt.eventsTopic); sqlite3_finalize(stmt.eventsAfter); sqlite3_finalize(stmt.eventsBefore); sqlite3_finalize(stmt.search); -- cgit 1.4.1 msJune McEnroe 2018-08-09Add M-b, M-f, M-DEL, M-d, C-wJune McEnroe 2018-08-09Add PASS optionJune McEnroe 2018-08-09Ignore trailing space on slash commandsJune McEnroe 2018-08-09Replace shift with a great variadic functionJune McEnroe 2018-08-09Only tabTouch nick if not selfJune McEnroe 2018-08-09Add URL detection, listing and openingJune McEnroe 2018-08-08Add commands to tab completeJune McEnroe 2018-08-08Use blank line as unread markerJune McEnroe 2018-08-08Add Homebrew LibreSSL paths to MakefileJune McEnroe 2018-08-08Distinguish self with square bracketsJune McEnroe 2018-08-08Add markers as lines to the logJune McEnroe 2018-08-08Factor out line editing to edit.cJune McEnroe 2018-08-08Set log marker on FocusOut eventJune McEnroe 2018-08-08Color own messages 15June McEnroe 2018-08-08Use BLACK LEFT-POINTING TRIANGLE for markerJune McEnroe 2018-08-07Reset attrs after addIRCJune McEnroe 2018-08-07Add tab complete UIJune McEnroe 2018-08-07Implement cycling tab completeJune McEnroe 2018-08-07Mark log when scrolling upJune McEnroe 2018-08-07Remove extraneous slash from unrecognized commandJune McEnroe 2018-08-07Highlight and beep pingsJune McEnroe 2018-08-07Factor out allocating conversion between wcs and mbsJune McEnroe 2018-08-07Match commands case-insensitivelyJune McEnroe 2018-08-07Convert input to multibyte before handlingJune McEnroe 2018-08-07Populate tab-complete listJune McEnroe 2018-08-07Fix /me formatting side-effectsJune McEnroe 2018-08-07Define ui.c BUF_LEN with enumJune McEnroe 2018-08-07Hack clang into checking uiFmt format stringsJune McEnroe 2018-08-07Handle PART and QUIT without messagesJune McEnroe 2018-08-07Make safe filling the who bufferJune McEnroe 2018-08-07Add reverse and reset IRC formatting codesJune McEnroe 2018-08-06Rewrite line editing again, add formattingJune McEnroe 2018-08-06Fix allocation size in vaswprintfJune McEnroe 2018-08-06Implement word wrappingJune McEnroe 2018-08-06Use wchar_t strings for all of UIJune McEnroe 2018-08-06Rename line editing functionsJune McEnroe 2018-08-05Initialize all possible color pairsJune McEnroe 2018-08-05Refactor color initializationJune McEnroe 2018-08-05Add ^L redrawJune McEnroe 2018-08-05Use 16 colors if availableJune McEnroe 2018-08-05Limit parsed colors to number of mIRC colorsJune McEnroe 2018-08-04Show source link on exitJune McEnroe 2018-08-04Implement line editing, scrollingJune McEnroe 2018-08-04Handle /topicJune McEnroe