#!/bin/bash
#
# Skrypt sluzy do przypominania o roznych dziwnych rzeczach. Przeznaczony jest
# dla ludzi siedzacych bez przerwy pod konsola (zadeklarowani X-owcy maja mase
# innych programow, choc dodalem prosty skrypcik Tk). Caly skrypt jest
# wykonywany w nawiasie okraglym, za ktorym stoi ampersand - wszystko po to,
# zeby skrypt nie blokowal terminala, na ktorym zostal odpalony. Po uplywie
# przewidzianego czasu na wszystkich konsolach zostanie wypisany na czerwono
# tekst przypomnienia wraz z aktualna godzina.
#
# BURAKI: skrypt nie dziala do konca ladnie przy odpalonym mc na terminalu,
# aczkolwiek daje sie toto odczytac.
#
# INSTALACJA: skopiuj ten plik dokadkolwiek, byle to miejsce bylo przegladane
# podczas szukania polecen (niezlym pomyslem jest ~/bin/), a potem nadaj temu
# plikowi atrybuty wykonywalnosci poleceniem "chmod a+x remindme".
# To wszystko.
#

# tekst pomocy - jakis zawsze musi byc
if [ $# = 0 -o "$1" = "--help" -o "$1" = "-h" -o "$1" = "-?" ]; then
  echo -n "Uzycie: "`basename "$0"`
  echo " [-x] [-c] <czas|godzina> [ tekst przypomnienia ]"
  echo "czas    - za ile przypomniec"
  echo "godzina - o ktorej przypomniec"
  echo "-x      - przypomina wyskakujac okienkiem w X-Window"
  echo "-c      - _nie_ przypomina w konsoli"
  exit 0
fi

# chce, zeby skrypt zwrocil sterowanie do powloki, wiec odpalam go
# w podpowloce i w tle
(

while [ $# -gt 0 ]; do
  case "$1" in
    -x) PRZYPOMNIJ_W_X11=1 ;;

    -c) NIE_PRZYPOMINAJ_W_KONSOLI=1 ;;

    [0-9]*)
      # ustalamy, ile mamy spac - czas spania musi byc pierwszym argumentem
      if echo "$1" | grep '[:/]' &> /dev/null; then
        # przypadek 1: podano konkretna godzine (zawiera : albo / [dla
        # leniwych ;] ])
        CZAS_SPANIA=$[ `date -d "$1" +%s` - `date +%s` ]
      else
        # przypadek 2: podano czas, za jaki mamy sie przypomniec
        CZAS_SPANIA="$1"
      fi

      # jesli uzyszkodnik podal ujemny czas oczekiwania (ew. wczesniejsza
      # godzine) albo pierwszy argument nie byl czasem, to nie czekamy
      if [ "${CZAS_SPANIA%[hms]}" -le 0 -a ! "${CZAS_SPANIA%[hms]}" = "0" ]; then
        echo "Za maly czas do odczekania"
        exit 0
      fi
    ;;

    *) TEKST_PRZYPOMNIENIA="$TEKST_PRZYPOMNIENIA $1" ;;
  esac

  shift
done

# spimy odpowiednia ilosc czasu, po czym sie przypomnimy
sleep "$CZAS_SPANIA"

# jesli nie uzyszkodnik nie podal, czym mamy go obudzic, to zbudzimy go
# standardowym tekstem
[ -z "$TEKST_PRZYPOMNIENIA" ] && TEKST_PRZYPOMNIENIA="Przypominam!!!"

# bierzemy wszystkie urzadzenia /dev/tty... (ale te z numerkami, zeby na COM-y
# nie wysylac danych) i wszystkie urzadzenia /dev/pts/... (terminale
# wirtualne), sprawdzamy, ktore sa nasze, po czym wypisujemy na czerwono
# aktualny czas i komunikat (przepuszczony przez unix2dos, bo terminal pod
# cursesami, na ktory ida dane z zewnatrz, potrzebuje sekwencji CR+LF, zeby
# sie toto ladnie wyswietlalo - sprawdzone doswiadczalnie ;) )
if [ "$NIE_PRZYPOMINAJ_W_KONSOLI" != "1" ]; then
  for TTY in `ls -l /dev/tty[0-9]* /dev/pts/* 2> /dev/null | grep "$USER" \
              | grep -v /dev/tty0 | cut -c57-`; do
    echo -e "\e[31;1m\r`date '+%k:%M'`\n$TEKST_PRZYPOMNIENIA\e[0m" \
         | sed 's/$/
/' > "$TTY"
  done
fi

# niedlugi skrypcik w Tk, wyskakujacy okienkiem
if [ "$PRZYPOMNIJ_W_X11" = "1" ] && which wish > /dev/null; then
  # jakby komus przyszlo do glowy wrzucac do tekstu przypominajacego '"'
  TEKST_PRZYPOMNIENIA="`echo "$TEKST_PRZYPOMNIENIA" | sed 's/"/\\\\"/g'`"

  echo "set tekst \"[ exec date +%k:%M: ] $TEKST_PRZYPOMNIENIA\"
  label .etykieta -text \"\$tekst\"
  button .przycisk -text OK -command \"exit 0\" -default active -state active
  pack .etykieta .przycisk
  # zakomentowane, bo ja jestem za szybki i czesto wciskam spacje nawet nie
  # zdazywszy przeczytac komunikatu
  #focus .przycisk
  event add <<Exit-Wish>> <Key-Return>
  event add <<Exit-Wish>> <Key-Escape>
  event add <<Exit-Wish>> <Key-KP_Enter>
  bind . <<Exit-Wish>> \"exit 0\"" | wish -name "Remindme" &> /dev/null
fi

) &
