| Rev 101 | Rev 102 | |
|---|---|---|
| Line 1... | Line 1... | |
| #!/bin/bash | #!/bin/bash | |
| function wait_for_window() { | ||
| name="$1" | CGOBAN_JAR=~/cgoban.jar | |
| while sleep 1; do | LOCKFILE=~/mes_lockfile | |
| echo "$name" | SCREENSHOT=~/mes_ss.png | |
| if xwininfo -wm -name "$name" > /dev/null 2> /dev/null; then | VGOUT=~/mes_vgout | |
| break | PAT=~/scripts/patterns | |
| FBDIR=~/mes_fb | ||
| SLEEPLOCK=~/scripts/sleeplock.sh | ||
| function kgs_start() { | ||
| if [ -e $LOCKFILE ]; then | ||
| kill `cat $LOCKFILE` | ||
| sleep 1 | ||
| fi | ||
| killall Xvfb 2> /dev/null && echo "oops" && sleep 1 | ||
| rm -f $LOCKFILE | ||
| xvfb-run -f ~/.Xauthority -n 97 -s '-screen 0 800x600x8 -fbdir '$FBDIR $SLEEPLOCK $LOCKFILE & | ||
| for I in $(seq 1 10); do | ||
| if [ -e $LOCKFILE ]; then | ||
| java -jar $CGOBAN_JAR & | ||
| x11vnc -passwd cccccccc -forever -viewonly -quiet > /dev/null 2> /dev/null & | ||
| return 0 | ||
| fi | fi | |
| sleep 1 | ||
| done | done | |
| return 1 | ||
| } | } | |
| function cgoban_start() { | ||
| # /home/kgs/scripts/xvfb java -jar /home/kgs/cgoban.jar 2> /dev/null > /dev/null & | function err() { | |
| java -jar /home/kgs/cgoban.jar & #2> /dev/null > /dev/null & | echo "$1" >&2 | |
| wait_for_window "CGoban: Main Window" | exit 1 | |
| sleep 1 | } | |
| } | ||
| function cgoban_exit() { | function screenshot() { | |
| main_id=$(xwininfo -children -name 'CGoban: Main Window'|grep xwininfo|sed 's/.*\(0x[0-9a-f]*\).*/\1/') | #import -window root -depth 8 $SCREENSHOT || err "Screenshot failed" | |
| xkill -id $main_id > /dev/null 2> /dev/null | convert $FBDIR/Xvfb_screen0 $SCREENSHOT || err "Screenshot failed" | |
| } | } | |
| function cgoban_login { | ||
| xte 'key space' # Login->Login box | function vt() { | |
| wait_for_window "KGS: Log In" | screenshot | |
| sleep 3 | if visgrep -t 100 $SCREENSHOT $PAT/$1.pat $PAT/$1.pat > $VGOUT; then | |
| xte 'key Return' # Username | J="$(grep ' 0$' $VGOUT|head -n 1|sed 's/ 0//;s/,/ /')" | |
| sleep 3 | if [ -n "$J" ]; then | |
| xte 'key Return' # Password->Rooms list | echo "$J" | |
| wait_for_window "KGS: Rooms" | echo "Early find" 2>&1 | |
| sleep 3 | return 0 | |
| } | fi | |
| function cgoban_open_message() { | fi | |
| menu=$(xwininfo -name 'KGS: Rooms'|perl -ne 'BEGIN{$y=10;$x=10}if(/Absolute upper-left Y:\s+(\d+)/){$y+=$1}if(/Absolute upper-left X:.*?(\d+)/){$x+=$1}END{print"$x $y\n"}') | if visgrep -t 5000 $SCREENSHOT $PAT/$1.pat $PAT/$1.pat > $VGOUT; then | |
| xte "mousemove $menu" # Select menu | J="$(grep ' 0$' $VGOUT|head -n 1|sed 's/ 0//;s/,/ /')" | |
| xte 'mouseclick 1' | if [ -n "$J" ]; then | |
| sleep 3 | echo "$J" | |
| xte 'key Right' | return 0 | |
| sleep 2 | fi | |
| xte 'key Right' # User menu | fi | |
| sleep 2 | return 1 | |
| xte 'key Up' # Leave message | } | |
| sleep 2 | ||
| xte 'key Return' # -> Leave message | function vg() { | |
| wait_for_window "KGS: Leave Message" | for I in $(seq 1 10); do | |
| sleep 3 | vt $1 && return 0 | |
| } | echo "Waiting on $1" >&2 | |
| function xte_str() { | sleep 1 | |
| str=$1 | done | |
| echo "$str"|perl -ne ' | echo "FAIL" >&2 | |
| use utf8; | return 1 | |
| my $shift=0; | } | |
| my @out; | ||
| my %conv = ( | function click() { | |
| "`" => "grave", | J="$(vg $1)" | |
| "¬" => "shift|grave", | [ -z "$J" ] && return 1 | |
| "!" => "shift|1", | xte "mousemove $J" "mouseclick 1" | |
| "\"" => "shift|2", | echo xte "mousemove $J" "mouseclick 1" | |
| "£" => "shift|3", | } | |
| "\$" => "shift|4", | ||
| "%" => "shift|5", | function kgs_login() { | |
| "^" => "shift|6", | kgs_start || err "Could not start server" | |
| "&" => "shift|7", | ||
| "*" => "shift|8", | click playonkgs || err "Could not find play button" | |
| "(" => "shift|9", | ||
| ")" => "shift|0", | click login_ok || err "Could not find login button" | |
| "-" => "minus", | } | |
| "_" => "shift|minus", | ||
| "=" => "equal", | function send_mes() { | |
| "+" => "shift|equal", | dst="$(echo "$1"|sed 's/[^a-zA-Z0-9]//g')" | |
| "[" => "bracketleft", | mes="$(echo "$2"|sed 's/[^a-zA-Z0-9`!"$%^&*()_+={}[]:;@'\''#~\/?.>,<\\|-]//g')" | |
| "{" => "shift|bracketleft", | ||
| "]" => "bracketright", | click usermenu || err "Could not find user menu" | |
| "}" => "shift|bracketright", | ||
| ";" => "semicolon", | click leavemessage || err "Could not find Leave Message button" | |
| "'\''" => "apostrophe", | ||
| "#" => "numbersign", | click mes_name || err "Could not find name box" | |
| "," => "comma", | ||
| "." => "period", | # Enter target name | |
| "/" => "slash", | xte "str $dst" "key Tab" | |
| ":" => "shift|semicolon", | ||
| "@" => "shift|apostrophe", | # click mes_content || err "Could not find content box" | |
| "~" => "shift|numbersign", | ||
| "<" => "shift|comma", | # Enter message | |
| ">" => "shift|period", | echo WTF?!?!? | |
| "?" => "shift|slash", | sleep 1 | |
| " " => "space", | echo "$mes" | while read I; do xte "str $I" "key Return"; done | |
| "\n" => "Return", | sleep 1 | |
| "\r" => "Return", | echo WTF?!?!? | |
| ); | ||
| for (split //) { | click mes_ok || err "Could not find OK box" | |
| my $needshift; | ||
| my $key; | # Get the mouse clear | |
| if ($key = $conv{$_}) { | xte "mousemove 0 0" | |
| $needshift = 1 if $key =~ s/shift\|//; | sleep 1 | |
| } elsif (/[a-zA-Z0-9]/) { | ||
| $key = $_; | # Check user existed... | |
| $needshift = 1 if ord $key >= ord("A") && ord $key <= ord("Z"); | for I in $(seq 1 10); do | |
| $key = lc $key; | if vt mes_ok > /dev/null; then | |
| } else { | echo Still here... | |
| open ERR, ">>/home/kgs/test"; | if vt mes_miss > /dev/null; then | |
| print ERR "Error char: $_ (".ord($_).")\n"; | echo Fail! | |
| close ERR; | sleep 1 | |
| } | click mes_miss_ok | |
| if ($needshift && !$shift) { | sleep 1 | |
| $shift = 1; | click mes_cancel | |
| push @out, "keydown Shift_L"; | return 1 | |
| } elsif ($shift && !$needshift) { | fi | |
| push @out, "keyup Shift_L"; | else | |
| undef $shift; | echo Gone. | |
| } | return 0 | |
| push @out, "key $key"; | fi | |
| } | ||
| if ($shift) { | sleep 1 | |
| push @out, "keyup Shift_L"; | done | |
| } | ||
| print join("\n",@out)."\n"; | # Seems to have gone fine, but the message box is still up | |
| system("/usr/bin/xte", @out); | ||
| ' | err "Message box never removed from screen" | |
| } | } | |
| function cgoban_enter_message() { | ||
| to="$1" | export DISPLAY=:97 | |
| message="$2" | ||
| xte 'key Tab' # Select username box | kgs_login | |
| sleep 3 | ||
| xte_str "$to" # username | while true; do | |
| sleep 3 | for I in $(seq 1 10); do | |
| xte_str "$message" # message | if mysql -Nsre 'SELECT @i:=id FROM message_queue WHERE err IS NULL LIMIT 1; SELECT username FROM message_queue WHERE id = @i; SELECT message FROM message_queue WHERE id = @i;' | ( | |
| sleep 10 | read id | |
| button=$(xwininfo -name 'KGS: Leave Message'|perl -ne 'BEGIN{$y=-10;$x=10}if(/Absolute upper-left Y:\s+(\d+)/||/Height:\s+(\d+)/){$y+=$1}if(/Absolute upper-left X:.*?(\d+)/){$x+=$1}END{print"$x $y\n"}') | ||
| xte "mousemove $button" | ||
| xte 'mouseclick 1' | ||
| sleep 3 | ||
| } | ||
| function xte() { | ||
| echo "xte: $1" | ||
| /usr/bin/xte "$1" | ||
| } | ||
| evilwm & | ||
| sleep 5 | ||
| killall -9 evilwm | ||
| sleep 2 | ||
| awesome & | ||
| sleep 5 | ||
| killall -9 awesome | ||
| sleep 2 | ||
| openbox & | ||
| xmodmap /home/kgs/.xmodmap | ||
| sleep 1 | ||
| cgoban_start | ||
| cgoban_login | ||
| count=0 | ||
| while [ $count -le 5 ]; do | ||
| if mysql -Nsre 'SELECT username FROM message_queue LIMIT 1; SELECT message FROM message_queue LIMIT 1;' | ( | ||
| read to | read to | |
| if [ -z "$to" ]; then | if [ -z "$to" ]; then | |
| exit 1 | exit 1 | |
| fi | fi | |
| message="$(cat)" | message="$(cat)" | |
| echo "To: $to" | echo "$id $to $message" | |
| echo "$message" | if send_mes "$to" "$message"; then | |
| cgoban_open_message | mysql -Nsre "DELETE FROM message_queue WHERE id = $id;" | |
| cgoban_enter_message "$to" "$message" | ||
| mysql -Nsre 'DELETE FROM message_queue LIMIT 1;' | ||
| ) then | ||
| count=0 | ||
| else | else | |
| sleep 10 | if [ "$?" = "1" ]; then | |
| count=$(expr $count + 1) | mysql -Nsre "UPDATE message_queue SET err=\"bad username\" WHERE id = $id;" | |
| else | ||
| mysql -Nsre "UPDATE message_queue SET err=\"who knows\" WHERE id = $id;" | ||
| fi | ||
| fi | ||
| ) then | ||
| break | ||
| fi | ||
| # No messages for 10 waits | ||
| if [ "$I" = "10" ]; then | ||
| exit 0 | ||
| fi | fi | |
| sleep 10 | ||
| done | ||
| done | done | |
| cgoban_exit | ||
| killall $(cat $LOCKFILE) | ||