]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Stats.pm
Use filter instead of having to stash the function everywhere
[ndwebbie.git] / lib / NDWeb / Controller / Stats.pm
1 package NDWeb::Controller::Stats;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 use NDWeb::Include;
8
9 =head1 NAME
10
11 NDWeb::Controller::Stats - Catalyst Controller
12
13 =head1 DESCRIPTION
14
15 Catalyst Controller.
16
17 =head1 METHODS
18
19 =cut
20
21
22 =head2 index 
23
24 =cut
25
26 sub index :Path :Args(0) {
27     my ( $self, $c ) = @_;
28
29     $c->response->body('Matched NDWeb::Controller::Stats in Stats.');
30 }
31
32 sub galaxy : Local {
33         my ( $self, $c, $x, $y, $z ) = @_;
34         my $dbh = $c->model;
35
36         my $query = $dbh->prepare(q{SELECT x,y,
37                 size, size_gain, size_gain_day,
38                 score,score_gain,score_gain_day,
39                 value,value_gain,value_gain_day,
40                 xp,xp_gain,xp_gain_day,
41                 sizerank,sizerank_gain,sizerank_gain_day,
42                 scorerank,scorerank_gain,scorerank_gain_day,
43                 valuerank,valuerank_gain,valuerank_gain_day,
44                 xprank,xprank_gain,xprank_gain_day,
45                 planets,planets_gain,planets_gain_day
46                 ,ticks_roiding, ticks_roided
47         FROM galaxies g
48                 JOIN (SELECT x,y,count(CASE WHEN size_gain > 0 THEN 1 ELSE NULL END) AS ticks_roiding
49                         ,count(CASE WHEN size_gain < 0 THEN 1 ELSE NULL END) AS ticks_roided
50                         FROM galaxies GROUP BY x,y) ga USING (x,y)
51         WHERE tick = ( SELECT max(tick) AS max FROM galaxies)
52                 AND x = $1 AND y = $2
53                 });
54
55         $query->execute($x,$y);
56         my $g = $query->fetchrow_hashref;
57         $c->detach('/default') unless $g;
58         $c->stash(g => $g);
59
60
61         my $extra_columns = '';
62         if ($c->check_user_roles(qw/stats_intel/)){
63                 $c->stash(intel => 1);
64                 $extra_columns = ",planet_status,hit_us, alliance,relationship,nick";
65         }
66         if ($c->check_user_roles(qw/stats_details/)){
67                 $c->stash( details => 1);
68                 $extra_columns .= q{
69                         ,gov, p.value - p.size*200 -
70                         COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150 -
71                         COALESCE(ds.total ,(SELECT COALESCE(avg(total),0)
72                                 FROM current_development_scans)::int)*1500 AS fleetvalue
73                         ,(metal+crystal+eonium)/100 AS resvalue
74                 };
75         }
76
77         $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,p.id)
78                 p.id,coords(x,y,z), ruler, p.planet,race,
79                 size, size_gain, size_gain_day,
80                 score,score_gain,score_gain_day,
81                 value,value_gain,value_gain_day,
82                 xp,xp_gain,xp_gain_day,
83                 sizerank,sizerank_gain,sizerank_gain_day,
84                 scorerank,scorerank_gain,scorerank_gain_day,
85                 valuerank,valuerank_gain,valuerank_gain_day,
86                 xprank,xprank_gain,xprank_gain_day
87                 $extra_columns
88                 FROM current_planet_stats_full p
89                         LEFT OUTER JOIN planet_scans ps ON p.id = ps.planet
90                         LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
91                 WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE)
92                 ORDER BY x,y,z,p.id,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC
93                 });
94
95         $query->execute($x,$y,$z);
96         $c->stash(planets => $query->fetchall_arrayref({}) );
97 }
98
99 sub planet : Local {
100         my ( $self, $c, $id ) = @_;
101         my $dbh = $c->model;
102
103         my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats
104                 WHERE id = $1},undef,$id);
105
106         $c->detach('/default') unless $p;
107
108         $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
109         $c->stash(p => $p);
110
111         if ($c->check_user_roles(qw/stats_missions/)){
112                 my $query = $dbh->prepare(q{
113 (
114         SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta
115                 ,amount, NULL AS coords, planet, NULL AS back
116         FROM fleets f
117         WHERE planet = $1 AND tick <= tick() AND (
118                         fid IN (SELECT fid FROM fleet_scans)
119                 ) AND (
120                         mission = 'Full fleet'
121                         OR tick >= tick() - 12
122                 )
123         ORDER BY mission,name,tick DESC
124 ) UNION (
125         SELECT DISTINCT ON (tick,x,y,z,mission,name,amount)
126                 NULL as fid, i.mission, i.name, i.tick,eta
127                 , i.amount, coords(x,y,z), t.id AS planet, back
128         FROM intel i
129         LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
130         WHERE uid = -1 AND i.sender = $1 AND i.tick > tick() - 14 AND i.tick < tick() + 14
131         ORDER BY i.tick,x,y,z,mission,name,amount,back
132 )
133                 });
134                 $query->execute($id);
135                 my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
136                         WHERE fid = ? ORDER BY num
137                 });
138                 my @missions;
139                 while (my $mission = $query->fetchrow_hashref){
140                         my @ships;
141                         if ($mission->{fid}){
142                                 $ships->execute($mission->{fid});
143                                 while (my $ship = $ships->fetchrow_hashref){
144                                         push @ships,$ship;
145                                 }
146                                 push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
147                                 $mission->{ships} = \@ships;
148                         }
149                         push @missions,$mission;
150                 }
151                 $c->stash(outgoings => \@missions);
152
153                 $query = $dbh->prepare(q{
154                         SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
155                                                 , i.amount, coords(x,y,z) AS coords, s.id AS planet
156                         FROM intel i
157                         LEFT OUTER JOIN (planets
158                                 NATURAL JOIN planet_stats) s ON i.sender = s.id
159                                         AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
160                         WHERE  i.uid = -1
161                                 AND i.target = ?
162                                 AND i.tick > tick() - 3
163                         ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta
164                 });
165                 $query->execute($id);
166                 my @incomings;
167                 while (my $mission = $query->fetchrow_hashref){
168                         my @ships;
169                         $ships->execute($mission->{id});
170                         if ($ships->rows != 0){
171                                 while (my $ship = $ships->fetchrow_hashref){
172                                         push @ships,$ship;
173                                 }
174                                 $mission->{ships} = \@ships;
175                         }
176                         push @incomings,$mission;
177                 }
178                 $c->stash(incomings => \@incomings);
179         }
180
181         if ($c->check_user_roles(qw/stats_scans/)){
182                 my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
183                         WHERE planet = ? AND tick > tick() - 168
184                         ORDER BY tick,type DESC
185                 });
186                 $query->execute($id);
187                 $c->stash(scans => $query->fetchall_arrayref({}) );
188         }
189
190         if ($c->check_user_roles(qw/stats_planetdata/)){
191                 $c->stash(planetscan => $dbh->selectrow_hashref(q{SELECT *
192                         FROM current_planet_scans WHERE planet = $1},undef,$id));
193                 $c->stash(devscan => $dbh->selectrow_hashref(q{SELECT *
194                         FROM current_development_scans WHERE planet = $1},undef,$id));
195         }
196
197         my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats 
198                 WHERE id = ? AND tick > tick() - 24});
199         $query->execute($id);
200         $c->stash(values => $query->fetchall_arrayref({}) );
201
202         $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
203                 WHERE id = ? ORDER BY tick ASC});
204         $query->execute($id);
205         my @coords;
206         my $co = {x => 0, y => 0, z => 0};
207         while (my $c2 = $query->fetchrow_hashref){
208                 if ($co->{x} != $c2->{x} || $co->{y} != $c2->{y} || $co->{z} != $c2->{z}){
209                         $co = $c2;
210                         push @coords,$co;
211                 }
212         }
213         $c->stash(oldcoords => \@coords);
214
215 }
216
217 sub find : Local {
218         my ( $self, $c, $find ) = @_;
219         my $dbh = $c->model;
220
221         local $_ = $find || $c->req->param('coords');
222         $c->stash(searchterm => $_);
223
224         if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
225                 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
226                         ,undef,$1,$2,$3,$4);
227                 $c->res->redirect($c->uri_for('planet',$planet));
228         }elsif (/(\d+)(?: |:)(\d+)/){
229                 $c->res->redirect($c->uri_for('galaxy',$1,$2));
230         }elsif($c->check_user_roles(qw/stats_find_nick/)) {
231                 my $query = $dbh->prepare(q{SELECT id,coords(x,y,z),nick
232                         FROM current_planet_stats p
233                         WHERE nick ilike $1
234                 });
235                 $query->execute($_);
236                 my $planets = $query->fetchall_arrayref({});
237                 if (@{$planets} == 1){
238                         $c->res->redirect($c->uri_for('planet',$planets->[0]->{id}));
239                 }else{
240                         $c->stash(planets => $planets);
241                 }
242         }
243 }
244
245
246 =head1 AUTHOR
247
248 Michael Andreen (harv@ruin.nu)
249
250 =head1 LICENSE
251
252 GPL 2.0, or later.
253
254 =cut
255
256 1;