quinta-feira, 18 de dezembro de 2008

Frases ditas por personagens ASCII no terminal

 ______________________________________
( If builders built buildings the way )
( programmers wrote programs, then the )
( first woodpecker to come along would )
( destroy civilization. )
--------------------------------------
o
o
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/


Utilizando-se os programas cowsay e fortunes, pode-se ter uma (deveras inútil) personagem com uma mensagem engraçada como saudação desenhada no terminal.

Para a ver em acção, basta gravar o código que se segue num ficheiro executável... E executá-lo! Se for colocado no ficheiro ~/.bash_rc, de preferência no final, mostra a personagem sempre que se inicia o terminal.

A personagem irá mostrar um estado de espírito, aspecto e frase diferentes de cada vez que for mostrada, conforme a sua disposição no momento. :)

Só precisa de um # apt-get install cowsay fortunes prévio.

# Pretty fortune-telling fellow, by Pitxyoki
# Ideas from http://bbs.archlinux.org/viewtopic.php?pid=36736#p36736
# and http://www.virtualroadside.com/blog/index.php/2007/06/09/rndsay-random-cow-sayings-and-fortune-combined/
#
# The character will be a random one from those that you don't consider ugly
#(set those on the BADFILES variable). It will also display a different
#emotional and physical state each time it appears.
#
# issue cowsay -l to get the list of cows you don't want to see
BADFILES=(beavis.zen bong bud-frogs calvin cheese cock daemon dragon
dragon-and-cow elephant eyes ghostbusters gnu head-in hellokitty kiss kitty
koala kosh luke-koala mech-and-cow meow milk ren sodomized sodomized-sheep
stegosaurus stimpy supermilker surgery suse telebears turkey turtle vader
vader-koala)

case $((RANDOM%2)) in
0)
CMD="cowthink";;
1)
CMD="cowsay";;
esac
case $((RANDOM%9)) in
1)
CMD=$CMD" -b";;
2)
CMD=$CMD" -d";;
3)
CMD=$CMD" -g";;
4)
CMD=$CMD" -p";;
5)
CMD=$CMD" -s";;
6)
CMD=$CMD" -t";;
7)
CMD=$CMD" -w";;
8)
CMD=$CMD" -y";;
esac
function randcowfile() {
file_list=( `$CMD -l| tail -n+2` )

while [[ ${#file_list[@]} -gt 0 ]]; do
randex=` expr $RANDOM % ${#file_list[@]} `

bad=false
for (( i=0 ; i < ${#BADFILES[@]}; i++ )); do
if [[ ${file_list[$randex]} == ${BADFILES[$i]} ]]; then
unset file_list[$randex]
unset BADFILES[$i]
file_list=("${file_list[@]}") # Converting to string and back to array to avoid having a sparse array
BADFILES=("${BADFILES[@]}") # If anyone knows a better alternative, I'd like to know it
bad=true
break
fi
done

if ! $bad ; then
cowfile=${file_list[$randex]}
echo $cowfile
break
fi
done
}

fortune -s | $CMD -f `randcowfile`
unset BADFILES
unset CMD


EDIT:Código actualizado para ser mais rápido a executar.

2 comentários:

Anónimo disse...

Parece-me mais simples o cowsay :D

Pitxyoki disse...

Isto é o cowsay!

A única diferença é que tem o fortunes por trás e mostra emoções e um personagem aleatórios de cada vez que é chamado.