From defff5181f36da178c38510009ff0ecfaf30cd0a Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 10 Jul 2020 08:35:11 -0400 Subject: List active networks first --- networks.c | 49 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 7 deletions(-) (limited to 'networks.c') diff --git a/networks.c b/networks.c index a81722c..ed19394 100644 --- a/networks.c +++ b/networks.c @@ -22,9 +22,25 @@ #include "server.h" const char *NetworksQuery = SQL( - SELECT DISTINCT network - FROM contexts - ORDER BY network; + WITH recentEvents AS ( + SELECT time, context + FROM events + ORDER BY event DESC + LIMIT 500 // TODO: Configurable. + ), activeNetworks AS ( + SELECT DISTINCT network + FROM contexts + JOIN recentEvents USING (context) + GROUP BY context + ORDER BY max(time) DESC + ), allNetworks AS ( + SELECT DISTINCT network + FROM contexts + ORDER BY network + ) + SELECT network, 1 FROM activeNetworks + UNION ALL + SELECT network, 0 FROM allNetworks; ); enum kcgi_err pageNetworks(struct kreq *req) { @@ -35,22 +51,41 @@ enum kcgi_err pageNetworks(struct kreq *req) { error = error || khttp_body(req) || khtml_open(&html, req, KHTML_PRETTY) - || htmlHead(&html, "Networks") + || htmlHead(&html, "Litterbox") || htmlNav(&html, NULL, NULL) - || htmlSearch(&html, NULL, NULL) - || khtml_elem(&html, KELEM_UL); + || htmlSearch(&html, NULL, NULL); if (error) return error; + enum State { + None, + Active, + Networks, + } state = None; + const char *Headings[] = { NULL, "Active", "Networks" }; + int result; while (SQLITE_ROW == (result = sqlite3_step(stmt.networks))) { const char *network = (const char *)sqlite3_column_text(stmt.networks, 0); + bool active = sqlite3_column_int(stmt.networks, 1); + + enum State prev = state; + state = (active ? Active : Networks); + if (state != prev) { + error = 0 + || khtml_closeelem(&html, 1) + || khtml_elem(&html, KELEM_H2) + || khtml_puts(&html, Headings[state]) + || khtml_closeelem(&html, 1) + || khtml_elem(&html, KELEM_UL); + if (error) return error; + } + char *href = khttp_urlpart( NULL, NULL, Pages[Contexts], Keys[Network].name, network, NULL ); if (!href) err(EX_OSERR, "khttp_urlpart"); - error = 0 || khtml_elem(&html, KELEM_LI) || khtml_attr(&html, KELEM_A, KATTR_HREF, href, KATTR__MAX) -- cgit 1.4.1