1 package NDWeb::Controller::Stats;
5 use parent 'Catalyst::Controller';
11 NDWeb::Controller::Stats - Catalyst Controller
26 sub index :Path :Args(0) {
27 my ( $self, $c ) = @_;
29 $c->response->body('Matched NDWeb::Controller::Stats in Stats.');
33 my ( $self, $c, $x, $y, $z ) = @_;
36 $c->stash( comma => \&comma_value);
38 my $query = $dbh->prepare(q{SELECT x,y,
39 size, size_gain, size_gain_day,
40 score,score_gain,score_gain_day,
41 value,value_gain,value_gain_day,
42 xp,xp_gain,xp_gain_day,
43 sizerank,sizerank_gain,sizerank_gain_day,
44 scorerank,scorerank_gain,scorerank_gain_day,
45 valuerank,valuerank_gain,valuerank_gain_day,
46 xprank,xprank_gain,xprank_gain_day,
47 planets,planets_gain,planets_gain_day
48 ,ticks_roiding, ticks_roided
50 JOIN (SELECT x,y,count(CASE WHEN size_gain > 0 THEN 1 ELSE NULL END) AS ticks_roiding
51 ,count(CASE WHEN size_gain < 0 THEN 1 ELSE NULL END) AS ticks_roided
52 FROM galaxies GROUP BY x,y) ga USING (x,y)
53 WHERE tick = ( SELECT max(tick) AS max FROM galaxies)
57 $query->execute($x,$y);
58 $c->stash(g => $query->fetchrow_hashref );
60 my $extra_columns = '';
61 if ($c->check_user_roles(qw/stats_intel/)){
62 $c->stash(intel => 1);
63 $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
65 if ($c->check_user_roles(qw/stats_details/)){
66 $c->stash( details => 1);
68 ,gov, p.value - p.size*200 -
69 COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 -
70 COALESCE(ss.total ,(SELECT COALESCE(avg(total),0)
71 FROM structure_scans)::int)*1500 AS fleetvalue
72 ,(metal+crystal+eonium)/100 AS resvalue
76 $query = $dbh->prepare(qq{SELECT p.id,coords(x,y,z), ruler, p.planet,race,
77 size, size_gain, size_gain_day,
78 score,score_gain,score_gain_day,
79 value,value_gain,value_gain_day,
80 xp,xp_gain,xp_gain_day,
81 sizerank,sizerank_gain,sizerank_gain_day,
82 scorerank,scorerank_gain,scorerank_gain_day,
83 valuerank,valuerank_gain,valuerank_gain_day,
84 xprank,xprank_gain,xprank_gain_day
86 FROM current_planet_stats_full p
87 LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet
88 LEFT OUTER JOIN structure_scans ss ON p.id = ss.planet
89 WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE) ORDER BY x,y,z ASC
92 $query->execute($x,$y,$z);
93 $c->stash(planets => $query->fetchall_arrayref({}) );
97 my ( $self, $c, $id ) = @_;
100 my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats
101 WHERE id = $1},undef,$id);
103 $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
106 if ($c->check_user_roles(qw/stats_missions/)){
107 my $query = $dbh->prepare(q{
108 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
109 , i.amount, coords(x,y,z) AS coords, t.id AS planet
112 WHERE sender = $1 AND tick > tick() - 14
114 SELECT * FROM fleets WHERE sender = $1 AND mission = 'Full fleet'
115 ORDER BY tick DESC LIMIT 5
118 LEFT OUTER JOIN (planets
119 NATURAL JOIN planet_stats) t ON i.target = t.id
120 AND t.tick = ( SELECT MAX(tick) FROM planet_stats)
122 ORDER BY i.tick,x,y,z,t.id,i.name,i.amount,i.eta
124 $query->execute($id);
125 my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
126 WHERE id = ? ORDER BY num
129 while (my $mission = $query->fetchrow_hashref){
131 $ships->execute($mission->{id});
132 if ($ships->rows != 0){
133 while (my $ship = $ships->fetchrow_hashref){
136 $mission->{ships} = \@ships;
138 push @missions,$mission;
140 $c->stash(outgoings => \@missions);
142 $query = $dbh->prepare(q{
143 SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
144 , i.amount, coords(x,y,z) AS coords, s.id AS planet
146 LEFT OUTER JOIN (planets
147 NATURAL JOIN planet_stats) s ON i.sender = s.id
148 AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
151 AND i.tick > tick() - 3
152 ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta
154 $query->execute($id);
156 while (my $mission = $query->fetchrow_hashref){
158 $ships->execute($mission->{id});
159 if ($ships->rows != 0){
160 while (my $ship = $ships->fetchrow_hashref){
163 $mission->{ships} = \@ships;
165 push @incomings,$mission;
167 $c->stash(incomings => \@incomings);
170 if ($c->check_user_roles(qw/stats_scans/)){
171 my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
172 WHERE planet = ? AND tick > tick() - 168
173 ORDER BY tick,type DESC
175 $query->execute($id);
176 $c->stash(scans => $query->fetchall_arrayref({}) );
179 if ($c->check_user_roles(qw/stats_planetdata/)){
180 my $query = $dbh->prepare(q{SELECT DISTINCT ON(rid) tick,category,name,amount
181 FROM planet_data pd JOIN planet_data_types pdt ON pd.rid = pdt.id
182 WHERE pd.id = $1 ORDER BY rid,tick DESC
184 $query->execute($id);
185 $c->stash(planetdata => $query->fetchall_arrayref({}) );
188 my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats
189 WHERE id = ? AND tick > tick() - 24});
190 $query->execute($id);
191 $c->stash(values => $query->fetchall_arrayref({}) );
193 $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
194 WHERE id = ? ORDER BY tick ASC});
195 $query->execute($id);
197 my $co = {x => 0, y => 0, z => 0};
198 while (my $c2 = $query->fetchrow_hashref){
199 if ($co->{x} != $c2->{x} || $co->{y} != $c2->{y} || $co->{z} != $c2->{z}){
204 $c->stash(oldcoords => \@coords);
209 my ( $self, $c, $find ) = @_;
212 local $_ = $find || $c->req->param('coords');
214 if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
215 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
217 $c->res->redirect($c->uri_for('planet',$planet));
218 }elsif (/(\d+)(?: |:)(\d+)/){
219 $c->res->redirect($c->uri_for('galaxy',$1,$2));
227 Michael Andreen (harv@ruin.nu)