#!/bin/sh
# Liferea/newsbeuter compatible RSS generator from gopher slerm phlog
# gopher://sdf.org/1/users/ulcer/rss
# ulcer <ulcer@sdf.org>, WTFPL, 2017

# slerm link for roster should be like "/cgi-bin/slerm"

FETCH="/usr/bin/curl --retry 0 -s -L -m 8 --retry-delay 1 -N"
# FETCH="/usr/bin/wget -O - -c -t 1 -q"
LINK="gopher://sdf.org/1/users/slugmax/cgi-bin/slerm"

# number of articles to download
count=10
# skip n lines
head_n=20
# phlog entries separator
sep='\*\~\*\~'
# record link
rec_link="^1View Post or Comment"

# feed head

cat << EOF
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
    <title>$(basename $0)</title>
    <link>${LINK}</link>
    <description>phlog feed generated from gopher://sdf.org/1/users/ulcer/rss</description>
    <ttl>1800</ttl>

EOF

# articles

${FETCH} "${LINK}" | tr -d '\r' | awk -v head_n="${head_n}" -v sep="${sep}" \
    -v link="${LINK}" -v author="$(basename $0)" -v count="${count}" \
    -v rec_link="${rec_link}" -v fetch="${FETCH}" -- '
    (NR > head_n) && ($0 ~ sep) {
        if (article) { print "]]></description><link>" item_link "</link></item>" }
        # item - bool to close <item>
        item = 0
        if (++article > count) exit
        # record line counter
        i = 0
    }
    !article { next }
    /^$/ || /^i\t/ { next }
    { i++ }
    i == 2 {
        split($0, g, "\t")
        d = substr(g[1], 2)
        sub("^[^,]+, ", "", d)
        match(d, " ")
        d = substr(d, 1, 3) substr(d, RSTART)
        sub(" at .*$", "", d)
        print "<item><pubDate>" d "</pubDate><author>" author "</author>"
        item = 1
        next
    }
    i == 3 {
        split($0, g, "\t")
        print "<title>" substr(g[1], 2) "</title><description><![CDATA[<pre>"
        next
    }
    $0 ~ rec_link {
        split($0, g, "\t")
        
        # item link points to slerm dynamic page
        item_link = "gopher://" g[3] ":" g[4] "/1" g[2]

        # fetched link is plain text
        sub("/cgi-bin/slerm\\?", "/dat/", g[2])
        cmd = fetch " '\''gopher://" g[3] ":" g[4] "/0" g[2] "'\'' |" \
            "tr -d '\''\r'\''"

        system(cmd)
    }
    END { if (item) print "</pre>]]></description><link>" item_link "</link></item>" }
' - 2>/dev/null

# finish feed

cat << EOF
    </channel>
</rdf:RDF>
EOF

