Sorteio do Amigo Secreto
Publicado por Marcelo Oliver (última atualização em 25/11/2015)
[ Hits: 2.758 ]
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
Calculando tempo para reportar relatórios ou as famosas log`s.
Download automático da 'Imagem do Dia' da NASA
Escrever números, datas, horas e outros por extenso
Script para Remover Ascentos em arquivos HTML
Script para automatizar instalação do Gentoo
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta