# show sunrise and sunset times for each callsign or prefix entered
#
# 1999/11/9 Steve Franke K9AN
-#
+# 2000/10/27 fixed bug involving degree to radian conversion.
+# 2001/09/15 accept prefix/call and number of days from today (+ or -).
+# e.g. sh/moon 2 w0 w9 shows rise/set 2 days hence for w0, w9
+# sh/moon w0 w9 2 same thing
+# az and el are shown only when day offset is zero (i.e. today).
my ($self, $line) = @_;
-my @list = split /\s+/, $line;
+my @f = split /\s+/, $line;
-my $l;
my @out;
+my $f;
+my $l;
+my $n_offset;
+my @list;
+
+while ($f = shift @f){
+ if(!$n_offset){
+ ($n_offset) = $f =~ /^([-+]?\d+)$/;
+ next if $n_offset;
+ }
+ push @list, $f;
+}
+$n_offset = 0 unless defined $n_offset;
+$n_offset = 0 if $n_offset > 365; # can request moon rise/set up to 1 year ago or from now...
+$n_offset = 0 if $n_offset < -365;
+
my ($lat, $lon); # lats and longs in radians
-my ($sec, $min, $hr, $day, $month, $yr) = (gmtime($main::systime))[0,1,2,3,4,5];
+my ($sec, $min, $hr, $day, $month, $yr) = (gmtime($main::systime+$n_offset*24*60*60))[0,1,2,3,4,5];
+
$month++;
$yr += 1900;
foreach $l (@list) {
my $user = DXUser->get_current(uc $l);
if ($user && $user->lat && $user->long) {
- push @in, [$user->qth, $user->lat * $d2r, $user->long * -$d2r, uc $l ];
+ push @in, [$user->qth, $user->lat, -$user->long, uc $l ];
} else {
# prefixes --->
my @ans = Prefix::extract($l);
}
}
-push @out, $self->msg('sun');
+if( !$n_offset ) {
+ push @out, $self->msg('sun_with_azel');
+} else {
+ push @out, $self->msg('sun');
+}
+
foreach $l (@in) {
- my ($rise, $set, $az, $dec )=Sun::rise_set($yr,$month,$day,$hr,$min,$l->[1],$l->[2],0);
- $l->[3] =~ s{(-\d+|/\w+)$}{};
- push @out,sprintf("%-6.6s %-30.30s %s %s %6.1f %6.1f ", $l->[3], $l->[0], $rise, $set, $az, $dec);
+ my ($rise, $set, $az, $dec, $loss )=Sun::rise_set($yr,$month,$day,$hr,$min,$l->[1],$l->[2],0);
+ $l->[3] =~ s{(-\d+|/\w+)$}{};
+ if( !$n_offset ) {
+ push @out,sprintf("%-6.6s %-30.30s %02d/%02d/%4d %s %s %6.1f %6.1f", $l->[3], $l->[0], $day, $month, $yr, $rise, $set, $az, $dec);
+ } else {
+ push @out,sprintf("%-6.6s %-30.30s %02d/%02d/%4d %s %s", $l->[3], $l->[0], $day, $month, $yr, $rise, $set);
+ }
}
-
return (1, @out);