]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Stats.pm
a1db2459db9a6e55f21341a8f805dcfe177c00f4
[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{
37 SELECT x,y
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
49 FROM galaxies g
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         LEFT OUTER JOIN (
54                 SELECT DISTINCT ON (x,y) x,y,raid, tick
55                 FROM (
56                         SELECT raid,p.tick,x,y,count(*), sum(size) AS size
57                         FROM raids r
58                                 JOIN raid_targets rt ON r.id = rt.raid
59                                 JOIN planet_stats p USING (pid)
60                         WHERE x = $1 and y = $2 AND p.tick = r.tick-12
61                         GROUP BY raid,p.tick,x,y
62                         ) AS a
63                         JOIN galaxies g USING (tick,x,y)
64                 WHERE a.count::float / g.planets >= 0.5
65                 ORDER BY x,y,tick
66         ) AS raid USING (x,y)
67
68 WHERE g.tick = ( SELECT max(tick) AS max FROM galaxies)
69         AND x = $1 AND y = $2;
70                 });
71
72         $query->execute($x,$y);
73         my $g = $query->fetchrow_hashref;
74         $c->detach('/default') unless $g;
75         $c->stash(g => $g);
76
77
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";
82         }
83         if ($c->check_user_roles(qw/stats_details/)){
84                 $c->stash( details => 1);
85                 $extra_columns .= q{
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
91                 };
92         }
93
94         $query = $dbh->prepare(qq{SELECT DISTINCT ON (x,y,z,pid)
95                 pid AS 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
104                 $extra_columns
105                 FROM current_planet_stats_full p
106                         LEFT OUTER JOIN planet_scans ps USING (pid)
107                         LEFT OUTER JOIN current_development_scans ds USING (pid)
108                 WHERE x = ? AND y = ? AND COALESCE(z = ?,TRUE)
109                 ORDER BY x,y,z,pid,ps.tick DESC, ps.id DESC, ds.tick DESC, ds.id DESC
110                 });
111
112         $query->execute($x,$y,$z);
113         $c->stash(planets => $query->fetchall_arrayref({}) );
114 }
115
116 sub planet : Local {
117         my ( $self, $c, $id ) = @_;
118         my $dbh = $c->model;
119
120         my $p = $dbh->selectrow_hashref(q{SELECT pid AS id,x,y,z FROM current_planet_stats
121                 WHERE pid = $1},undef,$id);
122
123         $c->detach('/default') unless $p;
124
125         $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
126         $c->stash(p => $p);
127
128         if ($c->check_user_roles(qw/stats_missions/)){
129                 my $query = $dbh->prepare(q{
130 (
131         SELECT DISTINCT ON (mission,name) fid,mission,name,tick, NULL AS eta
132                 ,amount, NULL AS coords, pid AS planet, NULL AS back
133         FROM fleets f
134         WHERE pid = $1 AND tick <= tick() AND (
135                         fid IN (SELECT fid FROM fleet_scans)
136                 ) AND (
137                         mission = 'Full fleet'
138                         OR tick >= tick() - 12
139                 )
140         ORDER BY mission,name,tick DESC
141 ) UNION (
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), pid AS planet, back
145         FROM intel i
146         LEFT OUTER JOIN current_planet_stats t ON i.target = pid
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
149 )
150                 });
151                 $query->execute($id);
152                 my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
153                         WHERE fid = ? ORDER BY num
154                 });
155                 my @missions;
156                 while (my $mission = $query->fetchrow_hashref){
157                         my @ships;
158                         if ($mission->{fid}){
159                                 $ships->execute($mission->{fid});
160                                 while (my $ship = $ships->fetchrow_hashref){
161                                         push @ships,$ship;
162                                 }
163                                 push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
164                                 $mission->{ships} = \@ships;
165                         }
166                         push @missions,$mission;
167                 }
168                 $c->stash(outgoings => \@missions);
169
170                 $query = $dbh->prepare(q{
171                         SELECT DISTINCT ON (i.tick,x,y,z,pid,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
172                                                 , i.amount, coords(x,y,z) AS coords, pid AS planet
173                         FROM intel i
174                         LEFT OUTER JOIN (planets
175                                 NATURAL JOIN planet_stats) s ON i.sender = pid
176                                         AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
177                         WHERE  i.uid = -1
178                                 AND i.target = ?
179                                 AND i.tick > tick() - 3
180                         ORDER BY i.tick,x,y,z,pid,i.name,i.amount,i.eta
181                 });
182                 $query->execute($id);
183                 my @incomings;
184                 while (my $mission = $query->fetchrow_hashref){
185                         my @ships;
186                         $ships->execute($mission->{id});
187                         if ($ships->rows != 0){
188                                 while (my $ship = $ships->fetchrow_hashref){
189                                         push @ships,$ship;
190                                 }
191                                 $mission->{ships} = \@ships;
192                         }
193                         push @incomings,$mission;
194                 }
195                 $c->stash(incomings => \@incomings);
196         }
197
198         if ($c->check_user_roles(qw/stats_scans/)){
199                 my $query = $dbh->prepare(q{SELECT type,scan_id, tick FROM scans
200                         WHERE pid = ? AND tick > tick() - 168
201                         ORDER BY tick,type DESC
202                 });
203                 $query->execute($id);
204                 $c->stash(scans => $query->fetchall_arrayref({}) );
205         }
206
207         if ($c->check_user_roles(qw/stats_planetdata/)){
208                 $c->stash(planetscan => $dbh->selectrow_hashref(q{SELECT *
209                         FROM current_planet_scans WHERE pid = $1},undef,$id));
210                 $c->stash(devscan => $dbh->selectrow_hashref(q{SELECT *
211                         FROM current_development_scans WHERE pid = $1},undef,$id));
212         }
213
214         my $query = $dbh->prepare(q{SELECT value,value_gain AS gain,tick FROM planet_stats
215                 WHERE pid = ? AND tick > tick() - 24});
216         $query->execute($id);
217         $c->stash(values => $query->fetchall_arrayref({}) );
218
219         $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
220                 WHERE pid = ? ORDER BY tick ASC});
221         $query->execute($id);
222         my @coords;
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}){
226                         $co = $c2;
227                         push @coords,$co;
228                 }
229         }
230         $c->stash(oldcoords => \@coords);
231
232 }
233
234 sub find : Local {
235         my ( $self, $c, $find ) = @_;
236         my $dbh = $c->model;
237
238         local $_ = $find || $c->req->param('coords');
239         $c->stash(searchterm => $_);
240
241         if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
242                 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
243                         ,undef,$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 pid AS id,coords(x,y,z),nick
249                         FROM current_planet_stats p
250                         WHERE nick ilike $1
251                 });
252                 $query->execute($_);
253                 my $planets = $query->fetchall_arrayref({});
254                 if (@{$planets} == 1){
255                         $c->res->redirect($c->uri_for('planet',$planets->[0]->{id}));
256                 }else{
257                         $c->stash(planets => $planets);
258                 }
259         }
260 }
261
262
263 =head1 AUTHOR
264
265 Michael Andreen (harv@ruin.nu)
266
267 =head1 LICENSE
268
269 GPL 2.0, or later.
270
271 =cut
272
273 1;