diff --git a/bunkdeck b/bunkdeck index 907abaf..590c05f 100755 --- a/bunkdeck +++ b/bunkdeck @@ -1,121 +1,156 @@ -#!/bin/bash -set -e +#!/bin/sh -e -heedPane="bunkdeck:0.0" -proclaimPane="bunkdeck:0.1" -shellPane="bunkdeck:0.2" +sessionname=bunkdeck +heedPane=bunkdeck:0.0 +proclaimPane=bunkdeck:0.1 +shellPane=bunkdeck:0.2 -function isExistingDeck { - set +e - sessions=$(tmux list-sessions) - set -e - - if [[ $sessions == *"bunkdeck"* ]]; then - return 0 - else - return 1 - fi +isExistingDeck () { + if tmux has -t $sessionname ; then + return 0 + else + return 1 + fi } -function startNewDeck { - tmux new -d -s bunkdeck heed - tmux split-window -h -t bunkdeck -p 70 - tmux split-window -t $heedPane -v -p 3 - tmux send-keys -t $proclaimPane 'proclaim' C-m - tmux send-keys -t $shellPane 'cowsay "press [CTRL+b then o] to cycle through panes"' C-m - # turn on pane titling - tmux select-pane -t $heedPane -T heed - tmux select-pane -t $proclaimPane -T proclaim - tmux select-pane -t $shellPane -T shell - tmux set -g set-titles on - # attach session to shell - tmux attach -t $shellPane +attachToDeck () { + # does not currently protect against nesting sessions (tmux does this for us) + tmux attach-session -d -t bunkdeck } -function killDeck { - tmux kill-session -t bunkdeck +startNewDeck () { + tmux new -d -s $sessionname heed + tmux split-window -h -t $sessionname -p 70 + tmux split-window -t $heedPane -v -p 3 + tmux send-keys -t $proclaimPane 'proclaim' C-m + tmux send-keys -t $shellPane 'cowsay "press [CTRL+b then o] to cycle through panes"' C-m + # turn on pane titling + tmux select-pane -t $heedPane -T heed + tmux select-pane -t $proclaimPane -T proclaim + tmux select-pane -t $shellPane -T shell + tmux set -g set-titles on + # attach session to shell + tmux attach -t $shellPane } -function growPane { - case $2 in - shell) - tmux resize-pane -t $shellPane -L "$3" - ;; - proclaim) - tmux resize-pane -t $proclaimPane -U "$3" - ;; - heed) - tmux resize-pane -t $heedPane -D "$3" - ;; - *) - echo "usage: bunkdeck grow [WINDOW] [SIZE]" - echo - echo "windows:" - echo " shell horizontally grow the shell window" - echo " proclaim vertically grow the window where you send text" - echo " heed vertically grow the window where you read texts" +killDeck () { + if isExistingDeck; then + tmux kill-session -t $sessionname + else + echo "you don't have bunkdeck running!" + fi +} + +leaveDeck () { + # currently assumes that bunkdeck is only session running + # if bunkdeck leave is issued from within another session, silent failure occurs + if isExistingDeck && [ "${TMUX}" != "" ]; then + tmux detach -s $sessionname + echo "you are not inside bunkdeck! for help:" + echo "$ bunkdeck help" + fi +} + +growPane () { + case $2 in + shell) + tmux resize-pane -t $shellPane -L "$3" + ;; + proclaim) + tmux resize-pane -t $proclaimPane -U "$3" + ;; + heed) + tmux resize-pane -t $heedPane -D "$3" + ;; + *) + echo "usage: bunkdeck grow [WINDOW] [SIZE]" + echo + echo "windows:" + echo " shell horizontally grow the shell window" + echo " proclaim vertically grow the window where you send text" + echo " heed vertically grow the window where you read texts" echo - echo "size:" - echo " number of cells to grow the selected window" - exit 1 - ;; - esac + echo "size:" + echo " number of cells to grow the selected window" + exit 1 + ;; + esac } -function shrinkPane { - case $2 in - shell) - tmux resize-pane -t $shellPane -R "$3" - ;; - proclaim) - tmux resize-pane -t $proclaimPane -D "$3" - ;; - heed) - tmux resize-pane -t $heedPane -U "$3" - ;; - *) - echo "usage: bunkdeck shrink [WINDOW] [SIZE]" - echo - echo "windows:" - echo " shell horizontally shrink the shell window" - echo " proclaim vertically shrink the window where you send text" - echo " heed vertically shrink the window where you read texts" +shrinkPane () { + case $2 in + shell) + tmux resize-pane -t $shellPane -R "$3" + ;; + proclaim) + tmux resize-pane -t $proclaimPane -D "$3" + ;; + heed) + tmux resize-pane -t $heedPane -U "$3" + ;; + *) + echo "usage: bunkdeck shrink [WINDOW] [SIZE]" + echo + echo "windows:" + echo " shell horizontally shrink the shell window" + echo " proclaim vertically shrink the window where you send text" + echo " heed vertically shrink the window where you read texts" echo - echo "size:" - echo " number of cells to shrink the selected window" - exit 1 - ;; - esac + echo "size:" + echo " number of cells to shrink the selected window" + exit 1 + ;; + esac } +helpText () { + usageText + echo + echo "help:" + echo + echo " movement:" + echo " bunkdeck gives you three panes, 'proclaim' to chat, 'heed' to read chats" + echo " and 'shell' to do whatever you want!" + echo " to move between panes you press [CTL + b] at the same time" + echo " then [arrow key] to move to a new pane, or 'o' to cycle around" +} -case $1 in - - kill) - killDeck - ;; - "") - if isExistingDeck; then - tmux attach-session -t bunkdeck - else - startNewDeck - fi - ;; - grow) - growPane "$@" - ;; - shrink) - shrinkPane "$@" - ;; - *) +usageText () { echo "usage: bunkdeck [COMMAND]" echo echo "commands:" echo " (none) attach to existing bunkdeck or start new one" echo " kill kill running bunkdeck" - echo " grow grow the size of a bunkdeck window" + echo " leave close bunkdeck without killing it" + echo " grow grow the size of a bunkdeck window" echo " shrink shrink the size of a bunkdeck window" - exit 1 - ;; -esac +} +case $1 in + + kill) + killDeck + ;; + "") + if isExistingDeck; then + attachToDeck + else + startNewDeck + fi + ;; + leave) + leaveDeck + ;; + grow) + growPane "$@" + ;; + shrink) + shrinkPane "$@" + ;; + help) + helpText + ;; + *) + usageText + ;; +esac diff --git a/delete.sh b/delete.sh new file mode 100644 index 0000000..1e84a94 --- /dev/null +++ b/delete.sh @@ -0,0 +1,6 @@ +#!/bin/sh -e +chatlog=/var/log/bunkchat/chat.log + +chattr -a $chatlog +echo > $chatlog +chattr +a $chatlog diff --git a/heed b/heed deleted file mode 100755 index 96a82d5..0000000 --- a/heed +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -e - -clear - -figlet -f future heed - bunkchat -echo "#######################################################################" -echo "# Take heed, $USER! This is a group chat with everyone on the server! #" -echo "# You can view earlier chat with 'scry' or 'less /srv/bunkchat.txt' #" -echo "#######################################################################" -echo - -tail -f /srv/bunkchat.txt diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..fb1647e --- /dev/null +++ b/install.sh @@ -0,0 +1,122 @@ +#!/bin/sh -e + +installtarget=/usr/local/bin +bunkchatrepo=https://git.bunk.computer/bunk/bunkchat.git + +missingtmux() { + echo + echo 'ERROR: tmux not found in $PATH' + echo ' please install tmux or add it to $PATH' + exit 1 +} + +missinggit() { + echo + echo 'ERROR: git not found in $PATH' + echo ' please install git or add it to $PATH' + exit 1 +} + +# check for tmux and cowsay +# if not prompt and exit +checkdeps() { + which tmux 1>/dev/null || missingtmux + which git 1>/dev/null || git + echo + echo 'deps located' +} + +clonebunkchat() { + echo "cloning bunkchat repo" + git clone $bunkchatrepo +} + +# if not found prompt for git clone or exit +prompttoclone() { + echo + echo "INFO: could not locate bunkchat scripts" + echo + printf "install bunkchat? (Y/n): " + read -r response + case $response in + n) + echo "exiting bunkchat install" + exit 0 + ;; + y) + clonebunkchat + ;; + "") + clonebunkchat + ;; + *) + prompttoclone + ;; + esac +} + +installbunkchat() { + (cd ../bunkchat && ./install.sh) +} + +missingbunkchat() { + echo "bunk chat not installed" + # check for bunkchat repo in parent dir + needclone=1 + for f in ./* + do + case $f in + bunkchat) + needclone=0 + break + ;; + esac + done + if [ $needclone == 1 ] ; then + prompttoclone + fi + # run bunkchat install script + installbunkchat +} + +# check for installed bunkchat && continue +checkbunkchat() { + which heed 1>/dev/null || missingbunkchat + which proclaim 1>/dev/null || missingbunkchat + which scry 1>/dev/null || missingbunkchat +} + +# install buckdeck in /usr/local/bin +installbunkdeck() { + echo "installing bunkchat" + cp bunkdeck $installtarget + chmod 755 ${installtarget}/bunkdeck + chown root:root ${installtarget}/bunkdeck + echo + echo "SUCCESS! bunkdeck installed!" +} + +infocron() { + echo + echo "INFO: bunkdeck comes with a script to clear chat history" + echo " if you would like to enable this copy the script to crontab scripts" + echo " and enable a cron for your desired cadence" + echo + echo "# cp delete.sh /root/crontab-scripts/delete-bunkchat.sh" + echo "# crontab -u root -e" + echo "# EXAMPLE FOR WEEKLY HISTORY DELETION" + echo "0 0 * * 6 /root/crontab-scripts/delete-bunkchat.sh" +} + +# check for root perms +if ! [ "$(id -u)" = 0 ]; then + echo + echo "ERROR: please run install with root permissions" + exit 1 +fi + +checkdeps +checkbunkchat +installbunkdeck +infocron +exit 0 diff --git a/proclaim b/proclaim deleted file mode 100755 index 48391ce..0000000 --- a/proclaim +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -e - -# make username uppercase -username=$(echo "$USER" | tr '[:lower:]' '[:upper:]') -timezone="America/New_York" -declare prompt - -makeSlug () { - # make time and date - time=$(TZ=${timezone} date +%I:%M%p) - date=$(TZ=${timezone} date +%m/%d) - - # make name/time string - prompt="${username}-${date}-${time}" -} - -# enter bunkchat mode (clear the screen) -clear - -while true -do - figlet -f future proclaim - bunkchat - echo "You may view old chat with 'scry', heathen." - echo "-------------------------------------------" - read -r -p "speak to the server: " text - makeSlug - echo "${prompt}: $text" >> /srv/bunkchat.txt - clear -done diff --git a/readme.md b/readme.md index 5741545..2543c3a 100644 --- a/readme.md +++ b/readme.md @@ -6,11 +6,8 @@ tmux wraps some hand-rolled local chat scripts, and the`bunkdeck` command starts bunkdeck is comprised of these lil things: * `bunkdeck` - run this command to start the interface -* `proclaim` - post in chat -* `heed` - read the chat -* `scry` - read the old chat +* `bunkchat` - the actual chat functionality [git](https://git.bunk.computer/bunk/bunkchat) on the server, these are all installed in `/usr/local/bin` so everyone can run them -the file they all interact with, `/srv/bunkchat.txt` has permissions such that everyone can read and write to it - +the file they all interact with, `/var/log/bunkchat/chat.log` is append-only diff --git a/scry b/scry deleted file mode 100755 index 432c623..0000000 --- a/scry +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -e - -less /srv/bunkchat.txt diff --git a/uninstall.sh b/uninstall.sh new file mode 100755 index 0000000..9ae4c23 --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,40 @@ +#!/bin/sh -e + +installtarget=/usr/local/bin + +# check for root perms +if ! [ "$(id -u)" = 0 ]; then + echo + echo "ERROR: please run install with root permissions" + exit 1 +fi + +echo +echo "uninstalling bunkdeck" +echo +printf "also uninstall bunkchat commands? (y/N): " +read -r response +case $response in + n) + rm ${installtarget}/bunkdeck + ;; + "") + rm ${installtarget}/bunkdeck + ;; + y) + (../bunkchat/uninstall.sh) + # 2>/dev/null || \ + # echo && echo "ERROR: couldn't run bunkchat uninstall script" && exit 1 + rm ${installtarget}/bunkdeck + ;; + *) + echo + echo "ERROR: invalid response" + exit 1 + ;; +esac + +echo +echo "SUCCESS: bunkdeck uninstalled" +echo " remember to clean up crontab /root/crontab-scripts/delete-bunkchat.sh" +exit 0