wrpr-bbs

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

commit c7c66065141e314c458087c63898b0effa541ae3
Author: William (wrpr.us) <x@linear.codes>
Date:   Fri, 19 Jan 2024 12:59:29 -0500

Initital bbs commit

Diffstat:
AMakefile | 10++++++++++
AREADME.md | 1+
Abbs | 287+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 298 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile @@ -0,0 +1,10 @@ +PREFIX ?= /usr + +all: + @echo RUN \'make install\' to install bbs + +install: + @install -Dm755 bbs $(DESTDIR)$(PREFIX)/bin/bbs + +uninstall: + @rm -f $(DESTDIR)$(PREFIX)/bin/bbs diff --git a/README.md b/README.md @@ -0,0 +1 @@ +wrpr.us bbs - a sloppy shell bbs that's somewhat of a Frankenstein script diff --git a/bbs b/bbs @@ -0,0 +1,287 @@ +#!/bin/bash +clear; +prompt="COMMAND:> " +today=$( date +%Y-%m-%d ) +time=$( date +%r ) +PS3="Please Select: " +line="\e[1;34m=====================================================================\e[0m\n" +line2="\n================================================================================\n" +line3="\n-------------------------------\n" +boardheader="[\e[1;32mBOARDS\e[0m]\t[\e[1;32mPOSTS\e[0m]\t[\e[1;32mTOPICS\e[0m]" +#header="\e[1;34mW R P R . U S - BULLETIN BOARD 1.0.1\e[0m" +header="\e[1;34m + _ _ +__ __ ___ _ _ __ _ _| |__| |__ ___ +\ V V / '_| '_ \ '_| '_ \ '_ (_-< + \_/\_/|_| | .__/_| |_.__/_.__/__/ + |_| +\e[0m" +boarddir="/userspace/bbs/" +bindex="$boarddir/.boardindex" +barchive="$boarddir/.archive" + +bnum='18' +bnum2='50' +DFLTBOARD="" +DFLTPAGER=${PAGER:-"less"} +CURBOARD=${1:-"$DFLTBOARD"} + +rm -rf $boarddir/post +prompt(){ + printf '<%s> %s' "$CURBOARD" "$prompt" +} + +helpp(){ + printf ' + Basic commands: + g -------- goto a board + l -------- list threads + t ------- view a thread + p --------- make a post + b ---- make a new board + h ------ print this msg + + RULES: + 1. Please keep titles (no spaces) and subject entries short! + 2. Do not open exessive boards, Keep it on topic. + Unused boards might be removed by a Janitor! + 3. Boards may be removed at anytime, for any reason! + 4. Have fun and be friendly! +' +} + + + + board(){ + printf "new board name (NO SPACES): " + read boardname; + printf "topic?: " + read topic + mkdir $boarddir/$boardname + touch $boarddir/$boardname/.btopic + chmod 777 $boarddir/$boardname + printf "\t\e[1;34m$topic\e[0m\n " >> $boarddir/$boardname/.btopic + chmod -R 776 $boarddir/$boardname/.btopic + chown $USER:userlog $boarddir/$boardname + } + + + post(){ + [ -z "$CURBOARD" ] && { + printf "board?: " + read boardsel + printf "subject: " + read subject + printf "say what: " + read post + printf "SUBJECT: $subject\nUSER: \e[1;33m$USER\e[0m\nDATE: [$today-$time]\n - \n$post\n$line\n" >> $boarddir/$boardsel/master + + } + } + + article(){ + [ -z "$CURBOARD" ] && { + printf "%s\n" "Not at any board! Hit 'enter' to list boards, 'g' to go to one." + return + } + printf "title (NO SPACES): " + read title + printf "name? " + read name + printf "subject: " + read subject + mkdir $boarddir/$CURBOARD/$title-$USER + chmod 755 $boarddir/$CURBOARD/$title-$USER + touch $boarddir/$CURBOARD/$title-$USER/post || printf "Already exists" + chmod 755 $boarddir/$CURBOARD/$title-$USER/post + vi $boarddir/$CURBOARD/$title-$USER/post + touch $boarddir/$CURBOARD/$title-$USER/.topic + printf "SUBJECT: $subject\nUSER: $name ($USER)\nDATE: $today $time\n" >> $boarddir/$CURBOARD/$title-$USER/.topic + + #boardlist + } + + + view(){ + printf "what board: " + read whatboard + clear + head -n2 $boarddir/$whatboard/master + tail -n80 $boarddir/$whatboard/master #|| clear && printf "\n\e[1;31mNothing here... Check spelling or open a new board!\e[0m\n" + + } + + + deposit(){ + printf "board to deposit to archive: " + read -r board + dep_board="$(ls "$boarddir" | tail -n +"$board" | head -1)" + [ -z "${dep_board}" ] && echo "invalid board number" && return 1 + mv $boarddir/$dep_board $barchive || printf "\nYou cannot deposit other users boards" + return 0 + } + + + quit(){ + clear + echo "Goodbye!" + exit + } + + +get_boards(){ + echo $(ls "${boarddir}") +} + + + +select_board(){ + printf "what board num: " + read -r board + NEW_BOARD="$(ls "$boarddir" | tail -n +"$board" | head -1)" + [ -z "${NEW_BOARD}" ] && echo "invalid board number" && return 1 + return 0 + +} + +boardlist(){ + #clear + printf "$header\nh -- help" + printf "$line2" + printf "$boardheader\n" + for b in $(get_boards); do + t="$(head -1 "$boarddir/$b"/.btopic | sed -E 's/^(.{50}).*/\1/g')" + n="$(ls "$boarddir/$b" | grep -E "^[0-9]+" | wc -l | sed -E 's/ //g')" + filecount=$(find $boarddir/$b -type d | wc -l | awk '{$1--}1') + printf "%-12s [ %-2s] %2s \n" "$b" "$filecount" "$t" + done | sort | nl -v1 -w3 -s " " + printf "$line2" + +} + + +read_reply(){ + cat $boarddir/$CURBOARD/$THREAD/replies/* + +} + + + +type_thread(){ + [ -z "$CURBOARD" ] && { + printf "%s\n" "Not at any board! Hit 'enter' to list boards, 'g' to go to one." + return + } + printf "Select Post num: " + read -r thread + THREAD="$(ls "$boarddir/$CURBOARD" | sort -rn | grep -v "^.topic$" | tail -n +"$thread" | head -1)" + [ -z "${THREAD}" ] && echo "Invalid thread index!" && return 1 + subject="$(head -n6 "$boarddir/$CURBOARD/$THREAD/.topic")" + #reply="$(cat "$boarddir/$CURBOARD/$THREAD/*.reply")" + for i in $(ls "$boarddir/$CURBOARD/$THREAD" | sort -n | grep -v "^subject$"); do + printf "$line3$subject$line3" + cat $boarddir/$CURBOARD/$THREAD/post + done | ${DFLTPAGER} +} + + + + +list_board_messages(){ + [ -z "$CURBOARD" ] && { + printf "\n%s\n" "Not at any board! Hit 'enter' to list boards, 'g' to go to one." + return + } + printf "$line2" + for i in $(ls $boarddir/$CURBOARD | sort -rn | grep -v "^.topic") ; do + print_thread_title "$boarddir/$CURBOARD/$i" || printf "no posts, maybe make one?" + done | sort -rk1 | nl -w3 -v1 -s" " + printf "$line2" +} + + +print_thread_title(){ + + #date="$(echo "$(basename $1)" | cut -d "S" -f3 )" + date="$(head -n1 $1/.topic | sed 's/^[^ ]* / /') " + author="$(head -n2 $1/.topic | sed 's/^[^ ]* / /' | cut -f3 -d":" ) " + #author="$(echo "$(basename $1)" | cut -d "-" -f 2)" + subject="$(tail -n1 $1/.topic | sed 's/^[^ ]* / /')" + posts="$(ls $1 | grep -v '^SUBJECT$' | wc -l | sed -E 's/\ +//g')" + printf "%-"10"s %-16s\n" "$subject"" |""$date" +} + +viewselect(){ + echo $(ls "${boarddir}") +} + +post_reply(){ + [ -z "$CURBOARD" ] && { + printf "%s\n" "Not at any board! Hit 'enter' to list boards, 'g' to go to one." + return + } + printf "Select Post num: " + read -r thread + THREAD="$(ls "$boarddir/$CURBOARD" | sort -rn | grep -v "^.topic$" | tail -n +"$thread" | head -1)" + [ -z "${THREAD}" ] && echo "Invalid thread index!" && return 1 + printf "title (NO SPACES): " + read title + printf "name? " + read name + printf "subject: " + read subject + touch $boarddir/$CURBOARD/$THREAD/$title.reply || printf "Already exists" + vi $boarddir/$CURBOARD/$THREAD/$title.reply + +} + + comm(){ + prompt + while read -n 1 cmd; do + case $cmd in + + q) + quit + ;; + b) + board + ;; + p) + printf "\n"; article + ;; + h) + helpp + ;; + g) + printf "\n"; select_board + [ $? -eq 0 ] && exec $0 ${NEW_BOARD} + ;; + t) + printf "\n"; type_thread + ;; + l) + list_board_messages + ;; + # r) + # post_reply + # ;; + + d) + deposit + ;; + + + *) + clear; boardlist + ;; + + + esac + prompt + done + } + + +boardlist +comm +