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