Sorteio do Amigo Secreto
Publicado por Marcelo Oliver (última atualização em 25/11/2015)
[ Hits: 3.156 ]
Faz o sorteio do amigo secreto.
Evita que o "Participante" se "Sorteie".
Verificações:
- Tamanho da tela.
- Se tem nome/e-mail duplicado.
- Se relação de participantes for alterada após o início.
- Fim do sorteio...
Características:
- Salva o resultado do sorteio para consulta do participante, utilizando uma senha fornecida por ocasião da realização do sorteio .
- Gera cores aleatórias, se não gostar da cor, pressione "m" e a cor é alterada, e o MENU é centralizado.
- Em "MENUADMIN", tem a função para criação de participantes...
- A senha do MENUADMIN é: "AMIGO_SECRETO"
O formato é:
------:Nome_Sobrenome:email
Bom pessoal, é isso...
#!/bin/bash
#################################################################
## ##
## CRIADO POR: Marcelo Oliver / marceloliver[At]gmail[Dot]com ##
## QUANDO: Setembro/2015 ##
## Agradeço a todos que compartilham os conhecimentos ... ##
## ##
#################################################################
#set -x
#VERSÃO-V01
HOJE=$(date +"%d/%m/%Y")
HORA=$(date +"%Hh%Mm")
DCOR="$PWD" export DCOR
[ -d $DCOR/TEMP ] || mkdir $DCOR/TEMP
TEMP=$DCOR/TEMP
[ -d $DCOR/APOIO ] || mkdir $DCOR/APOIO
APOIO=$DCOR/APOIO
ARQ01=$APOIO/PARTICIPANTES
ARQ02=$TEMP/A_SORTEAR
ARQ03=$APOIO/CHECK
ARQ04=$TEMP/TIRANDO_PAPEL
ARQ05=$TEMP/RECUPERA
ARQ06=$TEMP/RECUTEMP
SIZERC () {
ROWSCOLS
#DEFINE TAMANHO MINIMO
local TRCOLS=75 ; local TRROWS=25
# SE, ABAIXO DO RECOMENDADO . . .
if [ ${COLS} -lt ${TRCOLS} -o ${ROWS} -lt ${TRROWS} ];then
clear
# EXIBE A RESOLUÇÃO ATUAL
printf "\e[1;$(((COLS-50)/2))f\e[0;38;5;33m••• CURRENT SIZE: => $COLS COLUMNS ↔ x $ROWS LINES ↕ <= •••\e[m"
# INFORMA COMO ALTERAR
printf "\e[0;38;5;11m\e[$((ROWS-1));$(((COLS-60)/2))f•• PARA ALTERAR A *RESOLUÇÃO*, POSICIONE O CURSOR NO CANTO ••\e[$ROWS;$(((COLS-38)/2))f<<== •••••• CLIQUE E ARRASTE •••••• ==>>\e[m"
[ ${COLS} -lt ${TRCOLS} ] && printf "\e[0;38;5;33m\e[$((ROWS-3));$(((COLS-19)/2))f↔ AUMENTE A LARGURA ↔" || printf "\e[0;38;5;33m\e[$((ROWS-3));$(((COLS-12)/2))f↔ LARGURA OK ↔"
[ ${ROWS} -lt ${TRROWS} ] && printf "\e[0;38;5;33m\e[$((ROWS-2));$(((COLS-18)/2))f↕ AUMENTE A ALTURA ↕" || printf "\e[0;38;5;33m\e[$((ROWS-2));$(((COLS-12)/2))f↕ ALTURA OK ↕"
#E A RESOLUÇÃO RECOMENDADA
printf "\e[0;38;5;33m\e[2;$(((COLS-42)/2))f•• VISUALIZAR COM: ${TRCOLS} COLUNAS x ${TRROWS} LINHAS ••\e[m"
#EXIBE CRONOMETRO, DA 10s PARA ALTERAR, VERIFICA RESOLUÇÃO, SE OK, ABRE A TELA, SENÃO . . . SIZERC
for T in {10..00};do
sleep 1; printf "\e[3;$(((COLS-26)/2))f•• RESTAURANDO EM:\e[1;38;5;${T}m[00:${T}]\e[m ••";done;sleep 0.1
SIZERC
else
GERACOR
CHECA00
fi
}
ROWSCOLS() {
COLS=$(tput cols)
ROWS=$(tput lines)
}
GERACOR() {
COR=$(($RANDOM %255))
if [ $COR -eq 0 ];then ATB=1
#ELIMINA CORES QUE NÃO APARECEM NO FUNDO PRETO
elif [[ $COR == +(16|232|233|234|235|236) ]];then GERACOR
else
ATB=$(($RANDOM %2 + 0))
IC="\033[$ATB;38;5;${COR}m"
FC="\x1B[m"
fi
}
CHECA00() {
PQP=$(grep "^-PP" $ARQ01 | wc -l)
local CHECK00=$(cut -d: -f2- $ARQ01|md5sum |sed 's/[ ]\+//g')
if [ $PQP -eq 0 ];then
sed -i '1s/.*/'$CHECK00'/' $ARQ03
# SE "PARTICIPANTES" FOR ALTERADO APÓS O INÍCIO, TEM FRAUDE!
elif [ $PQP -ne 0 ];then
if [ "$CHECK00" != $(sed -n '1p' $ARQ03) ];then
MSG="CADASTRO de PARTICIPANTES ALTERADO APÓS O INÍCIO" ; MSGORG
fi
fi
QTREG
if [ ${NUMREG} -eq ${PQP} ];then
GERACOR
echo -e "\n$IC TODOS JÁ PARTICIPARAM\n AMIGO SECRETO FINALIZADO! $FC"
GERACOR
printf "\n$IC SE NENHUM DOS PARTICIPANTES TEM DúVIDA\n SOBRE QUEM É SEU \"AMIGO SECRETO\",\n O ARQUIVO DE RECUPERAÇÃO DEVE SER ELIMINADO.\n"
printf " ABRINDO o MENU do ADMIN\n\n $FC"
sleep 2.5
PASSWORD
else
CHECA01
fi
}
CHECA01() {
# VERIFICA SE TEM NOME||EMAIL REPETIDO
if [ `awk -F: '{printf "%s\n" ,$2}' "$ARQ01"|sort|uniq -c |sed 's/^[ ]\+//g'|sed -n '/^[^1]/p'|wc -l` -gt 0 ]
then MSG="TEM NOME DUPLICADO" ; MSGORG
elif [ `awk -F: '{printf "%s\n" ,$3}' "$ARQ01"|sort|uniq -c |sed 's/^[ ]\+//g'|sed -n '/^[^1]/p'|wc -l` -gt 0 ]
then MSG="TEM EMAIL DUPLICADO" ; MSGORG
else
CHECA02
fi
}
CHECA02() {
# CONTA SORTEADOS
PQS=$(grep "^-..-SS" $ARQ01 | wc -l)
# SE Nº de PESSOAS QUE PARTICIPARAM (PQP) NÃO FOR = AO Nº DE PESSOAS QUE FORAM SORTEADAS (PQS), TEM ERRO
if [ $PQP -ne $PQS ];then
MSG="INCONSISTÊNCIA ENTRE \"PARTICIPANTES\" x \"SORTEADOS\"" ; MSGORG
else
MENU
fi
}
MENU() {
clear
GERACOR
ROWSCOLS
POS=$(((COLS-63)/2))
printf "${IC}\e[2;${POS}f ••${FC}\e[01;38;5;m P:%02d • F:%02d ${FC}${IC}••••••••••••••••••••••••••••••••••••••••••••••\e[01;38;5;m%s${FC}${IC}••" "$NUMREG" "$((NUMREG-PQP))"
printf "\e[3;${POS}f•••••••••••••••••••••••••\e[m AMIGO SECRETO ${IC}•••••••••••••••••••••••••"
printf "\e[4;${POS}f %*s\n" "64" '' | sed "s/ /•/g"
printf "\e[5;${POS}f••\e[5;$((POS+63))f••"
printf "\e[6;${POS}f••\e[m [S] SORTEIO [O] ORGANIZADOR ${IC}••"
printf "\e[7;${POS}f••\e[7;$((POS+63))f••"
printf "\e[8;${POS}f %*s" "64" '' | sed "s/ /•/g"
printf "\e[9;${POS}f••••••••••••••••••••••••••••••••••••••••••••••••••••••${FC}\e[01;38;5;m $HORA ${FC}${IC}•••"
printf "\e[10;${POS}f •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••${FC}"
echo ""
GERACOR
echo -ne "${IC}\n OPÇÃO:${FC} "
read -n1 -e OPCAO
case "$OPCAO" in
S|s) IDENTIMAIL ;;
M|m) MENU ;;
O|o) PASSWORD ;;
3) echo "";exit ;;
*) echo -e "\n OPÇÃO NÃO EXISTE! " ; sleep 0.5 ; MENU
esac
}
IDENTIMAIL() {
echo
SFUNCTION=IDENTIMAIL
read -p " EMAIL: "
if [ -z $REPLY ];then IDENTIMAIL
elif [ -z $(sed -n 's/.*@//p' <<< $REPLY) ];then
printf "\n EMAIL INCOMPLETO, FALTA O DOMíNIO\n"
IDENTIMAIL
else
#BUSCA PELO EMAIL
FILTRAPMAIL
FILTRAPART
fi
}
FILTRAPMAIL() {
awk -F: 'BEGIN {IGNORECASE=1} $3~/^'$REPLY'$/ {printf "%s\n" ,$0 }' $ARQ01 > $ARQ04
}
FILTRAPART() {
#FILTRA TEMP/PARTICIPANTES COM O EMAIL OU NOME INFORMADO => JÁ PARTICIPOU = -PP-..:
if [ -s $ARQ04 ];then
#VERIFICA SE ARQ04 TEM MAIS DE UMA LINHA . . .
if [ `awk 'END {print NR}' $ARQ04` -gt 1 ];then
printf "\e[;38;5;1m\n PROBLEMAS NA IDENTIFICAÇÃO\e[m\n"
[ $SFUNCTION = IDENTINOME ] && { MSG="\n PROBLEMAS NO CADASTRO\n" ; MSGORG ; } || IDENTINOME
else
NOMEPART=$(cut -d":" -f2 $ARQ04 | sed 's/_/ /g')
MAILPART=$(cut -d":" -f3 $ARQ04)
if grep -wvq "^-PP-.." $ARQ04;then
FILTRAASORT
else
GERACOR
echo -e "$IC\n ID: $REPLY\n Nome: "$NOMEPART"\n Mail: "$MAILPART"$FC\n "
GERACOR
echo -e "$IC Você já PARTICIPOU! \n$FC" ; exit
fi
fi
else
#SE Já SE IDENTIFICOU POR EMAIL, IDENTIFIQUE-SE POR NOME, SE IDENTIFICOU-SE POR EMAIL E NOME . . .
[ $SFUNCTION = IDENTINOME ] && { MSG="Nome: $REPLY, NÃO CADASTRADO" ; MSGORG ; } || {
printf "\e[;38;5;1m\n PROBLEMAS NA IDENTIFICAÇÃO\n O EMAIL: "$REPLY", É INVÁLIDO\n IDENTIFIQUE-SE PELO NOME \e[m\n"
IDENTINOME ; }
fi
}
MSGORG() {
[[ $MSG ]] && {
printf "\e[;38;5;1m\n ERRO ENCONTRADO! \n %s \n COMUNIQUE AO ORGANIZADOR! \e[m\n\n" "$MSG"
}||{
printf "\e[;38;5;1m\n ERRO ENCONTRADO! \n COMUNIQUE AO ORGANIZADOR! \e[m\n\n" ; }
exit
}
PASSWORD() {
PWDREC=$(echo -n "QU1JR09fU0VDUkVUTw=="|base64 -d)
echo -e ""
read -s -p " DIGITE A SENHA: " -e PWDADM
echo -e "\n"
if [ "$PWDADM" = "$PWDREC" ];then
MENUADMIN
else
echo " SENHA INVÁLIDA!" ; PASSWORD
fi
}
MENUADMIN() {
printf " OPÇÕES Do ADMINISTRADOR:\n\n [C] CADASTRA PARTICIPANTE\n [R] REINICIA SORTEIO\n [M] MOSTRA SORTEADO\n [E] ELIMINA ARQ. RECUPERAÇÃO\n [V] VOLTA p/ MENU\n\n OPÇãO:"
read -n1 -e OPC
OPC="${OPC^^}"
if [[ $OPC != +(C|R|M|E|V) ]];then MENUADMIN
elif [ $OPC = "C" ];then CADASTRO
elif [ $OPC = "R" ];then LIMPARTI
elif [ $OPC = "M" ];then RECUPERA
elif [ $OPC = "E" ];then > $ARQ05 ; > $ARQ06
elif [ $OPC = "V" ];then MENU
fi
}
IDENTINOME() {
echo
SFUNCTION=IDENTINOME
read -p " NOME COMPLETO: "
REPLY=$(echo "$REPLY" |sed 's/ /_/g'|sed -r 's/(^.|_.)/\U&/g')
if [ -z $REPLY ];then IDENTINOME
else
#BUSCA PELO NOME COMO ESTA NO CADASTRO
awk -F: 'BEGIN {IGNORECASE=1} $2 ~ /\<'$REPLY'\>/ {printf "%s\n" ,$0 }' $ARQ01 > $ARQ04
FILTRAPART
fi
}
FILTRAASORT() {
#FOI SORTEADO = ---SS-: => FILTRA "PARTICIPANTES", RETIRA O PARTICIPANTE, QUEM JA FOI SORTEADO E EMBARALHA...
grep -Ewiv "\b$REPLY\b|^-..-SS" $ARQ01 | sort -R > $ARQ02
SORTEIO
}
SORTEIO() {
NS=$((10#$(date +%N | cut -c 1-5)))
QTLIN=$(awk 'END {print NR}' $ARQ02)
NUMSORT=($[RANDOM=${NS} %${QTLIN} +1])
SORTEADO=$(sed -n "$NUMSORT"p $ARQ02)
NOMESORT=$(cut -d":" -f2 <<< $SORTEADO | sed 's/_/ /g')
MAILSORT=$(cut -d":" -f3 <<< $SORTEADO)
MAILPART=$(cut -d":" -f3 $ARQ04)
sed -i "/$MAILPART/s/^---/-PP/" "$ARQ01" #MARCA QUE PARTICIPOU
sed -i "/$MAILSORT/s/--:/SS:/" "$ARQ01" #MARCA QUE FOI SORTEADO
clear
printf "\n\e[3;38;5;12m%$(((COLS-53)/2))s• • • • S O R T E I O • • F I N A L I Z A D O • • • •\e[m\n"
printf "\n${IC}%*s\n" $((COLS/2)) '' | sed "s/ / •/g"; printf "\e[m"
MSGTERM
printf "\n${IC}%*s\n" $((COLS/2)) '' | sed "s/ / •/g"; printf "\e[m"
FNATAL
PROMPT
PKILL
}
MSGTERM() {
echo -e "${IC} `OLAH`\n "$NOMEPART" \n No Sorteio realizado em: \n "$HOJE" as `date +%H:%M:%S`"$FC""
echo -e "${IC} Seu Amigo Secreto é . . .${FC}"
sleep 2.5
GERACOR
echo -ne "${IC} NOME => $NOMESORT \n MAIL => $MAILSORT ${FC}\n"
sleep 5
ARQRESULT
}
LIMPARTI() {
sed -i 's/^-..-..:/------:/' $ARQ01
printf " EFETUADO"
sleep 1
MENU
}
ARQRESULT() {
#GUARDA RESULTADOS PARA POSSÍVEIS CONSULTAS => "DO PARTICIPANTE"
PASSWORD=$(cat /dev/urandom|tr -dc '[[:alnum:]]'|fold -w6|head -n1)
printf " SENHA DE RECUPERAÇÃO\n SENHA => $PASSWORD\n"
echo -n "${PASSWORD}:"$NOMEPART":$MAILPART:"$HOJE":`date +%Hh%Mh%S`:" >> $ARQ05 ; echo -ne ""$NOMESORT":$MAILSORT\n" | base64 >> $ARQ05
sleep 3.5
}
RECUPERA() {
printf " INFORME A SENHA FORNECIDA\n"
read -s -p " DIGITE A SENHA: " -n6 PASSWORD
PASSWORD=$(sed 's/\(\[\|\]\)/\\&/g' <<< $PASSWORD)
if grep -w ^"$PASSWORD" $ARQ05 > $ARQ06 ;then
awk -F: '{printf " \n\n '$IC'PARTICIPANTE:\n'$FC' Pass:\t"$1"\n Nome:\t"$2"\n Mail:\t"$3"\n Data:\t"$4"\n Hora:\t"$5"\n\n '$IC'SORTEADO:'$FC'\n"}' $ARQ06
cat < $ARQ06 | cut -d: -f6- |base64 -d | awk -F: '{ print " Nome:\t"$1"\n"" Mail:\t"$2"\n"}'
else
printf " SEM RESULTADO! \n"
fi
MENUADMIN
}
OLAH() {
HORA=$(date +%H)
case $HORA in
0[3-9]|1[01]) echo -e "\n Bom Dia!";;
1[2-7] ) echo -e "\n Boa Tarde!" ;;
1[89]|2[0-3]|0[012]) echo -e "\n Boa Noite!" ;;
esac
}
CADASTRO() {
if [[ $PQP -eq 0 && $PQS -eq 0 ]];then
echo -e "\n CADASTRO do PARTICIPANTE. \n Informe os dados:\n"
echo -n " Nome:"
READTERMO
TIRAESP
ARRUMATERMO
NOME=$REPLY
INSEREMAILL
FLAG=INIC
QTREG
echo "------:$NOME:$EMAIL" >> $ARQ01
FLAG=FINA
QTREG ; PROMPT
elif [[ $PQP -ne 0 && $PQS -ne 0 ]];then
echo -e "\n ALTERAÇÕES PERMITIDAS SOMENTE ANTES DO INÍCIO DO SORTEIO"
echo -e "\n PARA REINICIAR, DIGITE [R] NO MENU do Admin.\n"
MENU
fi
}
READTERMO() {
read -p " "
[ "$REPLY" ] 2> /dev/null || { ALERTA ; READTERMO ; }
}
TIRAESP() {
REPLY=$(sed 's/ /_/g' <<< $REPLY)
}
ARRUMATERMO() {
REPLY=$(sed 's/\(^.\|_.\)/\U&/g;s/\(_.._\|^.._\)/\L&/' <<< $REPLY)
}
INSEREMAILL() {
read -p " Email: " EMAIL
[ ${#EMAIL} -gt 0 ] && EMAIL=${EMAIL,,} || INSEREMAILL
if egrep -qv "([a-z0-9._-][^ ])+@([a-z0-9-]{2,}\.)([a-z.]{2,})([a-z.]{2,}){0,1}" <<< "$EMAIL";then
printf "\e[;31m EMAIL INVÁLIDO! \e[m\n"
INSEREMAILL
else
DOM=$(cut -d"@" -f2 <<< "$EMAIL" | cut -d"." -f1)
[ $DOM == "com" ] && { echo -e " DOMÍNIO \e[;31m\"$DOM\"\e[m NÃO EXISTE" ; INSEREMAILL ; }
fi
EMAIL=(`sed "s/_/#/g" <<< $EMAIL`)
}
QTREG() {
NUMREG=$(awk 'BEGIN {RS="\n";}END {print NR}' $ARQ01)
if [ $FLAG ];then
if [ $FLAG = "INIC" ];then
VINIC=$NUMREG
elif [ $FLAG = "FINA" ];then
VFINA=$NUMREG
SOMA
fi
fi
}
SOMA() {
if [ $VFINA -gt $VINIC ];then
echo -e "\n EFETUADO COM SUCESSO"
else
echo -e "\n PROBLEMAS NO CADASTRO"
fi
}
ALERTA() { echo -e " \e[;31mPreenchimento Obrigatório\e[m" ; sleep 2.5 ; }
FNATAL() {
ROWSCOLS
clear
POS1=$(((COLS-67)/2))
for X in {1..12};do
GERACOR;sleep 0.05
printf "\e[2;${POS1}f${IC} _____ _____ _ ___ _____ _ _ _ _____ _ _ _${FC}\n";GERACOR;sleep 0.1
printf "\e[3;${POS1}f${IC}| ___| ____| | |_ _|__ / | \ | | / \|_ _|/ \ | | | |${FC}\n";GERACOR;sleep 0.1
printf "\e[4;${POS1}f${IC}| |_ | _| | | | | / / | \| | / _ \ | | / _ \ | | | |${FC}\n";GERACOR;sleep 0.1
printf "\e[5;${POS1}f${IC}| _| | |___| |___ | | / /__ | |\ |/ ___ \| |/ ___ \| |___ |_|${FC}\n";GERACOR;sleep 0.1
printf "\e[6;${POS1}f${IC}|_| |_____|_____|___/_____| |_| \_/_/ \_\_/_/ \_\_____| (_)${FC}\n";sleep 0.1
LIMPA
done
FIM
}
FIM() {
GERACOR
POS1=$(((COLS-71)/2))
sleep 0.05
printf "\e[2;${POS1}f${IC} ____ ___ __ __ _ _ _ ___ _ _ _____ _____ _ ${FC}\n";GERACOR;sleep 0.1
printf "\e[3;${POS1}f${IC}| __ ) / _ \| \/ | / \ | \ | |/ _ \ | \ | |/ _ \ \ / / _ \ | |${FC}\n";GERACOR;sleep 0.1
printf "\e[4;${POS1}f${IC}| _ \| | | | |\/| | / _ \ | \| | | | | | \| | | | \ \ / / | | | | |${FC}\n";GERACOR;sleep 0.1
printf "\e[5;${POS1}f${IC}| |_) | |_| | | | | / ___ \| |\ | |_| | | |\ | |_| |\ V /| |_| | |_|${FC}\n";GERACOR;sleep 0.1
printf "\e[6;${POS1}f${IC}|____/ \___/|_| |_| /_/ \_\_| \_|\___/ |_| \_|\___/ \_/ \___/ (_)${FC}\n\n"
}
LIMPA() {
ESP=" "
printf "\e[2;${POS1}f$ESP\n"
printf "\e[3;${POS1}f$ESP\n"
printf "\e[4;${POS1}f$ESP\n"
printf "\e[5;${POS1}f$ESP\n"
printf "\e[6;${POS1}f$ESP\n"
}
PROMPT() {
printf "\n\e[1;33m%$(((COLS-43)/2))s<< PRESSIONE QUALQUER TECLA PARA FECHAR! >>\e[m\n"
kill `ps -e | grep -w terminal | awk '{print $1}'`
MENU
}
PKILL() { kill `ps -a | grep -w terminal | grep -v grep | awk '{print $1}'` ; }
SIZERC
BKP Completo Sem compactação (com exclusao)
Download automatizado de instaladores para fileserver e afins
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Não consigo instalar distro antiga no virtualbox nem direto no hd (25)
queria saber como posso alterar a frequencia do meu ryzen 2300u pro (3)









