]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Intel.pm
388204bd5a74a583b74a6395b255c62949fbc563
[ndwebbie.git] / lib / NDWeb / Controller / Intel.pm
1 package NDWeb::Controller::Intel;
2
3 use strict;
4 use warnings;
5 use feature ':5.10';
6 use parent 'Catalyst::Controller';
7
8 use NDWeb::Include;
9
10 =head1 NAME
11
12 NDWeb::Controller::Intel - Catalyst Controller
13
14 =head1 DESCRIPTION
15
16 Catalyst Controller.
17
18 =head1 METHODS
19
20 =cut
21
22
23 =head2 index 
24
25 =cut
26
27 sub index :Path : Args(0) {
28         my ( $self, $c ) = @_;
29         my $dbh = $c->model;
30
31         my $ticks = $c->req->param('ticks') || 48;
32         $c->stash(showticks => $ticks);
33
34         my $query = $dbh->prepare(intelquery q{
35                         o.alliance AS oalliance ,coords(o.x,o.y,o.z) AS ocoords, i.sender
36                         ,t.alliance AS talliance,coords(t.x,t.y,t.z) AS tcoords, i.target
37                 },q{not ingal
38                         AND ((COALESCE( t.alliance != o.alliance,TRUE) AND (i.mission = 'Defend' OR i.mission = 'AllyDef' ))
39                                 OR ( t.alliance = o.alliance AND i.mission = 'Attack'))
40                         AND i.tick > (tick() - $1)
41                 });
42         $query->execute($ticks);
43         $c->stash(intel => $query->fetchall_arrayref({}) );
44
45         if (defined $c->req->param('coords')){
46                 my $coords = $c->req->param('coords');
47                 my @coords;
48                 while ($coords =~ m/(\d+:\d+:\d+)/g){
49                         push @coords,$1;
50                 }
51                 my $planets = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z), alliance, nick
52                         FROM current_planet_stats p
53                         WHERE coords(x,y,z) = ANY($1)
54                         ORDER BY alliance, p.x, p.y, p.z
55                 });
56                 $planets->execute(\@coords);
57                 $c->stash(coordslist => $planets->fetchall_arrayref({}) );
58         }
59 }
60
61 sub planet : Local {
62         my ( $self, $c, $id ) = @_;
63         my $dbh = $c->model;
64
65         $c->forward('findPlanet');
66         my $p = $c->stash->{p};
67
68         $c->stash(checkcoords => "$p->{x}:$p->{y}:$p->{z}");
69         my $ticks = $c->req->param('ticks') || 48;
70         $c->stash(showticks => $ticks);
71
72         my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),alliance,nick,channel
73                 FROM current_planet_stats WHERE channel = $1
74                 ORDER BY alliance,x,y,z
75                 });
76         $query->execute($p->{channel});
77         $c->stash(channelusers => $query->fetchall_arrayref({}) );
78
79         $c->forward('/listAlliances');
80         $c->forward('/forum/findPosts',[$p->{ftid}]);
81
82         $c->stash(govs => ["","Feu", "Dic", "Dem","Uni"]);
83         $c->stash(planetstatus => ["","Friendly", "NAP", "Hostile"]);
84
85         $query = $dbh->prepare(intelquery q{i.sender
86                         ,o.alliance AS oalliance,coords(o.x,o.y,o.z) AS ocoords
87                 },q{i.target = $1 AND i.tick > (tick() - $2)});
88         $query->execute($id,$ticks);
89         $c->stash(incoming => $query->fetchall_arrayref({}) );
90
91         $query = $dbh->prepare(intelquery q{i.target
92                         ,t.alliance AS talliance,coords(t.x,t.y,t.z) AS tcoords
93                 },q{i.sender = $1 AND i.tick > (tick() - $2)});
94         $query->execute($id,$ticks);
95         $c->stash(outgoing => $query->fetchall_arrayref({}) );
96
97 }
98
99 sub channels : Local {
100         my ( $self, $c, $order ) = @_;
101         my $dbh = $c->model;
102
103         if ($order ~~ /(alliance)/){
104                 $order = "lower($1) ASC";
105         }elsif ($order ~~ /(coords)/){
106                 $order = "x,y,z";
107         }else{
108                 $order = 'channel';
109         }
110
111         my $query = $dbh->prepare(q{
112 SELECT pid AS id,coords(x,y,z),nick,channel,alliance FROM current_planet_stats
113 WHERE channel <> '' and channel IS NOT NULL
114 ORDER BY } . $order
115         );
116         $query->execute;
117         $c->stash(planets => $query->fetchall_arrayref({}) );
118 }
119
120 sub postplanetcomment : Local {
121         my ($self, $c, $p) = @_;
122
123         $c->forward('findPlanet');
124         $p = $c->stash->{p};
125
126         $c->forward('/forum/insertPost',[$p->{ftid}]);
127         $c->res->redirect($c->uri_for('planet',$p->{id}));
128 }
129
130 sub postplanetupdate : Local {
131         my ($self, $c, $p) = @_;
132         my $dbh = $c->model;
133
134         $c->forward('findPlanet');
135         $p = $c->stash->{p};
136
137         $dbh->begin_work;
138         my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message)
139                 VALUES($2,$1,$3)
140                 });
141         if ($c->req->param('cnick')){
142                 my $value = html_escape $c->req->param('nick');
143                 $dbh->do(q{UPDATE planets SET nick = ? WHERE pid =?}
144                         ,undef,$value,$p->{id});
145                 $log->execute($c->user->id,$p->{ftid},"Set nick to: $value");
146         }
147         if ($c->req->param('cchannel')){
148                 my $value = html_escape $c->req->param('channel');
149                 $dbh->do(q{UPDATE planets SET channel = ? WHERE pid =?}
150                         ,undef,$value,$p->{id});
151                 $log->execute($c->user->id,$p->{ftid},"Set channel to: $value");
152         }
153         if ($c->req->param('cstatus')){
154                 my $value = $c->req->param('status');
155                 $dbh->do(q{UPDATE planets SET planet_status = ? WHERE pid =?}
156                         ,undef,$value,$p->{id});
157                 $log->execute($c->user->id,$p->{ftid},"Set planet_status to: $value");
158         }
159         if ($c->req->param('cgov')){
160                 my $value = $c->req->param('gov');
161                 $dbh->do(q{UPDATE planets SET gov = ? WHERE pid =?}
162                         ,undef,$value,$p->{id});
163                 $log->execute($c->user->id,$p->{ftid},"Set gov to: $value");
164         }
165         if ($c->req->param('calliance')){
166                 my $value = $c->req->param('alliance');
167                 $dbh->do(q{UPDATE planets SET alliance = NULLIF(?,'') WHERE pid = ?}
168                         ,undef,$value,$p->{id});
169                 $log->execute($c->user->id,$p->{ftid},"Set alliance to: $value");
170         }
171         $dbh->commit;
172
173         $c->res->redirect($c->uri_for('planet',$p->{id}));
174 }
175
176
177 sub find : Local {
178         my ( $self, $c, $find ) = @_;
179         my $dbh = $c->model;
180
181         local $_ = $find || $c->req->param('coords');
182         $c->stash(searchterm => $_);
183
184         if (/(\d+)(?: |:)(\d+)(?: |:)(\d+)(?:(?: |:)(\d+))?/){
185                 my $planet = $dbh->selectrow_array(q{SELECT planetid($1,$2,$3,$4)}
186                         ,undef,$1,$2,$3,$4);
187                 $c->res->redirect($c->uri_for('planet',$planet));
188         }else{
189                 my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z),nick
190                         FROM current_planet_stats p
191                         WHERE nick ilike $1
192                 });
193                 $query->execute($_);
194                 my $planets = $query->fetchall_arrayref({});
195                 if (@{$planets} == 1){
196                         $c->res->redirect($c->uri_for('planet',$planets->[0]->{id}));
197                 }else{
198                         $c->stash(planets => $planets);
199                 }
200         }
201 }
202
203 sub findPlanet : Private {
204         my ( $self, $c, $id ) = @_;
205         my $dbh = $c->model;
206
207         my $query = $dbh->prepare(q{SELECT x,y,z,pid AS id, nick, alliance,aid
208                 , planet_status,channel,ftid,gov
209                 FROM current_planet_stats
210                 WHERE pid = $1
211                 });
212         $query->execute($id);
213         $c->stash(p => $query->fetchrow_hashref);
214 }
215
216 sub members : Local {
217         my ( $self, $c, $order ) = @_;
218         my $dbh = $c->model;
219
220         if (defined $order && $order =~ /^(attacks|defenses|attack_points|defense_points
221                         |solo|bad_def)$/x){
222                 $order = $1;
223         }else{
224                 $order = 'attacks';
225         }
226         my $query = $dbh->prepare(q{SELECT u.uid,u.username,u.attack_points, u.defense_points, n.tick
227                 ,count(CASE WHEN i.mission = 'Attack' THEN 1 ELSE NULL END) AS attacks
228                 ,count(CASE WHEN (i.mission = 'Defend' OR i.mission = 'AllyDef') THEN 1 ELSE NULL END) AS defenses
229                 ,count(CASE WHEN i.mission = 'Attack' AND rt.id IS NULL THEN 1 ELSE NULL END) AS solo
230                 ,count(CASE WHEN i.mission = 'Defend' OR i.mission = 'AllyDef' THEN NULLIF(i.ingal OR (t.alliance_id = 1),TRUE) ELSE NULL END) AS bad_def
231                 FROM users u
232                 JOIN groupmembers gm USING (uid)
233                 LEFT OUTER JOIN (SELECT DISTINCT ON (planet) planet,tick from scans where type = 'News' ORDER BY planet,tick DESC) n USING (planet)
234                 LEFT OUTER JOIN (SELECT DISTINCT name,eta,tick,sender,target,mission,ingal FROM intel WHERE amount IS NULL) i ON i.sender = u.planet
235                 LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
236                 LEFT OUTER JOIN (SELECT rt.id,planet,tick FROM raids r 
237                                 JOIN raid_targets rt ON r.id = rt.raid) rt ON rt.planet = i.target 
238                         AND (rt.tick + 12) > i.tick AND rt.tick <= i.tick 
239                 LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target AND rc.uid = u.uid AND i.tick = rt.tick + rc.wave - 1
240                 WHERE gm.gid = 2
241                 GROUP BY u.uid,u.username,u.attack_points, u.defense_points,n.tick
242                 ORDER BY }. " $order DESC" );
243         $query->execute;
244         $c->stash(members => $query->fetchall_arrayref({}) );
245 }
246
247 sub member : Local {
248         my ( $self, $c, $uid ) = @_;
249         my $dbh = $c->model;
250
251         my $query = $dbh->prepare(q{
252                 SELECT coords(t.x,t.y,t.z), i.eta, i.tick, rt.id AS ndtarget, rc.launched, inc.landing_tick
253                 FROM users u
254                 LEFT OUTER JOIN (SELECT DISTINCT eta,tick,sender,target,mission,name FROM intel WHERE amount IS NULL) i ON i.sender = u.planet
255                 LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
256                 LEFT OUTER JOIN (SELECT rt.id,planet,tick FROM raids r 
257                                 JOIN raid_targets rt ON r.id = rt.raid) rt ON rt.planet = i.target 
258                         AND (rt.tick + 12) > i.tick AND rt.tick <= i.tick 
259                 LEFT OUTER JOIN raid_claims rc ON rt.id = rc.target AND rc.uid = u.uid AND i.tick = rt.tick + rc.wave - 1
260                 LEFT OUTER JOIN (SELECT sender, eta, landing_tick FROM calls c 
261                                         JOIN incomings i ON i.call = c.id) inc ON inc.sender = i.target 
262                                 AND (inc.landing_tick + inc.eta) >= i.tick 
263                                 AND (inc.landing_tick - inc.eta - 1) <= (i.tick - i.eta) 
264                 WHERE u.uid = $1 AND i.mission = 'Attack'
265                 ORDER BY (i.tick - i.eta)
266                 });
267         $query->execute($uid);
268         my @nd_attacks;
269         my @other_attacks;
270         while (my $intel = $query->fetchrow_hashref){
271                 my $attack = {target => $intel->{coords}, tick => $intel->{tick}};
272                 if ($intel->{ndtarget}){
273                         if (defined $intel->{launched}){
274                                 $attack->{other} = 'Claimed '.($intel->{launched} ? 'and confirmed' : 'but NOT confirmed');
275                         }else{
276                                 $attack->{other} = 'Launched at a tick that was not claimed';
277                         }
278                         push @nd_attacks, $attack;
279                 }else{
280                         push @other_attacks, $attack;
281                 }
282         }
283         my @attacks;
284         push @attacks, {name => 'ND Attacks', missions => \@nd_attacks, class => 'AllyDef'};
285         push @attacks, {name => 'Other', missions => \@other_attacks, class => 'Attack'};
286         $c->stash(attacks => \@attacks);
287
288         $query = $dbh->prepare(q{
289                 SELECT coords(t.x,t.y,t.z),t.alliance_id, t.alliance, i.eta, i.tick, i.ingal
290                 FROM users u
291                 JOIN (SELECT DISTINCT name,eta,tick,sender,target,mission,ingal FROM intel WHERE amount IS NULL) i ON i.sender = u.planet
292                 LEFT OUTER JOIN current_planet_stats t ON i.target = t.id
293                 WHERE u.uid = $1 AND (i.mission = 'Defend' OR i.mission = 'AllyDef')
294                 ORDER BY (i.tick - i.eta)
295                 });
296         $query->execute($uid);
297         my @nd_def;
298         my @ingal_def;
299         my @other_def;
300         while (my $intel = $query->fetchrow_hashref){
301                 my $def = {target => $intel->{coords}, other => $intel->{alliance}, tick => $intel->{tick}};
302                 if (defined $intel->{alliance_id} && $intel->{alliance_id} == 1){
303                         push @nd_def, $def;
304                 }elsif($intel->{ingal}){
305                         push @ingal_def, $def;
306                 }else{
307                         push @other_def, $def;
308                 }
309         }
310         my @defenses;
311         push @defenses, {name => 'ND Def', missions => \@nd_def, class => 'AllyDef'};
312         push @defenses, {name => 'Ingal Def', missions => \@ingal_def, class => 'Defend'};
313         push @defenses, {name => 'Other', missions => \@other_def, class => 'Attack'};
314         $c->stash(defenses => \@defenses);
315 }
316
317 sub naps : Local {
318         my ( $self, $c ) = @_;
319         my $dbh = $c->model;
320
321         my $query = $dbh->prepare(q{SELECT pid AS id,coords(x,y,z)
322                 ,ruler, p.planet,race, size, score, value
323                 , xp, sizerank, scorerank, valuerank, xprank, p.value - p.size*200 
324                         - COALESCE(ps.metal+ps.crystal+ps.eonium,0)/150
325                         - COALESCE(ds.total ,(SELECT COALESCE(avg(total),0)
326                                 FROM current_development_scans)::int)*1500 AS fleetvalue
327                 ,(metal+crystal+eonium)/100 AS resvalue, planet_status,hit_us
328                 , alliance,relationship,nick
329                 FROM current_planet_stats p
330                         LEFT OUTER JOIN current_planet_scans ps USING (pid)
331                         LEFT OUTER JOIN current_development_scans ds USING (pid)
332                 WHERE planet_status IN ('Friendly','NAP') order by x,y,z asc
333                 });
334         $query->execute;
335         $c->stash(planets => $query->fetchall_arrayref({}) );
336 }
337
338 =head1 AUTHOR
339
340 Michael Andreen (harv@ruin.nu)
341
342 =head1 LICENSE
343
344 GPL 2.0, or later.
345
346 =cut
347
348 1;