Sorteio do Amigo Secreto

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

[ Hits: 2.749 ]

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

Testar várias portas TCP para um único host/IP

Configurando JDK no PATH no Linux (qualquer distro)

Download do LXQT Slackware Current

Beckup .tar.gz com Data e Hora

Escrever por extenso


  

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