]> ruin.nu Git - ndwebbie.git/blob - ND/Web/Pages/Check.pm
use base instead of setting @ISA manually
[ndwebbie.git] / ND / Web / Pages / Check.pm
1 #**************************************************************************
2 #   Copyright (C) 2006 by Michael Andreen <harvATruinDOTnu>               *
3 #                                                                         *
4 #   This program is free software; you can redistribute it and/or modify  *
5 #   it under the terms of the GNU General Public License as published by  *
6 #   the Free Software Foundation; either version 2 of the License, or     *
7 #   (at your option) any later version.                                   *
8 #                                                                         *
9 #   This program is distributed in the hope that it will be useful,       *
10 #   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12 #   GNU General Public License for more details.                          *
13 #                                                                         *
14 #   You should have received a copy of the GNU General Public License     *
15 #   along with this program; if not, write to the                         *
16 #   Free Software Foundation, Inc.,                                       *
17 #   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
18 #**************************************************************************/
19
20 package ND::Web::Pages::Check;
21 use strict;
22 use warnings FATAL => 'all';
23 no warnings qw(uninitialized);
24 use ND::Include;
25 use CGI qw/:standard/;
26 use ND::Web::Include;
27
28 use base qw/ND::Web::XMLPage/;
29
30 $ND::Web::Page::PAGES{check} = __PACKAGE__;
31
32 sub parse {
33         my $self = shift;
34         if ($self->{URI} =~ m{^/.*/((\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?)$}){
35                 param('coords',$1);
36         }
37 }
38
39 sub render_body {
40         my $self = shift;
41         my ($BODY) = @_;
42         $self->{TITLE} = 'Check planets and galaxies';
43         my $DBH = $self->{DBH};
44
45         return $self->noAccess unless $self->{ATTACKER};
46
47         $BODY->param(isBC => $self->isMember && ($self->isOfficer || $self->isBC));
48
49         my ($x,$y,$z);
50         if (param('coords') =~ /(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?/){
51                 $x = $1;
52                 $y = $2;
53                 $z = $3;
54                 $BODY->param(Coords => "$x:$y".(defined $z ? ":$z" : ''));
55         }else{
56                 $ND::ERROR .= p b q{Couldn't parse coords};
57                 return $BODY;
58         }
59
60         if ($self->isMember && param('cmd') eq 'arbiter'){
61                 my $query = $DBH->prepare(q{SELECT count(*) AS friendlies FROM current_planet_stats WHERE x = ? AND y = ? 
62                         AND (planet_status IN ('Friendly','NAP') OR relationship IN ('Friendly','NAP'))});
63                 my ($count) = $DBH->selectrow_array($query,undef,$x,$y);
64                 if ($count > 0){
65                         $BODY->param(Arbiter => '<b>DO NOT ATTACK THIS GAL</b>');
66                 }else{
67                         $BODY->param(Arbiter => '<b>KILL THESE BASTARDS</b>');
68                 }
69                 log_message $ND::UID,"Arbiter check on $x:$y";
70         }
71
72         my $where = '';
73         my $extra_columns = '';
74
75         $where = 'AND z = ?' if defined $z;
76         if ($self->isMember && $self->isOfficer){
77                 $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
78         }elsif ($self->isMember && $self->isBC){
79                 $extra_columns = ", planet_status,hit_us, alliance,relationship";
80         }
81
82         my $query = $DBH->prepare(qq{Select id,coords(x,y,z), ((ruler || ' OF ') || p.planet) as planet,race, size, score, value, xp, sizerank, scorerank, valuerank, xprank, p.value - p.size*200 - coalesce(c.metal+c.crystal+c.eonium,0)/150 - coalesce(c.structures,(SELECT avg(structures) FROM covop_targets)::int)*1500 AS fleetvalue,(c.metal+c.crystal+c.eonium)/100 AS resvalue  $extra_columns from current_planet_stats p LEFT OUTER JOIN covop_targets c ON p.id = c.planet where x = ? AND y = ? $where order by x,y,z asc});
83
84         if (defined $z){
85                 $query->execute($x,$y,$z);
86         }else{
87                 $query->execute($x,$y);
88                 if ($self->isMember && ($self->isBC || $self->isOfficer) && !$self->isHC){
89                         log_message $ND::UID,"BC browsing $x:$y";
90                 }
91         }
92         my @planets;
93         my $planet_id = undef;
94         my $i = 0;
95         while (my ($id,$coords,$planet,$race,$size,$score,$value,$xp,$sizerank,$scorerank,$valuerank,$xprank
96                         ,$fleetvalue,$resvalue,$planet_status,$hit_us,$alliance,$relationship,$nick) = $query->fetchrow){
97                 $planet_id = $id;
98                 my %planet = (Coords => $coords, Planet => $planet, Race => $race, Size => "$size ($sizerank)"
99                         , Score => "$score ($scorerank)", Value => "$value ($valuerank)", XP => "$xp ($xprank)"
100                         , FleetValue => "$fleetvalue ($resvalue)");
101                 if ($self->isMember && ($self->isOfficer || $self->isBC)){
102                         $planet{HitUs} = $hit_us;
103                         $planet{Alliance} = "$alliance ($relationship)";
104                         $planet{Nick} = "$nick ($planet_status)";
105                         $planet{PlanetStatus} = $planet_status;
106                         $planet{Relationship} = $relationship;
107                         #$planet{isBC} = 1;
108                         if ($z && $alliance eq 'NewDawn' && not ($self->isHC || $self->isOfficer)){
109                                 log_message $ND::UID,"BC browsing ND planet $coords tick $self->{TICK}";
110                         }
111                 }
112                 $i++;
113                 $planet{ODD} = $i % 2;
114                 push @planets,\%planet;
115         }
116         $BODY->param(Planets => \@planets);
117
118         if ($z && $planet_id){
119                 $BODY->param(OnePlanet => 1);
120
121                 my $query = $DBH->prepare(q{ 
122                         SELECT i.mission, i.tick AS landingtick,MIN(eta) AS eta, i.amount, coords(p.x,p.y,p.z) AS target
123                         FROM intel i
124                         JOIN (planets
125                         NATURAL JOIN planet_stats) p ON i.target = p.id
126                         JOIN (planets
127                         NATURAL JOIN planet_stats) p2 ON i.sender = p2.id
128                         WHERE  p.tick = ( SELECT max(tick) FROM planet_stats) AND i.tick > tick() AND i.uid = -1 
129                         AND p2.tick = p.tick AND p2.id = ?
130                         GROUP BY p.x,p.y,p.z,p2.x,p2.y,p2.z,i.mission,i.tick,i.amount,i.ingal,i.uid
131                         ORDER BY p.x,p.y,p.z});
132                 $query->execute($planet_id);
133                 my @missions;
134                 while (my ($mission,$landingtick,$eta,$amount,$target) = $query->fetchrow){
135                         push @missions,{Target => $target, Mission => $mission, LandingTick => $landingtick
136                                 , ETA => $eta, Amount => $amount};
137                 }
138                 $BODY->param(Missions => \@missions);
139
140                 my @scans;
141                 $query = $DBH->prepare(q{SELECT value,tick FROM planet_stats 
142                         WHERE id = ? AND tick > tick() - 24});
143                 my $scan = q{
144                 <p>Value the last 24 ticks</p>
145                 <table><tr><th>Tick</th><th>Value</th><th>Difference</th></tr>};
146                 my $old = 0;
147                 $query->execute($planet_id);
148                 while (my($value,$tick) = $query->fetchrow){
149                         my $diff = $value-$old;
150                         $old = $value;
151                         my $class = 'Defend';
152                         $class = 'Attack' if $diff < 0;
153                         $scan .= qq{<tr><td>$tick</td><td>$value</td><td class="$class">$diff</td></tr>};
154                 }
155                 $scan .= q{</table>};
156                 push @scans, {Scan => $scan};
157
158                 $query = $DBH->prepare(q{SELECT x,y,z,tick FROM planet_stats WHERE id = ? ORDER BY tick ASC});
159                 $scan = q{
160                 <p>Previous Coords</p>
161                 <table><tr><th>Tick</th><th>Value</th><th>Difference</th></tr>};
162                 $query->execute($planet_id);
163                 $x = $y = $z = 0;
164                 while (my($nx,$ny,$nz,$tick) = $query->fetchrow){
165                         if ($nx != $x || $ny != $y || $nz != $z){
166                                 $x = $nx;
167                                 $y = $ny;
168                                 $z = $nz;
169                                 $scan .= qq{<tr><td>$tick</td><td>$x:$y:$z</td></tr>};
170                         }
171                 }
172                 $scan .= q{</table>};
173                 push @scans, {Scan => $scan};
174
175                 $query = $DBH->prepare(q{SELECT DISTINCT ON (type) type,scan_id, tick, scan FROM scans WHERE planet = ?
176                         GROUP BY type,scan_id, tick, scan ORDER BY type,tick DESC});
177                 $query->execute($planet_id);
178                 my %scans;
179                 while (my($type,$scan_id,$tick,$scan) = $query->fetchrow){
180                         $scans{$type} = [$scan_id,$tick,$scan];
181                 }
182                 for my $type ('Planet','Jumpgate','Unit','Military','Fleet Analysis','Surface Analysis','Technology Analysis','News'){
183                         next unless exists $scans{$type};
184                         my $scan_id = $scans{$type}->[0];
185                         my $tick = $scans{$type}->[1];
186                         my $scan = $scans{$type}->[2];
187                         if ($self->{TICK} - $tick > 10){
188                                 $scan =~ s{<table( cellpadding="\d+")?>}{<table$1 class="old">};
189                         }
190                         push @scans,{Scan => qq{
191                                 <p><b><a href="http://game.planetarion.com/showscan.pl?scan_id=$scan_id">$type</a> Scan from tick $tick</b></p>
192                                 $scan}};
193                 }
194
195                 $BODY->param(Scans => \@scans);
196         }
197         return $BODY;
198 }
199
200 1;