]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Alliances.pm
6c9731cc087f94b599f2841e5203694dff49a2e2
[ndwebbie.git] / lib / NDWeb / Controller / Alliances.pm
1 package NDWeb::Controller::Alliances;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 =head1 NAME
8
9 NDWeb::Controller::Alliances - Catalyst Controller
10
11 =head1 DESCRIPTION
12
13 Catalyst Controller.
14
15 =head1 METHODS
16
17 =cut
18
19
20 =head2 index 
21
22 =cut
23
24 sub index :Path :Args(0) {
25         my ( $self, $c ) = @_;
26         $c->stash(template => 'alliances/list.tt2');
27         $c->forward('list');
28 }
29
30 sub list : Local {
31         my ( $self, $c, $order ) = @_;
32         my $dbh = $c->model;
33
34         if (defined $order && $order =~ /^(score|kscore|size|ksize|members|kmem|kxp
35                         |kxp|scavg|kscavg|siavg|ksiavg|kxpavg|kvalue|kvalavg)$/x){
36                 $order = "$1 DESC";
37         } else {
38                 $order = "score DESC";
39         }
40         my $query = $dbh->prepare(q{
41                 SELECT aid AS id,alliance AS name,COALESCE(s.score,SUM(p.score)) AS score
42                         ,COALESCE(s.size,SUM(p.size)) AS size,s.members,count(p.score) AS kmem
43                         ,COALESCE(SUM(p.score),-1) AS kscore
44                         ,COALESCE(SUM(p.size),-1) AS ksize
45                         ,COALESCE(SUM(p.xp),-1) AS kxp
46                         ,COALESCE(SUM(p.value),-1) AS kvalue
47                         ,COALESCE(s.score/LEAST(s.members,60),-1) AS scavg
48                         ,COALESCE(AVG(p.score)::int,-1) AS kscavg
49                         ,COALESCE(s.size/s.members,-1) AS siavg
50                         ,COALESCE(AVG(p.size)::int,-1) AS ksiavg
51                         ,COALESCE(AVG(p.xp)::int,-1) AS kxpavg
52                         ,COALESCE(AVG(p.value)::int,-1) AS kvalavg
53                 FROM alliances a
54                         LEFT OUTER JOIN (SELECT * FROM alliance_stats
55                                 WHERE tick = (SELECT max(tick) FROM alliance_stats)) s USING (aid)
56                         LEFT OUTER JOIN current_planet_stats p USING (alliance,aid)
57                 GROUP BY aid,alliance,s.score,s.size,s.members
58                 HAVING s.score IS NOT NULL OR count(p.score) > 0
59                 ORDER BY
60                 } . $order);
61         $query->execute;
62         $c->stash(alliances => $query->fetchall_arrayref({}) );
63 }
64
65 sub edit : Local {
66         my ( $self, $c, $id, $order ) = @_;
67         my $dbh = $c->model;
68
69         my $query = $dbh->prepare(q{SELECT aid AS id,alliance AS name, relationship FROM alliances WHERE aid = ?});
70         my $a = $dbh->selectrow_hashref($query,undef,$id);
71         $c->stash(a => $a);
72
73
74         if ($order && $order =~ /^((score|size|value|xp|hit_us|race)(rank)?)$/){
75                 $order = $1;
76         }else {
77                 $order = 'x,y,z';
78         }
79         $c->stash(order => $order);
80
81         $order .= ' DESC' if $order eq 'hit_us';
82
83         my $members = $dbh->prepare(q{
84                 SELECT pid AS id, coords(x,y,z), nick, ruler, planet, race, size, score, value, xp
85                         ,planet_status,hit_us, sizerank, scorerank, valuerank, xprank
86                 FROM current_planet_stats p
87                 WHERE p.alliance = ?
88                 ORDER BY
89                 } . $order);
90         $members->execute($a->{name});
91         $c->stash(members => $members->fetchall_arrayref({}) );
92
93         my $ticks = $c->req->param('ticks') || 48;
94         $c->stash(showticks => $ticks);
95
96         $query = $dbh->prepare(q{
97 SELECT salliance, scoords, sender, talliance, tcoords, target
98         ,mission, tick AS landingtick, eta, amount, ingal, username
99 FROM full_intel
100 WHERE NOT ingal AND (salliance = $1 OR talliance = $1)
101         AND (mission = 'Defend' OR mission = 'AllyDef')
102         AND COALESCE( talliance <> salliance, TRUE)
103         AND tick > (tick() - $2)
104 ORDER BY tick DESC, mission
105                 });
106         $query->execute($a->{name}, $ticks);
107         $c->stash(intel => $query->fetchall_arrayref({}) );
108 }
109
110
111 sub pscans : Local {
112         my ( $self, $c, $id ) = @_;
113         my $dbh = $c->model;
114
115         my $members = $dbh->prepare(q{
116                 SELECT pid AS id, coords(x,y,z), metal, crystal, eonium, ps.tick
117                         ,planet_status,hit_us, sizerank, scorerank, valuerank, xprank
118                 FROM current_planet_stats p left outer join current_planet_scans ps using (pid)
119                 WHERE p.aid = ?
120                 ORDER BY x,y,z
121                 });
122         $members->execute($id);
123         $c->stash(members => $members->fetchall_arrayref({}) );
124
125 }
126
127 sub fleet : Local {
128         my ( $self, $c, $id ) = @_;
129         my $dbh = $c->model;
130
131         my $query = $dbh->prepare(q{SELECT ship, id FROM ship_stats WHERE id >= 0 ORDER BY id ASC;});
132         $query->execute;
133         $c->stash(ships => $query->fetchall_arrayref({}));
134
135         my $members = $dbh->prepare(q{
136 WITH
137 aus AS (SELECT DISTINCT ON (pid) pid, fid, name,tick
138         FROM fleets f join fleet_scans fs using (fid)
139         WHERE mission = 'Full fleet' and name = 'Advanced Unit'
140         ORDER BY pid,tick DESC)
141 ,ships AS (SELECT pid, tick, ship, amount, id AS ship_id
142         FROM fleet_ships fs JOIN aus USING(fid) JOIN ship_stats USING(ship))
143 SELECT pid, coords(x,y,z), p.race, tick, jsonb_object_agg(ship_id, amount) AS ships
144         FROM ships JOIN current_planet_stats p USING (pid)
145         WHERE p.aid = $1
146         GROUP BY x,y,z,pid,race,tick;
147                 });
148         $members->execute($id);
149         $c->stash(members => $members->fetchall_arrayref({}) );
150
151 }
152
153 sub postallianceupdate : Local {
154         my ( $self, $c, $id, $order ) = @_;
155         my $dbh = $c->model;
156
157         my $query = $dbh->prepare(q{SELECT aid,alliance, relationship FROM alliances WHERE aid = ?});
158         my $a = $dbh->selectrow_hashref($query,undef,$id);
159
160         $dbh->begin_work;
161         my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
162                 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
163                 });
164         if ($c->req->param('crelationship')){
165                 my $value = $c->req->param('relationship');
166                 $dbh->do(q{UPDATE alliances SET relationship = ? WHERE aid =?}
167                         ,undef,$value,$id);
168                 $log->execute($c->user->id
169                         ,"HC set alliance: $a->{alliance} ($id) relationship: $value");
170         }
171         my $coords = $c->req->param('coords');
172         my $findplanet = $dbh->prepare(q{SELECT pid FROM current_planet_stats
173                 WHERE x = ? AND y = ? AND z = ?});
174         my $addplanet = $dbh->prepare(q{
175                 UPDATE planets SET alliance = $2, nick = coalesce($3,nick)
176                 WHERE pid = $1;
177                 });
178         my $text = '';
179         while ($coords =~ m/(\d+):(\d+):(\d+)(?:\s+nick=(\S+))?/g){
180                 my ($planet) = $dbh->selectrow_array($findplanet,undef,$1,$2,$3);
181                 $addplanet->execute($planet,$a->{alliance},$4);
182                 my $nick = '';
183                 $nick = "(nick $4)" if defined $4;
184                 $text .= "($planet) $1:$2:$3 $nick\n";
185         }
186         if ($text){
187                 $log->execute($c->user->id
188                         ,"HC added the following planets to alliance $a->{alliance} ($id):\n $text");
189         }
190         $dbh->commit;
191
192         $c->res->redirect($c->uri_for('edit',$id));
193 }
194
195 sub postremoveallplanets : Local {
196         my ( $self, $c, $id, $order ) = @_;
197         my $dbh = $c->model;
198
199         my $query = $dbh->prepare(q{SELECT aid,alliance, relationship FROM alliances WHERE aid = ?});
200         my $a = $dbh->selectrow_hashref($query,undef,$id);
201
202         $dbh->begin_work;
203         my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
204                 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
205                 });
206         my ($coords) = $dbh->selectrow_array(q{SELECT array_to_string(array_agg(coords(x,y,z)),' ')
207                         FROM current_planet_stats where alliance = $1
208                 },undef,$a->{alliance});
209         my $removeplanets = $dbh->prepare(q{
210                 UPDATE planets SET alliance = NULL
211                 WHERE alliance = $1;
212         });
213         $removeplanets->execute($a->{alliance});
214         $log->execute($c->user->id
215                 ,"HC cleaned alliance $a->{alliance} (id) :\n\n$coords");
216         $dbh->commit;
217
218         $c->res->redirect($c->uri_for('edit',$id));
219 }
220
221 sub hostile : Local {
222     my ( $self, $c, $order ) = @_;
223         my $dbh = $c->model;
224
225         my $begintick = 0;
226         my $endtick = $c->stash->{TICK};
227         if ($c->req->param('ticks')){
228                 $begintick = $endtick - $c->req->param('ticks');
229         }elsif(defined $c->req->param('begintick') && defined $c->req->param('endtick')){
230                 $begintick = $c->req->param('begintick');
231                 $endtick = $c->req->param('endtick');
232         }
233
234         my $query = $dbh->prepare(q{
235 SELECT aid, alliance, hostile_count, targeted, targeted_raids
236 FROM hostile_alliances($1,$2)
237 ORDER BY hostile_count DESC
238                 });
239         $query->execute($begintick,$endtick);
240         $c->stash(alliances => $query->fetchall_arrayref({}) );
241         $c->stash(ticks => $endtick - $begintick);
242         $c->stash(begin_tick => $begintick);
243         $c->stash(end_tick => $endtick);
244 }
245
246 sub resources : Local {
247     my ( $self, $c, $order ) = @_;
248         my $dbh = $c->model;
249
250         if (defined $order && $order =~ /^(size|score|resources|hidden|resplanet|hidplanet|nscore|nscore2|nscore3)$/){
251                 $order = "$1 DESC";
252         }else{
253                 $order = "resplanet DESC";
254         }
255
256         my $query = $dbh->prepare(q{
257 SELECT aid AS id,alliance AS name,relationship,members,score,size
258         ,resources,hidden,planets
259         ,(resources/planets)::bigint AS resplanet
260         ,(hidden/planets)::bigint AS hidplanet
261         , nscore, nscore2, nscore3
262 FROM alliance_resources
263 ORDER BY } . $order
264         );
265         $query->execute;
266         $c->stash(alliances => $query->fetchall_arrayref({}));
267 }
268
269
270 =head1 AUTHOR
271
272 Michael Andreen (harv@ruin.nu)
273
274 =head1 LICENSE
275
276 GPL 2.0, or later.
277
278 =cut
279
280 1;