ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/bin/gtp-controller
Revision: 1.1
Committed: Sat May 15 17:50:07 2004 UTC (20 years ago) by pcg
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 #!/opt/bin/perl
2    
3     # lots of things have been hardcoded. search for #d# to find the places
4    
5     use KGS::Protocol;
6     use KGS::Listener::Debug;
7    
8     use IO::Socket::INET;
9     use Event;
10    
11     use GetOpt::Long;
12     use Carp;
13    
14     $VERSION = 0.0; # be more confident....
15    
16     $SIG{QUIT} = sub { Carp::confess "SIGQUIT" };
17    
18     my $kgs;
19     my $verbose = 1;
20     my $user = "guest";
21     my $pass = undef;
22    
23     sub usage {
24     print STDERR <<EOF
25     Usage: $0 [options] -- engine engine-args...
26     -u username usernmae to connect
27     -p password optional password to connect (none => guest)
28     -v increase verbosity
29     -q decrease verbosity
30    
31     $0 connects to the kiseido go server, starts the named engine
32     and communicates with it using GTP protocol using it's stdin and stdout.
33    
34     If no engine is given, uses stdin/stdout itself for communications.
35    
36     The engine can optionally act as controller, too, as long as it isn't
37     confused by responses on it's command input stream.
38    
39     Command extension used by the controller:
40    
41     kgs-login message # login successful
42     ...
43    
44     Commands usable by the client:
45    
46     ...
47    
48     EOF
49     exit shift;
50     }
51    
52     GetOptions (
53     "u=s" => \$user,
54     "v" => sub { $verbose++ },
55     "q" => sub { $verbose-- },
56     "h" => sub { usage(0) };
57     ) or die usage(1);
58    
59     package kgs;
60    
61     use base KGS::Listener;
62    
63     my $conn = new KGS::Protocol;
64    
65     sub new {
66     my $class = shift;
67     my $self = bless { @_ }, $class;
68    
69     print STDERR "$0 version $VERSION connecting...\n" if $verbose;
70    
71     my $sock = new IO::Socket::INET PeerHost => $ENV{KGSHOST} || "kgs.kiseido.com", PeerPort => "2379"
72     or die "connect: $!";
73    
74     $sock->blocking (1);
75     $conn->handshake ($sock);
76    
77     $self->listen ($conn, "any");
78    
79     # Listener for kgs data
80     $self->{w} = Event->io (fd => $sock, poll => 'r', cb => sub {
81     my $len = sysread $sock, my $buf, 16384;
82     if ($len) {
83     $conn->feed_data($buf);
84     } elsif (defined $len || (!$!{EINTR} and !$!{EAGAIN})) {
85     print STDERR "disconnected\n" if $verbose;
86     Event::unloop;
87     }
88     });
89    
90     # Listener for keyboard input. Needs a tty
91     $self->{kbd} = Event->io (fd => \*STDIN, poll => 'r', cb => sub {
92     $self->inject_cmd (<STDIN>);
93     });
94    
95     $conn->login ("kgsclient 0.0", $self->{user}, delete $self->{password});
96    
97     $self;
98     }
99    
100     sub inject_login {
101     my ($self, $msg) = @_;
102    
103     print STDERR "login: $msg->{message}\n" if $verbose;
104     # $self->send (join_room =>
105     # channel => 13,
106     # user => { name => $self->{user} });
107     }
108    
109     sub inject_msg_room {
110     my ($self, $msg) = @_;
111     print "$msg->{name}#$msg->{channel}: $msg->{message}\n";
112     }
113    
114     sub inject_any {
115     my ($self, $msg) = @_;
116     print "DEBUG: $msg->{type}#$msg->{channel}" if $verbose;
117     for (sort keys %$msg) {
118     print " $_<$msg->{$_}>";
119     }
120     print "\n";
121     }
122    
123     # user input
124     sub inject_cmd {
125     my ($self, $cmd) = @_;
126     chomp $cmd;
127     print ">>>>> $cmd\n" if $verbose;
128     $self->send (msg_room =>
129     channel => 13,
130     name => $self->{user},
131     message => $cmd);
132     }
133    
134     package gtp;
135    
136     sub new {
137     my $class = shift;
138     bless { @_ }, $class;
139     }
140    
141     sub set_fh {
142     my ($self, $in, $out) = @_;
143    
144     $self->{i} = $in;
145     $self->{o} = $out;
146    
147     Event->io (fd =>
148     }
149    
150     sub run_engine {
151     }
152    
153     package main;
154    
155     $kgs = new kgs user => "kgsclient", undef; #d#
156    
157     Event::loop;
158    
159     1;
160    
161