]> ruin.nu Git - ndwebbie.git/commitdiff
Converted check/stats page
authorMichael Andreen <harv@ruin.nu>
Tue, 15 Jul 2008 19:50:43 +0000 (21:50 +0200)
committerMichael Andreen <harv@ruin.nu>
Tue, 15 Jul 2008 19:50:43 +0000 (21:50 +0200)
14 files changed:
NDWeb/Pages/Check.pm [deleted file]
database/group_roles.sql
lib/NDWeb/Controller/Root.pm
lib/NDWeb/Controller/Stats.pm [new file with mode: 0644]
root/lib/inc/missionlist.tt2 [new file with mode: 0644]
root/lib/inc/stats.tt2 [new file with mode: 0644]
root/lib/site/html.tt2
root/lib/site/leftbar.tt2
root/src/calls/edit.tt2
root/src/stats/find.tt2 [new file with mode: 0644]
root/src/stats/galaxy.tt2 [new file with mode: 0644]
root/src/stats/planet.tt2 [new file with mode: 0644]
t/controller_Stats.t [new file with mode: 0644]
templates/check.tmpl [deleted file]

diff --git a/NDWeb/Pages/Check.pm b/NDWeb/Pages/Check.pm
deleted file mode 100644 (file)
index a0062ab..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-#**************************************************************************
-#   Copyright (C) 2006 by Michael Andreen <harvATruinDOTnu>               *
-#                                                                         *
-#   This program is free software; you can redistribute it and/or modify  *
-#   it under the terms of the GNU General Public License as published by  *
-#   the Free Software Foundation; either version 2 of the License, or     *
-#   (at your option) any later version.                                   *
-#                                                                         *
-#   This program is distributed in the hope that it will be useful,       *
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
-#   GNU General Public License for more details.                          *
-#                                                                         *
-#   You should have received a copy of the GNU General Public License     *
-#   along with this program; if not, write to the                         *
-#   Free Software Foundation, Inc.,                                       *
-#   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
-#**************************************************************************/
-
-package NDWeb::Pages::Check;
-use strict;
-use warnings;
-use ND::Include;
-use CGI qw/:standard/;
-use NDWeb::Include;
-
-use base qw/NDWeb::XMLPage/;
-
-$NDWeb::Page::PAGES{check} = __PACKAGE__;
-
-sub parse {
-       my $self = shift;
-       if ($self->{URI} =~ m{^/.*/((\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?)$}){
-               param('coords',$1);
-       }
-}
-
-sub render_body {
-       my $self = shift;
-       my ($BODY) = @_;
-       $self->{TITLE} = 'Check planets and galaxies';
-       my $DBH = $self->{DBH};
-
-       return $self->noAccess unless $self->{ATTACKER};
-
-       $BODY->param(isBC => $self->isMember && ($self->isOfficer || $self->isBC));
-
-       my ($x,$y,$z);
-       if (param('coords') =~ /(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?(?: |:(\d+))?/){
-               $x = $1;
-               $y = $2;
-               $z = $3;
-               $BODY->param(Coords => "$x:$y".(defined $z ? ":$z" : ''));
-       }else{
-               $ND::ERROR .= p b q{Couldn't parse coords};
-               return $BODY;
-       }
-
-       if ($self->isMember && defined param('cmd') && param('cmd') eq 'arbiter'){
-               my $query = $DBH->prepare(q{SELECT count(*) AS friendlies FROM current_planet_stats WHERE x = ? AND y = ? 
-                       AND (planet_status IN ('Friendly','NAP') OR relationship IN ('Friendly','NAP'))});
-               my ($count) = $DBH->selectrow_array($query,undef,$x,$y);
-               if ($count > 0){
-                       $BODY->param(Arbiter => '<b>DO NOT ATTACK THIS GAL</b>');
-               }else{
-                       $BODY->param(Arbiter => '<b>KILL THESE BASTARDS</b>');
-               }
-               log_message $ND::UID,"Arbiter check on $x:$y";
-       }
-
-       my $where = '';
-       my $extra_columns = '';
-
-       $where = 'AND z = ?' if defined $z;
-       if ($self->isMember && $self->isOfficer){
-               $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
-       }elsif ($self->isMember && $self->isBC){
-               $extra_columns = ", planet_status,hit_us, alliance,relationship";
-       }
-
-       my $query = $DBH->prepare(qq{Select p.id,coords(x,y,z), ((ruler || ' OF ') || p.planet) as planet,race,gov,
-               size, size_gain, size_gain_day,
-               score,score_gain,score_gain_day,
-               value,value_gain,value_gain_day,
-               xp,xp_gain,xp_gain_day,
-               sizerank,sizerank_gain,sizerank_gain_day,
-               scorerank,scorerank_gain,scorerank_gain_day,
-               valuerank,valuerank_gain,valuerank_gain_day,
-               xprank,xprank_gain,xprank_gain_day,
-               p.value - p.size*200 - 
-                       COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 - 
-                       COALESCE(ss.total ,(SELECT COALESCE(avg(total),0) FROM structure_scans)::int)*1500 AS fleetvalue
-               ,(metal+crystal+eonium)/100 AS resvalue  $extra_columns 
-               FROM current_planet_stats_full p 
-                       LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet
-                       LEFT OUTER JOIN structure_scans ss ON p.id = ss.planet
-               WHERE x = ? AND y = ? $where ORDER BY x,y,z ASC
-       });
-
-       if (defined $z){
-               $query->execute($x,$y,$z);
-       }else{
-               $query->execute($x,$y);
-               if ($self->isMember && ($self->isBC || $self->isOfficer) && !$self->isHC){
-                       log_message $ND::UID,"BC browsing $x:$y";
-               }
-       }
-       my @planets;
-       my $planet_id = undef;
-       while (my $planet = $query->fetchrow_hashref){
-               $planet_id = $planet->{id};
-               for my $type (qw/size score value xp/){
-                       $planet->{"${type}img"} = 'stay';
-                       $planet->{"${type}img"} = 'up' if $planet->{"${type}_gain_day"} > 0;
-                       $planet->{"${type}img"} = 'down' if $planet->{"${type}_gain_day"} < 0;
-                       $planet->{"${type}rankimg"} = 'stay';
-                       $planet->{"${type}rankimg"} = 'up' if $planet->{"${type}rank_gain_day"} < 0;
-                       $planet->{"${type}rankimg"} = 'down' if $planet->{"${type}rank_gain_day"} > 0;
-                       for my $type ($type,"${type}_gain","${type}_gain_day"){
-                               $planet->{$type} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000
-                       }
-               }
-               if ($self->isMember && ($self->isOfficer || $self->isBC)){
-                       if ($z && defined $planet->{alliance} && $planet->{alliance} eq 'NewDawn' && not ($self->isHC || $self->isOfficer)){
-                               log_message $ND::UID,"BC browsing ND planet $planet->{coords} tick $self->{TICK}";
-                       }
-               }
-               delete $planet->{id};
-               push @planets,$planet;
-       }
-       $BODY->param(GPlanets => \@planets);
-
-       if ($z && $planet_id){
-               $BODY->param(OnePlanet => 1);
-
-               my $query = $DBH->prepare(q{ 
-                       SELECT i.id,i.mission, i.name, i.tick AS landingtick,MIN(eta) AS eta
-                               , i.amount, coords(x,y,z) AS target
-                       FROM fleets i
-                       LEFT OUTER JOIN (planets
-                               NATURAL JOIN planet_stats) t ON i.target = t.id
-                                       AND t.tick = ( SELECT MAX(tick) FROM planet_stats)
-                       WHERE  i.uid = -1
-                               AND i.sender = ?
-                               AND (i.tick > tick() - 14 OR i.mission = 'Full fleet')
-                       GROUP BY i.id,x,y,z,i.mission,i.tick,i.name,i.amount,i.ingal,i.uid
-                       ORDER BY i.tick,x,y,z
-               });
-               $query->execute($planet_id);
-               my $ships = $DBH->prepare(q{SELECT ship,amount FROM fleet_ships
-                       WHERE id = ? ORDER BY num
-               });
-               my @missions;
-               while (my $mission = $query->fetchrow_hashref){
-                       $mission->{CLASS} = $mission->{mission};
-                       my @ships;
-                       $ships->execute($mission->{id});
-                       while (my $ship = $ships->fetchrow_hashref){
-                               push @ships,$ship;
-                       }
-                       push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
-                       $mission->{ships} = \@ships;
-                       push @missions,$mission;
-               }
-               $BODY->param(Missions => \@missions);
-
-               $query = $DBH->prepare(q{ 
-                       SELECT i.id,i.mission, i.name, i.tick AS landingtick,MIN(eta) AS eta
-                               , i.amount, coords(x,y,z) AS sender
-                       FROM fleets i
-                       LEFT OUTER JOIN (planets
-                               NATURAL JOIN planet_stats) s ON i.sender = s.id
-                                       AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
-                       WHERE  i.uid = -1
-                               AND i.target = ?
-                               AND (i.tick > tick() - 14 OR i.mission = 'Full fleet')
-                       GROUP BY i.id,x,y,z,i.mission,i.tick,i.name,i.amount,i.ingal,i.uid
-                       ORDER BY i.tick,x,y,z
-               });
-               $query->execute($planet_id);
-               my @incomings;
-               while (my $mission = $query->fetchrow_hashref){
-                       $mission->{CLASS} = $mission->{mission};
-                       my @ships;
-                       $ships->execute($mission->{id});
-                       while (my $ship = $ships->fetchrow_hashref){
-                               push @ships,$ship;
-                       }
-                       push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
-                       $mission->{ships} = \@ships;
-                       push @incomings,$mission;
-               }
-               $BODY->param(Incomings => \@incomings);
-
-               $query = $DBH->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats 
-                       WHERE id = ? AND tick > tick() - 24});
-               $query->execute($planet_id);
-               my @values;
-               while (my $value = $query->fetchrow_hashref){
-                       $value->{class} = 'Defend';
-                       $value->{class} = 'Attack' if $value->{gain} < 0;
-                       push @values, $value;
-               }
-               $BODY->param(Values => \@values);
-
-               $query = $DBH->prepare(q{SELECT type,scan_id, tick FROM scans
-                       WHERE planet = ? AND tick > tick() - 168
-                       ORDER BY tick,type DESC
-               });
-               $query->execute($planet_id);
-               my @scans;
-               while (my $scan = $query->fetchrow_hashref){
-                       push @scans,$scan;
-               }
-               $BODY->param(Scans => \@scans);
-
-               $query = $DBH->prepare(q{SELECT x,y,z,tick FROM planet_stats
-                       WHERE id = ? ORDER BY tick ASC});
-               $query->execute($planet_id);
-               my @coords;
-               my $c = {x => 0, y => 0, z => 0};
-               while (my $c2 = $query->fetchrow_hashref){
-                       if ($c->{x} != $c2->{x} || $c->{y} != $c2->{y} || $c->{z} != $c2->{z}){
-                               $c = $c2;
-                               push @coords,$c;
-                       }
-               }
-               $BODY->param(OldCoords => \@coords);
-
-               $query = $DBH->prepare(q{SELECT DISTINCT ON(rid) tick,category,name,amount
-                       FROM planet_data pd JOIN planet_data_types pdt ON pd.rid = pdt.id
-                       WHERE pd.id = $1 ORDER BY rid,tick DESC
-               });
-               $query->execute($planet_id);
-               my @pdata;
-               while (my $data = $query->fetchrow_hashref){
-                       $data->{amount} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000
-                       push @pdata,$data;
-               }
-               $BODY->param(PlanetData => \@pdata);
-
-       }
-       $query = $DBH->prepare(q{SELECT x,y,
-               size, size_gain, size_gain_day,
-               score,score_gain,score_gain_day,
-               value,value_gain,value_gain_day,
-               xp,xp_gain,xp_gain_day,
-               sizerank,sizerank_gain,sizerank_gain_day,
-               scorerank,scorerank_gain,scorerank_gain_day,
-               valuerank,valuerank_gain,valuerank_gain_day,
-               xprank,xprank_gain,xprank_gain_day,
-               planets,planets_gain,planets_gain_day
-       FROM galaxies g 
-       WHERE tick = ( SELECT max(tick) AS max FROM galaxies)
-               AND x = $1 AND y = $2
-               });
-       $query->execute($x,$y) or $ND::ERROR .= p($DBH->errstr);
-
-       my @galaxies;
-       while (my $galaxy = $query->fetchrow_hashref){
-               for my $type (qw/planets size score xp value/){
-                       #$galaxy->{$type} = prettyValue($galaxy->{$type});
-                       next unless defined $galaxy->{"${type}_gain_day"};
-                       $galaxy->{"${type}img"} = 'stay';
-                       $galaxy->{"${type}img"} = 'up' if $galaxy->{"${type}_gain_day"} > 0;
-                       $galaxy->{"${type}img"} = 'down' if $galaxy->{"${type}_gain_day"} < 0;
-                       unless( $type eq 'planets'){
-                               $galaxy->{"${type}rankimg"} = 'stay';
-                               $galaxy->{"${type}rankimg"} = 'up' if $galaxy->{"${type}rank_gain_day"} < 0;
-                               $galaxy->{"${type}rankimg"} = 'down' if $galaxy->{"${type}rank_gain_day"} > 0;
-                       }
-                       for my $type ($type,"${type}_gain","${type}_gain_day"){
-                               $galaxy->{$type} =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; #Add comma for ever 3 digits, i.e. 1000 => 1,000
-                       }
-               }
-               push @galaxies,$galaxy;
-       }
-       $BODY->param(Galaxies => \@galaxies);
-
-       return $BODY;
-}
-
-1;
index 16d6c7caa4925a57730cd3980d4b5ffb6ac8a1c0..8a51c2b6c8fccdc973c4953adb90829478679dc8 100644 (file)
@@ -26,11 +26,20 @@ INSERT INTO roles VALUES('calls_list');
 INSERT INTO roles VALUES('calls_edit');
 INSERT INTO roles VALUES('raids_info');
 INSERT INTO roles VALUES('raids_edit');
+INSERT INTO roles VALUES('stats_intel');
+INSERT INTO roles VALUES('stats_details');
+INSERT INTO roles VALUES('stats_missions');
+INSERT INTO roles VALUES('stats_scans');
+INSERT INTO roles VALUES('stats_planetdata');
 
 INSERT INTO group_roles (gid,role) VALUES(2,'member_menu');
 INSERT INTO group_roles (gid,role) VALUES(2,'attack_menu');
 INSERT INTO group_roles (gid,role) VALUES(2,'members');
 INSERT INTO group_roles (gid,role) VALUES(2,'covop');
+INSERT INTO group_roles (gid,role) VALUES(2,'stats_details');
+INSERT INTO group_roles (gid,role) VALUES(2,'stats_missions');
+INSERT INTO group_roles (gid,role) VALUES(2,'stats_scans');
+INSERT INTO group_roles (gid,role) VALUES(2,'stats_planetdata');
 
 INSERT INTO group_roles (gid,role) VALUES(6,'dc_menu');
 INSERT INTO group_roles (gid,role) VALUES(6,'calls_list');
@@ -45,6 +54,7 @@ INSERT INTO group_roles (gid,role) VALUES(5,'intel_menu');
 INSERT INTO group_roles (gid,role) VALUES(8,'no_fleet_update');
 
 INSERT INTO group_roles (gid,role) VALUES(9,'members_points_nolimit');
+INSERT INTO group_roles (gid,role) VALUES(9,'stats_intel');
 
 INSERT INTO group_roles (gid,role) VALUES(1,'dc_menu');
 INSERT INTO group_roles (gid,role) VALUES(1,'bc_menu');
index 9bf0dd5faa64da1611df2dd56e03a6cec91d6de6..8b4240ad9618583f574211a180dc7a53d1a845cc 100644 (file)
@@ -110,6 +110,7 @@ sub auto : Private {
        $dbh->do(q{SET timezone = 'GMT'});
 
        $c->stash(TICK =>$dbh->selectrow_array('SELECT tick()',undef));
+       $c->stash(STICK =>$dbh->selectrow_array('SELECT max(tick) FROM planet_stats',undef));
        $c->stash->{game}->{tick} = $c->stash->{TICK};
 
        if ($c->user_exists){
diff --git a/lib/NDWeb/Controller/Stats.pm b/lib/NDWeb/Controller/Stats.pm
new file mode 100644 (file)
index 0000000..2579859
--- /dev/null
@@ -0,0 +1,235 @@
+package NDWeb::Controller::Stats;
+
+use strict;
+use warnings;
+use parent 'Catalyst::Controller';
+
+use NDWeb::Include;
+
+=head1 NAME
+
+NDWeb::Controller::Stats - Catalyst Controller
+
+=head1 DESCRIPTION
+
+Catalyst Controller.
+
+=head1 METHODS
+
+=cut
+
+
+=head2 index 
+
+=cut
+
+sub index :Path :Args(0) {
+    my ( $self, $c ) = @_;
+
+    $c->response->body('Matched NDWeb::Controller::Stats in Stats.');
+}
+
+sub galaxy : Local {
+       my ( $self, $c, $x, $y, $z ) = @_;
+       my $dbh = $c->model;
+
+       $c->stash( comma => \&comma_value);
+
+       my $query = $dbh->prepare(q{SELECT x,y,
+               size, size_gain, size_gain_day,
+               score,score_gain,score_gain_day,
+               value,value_gain,value_gain_day,
+               xp,xp_gain,xp_gain_day,
+               sizerank,sizerank_gain,sizerank_gain_day,
+               scorerank,scorerank_gain,scorerank_gain_day,
+               valuerank,valuerank_gain,valuerank_gain_day,
+               xprank,xprank_gain,xprank_gain_day,
+               planets,planets_gain,planets_gain_day
+               ,ticks_roiding, ticks_roided
+       FROM galaxies g
+               JOIN (SELECT x,y,count(CASE WHEN size_gain > 0 THEN 1 ELSE NULL END) AS ticks_roiding
+                       ,count(CASE WHEN size_gain < 0 THEN 1 ELSE NULL END) AS ticks_roided
+                       FROM galaxies GROUP BY x,y) ga USING (x,y)
+       WHERE tick = ( SELECT max(tick) AS max FROM galaxies)
+               AND x = $1 AND y = $2
+               });
+
+       $query->execute($x,$y);
+       $c->stash(g => $query->fetchrow_hashref );
+
+       my $extra_columns = '';
+       if ($c->check_user_roles(qw/stats_intel/)){
+               $c->stash(intel => 1);
+               $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
+       }
+       if ($c->check_user_roles(qw/stats_details/)){
+               $c->stash( details => 1);
+               $extra_columns .= q{
+                       ,gov, p.value - p.size*200 -
+                       COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 -
+                       COALESCE(ss.total ,(SELECT COALESCE(avg(total),0)
+                               FROM structure_scans)::int)*1500 AS fleetvalue
+                       ,(metal+crystal+eonium)/100 AS resvalue
+               };
+       }
+
+       $query = $dbh->prepare(qq{SELECT p.id,coords(x,y,z), ruler, p.planet,race,
+               size, size_gain, size_gain_day,
+               score,score_gain,score_gain_day,
+               value,value_gain,value_gain_day,
+               xp,xp_gain,xp_gain_day,
+               sizerank,sizerank_gain,sizerank_gain_day,
+               scorerank,scorerank_gain,scorerank_gain_day,
+               valuerank,valuerank_gain,valuerank_gain_day,
+               xprank,xprank_gain,xprank_gain_day
+               $extra_columns
+               FROM current_planet_stats_full p 
+                       LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet
+                       LEFT OUTER JOIN structure_scans ss ON p.id = ss.planet
+               WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE) ORDER BY x,y,z ASC
+               });
+
+       $query->execute($x,$y,$z);
+       $c->stash(planets => $query->fetchall_arrayref({}) );
+}
+
+sub planet : Local {
+       my ( $self, $c, $id ) = @_;
+       my $dbh = $c->model;
+
+       my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats
+               WHERE id = $1},undef,$id);
+
+       $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
+       $c->stash(p => $p);
+
+       if ($c->check_user_roles(qw/stats_missions/)){
+               my $query = $dbh->prepare(q{
+                       SELECT DISTINCT ON (i.tick,x,y,z,t.id,i.name,i.amount) i.id,i.mission, i.name, i.tick, i.eta AS eta
+                               , i.amount, coords(x,y,z) AS coords, t.id AS planet
+                       FROM ((
+                                       SELECT * FROM fleets
+                                       WHERE sender = $1 AND tick > tick() - 14
+                               ) UNION (
+                                       SELECT * FROM fleets WHERE sender = $1 AND mission = 'Full fleet'
+                                       ORDER BY tick DESC LIMIT 5
+                               )
+                       ) i
+                       LEFT OUTER JOIN (planets
+                               NATURAL JOIN planet_stats) t ON i.target = t.id
+                                       AND t.tick = ( SELECT MAX(tick) FROM planet_stats)
+                       WHERE  i.uid = -1
+                       ORDER BY i.tick,x,y,z,t.id,i.name,i.amount,i.eta
+                       });
+               $query->execute($id);
+               my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
+                       WHERE id = ? ORDER BY num
+               });
+               my @missions;
+               while (my $mission = $query->fetchrow_hashref){
+                       my @ships;
+                       $ships->execute($mission->{id});
+                       if ($ships->rows != 0){
+                               while (my $ship = $ships->fetchrow_hashref){
+                                       push @ships,$ship;
+                               }
+                               $mission->{ships} = \@ships;
+                       }
+                       push @missions,$mission;
+               }
+               $c->stash(outgoings => \@missions);
+
+               $query = $dbh->prepare(q{
+                       SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
+                                               , i.amount, coords(x,y,z) AS coords, s.id AS planet
+                       FROM fleets i
+                       LEFT OUTER JOIN (planets
+                               NATURAL JOIN planet_stats) s ON i.sender = s.id
+                                       AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
+                       WHERE  i.uid = -1
+                               AND i.target = ?
+                               AND i.tick > tick() - 3
+                       ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta
+               });
+               $query->execute($id);
+               my @incomings;
+               while (my $mission = $query->fetchrow_hashref){
+                       my @ships;
+                       $ships->execute($mission->{id});
+                       if ($ships->rows != 0){
+                               while (my $ship = $ships->fetchrow_hashref){
+                                       push @ships,$ship;
+                               }
+                               $mission->{ships} = \@ships;
+                       }
+                       push @incomings,$mission;
+               }
+               $c->stash(incomings => \@incomings);
+       }
+
+       if ($c->check_user_roles(qw/stats_scans/)){
+               my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
+                       WHERE planet = ? AND tick > tick() - 168
+                       ORDER BY tick,type DESC
+               });
+               $query->execute($id);
+               $c->stash(scans => $query->fetchall_arrayref({}) );
+       }
+
+       if ($c->check_user_roles(qw/stats_planetdata/)){
+               my $query = $dbh->prepare(q{SELECT DISTINCT ON(rid) tick,category,name,amount
+                       FROM planet_data pd JOIN planet_data_types pdt ON pd.rid = pdt.id
+                       WHERE pd.id = $1 ORDER BY rid,tick DESC
+               });
+               $query->execute($id);
+               $c->stash(planetdata => $query->fetchall_arrayref({}) );
+       }
+
+       my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats 
+               WHERE id = ? AND tick > tick() - 24});
+       $query->execute($id);
+       $c->stash(values => $query->fetchall_arrayref({}) );
+
+       $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
+               WHERE id = ? ORDER BY tick ASC});
+       $query->execute($id);
+       my @coords;
+       my $co = {x => 0, y => 0, z => 0};
+       while (my $c2 = $query->fetchrow_hashref){
+               if ($co->{x} != $c2->{x} || $co->{y} != $c2->{y} || $co->{z} != $c2->{z}){
+                       $co = $c2;
+                       push @coords,$co;
+               }
+       }
+       $c->stash(oldcoords => \@coords);
+
+}
+
+sub find : Local {
+       my ( $self, $c, $find ) = @_;
+       my $dbh = $c->model;
+
+       local $_ = $find || $c->req->param('coords');
+
+       if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
+               my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
+                       ,undef,$1,$2,$3,$4);
+               $c->res->redirect($c->uri_for('planet',$planet));
+       }elsif (/(\d+)(?: |:)(\d+)/){
+               $c->res->redirect($c->uri_for('galaxy',$1,$2));
+       }
+
+}
+
+
+=head1 AUTHOR
+
+Michael Andreen (harv@ruin.nu)
+
+=head1 LICENSE
+
+GPL 2.0, or later.
+
+=cut
+
+1;
diff --git a/root/lib/inc/missionlist.tt2 b/root/lib/inc/missionlist.tt2
new file mode 100644 (file)
index 0000000..870205e
--- /dev/null
@@ -0,0 +1,36 @@
+       <table>
+               <tr><th></th><th>Coords</th><th>Name</th><th>Mission</th><th>Tick</th><th>ETA</th><th>Amount</th></tr>
+       [% FOR m IN missions %]
+               <tr align="center" class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]" onclick="$('#fleet[% m.id %]').toggle()">
+                       <td>
+               [% IF m.ships %]
+                               <b>&dArr;</b>
+               [% END %]
+                       </td><td>
+               [% IF m.planet %]
+                               <a href="[% c.uri_for('/stats/planet', m.planet) %]">[% m.coords %]</a>
+               [% END %]
+                       </td>
+                       <td>[% m.name %]</td>
+                       <td class="[% m.mission %]">[% m.mission %]</td>
+                       <td>[% m.tick %]</td>
+                       <td>[% m.eta %]</td>
+                       <td>[% m.amount %]</td>
+                       [% IF m.fleetcatch %]
+                       <td class="Hostile">FLEETCATCH!!</td>
+                       [% END %]
+               </tr>
+               [% IF m.ships %]
+               <tr id="fleet[% m.id %]" class="hidden">
+                       <td>
+                       <td colspan="5"><table>
+                       [% FOR s IN m.ships %]
+                               <tr class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+                                       <td>[% s.ship %]</td><td>[% s.amount %]</td>
+                               </tr>
+                       [% END %]
+                       </table></td>
+               </tr>
+               [% END %]
+       [% END %]
+       </table>
diff --git a/root/lib/inc/stats.tt2 b/root/lib/inc/stats.tt2
new file mode 100644 (file)
index 0000000..68e0308
--- /dev/null
@@ -0,0 +1,85 @@
+<table class="stats">
+       <tr align="center"><th colspan="4">Rank</th>
+       </tr>
+       <tr>
+       <th>Size</th>
+       <th>Score</th>
+       <th>Value</th>
+       <th>XP</th>
+       <th>Coords</th>
+       <th>Planets</th>
+       <th>Size</th>
+       <th>Score</th>
+       <th>Value</th>
+       <th>XP</th>
+       <th>Roided</th>
+       <th>Roiding</th>
+       </tr>
+       <tr align="right" class="odd">
+               [% g.sizerankimg = (g.sizerank_gain_day == 0 ? 'stay' : (g.sizerank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% g.sizerank_gain_day %] Today | [% g.sizerank_gain %] Tick">[% g.sizerank %] <img src="/static/images/[% g.sizerankimg %].png" alt="[% g.sizerankimg %]"> </td>
+               [% g.scorerankimg = (g.scorerank_gain_day == 0 ? 'stay' : (g.scorerank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% g.scorerank_gain_day %] Today | [% g.scorerank_gain %] Tick">[% g.scorerank %] <img src="/static/images/[% g.scorerankimg %].png" alt="[% g.scorerankimg %]"> </td>
+               [% g.valuerankimg = (g.valuerank_gain_day == 0 ? 'stay' : (g.valuerank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% g.valuerank_gain_day %] Today | [% g.valuerank_gain %] Tick">[% g.valuerank %] <img src="/static/images/[% g.valuerankimg %].png" alt="[% g.valuerankimg %]"> </td>
+               [% g.xprankimg = (g.xprank_gain_day == 0 ? 'stay' : (g.xprank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% g.xprank_gain_day %] Today | [% g.xprank_gain %] Tick">[% g.xprank %] <img src="/static/images/[% g.xprankimg %].png" alt="[% g.xprankimg %]"> </td>
+               <td><a href="[% c.uri_for('/stats','galaxy',g.x,g.y) %]">[% g.x %]:[% g.y %]</a></td>
+               [% g.planetsimg = (g.planets_gain_day == 0 ? 'stay' : (g.planets_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% g.planets_gain_day %] Today | [% g.planets_gain %] Tick">[% comma(g.planets) %] <img src="/static/images/[% g.planetsimg %].png" alt="[% g.planetsimg %]"> </td>
+               [% g.sizeimg = (g.size_gain_day == 0 ? 'stay' : (g.size_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% g.size_gain_day %] Today | [% g.size_gain %] Tick">[% comma(g.size) %] <img src="/static/images/[% g.sizeimg %].png" alt="[% g.sizeimg %]"> </td>
+               [% g.scoreimg = (g.score_gain_day == 0 ? 'stay' : (g.score_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% comma(g.score_gain_day) %] Today | [% comma(g.score_gain) %] Tick">[% comma(g.score) %] <img src="/static/images/[% g.scoreimg %].png" alt="[% g.scoreimg %]"> </td>
+               [% g.valueimg = (g.value_gain_day == 0 ? 'stay' : (g.value_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% comma(g.value_gain_day) %] Today | [% comma(g.value_gain) %] Tick">[% comma(g.value) %] <img src="/static/images/[% g.valueimg %].png" alt="[% g.valueimg %]"> </td>
+               [% g.xpimg = (g.xp_gain_day == 0 ? 'stay' : (g.xp_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% comma(g.xp_gain_day) %] Today | [% comma(g.xp_gain) %] Tick">[% comma(g.xp) %] <img src="/static/images/[% g.xpimg %].png" alt="[% g.xpimg %]"> </td>
+               <td>[% g.ticks_roided %]</td>
+               <td>[% g.ticks_roiding %]</td>
+       </tr>
+</table>
+
+<table>
+       <tr align="center"><th colspan="4">Rank</th>
+       </tr>
+       <tr><th>Size</th><th>Score</th><th>Value </th> <th>XP</th>
+               <th>Coords</th><th>Planet</th><th>Race</th>
+               <th>Size</th><th>Score</th><th>Value </th><th>XP</th>
+               [% IF details %]<th>Gov</th><th>Fleet (Resource) value</th>[% END %]
+               [% IF intel %]<th>Nick</th><th>Hit us</th><th>Alliance</th>[% END %]
+       </tr>
+[% FOR p IN planets %]
+       <tr align="right" class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+               [% p.sizerankimg = (p.sizerank_gain_day == 0 ? 'stay' : (p.sizerank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% p.sizerank_gain_day %] Today | [% p.sizerank_gain %] Tick">[% p.sizerank %] <img src="/static/images/[% p.sizerankimg %].png" alt="[% p.sizerankimg %]"> </td>
+               [% p.scorerankimg = (p.scorerank_gain_day == 0 ? 'stay' : (p.scorerank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% p.scorerank_gain_day %] Today | [% p.scorerank_gain %] Tick">[% p.scorerank %] <img src="/static/images/[% p.scorerankimg %].png" alt="[% p.scorerankimg %]"> </td>
+               [% p.valuerankimg = (p.valuerank_gain_day == 0 ? 'stay' : (p.valuerank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% p.valuerank_gain_day %] Today | [% p.valuerank_gain %] Tick">[% p.valuerank %] <img src="/static/images/[% p.valuerankimg %].png" alt="[% p.valuerankimg %]"> </td>
+               [% p.xprankimg = (p.xprank_gain_day == 0 ? 'stay' : (p.xprank_gain_day < 0 ? 'up' : 'down')) %]
+               <td title="[% p.xprank_gain_day %] Today | [% p.xprank_gain %] Tick">[% p.xprank %] <img src="/static/images/[% p.xprankimg %].png" alt="[% p.xprankimg %]"> </td>
+
+               <td><a href="[% c.uri_for('/stats','planet',p.id) %]">[% p.coords %]</a></td>
+               <td align="center">[% p.ruler %] <b>OF</b> [% p.planet %]</td>
+               <td align="center">[% p.race %]</td>
+               [% p.sizeimg = (p.size_gain_day == 0 ? 'stay' : (p.size_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% p.size_gain_day %] Today | [% p.size_gain %] Tick">[% comma(p.size) %] <img src="/static/images/[% p.sizeimg %].png" alt="[% p.sizeimg %]"> </td>
+               [% p.scoreimg = (p.score_gain_day == 0 ? 'stay' : (p.score_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% comma(p.score_gain_day) %] Today | [% comma(p.score_gain) %] Tick">[% comma(p.score) %] <img src="/static/images/[% p.scoreimg %].png" alt="[% p.scoreimg %]"> </td>
+               [% p.valueimg = (p.value_gain_day == 0 ? 'stay' : (p.value_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% comma(p.value_gain_day) %] Today | [% comma(p.value_gain) %] Tick">[% comma(p.value) %] <img src="/static/images/[% p.valueimg %].png" alt="[% p.valueimg %]"> </td>
+               [% p.xpimg = (p.xp_gain_day == 0 ? 'stay' : (p.xp_gain_day > 0 ? 'up' : 'down')) %]
+               <td title="[% comma(p.xp_gain_day) %] Today | [% comma(p.xp_gain) %] Tick">[% comma(p.xp) %] <img src="/static/images/[% p.xpimg %].png" alt="[% p.xpimg %]"> </td>
+       [% IF details %]
+               <td align="center">[% p.gov %]</td>
+               <td align="center">[% p.fleetvalue %] ([% p.resvalue %])</td>
+       [% END %]
+       [% IF intel %]
+       <td align="center" class="[% p.planet_status %]"><a href="[% c.uri_for('/intel','planet',p.id) %]">[% p.nick %]([% p.planet_stats %])</a></td>
+       <td>[% p.hit_us %]</td>
+       <td align="center" class="[% p.relationship %]">[% p.alliance %]</td>
+       [% END %]
+       </tr>
+[% END %]
+</table>
index 4c9f5b5e6c5390c9c396770972de17a7e1e10615..4671c42d0049bcd5412c9e4e2a4177aa2d783088 100644 (file)
 </head>
  <body>
 [% content %]
+
+<script type="text/javascript">
+<!--
+$(document).ready(function(){
+       $('.hidden').hide();
+       $('a[rel="external"]').click(function() {
+               window.open( $(this).attr('href') );
+               return false;
+       });
+});
+-->
+</script>
 </body>
 </html>
index 3c1a25077b36f43be5521222ac66ba58fc0f4941..fe04fd0eff8c3b1451c34e74daf1c9c8cf398ab2 100644 (file)
        <li><a href="/rankings/planets">Planet Rankings</a></li>
        <li><a href="/rankings/alliances">Alliance Rankings</a></li>
        <li><a href="/rankings/galaxies">Galaxy Rankings</a></li>
+       <li><form action="/stats/find" method="post"><p>
+               <input class="coordsinput" type="text" name="coords" value="[% checkcoords %]">
+               <input class="coordsinput" type="submit" value="Check">
+               </p></form>
+       </li>
 </ul>
 [% IF c.check_user_roles("member_menu") %]
        [% IF user.attacker %]
 [% IF user.attacker %]
 <p>Attack menu</p>
 <ul class="linkbar">
-       <li><form action="/check" method="post"><p>
-               <input class="coordsinput" type="text" name="coords" value="[% cords or '1:1:1' %]">
-               <input class="coordsinput" type="submit" value="Check">
-               </p></form></li>
        <li><a href="/raids">Web raids</a></li>
 </ul>
 <p><input type="button" value="Update target list"
index 14c2175fead9bb3e3f4ea8e6449cce445059bcc2..c410d741e5aa1764648a307cbeedf32c73cb1d05 100644 (file)
@@ -1,44 +1,5 @@
 [% META title = 'Edit call' %]
 
-[% BLOCK missiontable %]
-<table>
-               <tr><th></th><th>Coords</th><th>Name</th><th>Mission</th><th>Tick</th><th>ETA</th><th>Amount</th></tr>
-       [% FOR m IN missions %]
-               <tr align="center" class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]" onclick="$('#fleet[% m.id %]').toggle()">
-                       <td>
-               [% IF m.ships %]
-                               <b>&dArr;</b>
-               [% END %]
-                       </td><td>
-               [% IF m.planet %]
-                               <a href="[% c.uri_for('/stats/planet', m.planet) %]">[% m.coords %]</a>
-               [% END %]
-                       </td>
-                       <td>[% m.name %]</td>
-                       <td class="[% m.mission %]">[% m.mission %]</td>
-                       <td>[% m.tick %]</td>
-                       <td>[% m.eta %]</td>
-                       <td>[% m.amount %]</td>
-                       [% IF m.fleetcatch %]
-                       <td class="Hostile">FLEETCATCH!!</td>
-                       [% END %]
-               </tr>
-               [% IF m.ships %]
-               <tr id="fleet[% m.id %]" class="missionrow">
-                       <td>
-                       <td colspan="5"><table>
-                       [% FOR s IN m.ships %]
-                               <tr class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
-                                       <td>[% s.ship %]</td><td>[% s.amount %]</td>
-                               </tr>
-                       [% END %]
-                       </table></td>
-               </tr>
-               [% END %]
-       [% END %]
-       </table>
-[% END %]
-
 <form action="[% c.uri_for('postcallupdate',call.id) %]" method="post">
 <fieldset> <legend>Call details, call# [% call.id %]</legend>
 <table>
                <td>[% a.fleet %]</td>
                <td><input type="checkbox" name="change:[% a.id %]"></td>
        </tr>
-       <tr id="attacker[% a.id %]" class="missionrow">
+       <tr id="attacker[% a.id %]" class="hidden">
        <td></td>
        <td colspan="8">
-       [% PROCESS missiontable missions=a.missions %]
+       [% PROCESS inc/missionlist.tt2 missions=a.missions %]
        </td></tr>
 [% END %]
        </table>
 </form>
 </fieldset>
 <fieldset><legend>Member fleet</legend>
-[% PROCESS missiontable missions=fleets %]
+[% PROCESS inc/missionlist.tt2 missions=fleets %]
 </fieldset>
 <fieldset><legend>Defenders</legend>
-[% PROCESS missiontable missions=defenders %]
+[% PROCESS inc/missionlist.tt2 missions=defenders %]
 </fieldset>
 
 <div>
        <input type="submit" value="Submit">
 </fieldset></form>
 </div>
-
-<script type="text/javascript">
-<!--
-$(document).ready(function(){
-       $('.missionrow').hide();
-});
--->
-</script>
diff --git a/root/src/stats/find.tt2 b/root/src/stats/find.tt2
new file mode 100644 (file)
index 0000000..1e7402b
--- /dev/null
@@ -0,0 +1,10 @@
+[% META title = 'Find' %]
+
+<p>Could not find: &quot;[% c.req.param('coords') | html %]&quot;</p>
+
+<p>The following syntaxes are possible:</p>
+<ul>
+       <li>X:Y:Z tick (i.e. &quot;1:1:1 37&quot;) Finds the planet that had the coords at the specified tick</li>
+       <li>X:Y:Z (i.e.  &quot;1:1:1&quot;) Finds the planet that had the coords at the current tick</li>
+       <li>X:Y (i.e.  &quot;1:1&quot;) Finds a galaxy</li>
+</ul>
diff --git a/root/src/stats/galaxy.tt2 b/root/src/stats/galaxy.tt2
new file mode 100644 (file)
index 0000000..4e27a6b
--- /dev/null
@@ -0,0 +1,6 @@
+[% META title = 'Galaxy stats' %]
+[% PROCESS inc/stats.tt2 %]
+<div class="leftinfo">
+<img class="graph" src="[% c.uri_for('/graphs/galaxystats',g.x,g.y,STICK) %]" alt="stats" height="300" width="500">
+<img class="graph" src="[% c.uri_for('/graphs/galaxyranks',g.x,g.y,STICK) %]" alt="ranks" height="300" width="500">
+</div>
diff --git a/root/src/stats/planet.tt2 b/root/src/stats/planet.tt2
new file mode 100644 (file)
index 0000000..dfae29a
--- /dev/null
@@ -0,0 +1,61 @@
+[% META title = 'Planet stats' %]
+[% PROCESS inc/stats.tt2 %]
+
+[% IF planetdata %]
+<div class="leftinfo">
+<table>
+       <tr><th>Tick</th><th>Type</th><th>Amount</th></tr>
+       [% FOR pd IN planetdata %]
+       <tr class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+               <td>[% pd.tick %]</td>
+               <td>[% pd.category %] [% pd.name %]</td>
+               <td>[% comma(pd.amount) %]</td>
+       </tr>
+       [% END %]
+</table>
+</div>
+[% END %]
+<div class="leftinfo">
+<table>
+       <tr><th>Tick</th><th>Value</th><th>Gain</th></tr>
+[% FOR v IN values %]
+       <tr>
+               <td>[% v.tick %]</td><td>[% v.value %]</td>
+               <td class="[% v.gain < 0 ? 'Attack' : 'Defend' %]">[% v.gain %]</td>
+       </tr>
+[% END %]
+</table>
+</div>
+<div class="leftinfo">
+<table>
+[% IF scans %]
+       <tr><th>Tick</th><th>Scan</th></tr>
+       [% FOR s IN scans %]
+       <tr class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+               <td>[% s.tick %]</td>
+               <td><a href="http://game.planetarion.com/showscan.pl?scan_id=[% s.scan_id %]" rel="external">[% s.type %]</a></td>
+</tr>
+       [% END %]
+[% END %]
+       <tr><th>Tick</th><th>Coords</th></tr>
+[% FOR coords IN oldcoords %]
+       <tr>
+               <td>[% coords.tick %]</td>
+               <td>[% coords.x %]:[% coords.y %]:[% coords.z %]</td>
+       </tr>
+[% END %]
+</table>
+</div>
+[% IF outgoings %]
+<div class="leftinfo">
+<p>Outgoing fleets</p>
+       [% PROCESS inc/missionlist.tt2 missions=outgoings %]
+<p>Incoming fleets</p>
+       [% PROCESS inc/missionlist.tt2 missions=incomings %]
+</div>
+[% END %]
+
+<div class="leftinfo">
+<img class="graph" src="[% c.uri_for('/graphs/planetstats',p.id,STICK) %]" alt="stats" height="300" width="500">
+<img class="graph" src="[% c.uri_for('/graphs/planetranks',p.id,STICK) %]" alt="ranks" height="300" width="500">
+</div>
diff --git a/t/controller_Stats.t b/t/controller_Stats.t
new file mode 100644 (file)
index 0000000..e86e829
--- /dev/null
@@ -0,0 +1,10 @@
+use strict;
+use warnings;
+use Test::More tests => 3;
+
+BEGIN { use_ok 'Catalyst::Test', 'NDWeb' }
+BEGIN { use_ok 'NDWeb::Controller::Stats' }
+
+ok( request('/stats')->is_success, 'Request should succeed' );
+
+
diff --git a/templates/check.tmpl b/templates/check.tmpl
deleted file mode 100644 (file)
index 37be110..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-<p><TMPL_IF Arbiter><TMPL_VAR NAME=Arbiter><TMPL_ELSE><a href="/<TMPL_VAR NAME=PAGE>?cmd=arbiter&amp;coords=<TMPL_VAR ESCAPE=URL NAME=Coords>">Do arbiter check on gal</a></TMPL_IF></p>
-
-<table class="stats">
-       <tr align="center"><th colspan="4">Rank</th>
-       </tr>
-       <tr>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=sizerank">Size</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=scorerank">Score</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=valuerank">Value</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=xprank">XP</a></th>
-       <th>Coords</th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=planets">Planets</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=sizerank">Size</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=scorerank">Score</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=valuerank">Value</a></th>
-       <th><a href="/<TMPL_VAR NAME=PAGE>?offset=<TMPL_VAR NAME=Offset>&amp;order=xprank">XP</a></th>
-       </tr>
-       <TMPL_LOOP Galaxies>
-       <tr align="right" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-               <td title="<TMPL_VAR NAME=SizeRank_Gain_day> Today | <TMPL_VAR NAME=SizeRank_Gain> Tick"><TMPL_VAR NAME=SizeRank> <img src="/images/<TMPL_VAR NAME=SizeRankImg>.png" alt="<TMPL_VAR NAME=SizeImg>"/> </td>
-               <td title="<TMPL_VAR NAME=ScoreRank_Gain_day> Today | <TMPL_VAR NAME=ScoreRank_Gain> Tick"><TMPL_VAR NAME=ScoreRank> <img src="/images/<TMPL_VAR NAME=ScoreRankImg>.png" alt="<TMPL_VAR NAME=ScoreImg>"/> </td>
-               <td title="<TMPL_VAR NAME=ValueRank_Gain_day> Today | <TMPL_VAR NAME=ValueRank_Gain> Tick"><TMPL_VAR NAME=ValueRank> <img src="/images/<TMPL_VAR NAME=ValueRankImg>.png" alt="<TMPL_VAR NAME=ValueImg>"/> </td>
-               <td title="<TMPL_VAR NAME=XPRank_Gain_day> Today | <TMPL_VAR NAME=XPRank_Gain> Tick"><TMPL_VAR NAME=XPRank> <img src="/images/<TMPL_VAR NAME=XPRankImg>.png" alt="<TMPL_VAR NAME=XPImg>"/> </td>
-
-               <td><a href="/check?coords=<TMPL_VAR NAME=X>:<TMPL_VAR NAME=Y>"><TMPL_VAR NAME=X>:<TMPL_VAR NAME=Y></a></td>
-               <td title="<TMPL_VAR NAME=Planets_Gain_day> Today | <TMPL_VAR NAME=Planets_Gain> Tick"><TMPL_VAR NAME=Planets> <img src="/images/<TMPL_VAR NAME=PlanetsImg>.png" alt="<TMPL_VAR NAME=PlanetsImg>"/> </td>
-               <td title="<TMPL_VAR NAME=Size_Gain_day> Today | <TMPL_VAR NAME=Size_Gain> Tick"><TMPL_VAR NAME=Size> <img src="/images/<TMPL_VAR NAME=SizeImg>.png" alt="<TMPL_VAR NAME=SizeImg>"/> </td>
-               <td title="<TMPL_VAR NAME=Score_Gain_day> Today | <TMPL_VAR NAME=Score_Gain> Tick"><TMPL_VAR NAME=Score> <img src="/images/<TMPL_VAR NAME=ScoreImg>.png" alt="<TMPL_VAR NAME=ScoreImg>"/> </td>
-               <td title="<TMPL_VAR NAME=Value_Gain_day> Today | <TMPL_VAR NAME=Value_Gain> Tick"><TMPL_VAR NAME=Value> <img src="/images/<TMPL_VAR NAME=ValueImg>.png" alt="<TMPL_VAR NAME=ValueImg>"/> </td>
-               <td title="<TMPL_VAR NAME=XP_Gain_day> Today | <TMPL_VAR NAME=XP_Gain> Tick"><TMPL_VAR NAME=XP> <img src="/images/<TMPL_VAR NAME=XPImg>.png" alt="<TMPL_VAR NAME=XPImg>"/> </td>
-
-       </tr>
-       </TMPL_LOOP>
-</table>
-
-<table>
-       <tr align="center"><th colspan="4">Rank</th>
-       </tr>
-       <tr><th>Size</th><th>Score</th><th>Value </th> <th>XP</th><th>Coords</th><th>Planet</th><th>Race</th><th>Gov</th><th>Size</th><th>Score</th><th>Value </th>
-               <th>XP</th><th>Fleet (Resource) value</th><TMPL_IF isBC><th>Nick</th><th>Hit us</th><th>Alliance</th></TMPL_IF>
-       </tr>
-       <TMPL_LOOP GPlanets>
-       <tr align="right" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=SizeRank_Gain_day> Today | <TMPL_VAR NAME=SizeRank_Gain> Tick"><TMPL_VAR NAME=SizeRank> <img src="/images/<TMPL_VAR NAME=SizeRankImg>.png" alt="<TMPL_VAR NAME=SizeImg>"/> </td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=ScoreRank_Gain_day> Today | <TMPL_VAR NAME=ScoreRank_Gain> Tick"><TMPL_VAR NAME=ScoreRank> <img src="/images/<TMPL_VAR NAME=ScoreRankImg>.png" alt="<TMPL_VAR NAME=ScoreImg>"/> </td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=ValueRank_Gain_day> Today | <TMPL_VAR NAME=ValueRank_Gain> Tick"><TMPL_VAR NAME=ValueRank> <img src="/images/<TMPL_VAR NAME=ValueRankImg>.png" alt="<TMPL_VAR NAME=ValueImg>"/> </td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=XPRank_Gain_day> Today | <TMPL_VAR NAME=XPRank_Gain> Tick"><TMPL_VAR NAME=XPRank> <img src="/images/<TMPL_VAR NAME=XPRankImg>.png" alt="<TMPL_VAR NAME=XPImg>"/> </td>
-
-               <td align="left"><a href="/<TMPL_VAR NAME=PAGE>?coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Coords></a></td>
-               <td align="center"><TMPL_VAR NAME=Planet></td>
-               <td align="center"><TMPL_VAR NAME=Race></td>
-               <td align="center"><TMPL_VAR NAME=Gov></td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=Size_Gain_day> Today | <TMPL_VAR NAME=Size_Gain> Tick"><TMPL_VAR NAME=Size> <img src="/images/<TMPL_VAR NAME=SizeImg>.png" alt="<TMPL_VAR NAME=SizeImg>"/> </td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=Score_Gain_day> Today | <TMPL_VAR NAME=Score_Gain> Tick"><TMPL_VAR NAME=Score> <img src="/images/<TMPL_VAR NAME=ScoreImg>.png" alt="<TMPL_VAR NAME=ScoreImg>"/> </td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=Value_Gain_day> Today | <TMPL_VAR NAME=Value_Gain> Tick"><TMPL_VAR NAME=Value> <img src="/images/<TMPL_VAR NAME=ValueImg>.png" alt="<TMPL_VAR NAME=ValueImg>"/> </td>
-               <td style="padding-left: 0.5em" title="<TMPL_VAR NAME=XP_Gain_day> Today | <TMPL_VAR NAME=XP_Gain> Tick"><TMPL_VAR NAME=XP> <img src="/images/<TMPL_VAR NAME=XPImg>.png" alt="<TMPL_VAR NAME=XPImg>"/> </td>
-               <td align="center"><TMPL_VAR NAME=FleetValue> (<TMPL_VAR NAME=ResValue>)</td>
-               <TMPL_IF isBC>
-                       <td align="center" class="<TMPL_VAR NAME=Planet_Status>"><a href="intel?coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Nick>(<TMPL_VAR NAME=Planet_Status>)</a></td>
-                       <td align="center"><TMPL_VAR NAME=Hit_Us></td>
-                       <td align="center" class="<TMPL_VAR NAME=Relationship>"><TMPL_VAR NAME=Alliance></td>
-               </TMPL_IF>
-       </tr>
-
-       </TMPL_LOOP>
-</table>
-<TMPL_IF OnePlanet>
-<div class="leftinfo">
-<table>
-<tr><th>Tick</th><th>Type</th>Amount</tr>
-<TMPL_LOOP PlanetData>
-<tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-       <td><TMPL_VAR NAME=Tick></td>
-       <td><TMPL_VAR NAME=Category> <TMPL_VAR NAME=Name></td>
-       <td><TMPL_VAR NAME=Amount></td>
-</tr>
-</TMPL_LOOP>
-</table>
-</div>
-<div class="leftinfo">
-<table>
-<tr><th>Tick</th><th>Value</th><th>Gain</th></tr>
-<TMPL_LOOP Values>
-<tr>
-       <td><TMPL_VAR NAME=Tick></td><td><TMPL_VAR NAME=Value></td>
-       <td class="<TMPL_VAR NAME=Class>"><TMPL_VAR NAME=Gain></td>
-</tr>
-</TMPL_LOOP>
-</table>
-</div>
-<div class="leftinfo">
-<table>
-<tr><th>Tick</th><th>Scan</th></tr>
-<TMPL_LOOP Scans>
-<tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-       <td><TMPL_VAR NAME=Tick></td>
-       <td><a href="http://game.planetarion.com/showscan.pl?scan_id=<TMPL_VAR NAME=Scan_id>"><TMPL_VAR NAME=Type></a></td>
-</tr>
-</TMPL_LOOP>
-<tr><th>Tick</th><th>Coords</th></tr>
-<TMPL_LOOP OldCoords>
-<tr>
-       <td><TMPL_VAR NAME=Tick></td><td><TMPL_VAR NAME=X>:<TMPL_VAR NAME=Y>:<TMPL_VAR NAME=Z></td>
-</tr>
-</TMPL_LOOP>
-</table>
-</div>
-<div class="leftinfo">
-<table>
-       <tr><th>Target</th><th>Name</th><th>Mission</th><th>Landing tick</th><th>ETA</th><th>Amount</th></tr>
-       <TMPL_LOOP Missions>
-       <tr align="center" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>" onclick="toggleVisibility('fleet<TMPL_VAR NAME=Id>')">
-               <td><a href="/check?coords=<TMPL_VAR NAME=Target>"><TMPL_VAR NAME=Target></a></td>
-               <td><TMPL_VAR NAME=Name></td>
-               <td class="<TMPL_VAR NAME=Class>"><TMPL_VAR NAME=Mission></td><td><TMPL_VAR NAME=LandingTick></td>
-               <td><TMPL_VAR NAME=ETA></td><td><TMPL_VAR NAME=Amount></td>
-       </tr>
-       <tr id="fleet<TMPL_VAR NAME=Id>" style="z-index:1; display:none;">
-               <td/>
-               <td colspan="5"><table>
-               <TMPL_LOOP Ships>
-               <tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-                       <td><TMPL_VAR NAME=Ship></td><td><TMPL_VAR NAME=Amount></td>
-               </tr>
-               </TMPL_LOOP>
-               </table></td>
-       </tr>
-       </TMPL_LOOP>
-</table>
-<table>
-       <tr><th>Sender</th><th>Name</th><th>Mission</th><th>Landing tick</th><th>ETA</th><th>Amount</th></tr>
-       <TMPL_LOOP Incomings>
-       <tr align="center" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>" onclick="toggleVisibility('fleet<TMPL_VAR NAME=Id>')">
-               <td><a href="/check?coords=<TMPL_VAR NAME=Sender>"><TMPL_VAR NAME=Sender></a></td>
-               <td><TMPL_VAR NAME=Name></td>
-               <td class="<TMPL_VAR NAME=Class>"><TMPL_VAR NAME=Mission></td><td><TMPL_VAR NAME=LandingTick></td>
-               <td><TMPL_VAR NAME=ETA></td><td><TMPL_VAR NAME=Amount></td>
-       </tr>
-       <tr id="fleet<TMPL_VAR NAME=Id>" style="z-index:1; display:none;">
-               <td/>
-               <td colspan="5"><table>
-               <TMPL_LOOP Ships>
-               <tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-                       <td><TMPL_VAR NAME=Ship></td><td><TMPL_VAR NAME=Amount></td>
-               </tr>
-               </TMPL_LOOP>
-               </table></td>
-       </tr>
-       </TMPL_LOOP>
-</table>
-</div>
-</TMPL_IF>
-<div class="leftinfo">
-<img class="graph" src="/graph/stats/<TMPL_VAR NAME=Coords>" alt="stats" height="300" width="500"/>
-<img class="graph" src="/graph/ranks/<TMPL_VAR NAME=Coords>" alt="ranks" height="300" width="500"/>
-</div>