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

ROSTER="gopher://sdf.org/1/users/ulcer/rss/roster"
GOPHER_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}/gopher-rss"
LOCAL_ROSTER="${GOPHER_HOME}/roster"
NB_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}/newsbeuter"
NB_URLS="${NB_HOME}/urls"
NB_EXECURL="${NB_HOME}/execurl"

FETCH="/usr/bin/curl -s"
# FETCH="/usr/bin/wget -O - -q"

: ${1?usage: gopher-rss \{ update | follow ID | unfollow ID \} }

die() { echo "$1"; exit 1; }

validate() {
    if [ -z "$1" ]; then die "Missing target."; fi
    case "$1" in
        *[!a-zA-Z0-9]*) die "Incorrect target name." ;;
    esac
}

case "$1" in
    update)
        mkdir -p "${GOPHER_HOME}" || die "Can't create home folder."
        ${FETCH} "${ROSTER}" | tr -d '\r' >"${LOCAL_ROSTER}"
        ;;
    follow)
        shift
        validate "$1"

        # process template
        awk -v target="$1" -v gh="${GOPHER_HOME}" -- '
            $0 ~ "^" target "[^a-zA-Z0-9]" {
                match($0, "^[a-zA-Z0-9]+"); sep = substr($0, RLENGTH + 1, 1)
                # remove duplicate separator
                gsub(sep "+", sep)
                split($0, args, sep)

                f = gh "/" args[2]
                arg_names["LINK"] = args[3]
                args[1] = args[2] = args[3] = ""

                # validate args
                for (i in args) {
                    if (args[i] !~ "^[a-z_]+=" || args[i] ~ "'\''")
                        args[i] = ""
                    else {
                        match(args[i], "=")
                        arg_names[ substr(args[i], 1, RSTART - 1) ] = \
                            substr(args[i], RSTART + 1)
                    }
                }

                # substitute all params
                while (getline < f == 1) {
                    for (i in arg_names) {
                        if ($0 ~ "^" i "=") {
                            $0 = i "=" "'\''" arg_names[i] "'\''"
                            break
                        }
                    }
                    print
                }
                exit
            }
        ' "${LOCAL_ROSTER}" >"${NB_EXECURL}/gopher-$1"
        if [ ! -s "${NB_EXECURL}/gopher-$1" ]; then
            rm -f "${NB_EXECURL}/gopher-$1"
            die "Something went wrong, possibly missing template."
        fi
        chmod +x "${NB_EXECURL}/gopher-$1"

        # update newsbeuter urls
        egrep -q "^exec:.*/gopher-$1 " "${NB_URLS}" || \
            echo "exec:${NB_EXECURL}/gopher-$1 gopher" >>"${NB_URLS}"
        ;;
    unfollow)
        shift
        validate "$1"
        # remove scraper
        rm -f "${NB_EXECURL}/gopher-$1"

        # update newsbeuter urls
        tmp=$( mktemp )
        trap 'rm -f "${tmp}"' INT TERM KILL
        sed "\,^exec:.*/gopher-$1 ,d" "${NB_URLS}" >"${tmp}"
        mv "${tmp}" "${NB_URLS}"
        ;;
esac

