#!/opt/bin/perl BEGIN { $ENV{PERL_RL} = "gnu" } use Term::ReadLine; # this suxx use AnyEvent; use Storable; use YAML; @ARGV == 5 or die "Usage: $0 host port login password dm-pass\n"; use base Crossfire::Protocol::Base; my $login = AnyEvent->condvar; my $quit = AnyEvent->condvar; my $rl = new Term::ReadLine "cfshell"; sub logged_in { my ($self) = @_; $login->broadcast; $self->send_command ("dmhide $ARGV[4]"); print "\nlogged in.\n"; } sub fatal { $rl->crlf; $rl->deprep_terminal; print "$_[0]\n"; exit 1; } sub eof { my ($self) = @_; fatal "server closed connection."; } sub query { my ($self, $flags, $prompt) = @_; fatal "unexpected prompt: $prompt"; } sub drawinfo { my ($self, $flags, $text) = @_; $rl->crlf; print "$text\n"; $rl->forced_update_display; } my $cf = new main host => $ARGV[0], port => $ARGV[1] || 13327, user => $ARGV[2], pass => $ARGV[3], mapw => 1, maph => 1; $login->wait; my $w = AnyEvent->io (fh => $rl->IN, poll => 'r', cb => sub { $rl->callback_read_char }); $rl->callback_handler_install ("$ARGV[0]> ", sub { $rl->add_history ($_[0]); $cf->send_ext_req (perl_eval => code => $_[0], sub { my ($msg) = @_; $rl->crlf; my ($status, $result) = split / /, $data, 2; if (exists $msg->{error}) { print "$msg->{error}\n"; } else { print Dump Storable::thaw $msg->{result}; } $rl->forced_update_display; }); }); $quit->wait; $rl->callback_handler_remove;