#!/bin/sh # $Id: karolarm,v 1.40 2011/03/09 09:51:50 kili Exp $ # # Copyright (c) 2007, 2009, 2010 Matthias Kilian # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. myname=${0##*/} usage() { echo "usage: $myname [-a] [-b brokeninterval] [-i interval] [user]" >& 2 exit 1 } allttys=0 interval=15 brokenintv=300 local_user=$(id -un) for arg; do [ "X$arg" != X--help ] || { echo "$myname: Use 'man $myname' for help." >&2 exit 1 } done while getopts ab:i:u: flag; do case $flag in a) allttys=1;; b) brokenintv=$OPTARG;; i) interval=$OPTARG;; u) karo_user=$OPTARG;; # kept for backward compatibility *) usage;; esac done shift $((OPTIND - 1)) case $# in 0) karo_user=$local_user;; 1) karo_user=$1;; *) usage;; esac case $(uname) in *BSD) fetch() { ftp -V -o - "$@" } ;; Linux) fetch() { wget -q -O - "$@" } ;; *) echo "Don't know how to fetch URLs." >& 2 exit 1 ;; esac turn() { _d=$(fetch "http://www.karopapier.de/dran.php?login=$karo_user" | sed -e 's@^Karo - \([0-9]*\)$@\1@p' -e d) && expr "$_d" : '[0-9]\{1,\}$' > /dev/null && echo $_d || { notify "$myname: broken data."; false; } } sleepcheck() { sleep $1 who -T | awk "\$1 == \"$local_user\" && \$0 = \$1" | sort -u | read _ } notify() { who -T | while read u w t _; do if [ $u = $local_user -a \( $allttys -gt 0 -o "X$w" = "X+" \) ] then printf "$*\a\r\n" > /dev/$t fi done } trap lastt=0 HUP lastt=0 played=0 tmax=$((2 * interval / 15)) intv_cur=$interval while sleepcheck $intv_cur; do if ! t=$(turn); then intv_cur=$brokenintv continue fi intv_cur=$interval if [ $lastt -eq 0 -a $t -gt 0 -o \ $played -eq 1 -a $lastt -le $tmax -a $t -gt $lastt ] then s=$(echo $t | sed -e 's@^1$@@' -e 's@..*@s@') notify "It's your turn in $t game$s at karopapier.de!" fi played=$((t < lastt)) lastt=$t done