X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=cmd%2Fshow%2Fwm7d.pl;h=0aa7e9918084c6e32ace0d25f50d41f9e982d712;hb=36fb54df677f2db28b1e8ea098d5d492ad872896;hp=6dfb5b14172a8885511fd9fa97055eb19565c6e4;hpb=c3505bcfc922cd712bad2c20b3479cf8d1dc54fe;p=spider.git diff --git a/cmd/show/wm7d.pl b/cmd/show/wm7d.pl index 6dfb5b14..0aa7e991 100644 --- a/cmd/show/wm7d.pl +++ b/cmd/show/wm7d.pl @@ -1,43 +1,86 @@ # # Query the WM7D Database server for a callsign # -# Largely based on "sh/qrz" and info in the Net::Telnet documentation -# -# Copyright (c) 2002 Charlie Carroll K1XX +# Was Largely based on "sh/qrz" # +# Original Copyright (c) 2002 Charlie Carroll K1XX # +# Async version (c) Dirk Koopman G1TLH # +sub waitfor +{ + my $conn = shift; + my $msg = shift; + $msg =~ s/\cM//g; + + my $buf = $conn->{msg}; + $buf =~ s/\r/\\r/g; + $buf =~ s/\n/\\n/g; + + dbg "state $conn->{state} '$msg' '$buf'" if isdbg('wm7d'); + + $conn->{_wm7d} ||= []; + + if ($conn->{state} eq 'waitfor') { + if ($msg =~ /utc$/ ) { + $conn->send_later("$conn->{target_call}\n"); + $conn->{state} = 'working'; + } + } elsif ($conn->{state} eq 'working') { + if ($conn->{msg} =~ /^\rquery->\s*$/) { + $conn->send_later("QUIT\n"); + $conn->{state} = 'ending'; + } + return if $msg =~ /^query->/; + push @{$conn->{_wm7d}}, $msg; + } else { + return if $msg =~ /^query->/ || $msg =~ /bye/; +# $conn->handle_raw($msg); + push @{$conn->{_wm7d}}, $msg; + } +} + +sub on_disc +{ + my $conn = shift; + my $dxchan = shift; +# $DB::single = 1; + + $dxchan->send(map {"$conn->{prefix}$_"} @{$conn->{_wm7d}}); +} + # wm7d accepts only single callsign -my ($self, $line) = @_; -my $call = $self->call; -my @out; - -# send 'e24' if allow in Internet.pm is not set to 1 -return (1, $self->msg('e24')) unless $Internet::allow; -return (1, "SHOW/WM7D , e.g. SH/WM7D k1xx") unless $line; -my $target = $Internet::wm7d_url || 'www.wm7d.net'; -my $port = 5000; -my $cmdprompt = '/query->.*$/'; - -my($info, $t); - -$t = new Net::Telnet; -$info = $t->open(Host => $target, - Port => $port, - Timeout => 20); - -if (!$info) { - push @out, $self->msg('e18', 'WM7D.net'); -} else { - ## Wait for prompt and respond with callsign. - $t->waitfor($cmdprompt); - $t->print($line); - ($info) = $t->waitfor($cmdprompt); - - # Log the lookup +sub handle +{ + + my ($self, $line) = @_; + my $call = $self->call; + my @out; + +# $DB::single = 1; + + + # send 'e24' if allow in Internet.pm is not set to 1 + return (1, $self->msg('e24')) unless $Internet::allow; + return (1, "SHOW/WM7D , e.g. SH/WM7D k1xx") unless $line; + my $target = $Internet::wm7d_url || 'www.wm7d.net'; + my $port = 5000; + my $cmdprompt = '/query->.*$/'; + Log('call', "$call: show/wm7d \U$line"); - $t->close; - push @out, split /[\r\n]+/, $info; + + my $conn = AsyncMsg->raw($self, $target, $port, + handler => \&waitfor, prefix=>'wm7d> ', on_disc =>\&on_disc); + if ($conn) { + $conn->{state} = 'waitfor'; + $conn->{target_call} = $line; + + push @out, $self->msg('m21', "show/wm7d"); + } else { + push @out, $self->msg('e18', 'WM7D.net'); + } + + return (1, @out); } -return (1, @out); +