Table of Contents

UzZas

UzZas
founder: sachy
depends on:
interested: sumie-dh
software license: CC
hardware license: N/A

~~META: status = active &relation firstimage = :project:uzzas:plostboros.svg ~~

UzZas is TUI based minimalistic reminder of recurring events.

Main purpose is to periodically urge the user to complete the tasks which have to be done periodically - like biweekly changing the water in home aquarium, monthly payout to local mafia Protectors of the Throne goverment and so on.

Usage

uzzas.sh ACTION

ACTION could be one of:

Installation

  1. Check if the dependencies are met (bash interpreter, sqlite3). If you want automatic notifications, you need also CRON and zenity.
  2. Download the script and make it executable “chmod +x uzzas.sh”.
  3. Run “uzzas.sh -i” to create the database and to create crontab entry.

If you will ever update/modify the uzzas.sh script, do NOT reinstall it.

$ ./uzzas.sh -i
==== UzZas installed ====
  See brmlab.cz/project/uzzas/start for more info

Adding events

Run “uzzas.sh -a” and complete few challenging questins, see example below:

$ ./uzzas.sh -a
==== Enter new task ====
  First time planned to (yyyy-mm-dd):
2018-06-16
  Repeat each (days):
7
  Item...:
Aquarium
  ...containing:
Cutteries
  Action/note:
Wipe
ADD? (Y/n)
y
Added!

Listing events

To get list of events, sorted by due-date proximity (most urgent up), run “uzzas.sh -l”

$ ./uzzas.sh -l
2018-06-16  3           krabice 1   plostenka   dugesia   
2018-06-16  7           Aquarium    Cutteries   Wipe      
2018-06-19  3           krabice 1.  plostenka   dugesia   
2018-06-23  7           Plostenkoi  Dugesie     Vymen vodu

To see what have to be done today, run “uzzas.sh -t” for terminal, or “uzzas.sh -p” for graphical overview:

$ ./uzzas.sh -t
2018-06-16  3           krabice 1   plostenka   dugesia   
2018-06-16  7           Aquarium    Cutteries   Wipe

To see what have to be done tomorrow, run “uzzas.sh -T”. The output is similar to the today's listing.

Marking event as completed

If the event is completed, it is automatically postponed to the defined reoccurence date. To do so, run “uzzas.sh -A”. In the list are displayed only tasks planned for the current day.

$ ./uzzas.sh -A
Select which task is done
1           krabice 1   plostenka   dugesia   
6           Aquarium    Cutteries   Wipe      
  Done is: (0 = nothing; a = ALL)
0
Nothing done!

Deleting an event

If the reoccuring event is no longer valid, run “uzzas.sh -d”

$ ./uzzas.sh -d
==== Pick which action to delete (first column) ====
1           2018-06-16  krabice 1   plostenka   dugesia   
3           2018-06-19  krabice 1.  plostenka   dugesia   
5           2018-06-23  Plostenkoi  Dugesie     Vymen vodu
6           2018-06-16  Aquarium    Cutteries   Wipe      
  Delete: (0 = cancel)
0
Not removed!

Editing event

To edit existing event, run “uzzas.sh -e”.

$ ./uzzas.sh -e
==== Edit entry ====
1           krabice 1   plostenka   dugesia   
3           krabice 2   plastenka   chcije    
5           Plostenkoi  Dugesie     Vymen vodu
6           Aquarium    Cutteries   Wipe      
7           Aqua2       Modry       Wipe      
  Edit: (0 = nothing)
7
  First time planned to (yyyy-mm-dd):
2018-07-16
  Repeat each (days):
7
  Item...:
Aqua2
  ...containing:
Modry
  Action/note:
Wipe
EDIT? (Y/n)

Tasks edited!

Cloning entry

To clone/copy entry, possibly with modification, run “uzzas.sh -c”

$ ./uzzas.sh -c
==== Clone entry ====
1           krabice 1   plostenka   dugesia   
3           krabice 2   plastenka   chcije    
5           Plostenkoi  Dugesie     Vymen vodu
6           Aquarium    Cutteries   Wipe      
7           Aqua2       Modry       Wipe      
  Clone: (0 = nothing)
7
== Edit cloned entry ==
  First time planned to (yyyy-mm-dd):
2018-08-16
  Repeat each (days):
7
  Item...:
Aqua2
  ...containing:
Modry
  Action/note:
Wipe
COPY? (Y/n)

Tasks copied!

Source code

Download the script and make it executable “chmod +x uzzas.sh”.

Run “uzzas.sh -i” to create the database and to create crontab entry for reminding you.

After update of the uzzas.sh script, do NOT reinstall it!

uzzas.sh
#!/bin/bash
#
# UzZas - primitive boss behind your shoulder
#
# Dependency: CRON, sqlite3
#
# Usage:
#
#  uzzas.sh
#
 
dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
akce="$1"
db="$dir/uzzas.db"
 
case "$akce" in
  "add"|"-a"|"--add"|"new")
    echo "==== Enter new task ===="
    echo "  First time planned to (yyyy-mm-dd):"
    read day
    echo "  Repeat each (days):"
    read incr
    echo "  Item...:"
    read box
    echo "  ...containing:"
    read ins
    echo "  Action/note:"
    read note
    echo "ADD? (Y/n)"
    read ack
 
    if [[ "$ack" != "n" ]]; then
      sqlite3 "$db" "INSERT INTO zas VALUES (date('$day'),$incr,'$box','$ins','$note');"
      echo "Added!"
    else
      echo "Adding cancelled!"
    fi
    ;;
  "list"|"-l"|"--list"|"show"|"--show")
    echo ".mode column^SELECT * FROM zas ORDER BY day ASC;" | tr '^' '\n' | sqlite3 "$db"
    ;;
  "delete"|"del"|"-d"|"--delete")
    echo "==== Pick which action to delete (first column) ===="
    echo ".mode column^SELECT rowid,day,box,inside,note FROM zas ORDER BY rowid ASC;" | tr '^' '\n' | sqlite3 "$db"
    echo "  Delete: (0 = cancel)"
    read del
    if [[ "$del" > "0" ]]; then
      sqlite3 "$db" "DELETE FROM zas WHERE rowid='$del' LIMIT 1;"
      echo "Removed!"
    else
      echo "Not removed!"
    fi
    ;;
  "today"|"-t"|"--today")
    echo ".mode column^SELECT * FROM zas WHERE day=date('now');" | tr '^' '\n' | sqlite3 "$db"
    ;;
  "tomorrow"|"-T"|"--tomorrow")
    echo "==== Tomorrow TODO list ===="
    echo ".mode column^SELECT * FROM zas WHERE day=date('now','+1 day');" | tr '^' '\n' | sqlite3 "$db"
    ;;
  "ack"|"-A"|"--ack"|"done")
    echo "Select which task is done"
    echo ".mode column^SELECT rowid,box,inside,note FROM zas WHERE day=date('now') ORDER BY rowid ASC;" | tr '^' '\n' | sqlite3 "$db"
    echo "  Done is: (0 = nothing; a = ALL)"
    read hot
    if [[ "$hot" == "a" ]]; then
      sqlite3 "$db" "UPDATE zas SET day=date(day,'+'||increment||' day');"
      echo "All today's tasks postponed!"
    else
      if [[ "$hot" =~ ^[0-9]+$ ]] 2> /dev/null
      then
        if [[ "$hot" > "0" ]]; then
          sqlite3 "$db" "UPDATE zas SET day=date(day,'+'||increment||' day') WHERE rowid=$hot LIMIT 1;"
          echo "Task postponed!"
        else
          echo "Nothing done!"
        fi
      else
        echo "Invalid value!"
      fi
    fi
    ;;
  "install"|"-i"|"--install")
    touch "$db"
    sqlite3 "$db" "CREATE TABLE IF NOT EXISTS zas (day TIMESTAMP,increment INTEGER,box TEXT,inside TEXT,note TEXT);"
    (crontab -l 2>/dev/null; echo "0 8-23 * * * DISPLAY=:0 $dir/uzzas.sh ping") | crontab -
    echo "==== UzZas installed ===="
    echo "  See brmlab.cz/project/uzzas/start for more info"
    ;;
  "ping"|"-p"|"--ping") # Invoked via CRON, display graphical
    count=$(sqlite3 "$db" "SELECT count(rowid) FROM zas WHERE day=date('now');")
    if [[ "$count" > "0" ]]; then
      boxlen=$(sqlite3 "$db" "SELECT max(length(box)) FROM zas WHERE day=date('now');")
      inslen=$(sqlite3 "$db" "SELECT max(length(inside)) FROM zas WHERE day=date('now');")
      notelen=$(sqlite3 "$db" "SELECT max(length(note)) FROM zas WHERE day=date('now');")
      todo=$(echo ".headers on^.width $boxlen $inslen $notelen^.mode column^SELECT box,inside,note FROM zas WHERE day=date('now');" | tr '^' '\n' | sqlite3 "$db")
      #zenity --width=600 --info --text="$todo" --title="UzZas"
      zenity --info --title="UzZas" --no-wrap --text="<tt>$todo</tt>"
    fi
    ;;
  "help"|"-h"|"--help")
    echo "==== UzZas ===="
    echo "  Minimalistic reminder of recurrent events"
    echo " "
    echo "==== Dependencies ===="
    echo "  - BASH interpreter (b4ckd00r)"
    echo "  - sqlite3 (for storing the events)"
    echo "  - CRON (for recurring invocation)"
    echo "  - zenity (for graphical reminder)"
    echo " "
    echo "==== Usage ===="
    echo "  uzzas.sh ACTION"
    echo " "
    echo "  ACTION could be one of:"
    echo "  (add|-a|--add) - Add new entry"
    echo "  (list|-l|--list) - List all entries sorted by due date"
    echo "  (delete|-d|--delete) - Delete entry"
    echo "  (today|-t|--today) - Show entries which are planned for today"
    echo "  (tomorrow|-T|--tomorrow) - Show entries which are planned for tomorrow"
    echo "  (ack|-A|--ack) - Mark entry as done and activate next recurrence"
    echo "  (install|-i|--install) - Install UzZas (create uzzas.db and CRON entry)"
    echo "  (ping|-p|--ping) - Graphical equivalent of -t"
    echo "  (help|-h|--help) - This help"
    echo "  (edit|-e|--edit) - Edit existing entry"
    echo "  (clone|-c|--clone) - Clone (and modify) existing entry"
    echo " "
    echo "==== See brmlab.cz/project/uzzas/start for more info ===="
    echo " "
    ;;
  "edit"|"-e"|"--edit")
    echo "==== Edit entry ===="
    echo ".mode column^SELECT rowid,box,inside,note FROM zas ORDER BY rowid ASC;" | tr '^' '\n' | sqlite3 "$db"
    echo "  Edit: (0 = nothing)"
    read edit
    if [[ "$edit" > "0" ]]; then
      row=$(echo ".mode line^SELECT * FROM zas WHERE rowid=$edit LIMIT 1;" | tr '^' '\n' | sqlite3 "$db")
      day=$(echo "$row" | grep -e "^[ ]*day = " | sed -e 's/[ ]*day = //g')
      incr=$(echo "$row" | grep -e "^[ ]*increment = " | sed -e 's/[ ]*increment = //g')
      box=$(echo "$row" | grep -e "^[ ]*box = " | sed -e 's/[ ]*box = //g')
      ins=$(echo "$row" | grep -e "^[ ]*inside = " | sed -e 's/[ ]*inside = //g')
      note=$(echo "$row" | grep -e "^[ ]*note = " | sed -e 's/[ ]*note = //g')
 
      echo "  First time planned to (yyyy-mm-dd):"
      read -e -i "$day" day
      echo "  Repeat each (days):"
      read -e -i "$incr" incr
      echo "  Item...:"
      read -e -i "$box" box
      echo "  ...containing:"
      read -e -i "$ins" ins
      echo "  Action/note:"
      read -e -i "$note" note
      echo "EDIT? (Y/n)"
      read ack
 
      if [[ "$ack" != "n" ]]; then
        sqlite3 "$db" "UPDATE zas SET day='$day',box='$box',increment='$incr',inside='$ins',note='$note' WHERE rowid=$edit LIMIT 1;"
        echo "Tasks edited!"
      else
        echo "Edit cancelled!"
      fi
    else
      echo "Invalid value!"
    fi
    ;;
  "clone"|"-c"|"--clone"|"copy"|"--copy")
    echo "==== Clone entry ===="
    echo ".mode column^SELECT rowid,box,inside,note FROM zas ORDER BY rowid ASC;" | tr '^' '\n' | sqlite3 "$db"
    echo "  Clone: (0 = nothing)"
    read clone
    if [[ "$clone" > "0" ]]; then
      row=$(echo ".mode line^SELECT * FROM zas WHERE rowid=$clone LIMIT 1;" | tr '^' '\n' | sqlite3 "$db")
      day=$(echo "$row" | grep -e "^[ ]*day = " | sed -e 's/[ ]*day = //g')
      incr=$(echo "$row" | grep -e "^[ ]*increment = " | sed -e 's/[ ]*increment = //g')
      box=$(echo "$row" | grep -e "^[ ]*box = " | sed -e 's/[ ]*box = //g')
      ins=$(echo "$row" | grep -e "^[ ]*inside = " | sed -e 's/[ ]*inside = //g')
      note=$(echo "$row" | grep -e "^[ ]*note = " | sed -e 's/[ ]*note = //g')
 
      echo "== Edit cloned entry =="
 
      echo "  First time planned to (yyyy-mm-dd):"
      read -e -i "$day" day
      echo "  Repeat each (days):"
      read -e -i "$incr" incr
      echo "  Item...:"
      read -e -i "$box" box
      echo "  ...containing:"
      read -e -i "$ins" ins
      echo "  Action/note:"
      read -e -i "$note" note
      echo "COPY? (Y/n)"
      read ack
 
      if [[ "$ack" != "n" ]]; then
        sqlite3 "$db" "INSERT INTO zas VALUES (date('$day'),$incr,'$box','$ins','$note');"
        echo "Tasks copied!"
      else
        echo "Copy cancelled!"
      fi
    else
      echo "Invalid value!"
    fi
    ;;
esac
 
exit