]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Stats.pm
Converted check/stats page
[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         $c->stash( comma => \&comma_value);
37
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
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         WHERE tick = ( SELECT max(tick) AS max FROM galaxies)
54                 AND x = $1 AND y = $2
55                 });
56
57         $query->execute($x,$y);
58         $c->stash(g => $query->fetchrow_hashref );
59
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";
64         }
65         if ($c->check_user_roles(qw/stats_details/)){
66                 $c->stash( details => 1);
67                 $extra_columns .= q{
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
73                 };
74         }
75
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
85                 $extra_columns
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
90                 });
91
92         $query->execute($x,$y,$z);
93         $c->stash(planets => $query->fetchall_arrayref({}) );
94 }
95
96 sub planet : Local {
97         my ( $self, $c, $id ) = @_;
98         my $dbh = $c->model;
99
100         my $p = $dbh->selectrow_hashref(q{SELECT id,x,y,z FROM current_planet_stats
101                 WHERE id = $1},undef,$id);
102
103         $c->forward('galaxy',[$p->{x},$p->{y},$p->{z}]);
104         $c->stash(p => $p);
105
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
110                         FROM ((
111                                         SELECT * FROM fleets
112                                         WHERE sender = $1 AND tick > tick() - 14
113                                 ) UNION (
114                                         SELECT * FROM fleets WHERE sender = $1 AND mission = 'Full fleet'
115                                         ORDER BY tick DESC LIMIT 5
116                                 )
117                         ) i
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)
121                         WHERE  i.uid = -1
122                         ORDER BY i.tick,x,y,z,t.id,i.name,i.amount,i.eta
123                         });
124                 $query->execute($id);
125                 my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
126                         WHERE id = ? ORDER BY num
127                 });
128                 my @missions;
129                 while (my $mission = $query->fetchrow_hashref){
130                         my @ships;
131                         $ships->execute($mission->{id});
132                         if ($ships->rows != 0){
133                                 while (my $ship = $ships->fetchrow_hashref){
134                                         push @ships,$ship;
135                                 }
136                                 $mission->{ships} = \@ships;
137                         }
138                         push @missions,$mission;
139                 }
140                 $c->stash(outgoings => \@missions);
141
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
145                         FROM fleets i
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)
149                         WHERE  i.uid = -1
150                                 AND i.target = ?
151                                 AND i.tick > tick() - 3
152                         ORDER BY i.tick,x,y,z,s.id,i.name,i.amount,i.eta
153                 });
154                 $query->execute($id);
155                 my @incomings;
156                 while (my $mission = $query->fetchrow_hashref){
157                         my @ships;
158                         $ships->execute($mission->{id});
159                         if ($ships->rows != 0){
160                                 while (my $ship = $ships->fetchrow_hashref){
161                                         push @ships,$ship;
162                                 }
163                                 $mission->{ships} = \@ships;
164                         }
165                         push @incomings,$mission;
166                 }
167                 $c->stash(incomings => \@incomings);
168         }
169
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
174                 });
175                 $query->execute($id);
176                 $c->stash(scans => $query->fetchall_arrayref({}) );
177         }
178
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
183                 });
184                 $query->execute($id);
185                 $c->stash(planetdata => $query->fetchall_arrayref({}) );
186         }
187
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({}) );
192
193         $query = $dbh->prepare(q{SELECT x,y,z,tick FROM planet_stats
194                 WHERE id = ? ORDER BY tick ASC});
195         $query->execute($id);
196         my @coords;
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}){
200                         $co = $c2;
201                         push @coords,$co;
202                 }
203         }
204         $c->stash(oldcoords => \@coords);
205
206 }
207
208 sub find : Local {
209         my ( $self, $c, $find ) = @_;
210         my $dbh = $c->model;
211
212         local $_ = $find || $c->req->param('coords');
213
214         if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
215                 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
216                         ,undef,$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));
220         }
221
222 }
223
224
225 =head1 AUTHOR
226
227 Michael Andreen (harv@ruin.nu)
228
229 =head1 LICENSE
230
231 GPL 2.0, or later.
232
233 =cut
234
235 1;