commit c7c66065141e314c458087c63898b0effa541ae3
Author: William (wrpr.us) <x@linear.codes>
Date: Fri, 19 Jan 2024 12:59:29 -0500
Initital bbs commit
Diffstat:
| A | Makefile | | | 10 | ++++++++++ |
| A | README.md | | | 1 | + |
| A | bbs | | | 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
+