wip
[spider.git] / perl / DXProtout.pm
index 6917b88b8501b384d34fa958464911e4f54aa975..f08fef492bbfff7afd364cf1cf2c290593380494 100644 (file)
@@ -66,14 +66,15 @@ sub pc11
 # create an announce message
 sub pc12
 {
-       my ($call, $text, $tonode, $sysop, $wx) = @_;
+       my ($call, $text, $tonode, $sysop, $wx, $origin) = @_;
        my $hops = get_hops(12);
-       $sysop = ' ' if !$sysop;
-       $text = ' ' if !$text;
-       $wx = '0' if !$wx;
-       $tonode = '*' if !$tonode;
+       $origin ||= $main::mycall;
+       $sysop ||= ' ';
+       $text ||= ' ';
+       $wx ||= '0';
+       $tonode ||= '*';
        $text =~ s/\^/%5E/g;
-       return "PC12^$call^$tonode^$text^$sysop^$main::mycall^$wx^$hops^~";
+       return "PC12^$call^$tonode^$text^$sysop^$origin^$wx^$hops^~";
 }
 
 #
@@ -94,13 +95,13 @@ sub pc16
                next unless $_;
                my $ref = $_;
                my $str = sprintf "^%s %s %d", $ref->call, $ref->conf ? '*' : '-', $ref->here;
-               if (length($s) + length($str) >= $sentencelth) {
+               if (length($s) + length($str) > $sentencelth) {
                        push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16);
                        $s = "";
                }
                $s .= $str;
        }
-       push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16) if length $s;
+       push @out, "PC16^$ncall" . $s . sprintf "^%s^", get_hops(16);
        return @out;
 }
 
@@ -122,7 +123,7 @@ sub pc17
 # Request init string
 sub pc18
 {
-       return "PC18^DXSpider Version: $main::version Build: $main::build^$DXProt::myprot_version^";
+       return "PC18^DXSpider Version: $main::version Build: $main::build NewRoute^$DXProt::myprot_version^";
 }
 
 #
@@ -142,13 +143,13 @@ sub pc19
                my $conf = $ref->conf;
                my $version = $ref->version;
                my $str = "^$here^$call^$conf^$version";
-               if (length($s) + length($str) >= $sentencelth) {
+               if (length($s) + length($str) > $sentencelth) {
                        push @out, "PC19" . $s . sprintf "^%s^", get_hops(19);
                        $s = "";
                }
                $s .= $str;
        }
-       push @out, "PC19" . $s . sprintf "^%s^", get_hops(19) if length $s;
+       push @out, "PC19" . $s . sprintf "^%s^", get_hops(19);
        return @out;
 }
 
@@ -357,6 +358,68 @@ sub pc51
        return "PC51^$to^$from^$val^";
 }
 
+my $hexlasttime = 0;
+my $hexlastlet = 'A';
+
+sub hexstamp
+{
+       my $t = shift || $main::systime;
+       if ($t ne $hexlasttime) {
+               $hexlasttime = $t;
+               $hexlastlet = 'A';
+       } else {
+               do {
+                       $hexlastlet = chr(ord($hexlastlet) + 1);
+               } while ($hexlastlet eq '^');
+       }
+       return sprintf "%c%08X", $hexlastlet, $hexlasttime;
+}
+
+sub pc58
+{
+       my $sort = shift;
+       my $hexstamp = shift || hexstamp();
+       my $from = shift;
+       my $to = shift;
+       my $text = unpad(shift);
+       $text = ' ' if !$text;
+       $text =~ s/\^/%5E/g;
+       return "PC58^$sort^$hexstamp^$from^$to^$text" . sprintf "^%s^", get_hops(58);
+}
+
+sub pc59
+{
+       my @out;
+       my $sort = shift;
+       my $hexstamp = shift || hexstamp();
+       
+       my $node = $_[0]->call;
+       for (@_) {
+               next unless $_;
+               my $ref = $_;
+               my $call = $ref->call;
+               my $here = $ref->here;
+               $s .= $ref->isa('Route::Node') ? "^N$here$call" : "^U$here$call";
+       }
+       push @out, "PC59^$sort^$hexstamp^$node^$s" . sprintf "^%s^", get_hops(59);
+       return @out;
+}
+
+sub PC59c
+{
+       return PC59('C', @_);
+}
+
+sub PC59a
+{
+       return PC59('A', @_);
+}
+
+sub PC59d
+{
+       return PC59('D', @_);
+}
+
 # clx remote cmd send
 sub pc84
 {