summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbbsh171
1 files changed, 171 insertions, 0 deletions
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