1 package NDWeb::Controller::Stats;
5 use parent 'Catalyst::Controller';
12 NDWeb::Controller::Stats - Catalyst Controller
27 sub index :Path :Args(0) {
28 my ( $self, $c ) = @_;
30 $c->response->body('Matched NDWeb::Controller::Stats in Stats.');
34 my ( $self, $c, $x, $y, $z ) = @_;
37 my $query = $dbh->prepare(q{
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
49 ,raid.tick AS last_raid, raid
51 JOIN (SELECT x,y,count(CASE WHEN size_gain > 0 THEN 1 ELSE NULL END) AS ticks_roiding
52 ,count(CASE WHEN size_gain < 0 THEN 1 ELSE NULL END) AS ticks_roided
53 FROM galaxies GROUP BY x,y) ga USING (x,y)
55 SELECT DISTINCT ON (x,y) x,y,raid, tick
57 SELECT raid,p.tick,x,y,count(*), sum(size) AS size
59 JOIN raid_targets rt ON r.id = rt.raid
60 JOIN planet_stats p USING (pid)
61 WHERE x = $1 and y = $2 AND p.tick = r.tick-12
62 GROUP BY raid,p.tick,x,y
64 JOIN galaxies g USING (tick,x,y)
65 WHERE a.count::float / NULLIF(g.planets,0) >= 0.5
69 WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies)
70 AND x = $1 AND y = $2;
73 $query->execute($x,$y);
74 my $g = $query->fetchrow_hashref;
75 $c->detach('/default') unless $g;
79 my $extra_columns = '';
80 if ($c->check_user_roles(qw/stats_intel/)){
81 $c->stash(intel => 1);
82 $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
84 if ($c->check_user_roles(qw/stats_details/)){
85 $c->stash( details => 1);
87 ,gov, p.value - p.size*200 -
88 COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 -
89 COALESCE(ds.total ,(SELECT COALESCE(avg(total),0)
90 FROM current_development_scans)::int)*1500 AS fleetvalue
91 ,(metal+crystal+eonium)/100 AS resvalue
95 $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,pid)
96 pid AS id,coords(x,y,z), ruler, p.planet,race,
97 size, size_gain, size_gain_day,
98 score,score_gain,score_gain_day,
99 value,value_gain,value_gain_day,
100 xp,xp_gain,xp_gain_day,
101 sizerank,sizerank_gain,sizerank_gain_day,
102 scorerank,scorerank_gain,scorerank_gain_day,
103 valuerank,valuerank_gain,valuerank_gain_day,
104 xprank,xprank_gain,xprank_gain_day
106 FROM current_planet_stats_full p
107 LEFT OUTER JOIN planet_scans ps USING (pid)
108 LEFT OUTER JOIN current_development_scans ds USING (pid)
109 WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE)
110 ORDER BY x,y,z,pid,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC
113 $query->execute($x,$y,$z);
114 $c->stash(planets => $query->fetchall_arrayref({}) );
116 $query = $dbh->prepare(q{
118 SELECT x,y FROM galaxies
119 WHERE tick = tick() AND (x <= $1 AND y < $2 OR x < $1)
120 ORDER BY x DESC, y DESC LIMIT 1
122 SELECT x,y FROM galaxies
123 WHERE tick = tick() AND (x >= $1 AND y > $2 OR x > $1)
124 ORDER BY x ASC, y ASC LIMIT 1
126 TABLE p UNION TABLE n
128 $query->execute($x,$y);
129 $c->stash(browse => $query->fetchall_arrayref({}) );
133 my ( $self, $c, $id ) = @_;
136 my $p = $dbh->selectrow_hashref(q{SELECT pid AS id,x,y,z FROM current_planet_stats
137 WHERE pid = $1},undef,$id);
139 $c->detach('/default') unless $p;
141 $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
144 if ($c->check_user_roles(qw/stats_missions/)){
145 my $query = $dbh->prepare(q{
147 SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta
148 ,amount, NULL AS coords, pid AS planet, NULL AS back
150 WHERE pid = $1 AND tick <= tick() AND (
151 fid IN (SELECT fid FROM fleet_scans)
153 mission = 'Full fleet'
154 OR tick >= tick() - 12
156 ORDER BY mission,name,tick DESC
158 SELECT DISTINCT ON (tick,x,y,z,mission,name,amount)
159 NULL as fid, i.mission, i.name, i.tick,eta
160 , i.amount, coords(x,y,z), pid AS planet, back
162 LEFT OUTER JOIN current_planet_stats t ON i.target = pid
163 WHERE uid = -1 AND i.sender = $1 AND i.tick > tick() - 14 AND i.tick < tick() + 14
164 ORDER BY i.tick,x,y,z,mission,name,amount,back
167 $query->execute($id);
168 my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
169 WHERE fid = ? ORDER BY num
172 while (my $mission = $query->fetchrow_hashref){
174 if ($mission->{fid}){
175 $ships->execute($mission->{fid});
176 while (my $ship = $ships->fetchrow_hashref){
179 push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
180 $mission->{ships} = \@ships;
182 push @missions,$mission;
184 $c->stash(outgoings => \@missions);
186 $query = $dbh->prepare(q{
187 SELECT DISTINCT ON (i.tick,x,y,z,pid,i.name,i.mission,i.amount) i.id,i.mission, i.name, i.tick,eta
188 , i.amount, coords(x,y,z) AS coords, pid AS planet
190 LEFT OUTER JOIN (planets
191 NATURAL JOIN planet_stats) s ON i.sender = pid
192 AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
195 AND i.tick > tick() - 3
196 ORDER BY i.tick,x,y,z,pid,i.name,i.mission,i.amount,i.eta
198 $query->execute($id);
200 while (my $mission = $query->fetchrow_hashref){
201 push @incomings,$mission;
203 $c->stash(incomings => \@incomings);
206 if ($c->check_user_roles(qw/stats_scans/)){
207 my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
208 WHERE pid = ? AND tick > tick() - 168
209 ORDER BY tick,type DESC
211 $query->execute($id);
212 $c->stash(scans => $query->fetchall_arrayref({}) );
215 if ($c->check_user_roles(qw/stats_planetdata/)){
216 $c->stash(planetscan => $dbh->selectrow_hashref(q{SELECT *
217 FROM current_planet_scans WHERE pid = $1},undef,$id));
218 $c->stash(devscan => $dbh->selectrow_hashref(q{SELECT *
219 FROM current_development_scans WHERE pid = $1},undef,$id));
222 my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats
223 WHERE pid = ? AND tick > tick() - 24});
224 $query->execute($id);
225 $c->stash(values => $query->fetchall_arrayref({}) );
227 $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
228 WHERE pid = ? ORDER BY tick ASC});
229 $query->execute($id);
231 my $co = {x => 0, y => 0, z => 0};
232 while (my $c2 = $query->fetchrow_hashref){
233 if ($co->{x} != $c2->{x} || $co->{y} != $c2->{y} || $co->{z} != $c2->{z}){
238 $c->stash(oldcoords => \@coords);
243 my ( $self, $c, $find ) = @_;
246 local $_ = $find || $c->req->param('coords');
247 $c->stash(searchterm => $_);
249 if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
250 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
252 $c->res->redirect($c->uri_for('planet',$planet));
253 }elsif (/(\d+)(?: |:)(\d+)/){
254 $c->res->redirect($c->uri_for('galaxy',$1,$2));
255 }elsif($c->check_user_roles(qw/stats_find_nick/)) {
256 my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),nick
257 FROM current_planet_stats p
261 my $planets = $query->fetchall_arrayref({});
262 if (@{$planets} == 1){
263 $c->res->redirect($c->uri_for('planet',$planets->[0]->{id}));
265 $c->stash(planets => $planets);
271 my ( $self, $c ) = @_;
274 my @tags = $c->req->param('tags');
275 $c->stash(tags => \@tags);
276 my $query = $dbh->prepare(q{
283 $query->execute(\@tags, $c->user->id, $c->check_user_roles('stats_tags_all') // 0);
284 my $cloud = HTML::TagCloud->new;
285 while (my $tag = $query->fetchrow_hashref){
287 push @t, $tag->{tag};
288 my %param = (tags => \@t);
289 $cloud->add($tag->{tag}, $c->uri_for('tags',\%param), $tag->{count});
291 $c->stash(cloud => $cloud->html);
292 $c->stash(css => $cloud->css);
294 $query = $dbh->prepare(q{
295 WITH p AS (SELECT pid, coords(x,y,z) FROM current_planet_stats
296 ), t AS (SELECT pid,tag,bool_or(uid = $2) AS own,max(time) AS time
298 WHERE ($3 OR uid = $2)
301 ), tags AS (SELECT pid, array_agg(tag) AS tags
304 SELECT p.*k,array_to_string(tags,', ') AS tags FROM p JOIN tags USING (pid) WHERE tags @> $1;
306 $query->execute(\@tags, $c->user->id, $c->check_user_roles('stats_tags_all') // 0);
307 $c->stash(planets => $query->fetchall_arrayref({}));
312 Michael Andreen (harv@ruin.nu)