X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FDXChannel.pm;h=7a27a8f2bc3bd3a90eda6efaaf388e9c6bc312fc;hb=26d388e9e65e585c9883ba19fc9b12bdf5aec525;hp=93d07c1d3a69561ed50e84a40d2f2824a6118645;hpb=9995de8c1bfcb9ed980ab0ef12e4d66564c04105;p=spider.git diff --git a/perl/DXChannel.pm b/perl/DXChannel.pm index 93d07c1d..7a27a8f2 100644 --- a/perl/DXChannel.pm +++ b/perl/DXChannel.pm @@ -86,6 +86,7 @@ use vars qw(%channels %valid); pingtime => '5,Ping totaltime,parray', pingave => '0,Ping ave time', logininfo => '9,Login info req,yesno', + talklist => '0,Talk List,parray', ); # object destruction @@ -285,7 +286,7 @@ sub send_now my $call = $self->{call}; for (@_) { - chomp; +# chomp; my @lines = split /\n/; for (@lines) { $conn->send_now("$sort$call|$_"); @@ -306,7 +307,7 @@ sub send # this is always later and always data my $call = $self->{call}; for (@_) { - chomp; +# chomp; my @lines = split /\n/; for (@lines) { $conn->send_later("D$call|$_"); @@ -361,7 +362,7 @@ sub state dbg('state', "$self->{call} channel func $self->{func} state $self->{oldstate} -> $self->{state}\n"); # if there is any queued up broadcasts then splurge them out here - if ($self->{delayed} && ($self->{state} eq 'prompt' || $self->{state} eq 'convers')) { + if ($self->{delayed} && ($self->{state} eq 'prompt' || $self->{state} eq 'talk')) { $self->send (@{$self->{delayed}}); delete $self->{delayed}; } @@ -376,10 +377,8 @@ sub disconnect my $user = $self->{user}; my $conn = $self->{conn}; my $call = $self->{call}; - my $nopc39 = shift || 0; - $self->finish($nopc39); - $conn->send_now("Z$call|bye") if $conn; # this will cause 'client' to disconnect + $self->finish($conn); $user->close() if defined $user; $conn->disconnect() if $conn; $self->del(); @@ -438,6 +437,26 @@ sub field_prompt return $valid{$ele}; } +# take a standard input message and decode it into its standard parts +sub decode_input +{ + my $dxchan = shift; + my $data = shift; + my ($sort, $call, $line) = $data =~ /^([A-Z])([A-Z0-9\-]{3,9})\|(.*)$/; + + my $chcall = (ref $dxchan) ? $dxchan->call : "UN.KNOWN"; + + # the above regexp must work + if (!defined $sort || !defined $call || !defined $line || + (ref $dxchan && $call ne $chcall)) { + $data =~ s/([\x00-\x1f\x7f-\xff])/uc sprintf("%%%02x",ord($1))/eg; + dbg('chan', "DUFF Line from $chcall: $data"); + return (); + } + + return ($sort, $call, $line); +} + no strict; sub AUTOLOAD { @@ -447,8 +466,13 @@ sub AUTOLOAD $name =~ s/.*:://o; confess "Non-existant field '$AUTOLOAD'" if !$valid{$name}; - @_ ? $self->{$name} = shift : $self->{$name} ; + + # this clever line of code creates a subroutine which takes over from autoload + # from OO Perl - Conway + *{$AUTOLOAD} = sub {@_ > 1 ? $_[0]->{$name} = $_[1] : $_[0]->{$name}} ; + @_ ? $self->{$name} = shift : $self->{$name} ; } + 1; __END__;