Sorteio do Amigo Secreto

Publicado por Marcelo Oliver (última atualização em 25/11/2015)

[ Hits: 2.758 ]

Download AMIGO_SECRETO.sh




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...

  



Esconder código-fonte

#!/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 &#8596; x $ROWS LINES &#8597; <= •••\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&#8596; AUMENTE A LARGURA &#8596;" || printf "\e[0;38;5;33m\e[$((ROWS-3));$(((COLS-12)/2))f&#8596; LARGURA OK &#8596;"
   [ ${ROWS} -lt ${TRROWS} ] && printf "\e[0;38;5;33m\e[$((ROWS-2));$(((COLS-18)/2))f&#8597; AUMENTE A ALTURA &#8597;" || printf "\e[0;38;5;33m\e[$((ROWS-2));$(((COLS-12)/2))f&#8597; ALTURA  OK &#8597;"
   #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

Scripts recomendados

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


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts