#!/bin/bash
#< Fetch latest Dilbert strip and email it to me

BASENAME="/usr/bin/basename"
CURL="/usr/bin/curl"
DATE="/usr/bin/date"
ECHO="/usr/bin/echo"
GREP="/bin/grep"
MAILX="/bin/mailx"
RM="/bin/rm"
SED="/usr/bin/sed"
UUENCODE="/usr/bin/uuencode"

OUTPUT_FILE="dilbert.html"
OUTPUT_IMG="dilbert.gif"
THIS_PROG="$( ${BASENAME} $0 )"
DILBERT_URL="http://www.dilbert.com"
TO_ADDR="kevin@zazzybob.com"

function print_error {
   ${ECHO} "Error: $@" >&2
}

function print_usage {
   {
      ${ECHO} "Usage: ${THIS_PROG} [-hy]"
      ${ECHO} "       -h   Display this usage message"
   } >&2
}

function cleanup {
   ${RM} -f ${OUTPUT_FILE} ${OUTPUT_IMG}
}

trap 'cleanup; exit 1' 1 2 3 15

function check_url {
   HTTP_CODE=$( ${CURL} -s -o /dev/null -w%{http_code} ${DILBERT_URL} )
   if [ "${HTTP_CODE}" -ne "200" ]; then
      print_error "Unable to access ${DILBERT_URL}"
   fi
}

function get_url {
   ${CURL} ${DILBERT_URL} >${OUTPUT_FILE} 2>/dev/null
}

function get_img {
   ${CURL} ${DILBERT_URL}/${TODAYS_COMIC} >${OUTPUT_IMG} 2>/dev/null || { print_error "Could not get image" && exit 1; }
}

function mail_img {
   ${UUENCODE} ${OUTPUT_IMG} ${OUTPUT_IMG} | ${MAILX} -s "Dilbert for $( ${DATE} +%d/%m/%Y )" ${TO_ADDR}
}

function parse_html {
    ${GREP} "Today's Comic" ${OUTPUT_FILE} >/dev/null 2>&1 || { print_error "Could not parse HTML" && exit 1; }
    TODAYS_COMIC=$( ${GREP} "Today's Comic" ${OUTPUT_FILE} | ${SED} -n 's/^.*IMG SRC="\([^"]*\)" ALT="Today.*$/\1/p' )
}

while getopts ":h" OPTION; do
  case ${OPTION} in
      "h")  print_usage && exit 0   ;;
      *  )  print_usage && exit 1   ;;
  esac
done

shift $(( ${OPTIND} - 1 ))

if [ "$#" -ne "0" ]; then
   print_usage && exit 1
fi

check_url
get_url
parse_html
get_img
mail_img
cleanup

exit 0