Sorteio do Amigo Secreto
Publicado por Marcelo Oliver (última atualização em 25/11/2015)
[ Hits: 2.780 ]
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
Converter vários arquivos PDF com senha para sem senha com o qpdf
Instalando MPlayer no slackware
Detector de Bruteforce no SSH e Bloqueio de IP Atacante
Deixe sua internet plug and play com Pumpconfig
Ordenação de Bytes por Swap Nibble
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)
Problemas ao instalar o PHP (10)
Descompactar arquivos winrar no linux (9)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (12)