Sorteio do Amigo Secreto
Publicado por Marcelo Oliver (última atualização em 25/11/2015)
[ Hits: 3.052 ]
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
Enviar gráficos 2D pela janela de chat no Kopete
Backup simples com log de resultado
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?









