about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-07-12 13:42:48 -0400
committerJune McEnroe <june@causal.agency>2020-07-12 13:42:48 -0400
commitbf3decb0deda6f17ecf1fbcd1f11be82ff0dd0e4 (patch)
tree9e6afc57f8eb278d9def6a23c9d64f4411188e2c
parentAdd network MOTD to contexts page (diff)
downloadscooper-bf3decb0deda6f17ecf1fbcd1f11be82ff0dd0e4.tar.gz
scooper-bf3decb0deda6f17ecf1fbcd1f11be82ff0dd0e4.zip
Add topic to events page
-rw-r--r--events.c37
-rw-r--r--server.h4
2 files changed, 40 insertions, 1 deletions
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);