wrpr-bbs

wrpr.us Bash BBS
git clone git://git.wrpr.us/wrpr-bbs
Log | Files | Refs | README

bbs (8338B)


      1 #!/bin/bash
      2 clear;
      3 prompt="COMMAND:> "
      4 today=$( date +%Y-%m-%d )
      5 time=$( date +%r )
      6 PS3="Please Select: "
      7 line="\e[1;34m=====================================================================\e[0m\n"
      8 line2="\n================================================================================\n"
      9 line3="\n-------------------------------\n"
     10 boardheader="[\e[1;32mBOARDS\e[0m]\t[\e[1;32mPOSTS\e[0m]\t[\e[1;32mTOPICS\e[0m]"
     11 #header="\e[1;34mW R P R . U S - BULLETIN BOARD 1.0.1\e[0m"
     12 header="\e[1;34m  
     13 		     _    _
     14 __ __ ___ _ _ __ _ _| |__| |__ ___
     15 \ V  V / '_| '_ \ '_| '_ \ '_ (_-<
     16  \_/\_/|_| | .__/_| |_.__/_.__/__/
     17            |_|
     18 \e[0m"
     19 boarddir="/userspace/bbs/"
     20 bindex="$boarddir/.boardindex"
     21 barchive="$boarddir/.archive"
     22 
     23 bnum='18'
     24 bnum2='50'
     25 DFLTBOARD=""
     26 DFLTPAGER=${PAGER:-"less"}
     27 CURBOARD=${1:-"$DFLTBOARD"}
     28 
     29 rm -rf $boarddir/post
     30 prompt(){
     31      printf '<%s> %s' "$CURBOARD" "$prompt" 
     32 }
     33 
     34 helpp(){
     35 	printf '
     36  Basic commands:
     37  g -------- goto a board    
     38  l -------- list threads
     39  t ------- view a thread
     40  p --------- make a post
     41  b ---- make a new board
     42  h ------ print this msg
     43 
     44  RULES:
     45  1. Please keep titles (no spaces) and subject entries short! 
     46  2. Do not open exessive boards, Keep it on topic. 
     47     Unused boards might be removed by a Janitor!
     48  3. Boards may be removed at anytime, for any reason!
     49  4. Have fun and be friendly!
     50 '
     51 }
     52         
     53         
     54 
     55         board(){
     56             printf "new board name (NO SPACES): "
     57             read boardname;
     58             printf "topic?: "
     59             read topic
     60         	mkdir $boarddir/$boardname
     61             touch $boarddir/$boardname/.btopic
     62             chmod 777 $boarddir/$boardname
     63             printf "\t\e[1;34m$topic\e[0m\n " >> $boarddir/$boardname/.btopic
     64             chmod -R 776 $boarddir/$boardname/.btopic
     65             chown $USER:userlog $boarddir/$boardname
     66         }
     67 
     68 
     69         post(){
     70              [ -z "$CURBOARD" ] && {
     71                     printf "board?: "
     72                     read boardsel
     73                     printf "subject: "
     74                     read subject
     75                     printf "say what: "
     76                     read post
     77                     printf "SUBJECT: $subject\nUSER: \e[1;33m$USER\e[0m\nDATE: [$today-$time]\n - \n$post\n$line\n" >> $boarddir/$boardsel/master
     78         
     79                 }
     80             }
     81 
     82         article(){
     83              [ -z "$CURBOARD" ] && {
     84                 printf "%s\n" "Not at any board!  Hit 'enter' to list boards, 'g' to go to one."
     85                         return
     86         }
     87             printf "title (NO SPACES): "
     88             read title
     89             printf "name? "
     90             read name
     91             printf "subject: "
     92             read subject
     93             mkdir $boarddir/$CURBOARD/$title-$USER 
     94             chmod 755 $boarddir/$CURBOARD/$title-$USER
     95             touch $boarddir/$CURBOARD/$title-$USER/post || printf "Already exists"
     96             chmod 755 $boarddir/$CURBOARD/$title-$USER/post
     97             vi $boarddir/$CURBOARD/$title-$USER/post
     98             touch $boarddir/$CURBOARD/$title-$USER/.topic
     99             printf "SUBJECT: $subject\nUSER: $name ($USER)\nDATE: $today $time\n" >> $boarddir/$CURBOARD/$title-$USER/.topic
    100 
    101             #boardlist
    102     }
    103 
    104 
    105         view(){
    106             printf "what board: "
    107             read whatboard
    108             clear
    109             head -n2 $boarddir/$whatboard/master 
    110             tail -n80 $boarddir/$whatboard/master #|| clear && printf "\n\e[1;31mNothing here... Check spelling or open a new board!\e[0m\n"
    111        
    112         }
    113 
    114 
    115         deposit(){
    116             printf "board to deposit to archive: "
    117             read -r board
    118             dep_board="$(ls "$boarddir" | tail -n +"$board" | head -1)"
    119             [ -z "${dep_board}" ] && echo "invalid board number" && return 1 
    120             mv $boarddir/$dep_board $barchive || printf "\nYou cannot deposit other users boards" 
    121             return 0 
    122         }
    123 
    124 
    125 		quit(){
    126 			clear
    127             echo "Goodbye!"
    128 			exit
    129 		}
    130 
    131 
    132 get_boards(){
    133         echo $(ls "${boarddir}")
    134 }
    135 
    136 
    137 
    138 select_board(){
    139         printf "what board num: "
    140         read -r board
    141         NEW_BOARD="$(ls "$boarddir" | tail -n +"$board" | head -1)"
    142         [ -z "${NEW_BOARD}" ] && echo "invalid board number" && return 1 
    143         return 0 
    144 
    145 }
    146 
    147 boardlist(){
    148         #clear
    149         printf "$header\nh -- help"
    150         printf "$line2"
    151         printf "$boardheader\n"
    152         for b in $(get_boards); do
    153                 t="$(head -1 "$boarddir/$b"/.btopic | sed -E 's/^(.{50}).*/\1/g')"
    154                 n="$(ls "$boarddir/$b" | grep -E "^[0-9]+" | wc -l | sed -E 's/ //g')"
    155                 filecount=$(find $boarddir/$b -type d | wc -l | awk '{$1--}1')
    156                 printf "%-12s [ %-2s] %2s \n" "$b" "$filecount" "$t" 
    157         done | sort | nl -v1 -w3 -s " "
    158         printf "$line2"
    159 
    160 }
    161 
    162 
    163 read_reply(){
    164     cat $boarddir/$CURBOARD/$THREAD/replies/* 
    165 
    166 }
    167 
    168 
    169 
    170 type_thread(){
    171         [ -z "$CURBOARD" ] && {
    172                 printf "%s\n" "Not at any board!  Hit 'enter' to list boards, 'g' to go to one."
    173                         return
    174         }
    175         printf "Select Post num: " 
    176         read -r thread
    177         THREAD="$(ls "$boarddir/$CURBOARD" | sort -rn | grep -v "^.topic$" | tail -n +"$thread" | head -1)"
    178         [ -z "${THREAD}" ] && echo "Invalid thread index!" && return 1
    179         subject="$(head -n6 "$boarddir/$CURBOARD/$THREAD/.topic")"
    180         #reply="$(cat "$boarddir/$CURBOARD/$THREAD/*.reply")"
    181         for i in $(ls "$boarddir/$CURBOARD/$THREAD" | sort -n | grep -v "^subject$"); do
    182             printf "$line3$subject$line3"
    183             cat $boarddir/$CURBOARD/$THREAD/post
    184         done | ${DFLTPAGER}
    185 }
    186 
    187 
    188 
    189 
    190 list_board_messages(){
    191         [ -z "$CURBOARD" ] && {
    192                 printf "\n%s\n" "Not at any board!  Hit 'enter' to list boards, 'g' to go to one."
    193                         return
    194         }
    195         printf "$line2"
    196         for i in $(ls $boarddir/$CURBOARD | sort -rn | grep -v "^.topic") ; do
    197                 print_thread_title "$boarddir/$CURBOARD/$i" || printf "no posts, maybe make one?"
    198         done | sort -rk1 | nl -w3 -v1 -s" "
    199         printf "$line2"
    200 }
    201 
    202 
    203 print_thread_title(){
    204 
    205         #date="$(echo "$(basename $1)" | cut -d "S" -f3 )"
    206         date="$(head -n1 $1/.topic | sed 's/^[^ ]* / /') "
    207         author="$(head -n2 $1/.topic | sed 's/^[^ ]* / /' | cut -f3 -d":" ) "
    208         #author="$(echo "$(basename $1)" | cut -d "-" -f 2)"
    209         subject="$(tail -n1 $1/.topic | sed 's/^[^ ]* / /')" 
    210         posts="$(ls $1 | grep -v '^SUBJECT$' | wc -l | sed -E 's/\ +//g')"
    211         printf "%-"10"s %-16s\n" "$subject"" |""$date"
    212 }
    213 
    214 viewselect(){
    215         echo $(ls "${boarddir}")
    216 }
    217 
    218 post_reply(){
    219         [ -z "$CURBOARD" ] && {
    220                 printf "%s\n" "Not at any board!  Hit 'enter' to list boards, 'g' to go to one."
    221                         return
    222         }
    223         printf "Select Post num: " 
    224         read -r thread
    225         THREAD="$(ls "$boarddir/$CURBOARD" | sort -rn | grep -v "^.topic$" | tail -n +"$thread" | head -1)"
    226         [ -z "${THREAD}" ] && echo "Invalid thread index!" && return 1
    227             printf "title (NO SPACES): "
    228             read title
    229             printf "name? "
    230             read name
    231             printf "subject: "
    232             read subject
    233             touch $boarddir/$CURBOARD/$THREAD/$title.reply || printf "Already exists"
    234             vi $boarddir/$CURBOARD/$THREAD/$title.reply
    235 
    236 }
    237 
    238 		comm(){
    239 			prompt
    240 			while read -n 1 cmd; do
    241 				case $cmd in
    242 
    243 	            q)
    244 			quit
    245 			;;
    246                     b)
    247                         board
    248                         ;;
    249                     p)
    250                         printf "\n"; article
    251                         ;;
    252                     h)
    253 			helpp
    254 			;;
    255                     g)
    256                         printf "\n"; select_board
    257                         [ $? -eq 0 ] && exec $0 ${NEW_BOARD} 
    258                         ;;
    259                     t)
    260                         printf "\n"; type_thread
    261                         ;;
    262                     l)
    263                         list_board_messages
    264                         ;;
    265                   #  r)
    266                   #      post_reply
    267                   #      ;;
    268                     
    269                      d)
    270                          deposit
    271                          ;;
    272 
    273                      
    274                      *)
    275                         clear; boardlist
    276                         ;;
    277 
    278 
    279 				esac
    280 				prompt
    281 			done
    282 		}
    283 
    284 
    285 boardlist
    286 comm
    287