Sorteio do Amigo Secreto
Publicado por Marcelo Oliver (última atualização em 25/11/2015)
[ Hits: 2.828 ]
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
zswaplig.sh - Um "Ligador" de ZSWAP, SWAP em RAM para Sabayon Linux
Script shell para automatizar downloads do MegaUpload
Nenhum comentário foi encontrado.
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Criar entrada no GRUB para uma ISO Linux (7)
Open Suse não abre wi-fi automaticamente (3)
Ruído no Microfone (ALC287 - AMD Ryzen 5 7535HS) no Debian 12.9 (15)