fix .. in cmd parser
[spider.git] / perl / DXUser.pm
index c1ab95aeb52b46314a5ca8b274ea15441c65255d..cd30264e1d16e54cfaea2d45e57680b2de51e277 100644 (file)
@@ -20,10 +20,8 @@ use LRU;
 use strict;
 
 use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/  || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
+
+main::mkver($VERSION = q$Revision$);
 
 use vars qw(%u $dbm $filename %valid $lastoperinterval $lasttime $lru $lrusize $tooold $v3);
 
@@ -61,7 +59,7 @@ $v3 = 0;
                  annok => '9,Accept Announces?,yesno', # accept his announces?
                  lang => '0,Language',
                  hmsgno => '0,Highest Msgno',
-                 group => '0,Access Group,parray',     # used to create a group of users/nodes for some purpose or other
+                 group => '0,Chat Group,parray',       # used to create a group of users/nodes for some purpose or other
                  isolate => '9,Isolate network,yesno',
                  wantbeep => '0,Req Beep,yesno',
                  wantann => '0,Req Announce,yesno',
@@ -75,20 +73,25 @@ $v3 = 0;
                  pagelth => '0,Current Pagelth',
                  pingint => '9,Node Ping interval',
                  nopings => '9,Ping Obs Count',
-                 wantlogininfo => '9,Login info req,yesno',
-          wantgrid => '0,DX Grid Info,yesno',
+                 wantlogininfo => '0,Login Info Req,yesno',
+          wantgrid => '0,Show DX Grid,yesno',
                  wantann_talk => '0,Talklike Anns,yesno',
                  wantpc90 => '1,Req PC90,yesno',
-                 wantnp => '1,Req New Protocol,yesno',
+                 wantnp => '1,Req New Proto,yesno',
                  wantpc16 => '9,Want Users from node,yesno',
                  wantsendpc16 => '9,Send PC16,yesno',
                  wantroutepc19 => '9,Route PC19,yesno',
+                 wantusstate => '0,Show US State,yesno',
+                 wantdxcq => '0,Show CQ Zone,yesno',
+                 wantdxitu => '0,Show ITU Zone,yesno',
                  lastoper => '9,Last for/oper,cldatetime',
                  nothere => '0,Not Here Text',
                  registered => '9,Registered?,yesno',
                  prompt => '0,Required Prompt',
                  version => '1,Version',
                  build => '1,Build',
+                 believe => '1,Believable nodes,parray',
+                 lastping => '1,Last Ping at,ptimelist',
                 );
 
 #no strict;
@@ -129,12 +132,16 @@ sub init
        
        if ($@) {
                $ufn = "$fn.v2";
+               $v3 = $convert = 0;
+               dbg("the module Storable appears to be missing!!");
+               dbg("trying to continue in compatibility mode (this may fail)");
+               dbg("please install Storable from CPAN as soon as possible");
        } else {
                import Storable qw(nfreeze thaw);
 
                $ufn = "$fn.v3";
                $v3 = 1;
-               $convert = ! -e $ufn;
+               $convert++ unless -e $ufn;
        }
        
        if ($mode) {
@@ -142,14 +149,17 @@ sub init
        } else {
                $dbm = tie (%u, 'DB_File', $ufn, O_RDONLY, 0666, $DB_BTREE) or confess "can't open user file: $fn ($!) [rebuild it from user_asc?]";
        }
+
+       $lru = LRU->newbase("DXUser", $lrusize);
        
        # do a conversion if required
        if ($convert) {
                my ($key, $val, $action, $count, $err) = ('','',0,0,0);
                
                my %oldu;
-               dbg("Converting the User File to V3 (I suggest you go and have cup of strong tea)");
-               my $odbm = tie (%oldu, 'DB_File', "${fn}.v2", O_RDONLY, 0666, $DB_BTREE) or confess "can't open user file: $fn ($!) [rebuild it from user_asc?]";
+               dbg("Converting the User File to V3 ");
+               dbg("This will take a while, I suggest you go and have cup of strong tea");
+               my $odbm = tie (%oldu, 'DB_File', "$fn.v2", O_RDONLY, 0666, $DB_BTREE) or confess "can't open user file: $fn.v2 ($!) [rebuild it from user_asc?]";
         for ($action = R_FIRST; !$odbm->seq($key, $val, $action); $action = R_NEXT) {
                        my $ref = asc_decode($val);
                        if ($ref) {
@@ -164,7 +174,6 @@ sub init
                dbg("Conversion completed $count records $err errors");
        }
        $filename = $ufn;
-       $lru = LRU->newbase("DXUser", $lrusize);
 }
 
 sub del_file
@@ -253,7 +262,7 @@ sub get_current
        my $pkg = shift;
        my $call = uc shift;
   
-       my $dxchan = DXChannel->get($call);
+       my $dxchan = DXChannel::get($call);
        return $dxchan->user if $dxchan;
        my $rref = Route::get($call);
        return $rref->user if $rref && exists $rref->{user};
@@ -288,6 +297,7 @@ sub put
        $lru->put($call, $self);
        my $ref = $self->encode;
        $dbm->put($call, $ref);
+       return $self;
 }
 
 # freeze the user
@@ -583,6 +593,8 @@ sub sort
 }
 
 # some accessors
+
+# want is default = 1
 sub _want
 {
        my $n = shift;
@@ -593,6 +605,17 @@ sub _want
        return exists $self->{$s} ? $self->{$s} : 1;
 }
 
+# wantnot is default = 0
+sub _wantnot
+{
+       my $n = shift;
+       my $self = shift;
+       my $val = shift;
+       my $s = "want$n";
+       $self->{$s} = $val if defined $val;
+       return exists $self->{$s} ? $self->{$s} : 0;
+}
+
 sub wantbeep
 {
        return _want('beep', @_);
@@ -653,6 +676,11 @@ sub wantpc16
        return _want('pc16', @_);
 }
 
+sub wantpc90
+{
+       return _wantnot('pc90', @_);
+}
+
 sub wantsendpc16
 {
        return _want('sendpc16', @_);
@@ -663,6 +691,26 @@ sub wantroutepc16
        return _want('routepc16', @_);
 }
 
+sub wantusstate
+{
+       return _want('usstate', @_);
+}
+
+sub wantdxcq
+{
+       return _want('dxcq', @_);
+}
+
+sub wantdxitu
+{
+       return _want('dxitu', @_);
+}
+
+sub wantnp
+{
+       return _wantnot('np', @_);
+}
+
 sub wantlogininfo
 {
        my $self = shift;
@@ -677,6 +725,12 @@ sub is_node
        return $self->{sort} =~ /[ACRSX]/;
 }
 
+sub is_aranea
+{
+       my $self = shift;
+       return $self->{sort} eq 'W';
+}
+
 sub is_user
 {
        my $self = shift;
@@ -730,6 +784,41 @@ sub unset_passphrase
        my $self = shift;
        delete $self->{passphrase};
 }
+
+sub set_believe
+{
+       my $self = shift;
+       my $call = uc shift;
+       $self->{believe} ||= [];
+       push @{$self->{believe}}, $call unless grep $_ eq $call, @{$self->{believe}};
+}
+
+sub unset_believe
+{
+       my $self = shift;
+       my $call = uc shift;
+       if (exists $self->{believe}) {
+               $self->{believe} = [grep {$_ ne $call} @{$self->{believe}}];
+               delete $self->{believe} unless @{$self->{believe}};
+       }
+}
+
+sub believe
+{
+       my $self = shift;
+       return exists $self->{believe} ? @{$self->{believe}} : ();
+}
+
+sub lastping
+{
+       my $self = shift;
+       my $call = shift;
+       $self->{lastping} ||= {};
+       $self->{lastping} = {} unless ref $self->{lastping};
+       my $b = $self->{lastping};
+       $b->{$call} = shift if @_;
+       return $b->{$call};     
+}
 1;
 __END__