A lot of tweaks, particularly concerning the MHC schedule
[tpope-extra.git] / bin / away-detect
1 #!/bin/sh
2 # $Id$
3 # -*- sh -*- vim: ft=sh sw=4 sts=4
4
5 # Checks several sources of information and updates my away status
6 # appropriately.  Designed to be periodically called by cron on marge.
7
8 PATH=/home/tpope/bin:/bin:/usr/bin
9
10 out="Out"
11 sleeping="Sleeping"
12 afk="Away from keyboard"
13 off="Desktop is off"
14
15 old_away="`tpope away`"
16 [ -f "$HOME/.away-smart" ] && . "$HOME/.away-smart"
17 cat /dev/null > "$HOME/.away-smart"
18
19 ssh="ssh -a -x -oBatchmode=yes -oSetupTimeOut=20"
20
21 if [ -f "/tmp/LCK..`basename $0`" ]; then
22     if [ -d "/tmp/LCK..`basename $0`" ]; then
23         #echo "Locked.  Exiting." >&2
24         exit 1
25     else
26         #echo "Stale lock file found.  Removing." >&2
27         rm -f "/tmp/LCK..`basename $0`"
28     fi
29 fi
30
31 trap 'rm -f "/tmp/LCK..`basename $0`"' EXIT
32 echo $$ > "/tmp/LCK..`basename $0`"
33
34 set_smart() {
35     if [ -z "$old_away" -o "$old_away" = "$old_smart" ] || [ "$phone" = present -a "$old_phone" = absent ]; then
36         tpope away "$*"
37     fi
38     smart="$*"
39 }
40
41 set_custom() {
42     [ -z "$old_away" -o "$old_away" = "$old_smart" ] && \
43     tpope away "$*"
44 }
45
46 set_out() {
47     [ -z "$old_away" -o "$old_away" = "$old_smart" ] && \
48     tpope away "$*"
49     set_smart "$*"
50 }
51
52 set_in() {
53     if [ "`date +%k`" -ge 2 -a "`date +%k`" -le 9 ]; then
54         set_smart "$sleeping"
55     else
56         set_smart "$*"
57     fi
58 }
59
60 set_active() {
61     if [ -n "$old_smart" -a -n "$old_away" ]; then
62         tpope away -c
63         set_smart ""
64     fi
65     #[ -f "$HOME/.away-smart" ] && tpope away -c
66 }
67
68 now="$(expr 60 \* $(date +%H) + $(date +%M))"
69
70 today --category=school | sed -e s/^..........// -e 's/ \[.*\]$//'|grep '[0-9][0-9]:[0-9][0-9]-[0-9][0-9]:[0-9][0-9]'| \
71 while read times event; do
72     begin="$(expr 60 \* $(echo $times|sed -e 's/-.*//' -e 's/:/ + /g'))"
73     end="$(expr 60 \* $(echo $times|sed -e 's/.*-//' -e 's/:/ + /g'))"
74     max_end="$end"
75     end="`expr 3 \* $begin / 4 + $end / 4`"
76     begin="`expr $begin - 15`"
77     echo $begin $now $end $max_end
78     if [ "$begin" -le "$now" -a "$now" -lt "$end" ]; then
79         echo "scheduled=\"Class ($event)\"" >> "$HOME/.away-smart"
80         break
81     elif [ "$old_away" = "Class ($event)" -a "$now" -gt "$max_end" ]; then
82         echo "old_smart=\"$old_away\"" > "$HOME/.away-smart"
83         echo HI MOM
84     fi
85 done
86
87 cat ~/.away-smart
88
89 today --category='!school'\ '!private' | sed -e s/^..........// -e 's/ \[[^[]*\]$//'|grep '[0-9][0-9]:[0-9][0-9]-[0-9][0-9]:[0-9][0-9]'| \
90 while read times event; do
91     begin="$(expr 60 \* $(echo $times|sed -e 's/-.*//' -e 's/:/ + /g'))"
92     end="$(expr 60 \* $(echo $times|sed -e 's/.*-//' -e 's/:/ + /g'))"
93     max_end="$end"
94     if [ "$begin" -le "$now" -a "$now" -lt "$end" ]; then
95         echo "scheduled=\"$event\"" > "$HOME/.away-smart"
96         break
97     elif [ "$old_away" = "$event" -a "$now" -gt "$max_end" ]; then
98         echo "old_smart=\"$old_away\"" > "$HOME/.away-smart"
99     fi
100 done
101
102 [ -f "$HOME/.away-smart" ] && . "$HOME/.away-smart"
103 old_sched="$scheduled"
104
105 for host in abe homer lisa mona; do
106     ping -c 1 $host >/dev/null 2>&1 && livehosts="$livehosts $host"
107 done
108
109 for host in $livehosts; do
110     # True if a non-blanked display is found
111     $ssh $host 'if DISPLAY=:0.0 xscreensaver-command -version >/dev/null 2>&1; then if DISPLAY=:0.0 xscreensaver-command -time 2>&1 |egrep "non-blanked|no saver status" >/dev/null; then true; else pid=`ps ax|grep "[0-9]:[0-9][0-9] ssh .*exec screen.*RR irc"|sed -e "s/^  *//"|cut -d" " -f 1`; [ -f "$HOME/.irc.lock" -o -z "$pid" ] || kill $pid; false; fi; else false; fi' && alive=$host
112 done
113
114 if ! ping -c 1 mona >/dev/null 2>/dev/null; then
115     phone=unknown
116 else
117     last_slh="`$ssh mona cat .blue/last_slh 2>/dev/null`"
118     if [ -z "$last_slh" ]; then
119         phone=unknown
120     elif [ "$(expr "$(date +%s)" - "$last_slh")" -lt 600 ]; then
121         phone=present
122     else
123         phone=absent
124     fi
125 fi
126
127 if [ -n "$scheduled" ]; then
128     set_custom "$scheduled"
129 elif [ -n "$alive" ]; then
130     set_active
131 elif [ "$phone" = unknown ]; then
132     set_in "$afk"
133 elif [ "$phone" = present ]; then
134     set_in "$afk"
135 else
136     set_out "$out"
137 fi
138
139 cat /dev/null > "$HOME/.away-smart"
140 echo "old_smart=\"$smart\"" >>~/.away-smart
141 echo "old_phone=\"$phone\"" >>~/.away-smart
142 echo "old_alive=\"$alive\"" >>~/.away-smart
143 echo "old_sched=\"${scheduled:-$old_sched}\"" >>~/.away-smart
144
145 exit 0