Add ifdbgames example. Thanks pazz0! - brcon2024-hackathons - Bitreichcon 2024 Hackathons HTML git clone git://bitreich.org/brcon2024-hackathons git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/brcon2024-hackathons DIR Log DIR Files DIR Refs DIR Tags DIR Submodules --- DIR commit 657b359aba0a48bc973a0cffe152a941297f6543 DIR parent ad0bd2f3d8d0c6d5e4aa3209cbeb81d4d9751a1a HTML Author: Christoph Lohmann <20h@r-36.net> Date: Sun, 4 Aug 2024 20:47:53 +0200 Add ifdbgames example. Thanks pazz0! Diffstat: M gopher/README.md | 3 +++ A gopher/ifdbgames.sh | 349 +++++++++++++++++++++++++++++++ 2 files changed, 352 insertions(+), 0 deletions(-) --- DIR diff --git a/gopher/README.md b/gopher/README.md @@ -42,6 +42,9 @@ fiction for gopher. Is this enough? + https://ifarchive.org/indexes/if-archive/info/ifdb/ + gopher://gopher.0xfa.de/0/pazz0/p/ifdbgames.sh + ## Pharos Internet Archive Interface Help pi31415 and extend his Internet Archive Interface for Gopher: DIR diff --git a/gopher/ifdbgames.sh b/gopher/ifdbgames.sh @@ -0,0 +1,349 @@ +#!/bin/sh +getrawdata() { + printf "getrawdata: start\n" 1>&2 + sqlite3 "$1" <<-EOF + .separator "\x1f" "\x1e" + + with ratings as ( + select gameid, avg(rating) rawavg, round(avg(rating) * 2) / 2 stars, count(*) cnt from reviews where special isnull group by gameid + ) + select + games.id, + games.title, + games.sort_title, + games.author, + games.sort_author, + games.tags, + iif(time(games.published) = '00:00:00',strftime('%Y', games.published), date(games.published)), + games.license, + games.desc, + games.genre, + games.forgiveness, + games.language, + games.website, + games.downloadnotes, + + gamelinks.title, + gamelinks.desc, + gamelinks.url, + + filetypes.externid, + filetypes.fmtname, + filetypes.desc, + + extreviews.url, + extreviews.sourcename, + extreviews.sourceurl, + reviews.summary, + reviews.review, + reviews.rating, + + ratings.stars, + ratings.cnt + from games + left outer join gamelinks on gamelinks.gameid = games.id + left outer join filetypes on filetypes.id = gamelinks.fmtid + left outer join extreviews on extreviews.gameid = games.id + left outer join reviews on reviews.id = extreviews.reviewid + left outer join ratings on ratings.gameid = games.id + order by games.id, gamelinks.displayorder, extreviews.displayorder + EOF + printf "getrawdata: end\n" 1>&2 +} + +# Sadly OpenBSD's awk has some problems with some multibyte characters in the +# dataset Maybe the encoding in the database is wonky. I don't know. Let's +# ignore it! And just use gawk. I want to see something in the end. I doesn't +# have to be correct. :) +getrawdata "$1" | \ +gawk -v"FS=\x1f" -v"RS=\x1e" ' +function removehtmltags(s) { + gsub("<[^>]+>", "", s) + return s +} +# TODO Do it, future_pazz0! +function resolvehtmlentities(s) { + return s +} +function trim(s) { + gsub("^[ ]+", "", s) + gsub("[ ]+$", "", s) + return s +} +function foldinto(input, w, indentstr, file, + p, t, l, linel, line, n) { + l = length(input) + p = 1 + line = indentstr + n = 0 + while (p <= l) { + for (t = p; t <= l && !index(" \t\n", substr(input, t, 1)); t++); + + # Doesnt fit in the current line + if (length(line) + t - p + 1 > w) { + print line >> file + line = indentstr + n++ + } + + # Doesnt fit anyways + if (t - p > w) { + print line >> file + } else { + if (line && line != indentstr) + line = line " " + line = line substr(input, p, t - p) + } + + for (; t <= l && index(" \t\n", substr(input, t, 1)); t++) { + if (substr(input, t, 1) == "\n" && substr(input, t - 1, 1) == "\n") { + print line >> file + line = indentstr + print indentstr >> file + n++ + } + } + p = t + } + if (line) + print line >> file +} +function flushdescription2(file, + i) { + cmd = "groff -Tutf8 -ms > " file + + print ".nr LL 80n" | cmd + print ".nr LT 80n" | cmd + + print ".SH\n" data[2] | cmd + print ".IP Author(s)\n" data[4] | cmd + if (data[10]) + print ".IP Genre\n" data[10] | cmd + if (data[13]) + print ".IP Website\n" data[13] | cmd + if (data[12]) + print ".IP Language\n" data[12] | cmd + if (data[7]) + print ".IP \"First Publication Date\"\n" data[7] | cmd + if (data[8]) + print ".IP License\n" data[8] | cmd + if (data[11]) + print ".IP \"Forgiveness Rating\"\n" data[11] | cmd + if (ratings["stars"]) + printf(".IP Rating\n%s (based on %s rating%s)\n", ratings["stars"], ratings["count"], ratings["count"] > 1 ? "s" : "") | cmd + + if (data[9]) { + print ".SH\nAbout the Story" | cmd + gsub("\n\n", "\n.LP\n", data[9]) + print ".LP\n" data[9] | cmd + } + + if (reviews["length"]) { + print ".SH\nEditorial Reviews" | cmd + for (i = 1; i <= reviews["length"]; i++) { + print ".SH\n" reviews[i, "sourcename"] | cmd + print ".IP URL\n" reviews[i, "url"] | cmd + if (reviews[i, "summary"]) + print ".SH\n" reviews[i, "summary"] | cmd + if (reviews[i, "review"]) + print ".IP\n" reviews[i, "review"] | cmd + } + } + if (links["length"]) { + print ".SH\nExternal Links" | cmd + if (data[14]) + print ".LP\n" data[14] | cmd + for (i = 1; i <= links["length"]; i++) { + print ".SH\n" links[i, "title"] | cmd + print ".IP URL\n" links[i, "url"] | cmd + if (links[i, "desc"]) + print ".IP\n" links[i, "desc"] | cmd + if (links[i, "fmtdesc"]) { + print ".IP\n" links[i, "fmtdesc"] | cmd + print ".IP\n" links[i, "fmtdesclink"] | cmd + } + } + } + + close(cmd) +} +function keyvalue(key, value, file, w) { + if (length(key ": " value) <= w) { + printf("%s: %s\n", key, value) >> file + return + } + printf("%s:\n", key) >> file + foldinto(sprintf("%s\n", value), w, " ", file) +} +function flushdescription_(file, + i, refs, temp) { +# file = data[1] ".txt" +# file = "/dev/stdout" + + printf("") > file + foldinto(sprintf("%s\n", data[2]), 80, "", file) + printf("--------------------------------------------------------------------------------\n") >> file + + keyvalue("Author(s)", data[4], file, 80) +# foldinto(sprintf("Author(s): %s\n", data[4]), 80, " ", file) + if (data[10]) + printf("Genre: %s\n", data[10]) >> file + if (data[13]) + printf("Website: %s\n", data[13]) >> file + if (data[12]) + printf("Language: %s\n", data[12]) >> file + if (data[7]) + printf("First Publication Date: %s\n", data[7]) >> file + if (data[8]) + printf("License: %s\n", data[8]) >> file + if (data[11]) + printf("Forgiveness Rating: %s\n", data[11]) >> file + if (ratings["stars"]) + printf("Rating: %s (based on %s rating%s)\n", ratings["stars"], ratings["count"], ratings["count"] > 1 ? "s" : "") >> file + + if (data[9]) { + printf("\n\nABOUT THE STORY\n\n") >> file + foldinto(data[9], 80, " ", file) + } + + if (links["length"]) { + printf("\n\nEXTERNAL LINKS\n") >> file + for (i = 1; i <= links["length"]; i++) { + printf("\n %s <%s>\n", links[i, "title"], links[i, "url"]) >> file + if (links[i, "desc"]) + foldinto(links[i, "desc"], 80, " ", file) + if (links[i, "fmtdesc"]) { + temp = links[i, "fmtdesc"] + if (links[i, "fmtdesclink"]) { + if (!refs["set", links[i, "fmtdesclink"]]) { + refs["length"]++ + refs[refs["length"]] = links[i, "fmtdesclink"] + refs["set", links[i, "fmtdesclink"]] = refs["length"] + } + temp = temp sprintf("[%s]", refs["set", links[i, "fmtdesclink"]]) + } + foldinto(temp, 80, " ", file) + } + } + } + + if (reviews["length"]) { + printf("\n\nEDITORIAL REVIEWS\n") >> file + for (i = 1; i <= reviews["length"]; i++) { + printf("\n %s\n", reviews[i, "sourcename"]) >> file + printf(" ") >> file + if (reviews[i, "summary"]) + printf("%s ", reviews[i, "summary"]) >> file + printf("<%s>\n", reviews[i, "url"]) >> file + if (reviews[i, "review"]) + foldinto(reviews[i, "review"], 80, " > ", file) + } + } + + if (refs["length"]) { + printf("\n\nREFERENCES\n\n") >> file + for (i = 1; i <= refs["length"]; i++) + printf(" [%s] <%s>\n", i, refs[i]) >> file + } + + close(file) +} +function gphescape(s, f) { + gsub(" ", " ", s) + gsub("\n", " ", s) + if (f) + gsub("^\\[", "[|&", s) + else + gsub("\\|", "\\|", s) + return s +} +function gphitem(type, text, selector, server, port, file) { + printf("[%c|%s|%s|%s|%s]\n", type, gphescape(text), gphescape(selector), server, port) >> file +} +function flushmenu(file) { + printf("") > file + gphitem("0", sprintf("About \"%s\"", data[2]), "./" data[1] ".txt", "server", "port", file) + foldinto(sprintf("%s\n", data[2]), 80, "", file) + + close(file) +} +function getlink(s, + i) { + if (!match(s, /href="[^"]*"/)) + return "" + return substr(s, RSTART + length("href=\""), RLENGTH - length("href=\"") - 1) +} +function flush(tuid) { + print tuid > "/dev/stderr" + flushdescription_(tuid ".txt") +# flushmenu(tuid ".gph") + printf("%s\t%s\n", tuid ".txt", data[2]) >> "index.txt" +} +BEGIN { + printf("") > "index.txt" +} +tuid && $1 != tuid { + flush(tuid) + + delete links + delete reviews + delete ratings + delete data +} +$1 != tuid { + for (i = 1; i <= 14; i++) { + $i = removehtmltags($i) + $i = resolvehtmlentities($i) + data[i] = $i + } + ratings["stars"] = $27 + ratings["count"] = $28 + tuid = $1 +} +$17 && !links["url", $17] { + links["length"]++ + links[links["length"], "title"] = removehtmltags($15) + links[links["length"], "desc"] = removehtmltags($16) + links[links["length"], "url"] = removehtmltags($17) + + links[links["length"], "externid"] = removehtmltags($18) + links[links["length"], "fmtname"] = removehtmltags($19) + links[links["length"], "fmtdesc"] = removehtmltags($20) + links[links["length"], "fmtdesclink"] = getlink($20) + + links["url", $17]++ +} +$21 && !reviews["url", $21] { + reviews["length"]++ + reviews[reviews["length"], "url"] = removehtmltags($21) + reviews[reviews["length"], "sourcename"] = removehtmltags($22) + reviews[reviews["length"], "sourceurl"] = removehtmltags($23) + reviews[reviews["length"], "summary"] = removehtmltags($24) + reviews[reviews["length"], "review"] = removehtmltags($25) + reviews[reviews["length"], "rating"] = removehtmltags($26) + + reviews["url", $21]++ +} +END { + flush(tuid) +} +' + +sort -t ' ' -k2 index.txt | \ +gawk -v"FS=\t" ' +function gphescape(s, f) { + gsub(" ", " ", s) + gsub("\n", " ", s) + if (f) + gsub("^\\[", "[|&", s) + else + gsub("\\|", "\\|", s) + return s +} +function gphitem(type, text, selector, server, port, file) { + printf("[%c|%s|%s|%s|%s]\n", type, gphescape(text), gphescape(selector), server, port) >> file +} +{ + gphitem("0", $2, "./" $1, "servere", "port", "index.gph") +} +'