#!/bin/bash
# datas - programa em modo texto de calendario e compromissos
#
# Autor....: Thobias Salazar Trevisan
# Site.....: http://thobias.org/datas
# Licenca..: GPL
#
# Changelog:
# 25/11/2005 - colore dia de hoje com cor diferente (valeu elias)
#            - colore os compromissos mesmo que o mes/ano nao seja atual
#            - variavel $SED especifica qual sed utilizar (valeu Josevan)
# 20/09/2005 - adicionada opcao --list
#            - sort dos lembretes do mes
#            - aviso de lembrete para o celular (valeu ataliba)
#            - adicionado o "mes 00". nao precisa mais adicionar o
#              mesmo lembrete em todos os meses (valeu aurelio)
# 15/01/2005 - Primeira versao
#
#############################################################################
#
#                Configuracoes
#                =============
#
# arquivo que contem as datas a serem lembradas
# baixe o arquivo modelo no site: http://thobias.org/datas
dados='/home/thobias/devel/datas/1.2/datas.txt'
#
# endereco de mail de quem vai receber o lembrete (utilizado apenas quando
# for passado o parametro --cron
mailto='thobias'
#
# o seu celular recebe mail?!
# ex: celmail='seunumero@suaoperadora.com.br'
celmail=''
#
# numero de dias de antecedencia que sera enviado o lembrete por mail
days='1'
# comando para enviar o mail
cmd_mail="mail -s 'datas: lembrete de data(s) importante(s)' $mailto"
#
# especifique a versao/implementacao do sed que voce quer usar. este script so
# foi testado com o GNU Sed, se voce usa algum BSD por exemplo, instale o
# gsed e coloque o gsed na variavel abaixo: (Exemplo: SED='gsed')
SED='sed'
#
# definindo as possiveis cores
VERDE="\\033[1;32m"
BRANCO="\\033[1;37m"
AZUL="\\033[1;36m"
AMARELO="\\033[1;33m"
VERMELHO="\\033[1;31m"
PRETO="\\033[1;30m"
NORMAL="\\033[0;39m"
#
# escolha quais cores serao utilizadas para destacar os dias com
# compromissos e o dia de "hoje". Se nao quiser nenhuma cor, defina
# como NORMAL. Exemplo:  COR_HJ="$NORMAL"
COR_DATA="$AZUL"
# cor que ficara o dia de hoje
COR_HJ="$VERDE"
#
versao='1.2'
#
# sedao que arruma o mes especial no arquivo com os lembretes
# so mexa se voce souber _realmente_ o que esta fazendo
SEDMES00='/^ *# *00 *-/,/^ *# *[0-9][0-9] *-/{/^ *# *00 *-/d;
/^ *# *[0-9][0-9] *-/ba;H;};:a;/^ *# *[0-9][0-9] *-/G'
#
#
#############################################################################
############# Funcoes
#############################################################################

##### funcao que envia o lembrete por mail e/ou celular (parametro --cron)
cron(){
local i hj mes ano
[ "$1" -a "${1//[0-9]}" ] && { echo "Número de dias inválido"; return; }
hj=$(date  '+%d' --date "${1:-$days} days" | $SED 's/^0//')
ms=$(date  '+%m' --date "${1:-$days} days" | $SED 's/^.$/0&/')
ano=$(date  '+%Y' --date "${1:-$days} days")
# verifica se existe algum compromisso 
i=$(cat $dados | $SED "$SEDMES00"| $SED -n "/^ *# *$ms *- /,/#/{//d;/^ *$/d;
s/^ *0//;/\b$hj\b/!d;p;}")
# tem algum compromisso?!
if [ "$i" ]; then
   # envia mail. facil de personalizar o mail enviado
   echo "
Hoje é: $(date '+%d de %b de %Y')

$(cal $ms $ano)

Lembrete(s):

$i" | eval $cmd_mail

   # envia para o celular. facil de personalizar a mensagem enviada
   [ "$celmail" ] && echo "Lembrete do programa datas: dia $i"|mail $celmail
fi
}

##### mostra o calendario com os lembretes na stdout
cmd(){
local hj ms ano cal a cor diacor # sed que colore o dia no calendario
diacor='"s/\(^\| \)$a\( \|$\)/\1$(echo -en $cor)$a$(echo -en $NORMAL)\2/"'
hj=$(date '+%d' | $SED 's/^0//')
[ "$1" ] && ms="$1" || ms=$(date '+%m'); ms=$(echo $ms | $SED 's/^.$/0&/')
[ "$2" ] && ano="$2" || ano=$(date '+%Y')
# testa se o mes e valido
[ "$(echo $ms | $SED 's/^.$/0&/;s/^\(0[1-9]\|1[0-2]\)$//')" ] &&
{ echo Erro: mês inválido; exit 1; }
[ "$(echo $ano | $SED 's/^200[0-9]$//')" ] && # testa se o ano e valido
{ echo "Erro: ano inválido"; exit 1; }
cal=$(cal "$ms" $ano)
# se for este mes e ano, colore o dia de hoje
[ "$ms" = "$(date '+%m')" -a "$ano" = "$(date '+%Y')" ] && {
cor="$COR_HJ"; a=$hj; cal="$(echo "$cal"| eval $SED "$diacor")"; }
# colore o calendario
cor=$COR_DATA ; while read a; do cal="$(echo "$cal"| eval $SED "$diacor")"
done < <(cat $dados | $SED "$SEDMES00" |
$SED -n "/^ *# *$ms *- /,/#/{//d;/^ *$/d;s/^ *0//;s/ \+/ /g;s/ \?-.*//;p;}")
[ "$ms" = "$(date '+%m')" -a "$ano" = "$(date '+%Y')" ] || COR_HJ=$NORMAL
# monta o calendario com os lembretes
paste <(echo "$cal") <(cat $dados | $SED "$SEDMES00" |
$SED -n "/^ *# *$ms *- /,/#/{//d;/^ *$/d;s/^ *0//;s/ \+/ /g;p;}" | sort -n |
$SED "s/^[0-9] / &/;/\b$hj\b/s/.*/$(echo -en $COR_HJ)&$(echo -en $NORMAL)/")
}

#############################################################################
############# Main
#############################################################################

[ "$1" = "--versao" -o "$1" = "-v" ]&&{ echo "datas versao $versao";exit; }

# edita o arquivo de configuracao
[ "$1" = "--edit" -o "$1" = "-e" ] && { ${EDITOR:-${2:-vi}} $dados ; exit; }

# envia o(s) lembrete(s) por mail e/ou celular (se necessario)
[ "$1" = "--cron" ] && { shift; cron "$1"; exit; }

# lista todos os compromissos cadastrados
[ "$1" = "--list" -o "$1" = "-l" ] && {
$SED "$SEDMES00" $dados | $SED -n "/^ *$/d;s/^[0-9] /0&/;/^ *# *01 *-/,\${
s/^ *# *[0-9].*/$(echo -en $VERDE)&$(echo -en $NORMAL)/;p;}" |
$SED '1i **** tecla Q sai' | ${PAGER:-less -r}; exit; }

# mostra help
[ "$1" = "--help" -o "$1" = "-h" ] && {
echo "datas.: script que mostra o calendário destacando as datas importantes
Site..: http://thobias.org/datas
Versão: $versao

Uso: datas [opções]

    [mês] [ano] especifica o mês a ser consultado (pode ser indicado o ano)
    --cron [N]  envia o mail com de N dias de antecedência da data do lembrete
-e, --edit      abre o arquivo com os lembretes em um editor de texto
-l, --list      mostra todos os lembretes cadastrados
-h, --help      mostra a ajuda
-v, --versao    mostra a versão

Consulte a documentação completa no site.
" ; exit; }

# mostra o calendario com os compromissos 
cmd "$@"