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 my $query = $dbh->prepare(q{
38 ,size, size_gain, size_gain_day
39 ,score,score_gain,score_gain_day
40 ,value,value_gain,value_gain_day
41 ,xp,xp_gain,xp_gain_day
42 ,sizerank,sizerank_gain,sizerank_gain_day
43 ,scorerank,scorerank_gain,scorerank_gain_day
44 ,valuerank,valuerank_gain,valuerank_gain_day
45 ,xprank,xprank_gain,xprank_gain_day
46 ,planets,planets_gain,planets_gain_day
47 ,ticks_roiding, ticks_roided
48 ,raid.tick AS last_raid, raid
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)
54 SELECT DISTINCT ON (x,y) x,y,raid, tick
56 SELECT raid,p.tick,x,y,count(*), sum(size) AS size
58 JOIN raid_targets rt ON r.id = rt.raid
59 JOIN planet_stats p ON p.id = rt.planet AND p.tick = r.tick-12
60 WHERE x = $1 and y = $2
61 GROUP BY raid,p.tick,x,y
63 JOIN galaxies g USING (tick,x,y)
64 WHERE a.count::float / g.planets >= 0.5
68 WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies)
69 AND x = $1 AND y = $2;
72 $query->execute($x,$y);
73 my $g = $query->fetchrow_hashref;
74 $c->detach('/default') unless $g;
78 my $extra_columns = '';
79 if ($c->check_user_roles(qw/stats_intel/)){
80 $c->stash(intel => 1);
81 $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
83 if ($c->check_user_roles(qw/stats_details/)){
84 $c->stash( details => 1);
86 ,gov, p.value - p.size*200 -
87 COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 -
88 COALESCE(ds.total ,(SELECT COALESCE(avg(total),0)
89 FROM current_development_scans)::int)*1500 AS fleetvalue
90 ,(metal+crystal+eonium)/100 AS resvalue
94 $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,p.id)
95 p.id,coords(x,y,z), ruler, p.planet,race,
96 size, size_gain, size_gain_day,
97 score,score_gain,score_gain_day,
98 value,value_gain,value_gain_day,
99 xp,xp_gain,xp_gain_day,
100 sizerank,sizerank_gain,sizerank_gain_day,
101 scorerank,scorerank_gain,scorerank_gain_day,
102 valuerank,valuerank_gain,valuerank_gain_day,
103 xprank,xprank_gain,xprank_gain_day
105 FROM current_planet_stats_full p
106 LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet
107 LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
108 WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE)
109 ORDER BY x,y,z,p.id,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC
112 $query->execute($x,$y,$z);
113 $c->stash(planets => $query->fetchall_arrayref({}) );
117 my ( $self, $c, $id ) = @_;
120 my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats
121 WHERE id = $1},undef,$id);
123 $c->detach('/default') unless $p;
125 $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
128 if ($c->check_user_roles(qw/stats_missions/)){
129 my $query = $dbh->prepare(q{
131 SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta
132 ,amount, NULL AS coords, planet, NULL AS back
134 WHERE planet = $1 AND tick <= tick() AND (
135 fid IN (SELECT fid FROM fleet_scans)
137 mission = 'Full fleet'
138 OR tick >= tick() - 12
140 ORDER BY mission,name,tick DESC
142 SELECT DISTINCT ON (tick,x,y,z,mission,name,amount)
143 NULL as fid, i.mission, i.name, i.tick,eta
144 , i.amount, coords(x,y,z), t.id AS planet, back
146 LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
147 WHERE uid = -1 AND i.sender = $1 AND i.tick > tick() - 14 AND i.tick < tick() + 14
148 ORDER BY i.tick,x,y,z,mission,name,amount,back
151 $query->execute($id);
152 my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
153 WHERE fid = ? ORDER BY num
156 while (my $mission = $query->fetchrow_hashref){
158 if ($mission->{fid}){
159 $ships->execute($mission->{fid});
160 while (my $ship = $ships->fetchrow_hashref){
163 push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
164 $mission->{ships} = \@ships;
166 push @missions,$mission;
168 $c->stash(outgoings => \@missions);
170 $query = $dbh->prepare(q{
171 SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
172 , i.amount, coords(x,y,z) AS coords, s.id AS planet
174 LEFT OUTER JOIN (planets
175 NATURAL JOIN planet_stats) s ON i.sender = s.id
176 AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
179 AND i.tick > tick() - 3
180 ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta
182 $query->execute($id);
184 while (my $mission = $query->fetchrow_hashref){
186 $ships->execute($mission->{id});
187 if ($ships->rows != 0){
188 while (my $ship = $ships->fetchrow_hashref){
191 $mission->{ships} = \@ships;
193 push @incomings,$mission;
195 $c->stash(incomings => \@incomings);
198 if ($c->check_user_roles(qw/stats_scans/)){
199 my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
200 WHERE planet = ? AND tick > tick() - 168
201 ORDER BY tick,type DESC
203 $query->execute($id);
204 $c->stash(scans => $query->fetchall_arrayref({}) );
207 if ($c->check_user_roles(qw/stats_planetdata/)){
208 $c->stash(planetscan => $dbh->selectrow_hashref(q{SELECT *
209 FROM current_planet_scans WHERE planet = $1},undef,$id));
210 $c->stash(devscan => $dbh->selectrow_hashref(q{SELECT *
211 FROM current_development_scans WHERE planet = $1},undef,$id));
214 my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats
215 WHERE id = ? AND tick > tick() - 24});
216 $query->execute($id);
217 $c->stash(values => $query->fetchall_arrayref({}) );
219 $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
220 WHERE id = ? ORDER BY tick ASC});
221 $query->execute($id);
223 my $co = {x => 0, y => 0, z => 0};
224 while (my $c2 = $query->fetchrow_hashref){
225 if ($co->{x} != $c2->{x} || $co->{y} != $c2->{y} || $co->{z} != $c2->{z}){
230 $c->stash(oldcoords => \@coords);
235 my ( $self, $c, $find ) = @_;
238 local $_ = $find || $c->req->param('coords');
239 $c->stash(searchterm => $_);
241 if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
242 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
244 $c->res->redirect($c->uri_for('planet',$planet));
245 }elsif (/(\d+)(?: |:)(\d+)/){
246 $c->res->redirect($c->uri_for('galaxy',$1,$2));
247 }elsif($c->check_user_roles(qw/stats_find_nick/)) {
248 my $query = $dbh->prepare(q{SELECT id,coords(x,y,z),nick
249 FROM current_planet_stats p
253 my $planets = $query->fetchall_arrayref({});
254 if (@{$planets} == 1){
255 $c->res->redirect($c->uri_for('planet',$planets->[0]->{id}));
257 $c->stash(planets => $planets);
265 Michael Andreen (harv@ruin.nu)