phlog-index - annna - Annna the nice friendly bot. HTML git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/ DIR Log DIR Files DIR Refs DIR Tags DIR README --- phlog-index (3520B) --- 1 #!/bin/sh 2 3 export PATH="$PATH:/home/annna/bin" 4 5 doforce=0 6 if [ $# -gt 0 ]; 7 then 8 if [ "$1" = "-f" ]; 9 then 10 doforce=1 11 fi 12 fi 13 14 base="$HOME/phlogs" 15 cache="$base/cache" 16 gopherbase="/usr/%s/phlog/%s" 17 ircchans="#bitreich-en #bitreich-de #bitreich-fr #bitreich-nl #bitreich-con #bitreich-it irc.libera.chat/#gopherproject #bitreich-zh" 18 19 find /home/*/gopher/phlog \ 20 -name "*.md" \ 21 -printf "%f %T@ %u %p\n" > $cache/lsr.new 22 23 cd $cache 24 25 if [ -e lsr.old ] && [ $doforce -eq 0 ]; 26 then 27 diff lsr.new lsr.old > lsr.diff 28 else 29 cp lsr.new lsr.diff 30 fi 31 32 if [ $(stat --printf="%s" lsr.diff) -eq 0 ]; 33 then 34 exit 0 35 fi 36 37 # First create the links for all news. 38 cat lsr.new \ 39 | sort -r \ 40 | while read f; 41 do 42 IFS=' ' read -r fname unixt user fpath <<< $f 43 tstamp="$(sed -n 1p "$fpath" | cut -d' ' -f 2)" 44 [ -z "$tstamp" ] && continue 45 title="$(sed -n 3p "$fpath" | sed 's,\t, ,g; s,|,\\|,g';)" 46 [ -z "$title" ] && continue 47 48 gphpth="$(printf "$gopherbase" "$user" "$fname")" 49 printf "[0|%s – »%s« by %s|%s|server|port]\n" \ 50 "$tstamp" "$title" "$user" \ 51 "$gphpth" 52 done \ 53 > ../agg.gph 54 55 # Create the atom feed. Only the first 64 news items. 56 cat lsr.new \ 57 | sort -r \ 58 | head -n 64 \ 59 | while read f; 60 do 61 IFS=' ' read -r fname unixt user fpath <<< $f 62 tstamp="$(sed -n 1p "$fpath" | cut -d' ' -f 2-)" 63 [ -z "$tstamp" ] && continue 64 title="$(sed -n 3p "$fpath" | sed 's,\t, ,g')" 65 [ -z "$title" ] && continue 66 67 updated="$(date -d "${tstamp}" -u +%FT%T%z)" 68 gphpth="$(printf "$gopherbase" "$user" "$fname")" 69 furi="$(printf "gophers://bitreich.org/0%s" "$gphpth")" 70 printf "\t\t<entry>\n" 71 printf "\t\t<id>%s</id>\n" "$furi" 72 printf "\t\t<title><![CDATA[%s]]></title>\n" "$title" 73 printf "\t\t<link href=\"%s\" />\n" "$furi" 74 printf "\t\t<author><name>%s</name></author>\n" "$user" 75 printf "\t\t<content type=\"text\"><![CDATA[" 76 cat $fpath 77 printf "]]></content>\n" 78 printf "\t\t<updated>%s</updated>\n" "$updated" 79 printf "\t\t</entry>\n" 80 done \ 81 > ../agg.atom.xml 82 83 # Talk to IRC about the news. 84 if [ $doforce -eq 0 ]; 85 then 86 cat lsr.diff \ 87 | sort \ 88 | while read f; 89 do 90 IFS=' ' read -r dire fname unixt user fpath <<< $f 91 [ -z "$fpath" ] && continue 92 [ -z "$user" ] && continue 93 [ -z "$unixt" ] && continue 94 [ -z "$fname" ] && continue 95 [ -z "$dire" ] && continue 96 97 # If the post disappeared, don't tell IRC. 98 [ "$dire" = ">" ] && continue 99 100 tstamp="$(sed -n 1p "$fpath" | cut -d' ' -f 2)" 101 [ -z "$tstamp" ] && continue 102 title="$(sed -n 3p "$fpath" | sed 's,\t, ,g')" 103 [ -z "$title" ] && continue 104 105 gphpth="$(printf "$gopherbase" "$user" "$fname")" 106 107 for chan in $ircchans; 108 do 109 annna-say -c "$chan" \ 110 "$(printf "%s – »%s« by %s gophers://bitreich.org/0%s" \ 111 "$tstamp" "$title" "$user" "$gphpth")" 112 # Case against channel flood. 113 sleep 1 114 done 115 # Case against news flood. 116 sleep 2 117 done 118 fi 119 120 cp lsr.new lsr.old 121 122 # Now change the gph files in a really easy way. 123 { 124 printf "/ News Aggregator /+2,/ Introduction /-6d\n" 125 printf "/ News Aggregator /+1r !cat /home/annna/phlogs/agg.gph | head -n 4\n" 126 printf "w\nq\n" 127 } | ed -s /br/gopher/bitreich.gph 128 129 { 130 printf "/ News Aggregator /+1,\$-3d\n" 131 printf "? News Aggregator ?r !cat /home/annna/phlogs/agg.gph\n" 132 printf "w\nq\n" 133 } | ed -s /br/gopher/news.gph 134 135 # Make the atom news file ready for consumption. 136 { 137 printf "/updated/+1,\$-1d\n" 138 printf "?updated?c\n" 139 printf "\t<updated>%s</updated>\n" "$(date -u +%FT%T%z)" 140 printf ".\n" 141 printf "?updated?r !cat /home/annna/phlogs/agg.atom.xml\n" 142 printf "w\nq\n" 143 } | ed -s /br/gopher/news.atom.xml 144