commit
04698dff4e
@ -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 |
Loading…
Reference in new issue