From 04698dff4e667c61ff959ec8a991204d89641e09 Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Sun, 3 Feb 2019 15:29:00 +0000 Subject: initial commit --- bbsh | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100755 bbsh diff --git a/bbsh b/bbsh new file mode 100755 index 0000000..51e2c13 --- /dev/null +++ b/bbsh @@ -0,0 +1,171 @@ +#!/bin/sh + +BDIR="/var/bbs/boards" + +###### +NUMW='3' +BRDW='18' +TITW='50' +TRDW='12' +TOTW="$(echo "$NUMW+$BRDW+$TITW+$TRDW" | bc)" +HR="------------------------------------------------------------------------------\n" + + +#set -x + +###### +PROMPT='COMMAND :> ' +DFLTBOARD="" +DFLTPAGER=${PAGER:-"less"} +CURBOARD=${1:-"$DFLTBOARD"} + +##function +__prompt(){ + + printf '[%s] %s' "$CURBOARD" "$PROMPT" +} + +##function +__board_prompt(){ + printf "%s" "Go to which board? (use index) " +} + +##function +__thread_prompt(){ + printf "%s" "Read which thread? " +} + +##function +select_board(){ + __board_prompt + read -r board + NEW_BOARD="$(ls "$BDIR" | tail -n +"$board" | head -1)" + [ -z "${NEW_BOARD}" ] && echo "invalid board number" && return 1 + return 0 + +} + +##function +get_boards(){ + echo $(ls "${BDIR}") +} + + +##function +show_boards(){ + + printf -- "$HR" + for b in $(get_boards); do + t="$(head -1 "$BDIR/$b"/topic | sed -E 's/^(.{50}).*/\1/g')" + n="$(ls "$BDIR/$b" | grep -E "^[0-9]+" | wc -l | sed -E 's/ //g')" + printf "%-"$BRDW"s %-"$TITW"s [ %2s boards ]\n" "$b" "$t" "$n" + done | sort | nl -v1 -w3 -s " " + printf -- "$HR" + +} + +##function +show_help(){ + + printf '%s\n' \ + ' [Bulletin Boards Commands]'\ + ' ----------------------------------------------------------'\ + ' (l)ist ......... List all available boards'\ + ' (g)oto ......... Goto a board by name or number'\ + ' (h)elp ......... Show this help message'\ + ' (m)essages...... List all messages in current board'\ + ' (t)ype ......... Display the contents of a message thread'\ + ' (q)uit ......... Quit bbsh' +} + +##function +print_thread_title(){ + + date="$(echo "$(basename $1)" | cut -d "-" -f 1 )" + author="$(echo "$(basename $1)" | cut -d "-" -f 2)" + subject="$(head -1 $1/subject | sed -E 's/^(.{50}).*/\1/g')" + posts="$(ls $1 | grep -v '^subject$' | wc -l | sed -E 's/\ +//g')" + printf "%-10s %-16s %-"$TITW"s [ %2s posts ]\n" "$date" "$author" "$subject" "$posts" +} + + +##function +list_board_messages(){ + [ -z "$CURBOARD" ] && { + printf "%s\n" "Not at any board! Hit `l` to list boards, `g` to go to one." + return + } + printf -- "$HR" + for i in $(ls $BDIR/$CURBOARD | sort -rn | grep -v "^topic") ; do + print_thread_title "$BDIR/$CURBOARD/$i" + done | sort -rk1 | nl -w3 -v1 -s" " + printf -- "$HR" +} + +##function +type_message(){ + + subject="$2" + author="$(echo $(basename $1) | cut -d "-" -f 2)" + date="$(echo $(basename $1) | cut -d "-" -f 1)" + printf -- "--------------------------\n" + printf "SUBJECT: %s\n" "$subject" + printf "AUTHOR: %s\n" "$author" + printf "POSTED: %s\n" "$date" + printf -- "--------------------------\n" + cat $1 + +} + + +##function +type_thread(){ + [ -z "$CURBOARD" ] && { + printf "%s\n" "Not at any board! Hit `l` to list boards, `g` to go to one." + return + } + __thread_prompt + read -r thread + THREAD="$(ls "$BDIR/$CURBOARD" | sort -rn | grep -v "^topic$" | tail -n +"$thread" | head -1)" + [ -z "${THREAD}" ] && echo "Invalid thread index!" && return 1 + subject="$(head -1 "$BDIR/$CURBOARD/$THREAD/subject")" + for i in $(ls "$BDIR/$CURBOARD/$THREAD" | sort -n | grep -v "^subject$"); do + type_message "$BDIR/$CURBOARD/$THREAD/$i" "$subject" + done | ${DFLTPAGER} + +} ##function +read_cmd(){ + __prompt + while read -r cmd; do + case $cmd in + + g) + select_board + [ $? -eq 0 ] && exec $0 ${NEW_BOARD} + ;; + h) + show_help + ;; + l) + show_boards + ;; + q) + exit 0 + ;; + m) + list_board_messages + ;; + t) + type_thread + ;; + *) + show_boards + ;; + esac + __prompt + done +} + + +show_boards +read_cmd -- cgit v1.2.3