MJN All Blog Cheatsheets Elasticsearch GCP JS LinuxBash Misc Notes Other ShortcutKeys / - Search

Home / LinuxBash / Script idid - Script to prompt user to do something!


#!/bin/bash
help_text="
NAME
  idid - Prompt to do something and create a note of what got done.

USAGE
  idid [options] 

OPTIONS

  -a|--activity <activity/task name>
    Show hours per week for a single activity/task

  -e|--editlog
    Opens the idid log file in vi to edit.

  -g
    To signify this is being run from git-bash

  -h|--help
    Show help text.

  -i|--interactive
    Run as an interactive tool.

  -l|--list
    Display the list of things I did.

  -r|--replace <current event> <replacement event>
    Replace a timed event name with a new name.

  -s|--schedule [<start date YY/MM/DD>]
    Display the timed events summary.

  -t|--tasksheet [<start date YY/MM/DD>]
    Display the timed events as an event focused timesheet.

  -u|--uniqueevents
    Display a unique list of event descriptions.

DESCRIPTION
  To keep a record of things done.

  Note: A timed event is text in the format XXX:HH - XXX - any characters, HH - hours.

AUTHOR
  mjnurse.dev - 2023
"

help_line="Script to prompt user to do something!"
web_desc_line="Script to prompt user to do something!"

gitbash_yn=n

# Regular Text Colours
txtblk='\e[0;30m' # Black
txtred='\033[01;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White

# Bold Text Colours
bldblk='\e[1;30m' # Black
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White

# Underlined Text Colours
unkblk='\e[4;30m' # Black
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White

# Background Colours
bakblk='\e[40m'   # Black
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

if [[ "$GITBASH" == "Y" || "$1" == "-g" || "$1" == "-gs" ]]; then
  i_did="/c/MJN/drive/i-did.txt"
  gitbash_yn=y
else
  i_did="/mnt/c/MJN/drive/i-did.txt"
fi

try="Try ${0##*/} -h for more information"
tmp="${help_text##*USAGE}"
usage=$(echo "Usage: ${tmp%%OPTIONS*}" | tr -d "\n" | sed "s/  */ /g")

case $1 in
  -h|--help)
    echo "$help_text"
    exit
    ;;
  -l|--list)
    cat ${i_did}
    exit
    ;;
  -a|--activity)
    clear
    tmpfile=/tmp/dme
    tmpcsvfile=/tmp/dmecsvA
    task=$2
    rm -rf $tmpfile $tmpcsvfile
    echo "dte,task,hrs" > $tmpcsvfile
    cat $i_did | grep -o " [^ ]*:[^ ]*\|^........" > $tmpfile
    dte=""
    out=""
    pdow=0
    while read line; do
      if [[ $line =~ ../../.. ]]; then
        if [[ $line != $dte ]]; then
          dte="$line"
          dow="$(date -d  ${line//\//-} +'%u')"
        fi
      else
        echo $dte:$line | sed "s/,//g;s/:/,/g" >> $tmpcsvfile
      fi
    done < $tmpfile
    dt="$2"
    if [[ "$dt" == "" ]]; then
      dt="$(date -d'monday-14 days' +%y/%m/%d)"
    fi
    csvsql $tmpcsvfile "
    SELECT STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week,
           task,
           MIN(dte) AS start, MAX(dte) AS end,
           SUM(hrs) *1.0 AS hrs
    FROM '$tmpcsvfile' 
    WHERE UPPER(task) = UPPER('$task')
    GROUP BY STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-')))  
    ORDER BY 3
    "
    rm -rf $tmpfile $tmpcsvfile
    exit
    ;;
  -e|--editlog)
    vi ${i_did}
    exit
    ;;
  -s|--schedule|-gs)
    tmpfile=/tmp/dme
    tmpcsvfile=/tmp/dmecsv
    rm -rf $tmpfile $tmpcsvfile
    echo "dte,task,hrs" > $tmpcsvfile
    cat $i_did | grep -o " [^ ]*:[^ ]*\|^........" > $tmpfile
    dte=""
    out=""
    pdow=0
    while read line; do
      if [[ $line =~ ../../.. ]]; then
        if [[ $line != $dte ]]; then
          dte="$line"
          dow="$(date -d  ${line//\//-} +'%u')"
        fi
      else
        echo $dte:$line | sed "s/,//g;s/:/,/g" >> $tmpcsvfile
      fi
    done < $tmpfile
    csvsql $tmpcsvfile "
      SELECT dte, total, breakdown
      FROM (
      SELECT dte, SUM(hrs) AS total, GROUP_CONCAT(task||':'||hrs, ', ') AS breakdown
      FROM (
        SELECT dte, task, SUM(hrs)*1.0 AS hrs 
        FROM '$tmpcsvfile' 
        GROUP BY dte, task
        )
      GROUP BY dte
      UNION
      SELECT date, '-----',''
      FROM (
      WITH RECURSIVE dates(date) AS (
        VALUES('2023-07-01')
        UNION ALL
        SELECT date(date, '+1 day')
        FROM dates
        WHERE date <= DATE('now')
      )
      SELECT SUBSTR(REPLACE(date,'-','/'), 3) AS date
      FROM dates
      WHERE STRFTIME('%w', date) = '5')
      ORDER BY dte )
      WHERE dte >= '$2'
      "

    rm -rf $tmpfile $tmpcsvfile
    exit
    ;;
  -t|--tasksheet)
    clear
    tmpfile=/tmp/dme
    tmpcsvfile=/tmp/dmecsv
    rm -rf $tmpfile $tmpcsvfile
    echo "dte,task,hrs" > $tmpcsvfile
    cat $i_did | grep -o " [^ ]*:[^ ]*\|^........" > $tmpfile
    dte=""
    out=""
    pdow=0
    while read line; do
      if [[ $line =~ ../../.. ]]; then
        if [[ $line != $dte ]]; then
          dte="$line"
          dow="$(date -d  ${line//\//-} +'%u')"
        fi
      else
        echo $dte:$line | sed "s/,//g;s/:/,/g" >> $tmpcsvfile
      fi
    done < $tmpfile

# import re
# from datetime import datetime
# 
# tmpfile = 'path/to/your/tmpfile.txt'
# tmpcsvfile = 'path/to/your/tmpcsvfile.csv'
# 
# # Open the files for reading and writing
# with open(tmpfile, 'r') as infile, open(tmpcsvfile, 'w') as outfile:
#     dte = None  # Variable to store the date
#     dow = None  # Variable to store the day of the week
# 
#     # Read lines from the input file
#     for line in infile:
#         line = line.strip()  # Remove leading/trailing whitespaces
# 
#         # Check if the line matches the pattern ../../..
#         if re.match(r'../../..', line):
#             # If the line is a date and different from the stored date, update variables
#             if line != dte:
#                 dte = line
#                 dow = datetime.strptime(line, '%m/%d/%y').strftime('%u')
# 
#         else:
#             # If the line does not match the date pattern, format and write to CSV file
#             if dte:
#                 formatted_line = f'{dte},{line}'.replace(',', '').replace(':', ',')
#                 outfile.write(formatted_line + '\n')

    dt="$2"
    if [[ "$dt" == "" ]]; then
      dt="$(date -d'monday-14 days' +%y/%m/%d)"
    fi
    csvsql $tmpcsvfile "
    SELECT task, Mon, Tue, Wed, Thu, Fri, Tot
    FROM (
      SELECT 3 AS pos, week, task 
           , SUM(CASE WHEN day='1' THEN hrs ELSE 0 END) AS Mon
           , SUM(CASE WHEN day='2' THEN hrs ELSE 0 END) AS Tue
           , SUM(CASE WHEN day='3' THEN hrs ELSE 0 END) AS Wed
           , SUM(CASE WHEN day='4' THEN hrs ELSE 0 END) AS Thu
           , SUM(CASE WHEN day='5' THEN hrs ELSE 0 END) AS Fri
           , SUM(hrs) AS Tot
      FROM (
        SELECT STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week
             , STRFTIME('%w',DATE('20'||REPLACE(dte,'/','-'))) AS day
             , dte
             , task
             , SUM(hrs)*1.0 AS hrs 
        FROM '$tmpcsvfile' 
        WHERE dte >= '"$dt"'
        GROUP BY dte, task 
        )
      GROUP BY week, task
      UNION
      SELECT 1, STRFTIME('%W',d) AS week
           , ''
           , STRFTIME('%m/%d', date(d, '-'||(MAX(STRFTIME('%w',d)-1))||' day'))
           , '', '' ,''
           , STRFTIME('%m/%d', date(d, '+'||(5-MAX(STRFTIME('%w',d)))||' day'))
           , 'Tot'
      FROM (
        SELECT DATE('20'||REPLACE(dte,'/','-')) AS d
        FROM '$tmpcsvfile' 
        WHERE dte >= '"$dt"'
        )
      GROUP BY 1, 2
      UNION
      SELECT 2, STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week
           , '', '-----', '-----', '-----', '-----', '-----','-----'
      FROM '$tmpcsvfile' 
      WHERE dte >= '"$dt"'
      GROUP BY 1, 2
      UNION
      SELECT 4, STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week
           , '', '-----', '-----', '-----', '-----', '-----','-----'
      FROM '$tmpcsvfile' 
      WHERE dte >= '"$dt"'
      GROUP BY 1, 2
      UNION
      SELECT 5 AS pos, week, 'TOTAL' as task
           , SUM(CASE WHEN day='1' THEN hrs ELSE 0 END) AS Mon
           , SUM(CASE WHEN day='2' THEN hrs ELSE 0 END) AS Tue
           , SUM(CASE WHEN day='3' THEN hrs ELSE 0 END) AS Wed
           , SUM(CASE WHEN day='4' THEN hrs ELSE 0 END) AS Thu
           , SUM(CASE WHEN day='5' THEN hrs ELSE 0 END) AS Fri
           , SUM(hrs) AS Tot
      FROM (
        SELECT STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week
             , STRFTIME('%w',DATE('20'||REPLACE(dte,'/','-'))) AS day
             , dte
             , SUM(hrs)*1.0 AS hrs 
        FROM '$tmpcsvfile' 
        WHERE dte >= '"$dt"'
        GROUP BY dte
        ) 
      GROUP BY week, task
      UNION
      SELECT 6 AS pos, week, '' as task
           , CASE SUM(CASE WHEN day='1' THEN hrs ELSE 0 END) WHEN 8 THEN '' ELSE '^^^^^' END
           , CASE SUM(CASE WHEN day='2' THEN hrs ELSE 0 END) WHEN 8 THEN '' ELSE '^^^^^' END
           , CASE SUM(CASE WHEN day='3' THEN hrs ELSE 0 END) WHEN 8 THEN '' ELSE '^^^^^' END
           , CASE SUM(CASE WHEN day='4' THEN hrs ELSE 0 END) WHEN 8 THEN '' ELSE '^^^^^' END
           , CASE SUM(CASE WHEN day='5' THEN hrs ELSE 0 END) WHEN 8 THEN '' ELSE '^^^^^' END
           , ''
      FROM (
        SELECT STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week
             , STRFTIME('%w',DATE('20'||REPLACE(dte,'/','-'))) AS day
             , dte
             , SUM(hrs)*1.0 AS hrs 
        FROM '$tmpcsvfile' 
        WHERE dte >= '"$dt"'
        GROUP BY dte
        ) 
      GROUP BY week, task
    )
    ORDER BY week, pos, task
    "
    # SELECT 6, STRFTIME('%W',DATE('20'||REPLACE(dte,'/','-'))) AS week
    #      , '', '', '', '', '', ''
    # FROM '$tmpcsvfile' 
    # WHERE dte >= '$2'
    # GROUP BY 1, 2

    rm -rf $tmpfile $tmpcsvfile
    exit
    ;;
  -u|--uniqueevents)
    for w in $(cat ${i_did}); do echo " $w "; done | \
      grep -o " [a-zA-Z][^:]*:[^ ]* " | sed "s/ //g; s/:.*//" | sort | uniq -c
    exit
    ;;
  -r|--replace)
    sed -i "s/ $2:/ $3:/g" $i_did
    idid -u
    exit
    ;;
  -i|--interactive) 
    while [ 1 ]; do
      echo
      echo "(h - help, x - exit)"
      echo
      read -p "> " i
      if [[ $i == x ]]; then
        exit
      fi
      idid -$i
    done
    exit
    ;;
  ??/??)
    dte="$(date +'%y')/$1"
    echo date: $dte
    ;;  
esac

cd /c/Users/MartinNurse/OneDrive\ -\ Quantexa\ Ltd/MJN/github/todo-done
/c/Users/MartinNurse/OneDrive\ -\ Quantexa\ Ltd/MJN/github/todo-done/dne
/c/Users/MartinNurse/OneDrive\ -\ Quantexa\ Ltd/MJN/github/todo-done/todo
exit

clear

hour=""
if [[ "$dte" == "" ]]; then
  dte="$(date +'%y/%m/%d')"
  hour="-$(date +'%H:00')"
fi

repeat_yn=y

while [[ ${repeat_yn} == y ]]; do
  echo
  read -p "What did you do? " did
  echo
  echo "${dte}${hour} - ${did}"
  echo
  read -p "Save [yNq] (q - quit) " yn
  if [[ $yn == q ]]; then
    exit
  elif [[ $yn == y ]]; then
    repeat_yn=n
  fi
done

echo "${dte}${hour} - ${did}" >> ${i_did}

echo
tail -n 40 ${i_did}

echo
read -p "Press RTN to close (e RTN to edit I did, s RTN to see schedule) " v

case $v in
  e)
    vi ${i_did}
    ;;
  s)
    if [[ $gitbash_yn == y ]]; then
      $0 -gs
    else
      $0 -s
    fi
    echo 
    read -p "Press RTN to close" w
    ;;
esac

sort ${i_did} | sed "/^$/d" > /tmp/idid.tmp

rm -f ${i_did}
st=""
while read line; do
  if [[ "$st" != "${line:0:8}" ]]; then
    echo >> ${i_did}
    st=${line:0:8}
  fi
  echo $line >> ${i_did}
done < /tmp/idid.tmp


This page was generated by GitHub Pages. Page last modified: 24/03/12 09:53