forked from cmccabe/spacelaunch
set up new repo
This commit is contained in:
parent
e1cab47162
commit
73c263cf2a
|
@ -1,3 +1,10 @@
|
|||
# spacelaunch
|
||||
|
||||
Space Launch is a pubnix take on the classic Unix prank called Steam Locomotive. Rather than running a steam engine train across users' screen when they mistype 'ls' as 'sl', Space Launch blasts a rocket across their screen.
|
||||
Space Launch is a pubnix take on the classic Unix prank called
|
||||
Steam Locomotive. Rather than running a steam engine train
|
||||
across users' screen when they mistype 'ls' as 'sl', Space
|
||||
Launch blasts a rocket across their screen.
|
||||
|
||||
Space Launch is a collaborative pubnix/tilde project. It was
|
||||
started by cmccabe in 2019, but you are encouraged to improve
|
||||
it. The code is here: https://tildegit.org/cmccabe/spacelaunch
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
##########################################################
|
||||
##
|
||||
## CONFIGURATION VARIABLES FOR SPACE LAUNCH (SL)
|
||||
|
||||
CODE_DIR=/home/cmccabe/code/spacelaunch
|
||||
NOSE_CONE=$CODE_DIR/nose_cone.txt
|
||||
FLAMES=$CODE_DIR/flames.txt
|
||||
KABOOM=$CODE_DIR/kaboom.txt
|
||||
|
||||
HOME_DIR=/home # LOCATION OF USERS' HOME DIRECTORIES
|
||||
# E.G. /home WHERE USER DIRECTORIES ARE OF
|
||||
# THE FORM /home/username
|
||||
# OR, SDF META ARRAY AS AN EXAMPLE,
|
||||
# /meta/* WHERE USER DIRS ARE OF THE
|
||||
# FORM /meta/[a-z]/username
|
||||
|
||||
VROOM_WIDTH=22 ## WIDTH OF USER .vroom FILE (MUST BE
|
||||
## MATCHED TO WIDTH OF NOSE CONE AND
|
||||
## FLAMES).
|
||||
VROOM_HEIGHT_MAX=22 ## MAX NUM LINES IN .vroom FILE
|
||||
SLEEP_TIME=0.05 ## HOW FAST TO MOVE THE ROCKET.
|
||||
ROCKET_SIZE=5 ## MAX NUMBER OF USER ROCKET PARTS TO GRAB.
|
||||
|
||||
##
|
||||
###########################################################
|
|
@ -0,0 +1,16 @@
|
|||
/ || \
|
||||
/ | || | \
|
||||
/ | || | \
|
||||
/ | || | \
|
||||
| | || | |
|
||||
| / __________||__________ \ |
|
||||
| / |__________||__________| \ |
|
||||
|/ \ || / \|
|
||||
))())(()())((())(()(
|
||||
(( (( )) (( ))) (( )))
|
||||
)) )) (( )) ((( )) (((
|
||||
( (( ) (( )) ( ))
|
||||
( ) )) ) )) ) ))
|
||||
( ( (( ( ) )) ))
|
||||
() ) ) (( (
|
||||
(( )
|
|
@ -0,0 +1,23 @@
|
|||
*
|
||||
|
|
||||
.
|
||||
. | _ .
|
||||
\ ) /
|
||||
. ^ .
|
||||
\ / \ / -*
|
||||
/ _ . .
|
||||
< ( \ / _ \
|
||||
\ ./\. ) >
|
||||
( / \ \ /
|
||||
*---- \ / >
|
||||
/ ( \/ ) /
|
||||
< . . \
|
||||
\ / \ > ---*
|
||||
(_ . _) . ) /
|
||||
/ (_ \
|
||||
. .
|
||||
/ \ / \
|
||||
. / v .
|
||||
.
|
||||
/
|
||||
*
|
|
@ -0,0 +1,12 @@
|
|||
/\
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
/ \
|
||||
======================
|
|
@ -0,0 +1,210 @@
|
|||
#!/bin/bash
|
||||
|
||||
## SPACE LAUNCH - A multi-user take on the classic Unix
|
||||
## steam locomotive (sl) prank.
|
||||
## Written by cmccabe on the Zaibatsu in 2019.
|
||||
##
|
||||
## Questions? Comments? Smart remarks? --> cmccabe@sdf.org
|
||||
##
|
||||
## System users should create ~/.vroom files that contain lines within
|
||||
## the configured limits of length and line numbers. These .vroom files
|
||||
## will be fused together using space-age technology and launched into
|
||||
## orbit whenever this script is run.
|
||||
## -t, -m and -h switches are explained in the help:
|
||||
## > sl.sh -h
|
||||
|
||||
#########################################################################
|
||||
## CONFIGURATION VARIABLES
|
||||
source /home/cmccabe/code/spacelaunch/config
|
||||
|
||||
#########################################################################
|
||||
## VARIABLE INITIALIZATION AND SET-UP STEPS
|
||||
|
||||
# stty -echo ## TO DO: HOW TO RE-ENABLE THIS FROM ^C TRAP FUNCTION?
|
||||
# OTHERWISE USER CAN'T SEE THEIR CHARS ECHOED
|
||||
# AFTER THEY KILL THIS SCRIPT.
|
||||
|
||||
USER=$(id -run)
|
||||
|
||||
# HEIGHT OF TERMINAL WINDOW; USED TO PUSH ROCKET OFF THE SCREEN
|
||||
TRAILING_SPACE=$(tput lines)
|
||||
ALTITUDE=0
|
||||
|
||||
ROCKET_PARTS=$(ls $HOME_DIR/*/.vroom | shuf -n $ROCKET_SIZE)
|
||||
ROCKET_PARTS=(${ROCKET_PARTS[@]})
|
||||
[ ${#ROCKET_PARTS[@]} -gt $ROCKET_SIZE ] && ROCKET_PARTS=(${ROCKET_PARTS[@]:1:${ROCKET_SIZE}})
|
||||
# ^^ CHOOSE $ROCKET_SIZE RANDOM FILES FROM ALL ~.vroom FILES
|
||||
|
||||
read -r -d '' HELP_TEXT << EOM
|
||||
|
||||
================= SPACE LAUNCH (sl) HELP =================
|
||||
|
||||
Space Launch reads everyone's ~/.vroom file and concatenates
|
||||
a random selection of them into an animated rocket.
|
||||
|
||||
You can create your own .vroom file. Just make sure all
|
||||
of the lines are exactly $VROOM_WIDTH characters long and the file
|
||||
contains no more than $VROOM_HEIGHT_MAX lines. Make sure the file is
|
||||
readable by everyone (e.g. chmod ugo+r ~/.vroom) and that
|
||||
it is located at the top level of your home directory.
|
||||
|
||||
Space Launch ignores any .vroom files that don't meet the
|
||||
file size requirements. It's not rocket science; so don't
|
||||
get left on the launch pad!
|
||||
|
||||
Command line options:
|
||||
-t : Reports if your .vroom file passes or fails spec.
|
||||
-m : Prints template .vroom file of size $VROOM_WIDTH x $VROOM_HEIGHT_MAX.
|
||||
You can pipe this template into a .vroom file and
|
||||
modify it.
|
||||
-h : Prints this help message. Duh!
|
||||
|
||||
==========================================================
|
||||
EOM
|
||||
|
||||
## CTRL-C TRAP - BLOW UP THE ROCKET WHEN ^c CAUGHT:
|
||||
ALTITUDE=1 ## INCREMENTS AS ROCKET GOES UP
|
||||
trap ctrl_c INT
|
||||
function ctrl_c() {
|
||||
# PUSH ROCKET OFF THE SCREEN:
|
||||
i=0
|
||||
while [ $i -lt $TRAILING_SPACE ]; do
|
||||
echo; i=$(($i+1))
|
||||
done
|
||||
|
||||
cat $KABOOM
|
||||
|
||||
## vv sed -e 's/^ *//' IS A BANDAID FOR SOME SYSTEM'S LEADING SPACE PADDING OF wc OUTPUT
|
||||
KABOOM_HEIGHT=$(wc -l "$KABOOM" | sed -e 's/^ *//' | cut -d" " -f1);
|
||||
if [ "$ALTITUDE" -ge $((TRAILING_SPACE-$KABOOM_HEIGHT)) ] && [ $KABOOM_HEIGHT -lt $TRAILING_SPACE ]; then
|
||||
ALTITUDE=$(($TRAILING_SPACE-$KABOOM_HEIGHT))
|
||||
elif [ "$ALTITUDE" -le "$KABOOM_HEIGHT" ]; then
|
||||
ALTITUDE=0
|
||||
fi
|
||||
|
||||
# PRINT EXTRA LINES TO PLACE KABOOM AT CORRECT HEIGHT
|
||||
i=0
|
||||
while [ $i -lt $ALTITUDE ]; do
|
||||
echo
|
||||
i=$(($i+1))
|
||||
done
|
||||
|
||||
# stty echo ## RE-ENABLE ECHO
|
||||
exit
|
||||
}
|
||||
|
||||
VALIDATE_VROOM () {
|
||||
if [ -r $1 ]; then
|
||||
|
||||
while read -r line; do ## lines in file
|
||||
[ "${#line}" = "$VROOM_WIDTH" ] || PASS='fail'
|
||||
done <$1
|
||||
|
||||
# CHECK THAT VROOM FILE IS UNDER HEIGHT LIMIT
|
||||
VROOM_HEIGHT=$(wc -l $1 | cut -d" " -f1)
|
||||
[ "$VROOM_HEIGHT" -gt "$VROOM_HEIGHT_MAX" ] && PASS='fail'
|
||||
|
||||
else
|
||||
PASS='fail' # KICK IT OUT IF FILE IS UNREADABLE
|
||||
fi
|
||||
}
|
||||
|
||||
TEST_VROOM () {
|
||||
echo
|
||||
echo "=========================================================="
|
||||
echo "Testing your .vroom file..."
|
||||
echo
|
||||
|
||||
TEST_PASS_MSG="PASS! Your .vroom file meets requirements and will be included in future launches."
|
||||
|
||||
read -r -d '' TEST_FAIL_MSG << EOM
|
||||
FAIL! Your .vroom file does not meet one or more of the
|
||||
following requirements:
|
||||
|
||||
* Each line in the .vroom file must be exactly $VROOM_WIDTH
|
||||
characters in length.
|
||||
|
||||
* The .vroom file may contain no more than $VROOM_HEIGHT_MAX lines.
|
||||
|
||||
==========================================================
|
||||
EOM
|
||||
|
||||
PASS='pass'
|
||||
VALIDATE_VROOM "$HOME_DIR/$USER/.vroom"
|
||||
if [[ $PASS = 'pass' ]]; then
|
||||
echo "PASS! Your .vroom file meets requirements and will be"
|
||||
echo "included in future launches.";
|
||||
echo "=========================================================="
|
||||
elif [[ $PASS = 'fail' ]]; then echo "$TEST_FAIL_MSG";
|
||||
else echo "This message indicates that a bug has occured. Please submit a copy of your .vroom accompanied by pitiless mockery to the developer."
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
CREATE_VROOM() {
|
||||
for i in $(seq 1 $VROOM_HEIGHT_MAX); do
|
||||
for j in $(seq 1 $VROOM_WIDTH); do printf "="; done
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
## 3, 2, 1 LAUCH! MAIN PROGRAM FLOW:
|
||||
|
||||
[ "$1" = "-h" ] && echo "$HELP_TEXT" && exit
|
||||
[ "$1" = "-t" ] && TEST_VROOM && exit
|
||||
[ "$1" = "-m" ] && CREATE_VROOM && exit
|
||||
|
||||
# CALCULATE ADDITIONAL PADDING NEEDED RELATIVE TO FLAMES:
|
||||
PADDING_SIZE=0
|
||||
IFS=''
|
||||
while read -r line; do
|
||||
[ ${#line} -ge $PADDING_SIZE ] && PADDING_SIZE=${#line}
|
||||
done <$FLAMES
|
||||
PADDING_SIZE=$(($PADDING_SIZE-$VROOM_WIDTH))
|
||||
PADDING_SIZE=$(($PADDING_SIZE/2)) ## TO DO: WHAT IF PAD IS ODD?
|
||||
PADDING=$(printf '%*s' "$PADDING_SIZE" | tr ' ' " ")
|
||||
|
||||
unset PASS
|
||||
|
||||
# PRINT THE NOSE CONE
|
||||
while read -r line; do
|
||||
echo "$PADDING$line"
|
||||
sleep $SLEEP_TIME
|
||||
done <$NOSE_CONE
|
||||
|
||||
# VALIDATE WIDTH AND HEIGHT OF ROCKET PARTS (FROM USERS)
|
||||
for i in ${ROCKET_PARTS[@]}; do
|
||||
PASS='pass'
|
||||
|
||||
VALIDATE_VROOM $i
|
||||
|
||||
## PRINT THE ROCKET PARTS (FROM USERS) IF CORRECT SIZE:
|
||||
if [ "$PASS" = 'pass' ]; then
|
||||
while read -r line; do ## lines in file
|
||||
echo "$PADDING$line";
|
||||
sleep $SLEEP_TIME
|
||||
done <$i
|
||||
fi
|
||||
|
||||
unset PASS
|
||||
done
|
||||
|
||||
# PRINT THE FLAMES:
|
||||
while read -r line; do ## lines in file
|
||||
echo "$line";
|
||||
ALTITUDE=$((ALTITUDE+1))
|
||||
sleep $SLEEP_TIME
|
||||
done <$FLAMES
|
||||
|
||||
# PRINT EXTRA LINES TO KEEP ROCKET MOVING UP
|
||||
i=0
|
||||
while [ $i -lt $TRAILING_SPACE ]; do
|
||||
echo
|
||||
ALTITUDE=$((ALTITUDE+1))
|
||||
sleep $SLEEP_TIME
|
||||
i=$(($i+1))
|
||||
done
|
||||
|
||||
## stty echo ## RE-ENABLE ECHO SO USERS CAN SEE WHAT THEY TYPE AGAIN
|
||||
exit
|
Loading…
Reference in New Issue