]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Alliances.pm
Use top60 members to calculate estimated score
[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 use NDWeb::Include;
8
9 =head1 NAME
10
11 NDWeb::Controller::Alliances - 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         $c->stash(template => 'alliances/list.tt2');
29         $c->forward('list');
30 }
31
32 sub list : Local {
33         my ( $self, $c, $order ) = @_;
34         my $dbh = $c->model;
35
36         if (defined $order && $order =~ /^(score|kscore|size|ksize|members|kmem|kxp
37                         |kxp|scavg|kscavg|siavg|ksiavg|kxpavg|kvalue|kvalavg)$/x){
38                 $order = "$1 DESC";
39         } else {
40                 $order = "score DESC";
41         }
42         my $query = $dbh->prepare(q{
43                 SELECT DISTINCT a.id,name,COALESCE(s.score,SUM(p.score)) AS score
44                         ,COALESCE(s.size,SUM(p.size)) AS size,s.members,count(p.score) AS kmem
45                         ,COALESCE(SUM(p.score),-1) AS kscore
46                         ,COALESCE(SUM(p.size),-1) AS ksize
47                         ,COALESCE(SUM(p.xp),-1) AS kxp
48                         ,COALESCE(SUM(p.value),-1) AS kvalue
49                         ,COALESCE(s.score/LEAST(s.members,60),-1) AS scavg
50                         ,COALESCE(AVG(p.score)::int,-1) AS kscavg
51                         ,COALESCE(s.size/s.members,-1) AS siavg
52                         ,COALESCE(AVG(p.size)::int,-1) AS ksiavg
53                         ,COALESCE(AVG(p.xp)::int,-1) AS kxpavg
54                         ,COALESCE(AVG(p.value)::int,-1) AS kvalavg
55                 FROM alliances a
56                         LEFT OUTER JOIN (SELECT * FROM alliance_stats
57                                 WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON s.id = a.id
58                         LEFT OUTER JOIN current_planet_stats p ON p.alliance_id = a.id
59                 GROUP BY a.id,a.name,s.score,s.size,s.members
60                 HAVING s.score IS NOT NULL OR count(p.score) > 0
61                 ORDER BY
62                 } . $order);
63         $query->execute;
64         $c->stash(alliances => $query->fetchall_arrayref({}) );
65         $c->stash(comma => \&comma_value);
66 }
67
68 sub edit : Local {
69         my ( $self, $c, $id, $order ) = @_;
70         my $dbh = $c->model;
71
72         my $query = $dbh->prepare(q{SELECT id,name, relationship FROM alliances WHERE id = ?});
73         my $a = $dbh->selectrow_hashref($query,undef,$id);
74         $c->stash(a => $a);
75
76
77         if ($order && $order =~ /^((score|size|value|xp|hit_us|race)(rank)?)$/){
78                 $order = $1;
79         }else {
80                 $order = 'x,y,z';
81         }
82         $c->stash(order => $order);
83
84         $order .= ' DESC' if $order eq 'hit_us';
85
86         my $members = $dbh->prepare(q{
87                 SELECT id, coords(x,y,z), nick, ruler, planet, race, size, score, value, xp
88                         ,planet_status,hit_us, sizerank, scorerank, valuerank, xprank
89                 FROM current_planet_stats p
90                 WHERE p.alliance_id = ?
91                 ORDER BY
92                 } . $order);
93         $members->execute($a->{id});
94         $c->stash(members => $members->fetchall_arrayref({}) );
95
96         my $ticks = $c->req->param('ticks') || 48;
97         $c->stash(showticks => $ticks);
98
99         $query = $dbh->prepare(intelquery q{
100                         o.alliance AS oalliance ,coords(o.x,o.y,o.z) AS ocoords, i.sender
101                         ,t.alliance AS talliance,coords(t.x,t.y,t.z) AS tcoords, i.target
102                 },q{NOT ingal AND (o.alliance_id = $1 OR t.alliance_id = $1)
103                         AND (i.mission = 'Defend' OR i.mission = 'AllyDef')
104                         AND ((( t.alliance_id != o.alliance_id OR t.alliance_id IS NULL OR o.alliance_id IS NULL)))
105                         AND i.sender NOT IN (SELECT planet FROM users u NATURAL JOIN groupmembers gm WHERE gid = 8 AND planet IS NOT NULL)
106                         AND NOT (i.back IS NOT NULL AND i.back = i.tick + 4)
107                         AND i.tick > (tick() - $2)
108                 });
109         $query->execute($a->{id}, $ticks);
110         $c->stash(intel => $query->fetchall_arrayref({}) );
111 }
112
113 sub postallianceupdate : Local {
114         my ( $self, $c, $id, $order ) = @_;
115         my $dbh = $c->model;
116
117         $dbh->begin_work;
118         my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
119                 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
120                 });
121         if ($c->req->param('crelationship')){
122                 my $value = $c->req->param('relationship');
123                 $dbh->do(q{UPDATE alliances SET relationship = ? WHERE id =?}
124                         ,undef,$value,$id);
125                 $log->execute($c->user->id
126                         ,"HC set alliance: $id relationship: $value");
127         }
128         my $coords = $c->req->param('coords');
129         my $findplanet = $dbh->prepare(q{SELECT id FROM current_planet_stats
130                 WHERE x = ? AND y = ? AND z = ?});
131         my $addplanet = $dbh->prepare(q{
132                 UPDATE planets SET alliance_id = $2, nick = coalesce($3,nick)
133                 WHERE id = $1;
134                 });
135         my $text = '';
136         while ($coords =~ m/(\d+):(\d+):(\d+)(?:\s+nick=(\S+))?/g){
137                 my ($planet) = $dbh->selectrow_array($findplanet,undef,$1,$2,$3);
138                 $addplanet->execute($planet,$id,$4);
139                 my $nick = '';
140                 $nick = "(nick $4)" if defined $4;
141                 $text .= "($planet) $1:$2:$3 $nick\n";
142         }
143         if ($text){
144                 $log->execute($c->user->id
145                         ,"HC added the following planets to alliance $id:\n $text");
146         }
147         $dbh->commit;
148
149         $c->res->redirect($c->uri_for('edit',$id));
150 }
151
152 sub postremoveallplanets : Local {
153         my ( $self, $c, $id, $order ) = @_;
154         my $dbh = $c->model;
155
156         $dbh->begin_work;
157         my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
158                 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
159                 });
160         my ($coords) = $dbh->selectrow_array(q{SELECT CONCAT(coords(x,y,z) || ' ') 
161                         FROM current_planet_stats where alliance_id = $1
162                 },undef,$id);
163         my $removeplanets = $dbh->prepare(q{
164                 UPDATE planets SET alliance_id = NULL
165                 WHERE alliance_id = $1;
166         });
167         $removeplanets->execute($id);
168         $log->execute($c->user->id
169                 ,"HC cleaned alliance $id :\n\n$coords");
170         $dbh->commit;
171
172         $c->res->redirect($c->uri_for('edit',$id));
173 }
174
175 sub hostile : Local {
176     my ( $self, $c, $order ) = @_;
177         my $dbh = $c->model;
178
179         my $begintick = 0;
180         my $endtick = $c->stash->{TICK};
181         if ($c->req->param('ticks')){
182                 $begintick = $endtick - $c->req->param('ticks');
183         }elsif(defined $c->req->param('begintick') && defined $c->req->param('endtick')){
184                 $begintick = $c->req->param('begintick');
185                 $endtick = $c->req->param('endtick');
186         }
187
188         my $query = $dbh->prepare(q{
189                 SELECT s.alliance_id AS id,s.alliance AS name,count(*) AS hostile_count
190 FROM calls c 
191         JOIN incomings i ON i.call = c.id
192         JOIN current_planet_stats s ON i.sender = s.id
193 WHERE c.landing_tick - i.eta > $1 and c.landing_tick - i.eta < $2
194 GROUP BY s.alliance_id,s.alliance
195 ORDER BY hostile_count DESC
196                 });
197         $query->execute($begintick,$endtick);
198         $c->stash(alliances => $query->fetchall_arrayref({}) );
199         $c->stash(ticks => $endtick - $begintick);
200         $c->stash(begin_tick => $begintick);
201         $c->stash(end_tick => $endtick);
202 }
203
204 sub resources : Local {
205     my ( $self, $c, $order ) = @_;
206         my $dbh = $c->model;
207
208         if (defined $order && $order =~ /^(size|score|resources|hidden|resplanet|hidplanet|nscore|nscore2|nscore3)$/){
209                 $order = "$1 DESC";
210         }else{
211                 $order = "resplanet DESC";
212         }
213
214         my $query = $dbh->prepare(qq{
215                 SELECT a.id,a.name,a.relationship,s.members,s.score,s.size
216                 ,r.resources,r.hidden,r.planets
217                 ,(resources/planets)::bigint AS resplanet
218                 ,(hidden/planets)::bigint AS hidplanet
219                 ,(score + (resources / 300) + (hidden / 100))::bigint AS nscore
220                 ,(SELECT sum(score)::bigint FROM (
221 SELECT score + (metal+crystal+eonium)/300 + hidden/100 AS score
222 FROM current_planet_stats p
223         JOIN current_planet_scans ps ON p.id = ps.planet
224 WHERE alliance_id = r.id
225 ORDER BY score DESC
226 LIMIT 60) a
227                 ) AS nscore2
228                 ,(SELECT sum(score)::bigint FROM (
229 SELECT score + (metal+crystal+eonium)/300 + hidden/100 + (endtick()-tick())*(
230                 250*size + COALESCE(metal_ref + crystal_ref + eonium_ref,7)* 1000
231                 + CASE extraction WHEN 0 THEN 3000 WHEN 1 THEN 11500 ELSE COALESCE(extraction,3)*3000*3 END
232         )*(1.35+0.005*COALESCE(fincents,20))/100 AS score
233 FROM current_planet_stats p
234         JOIN current_planet_scans ps ON p.id = ps.planet
235         LEFT OUTER JOIN current_development_scans ds ON p.id = ds.planet
236 WHERE alliance_id = r.id
237 ORDER BY score DESC
238 LIMIT 60) a
239                 ) AS nscore3
240                 FROM (SELECT alliance_id AS id,sum(metal+crystal+eonium) AS resources
241                                 , sum(hidden) AS hidden, count(*) AS planets
242                                 FROM planets p join current_planet_scans c ON p.id = c.planet
243                                 GROUP by alliance_id
244                         ) r
245                         NATURAL JOIN alliances a
246                         LEFT OUTER JOIN (SELECT *,LEAST(members,60) AS scoremem FROM alliance_stats
247                                 WHERE tick = (SELECT max(tick) FROM alliance_stats)) s ON a.id = s.id
248                 ORDER BY $order
249                 });
250         $query->execute;
251         my @alliances;
252         while (my $alliance = $query->fetchrow_hashref){
253                 push @alliances,$alliance;
254         }
255         $c->stash(alliances => \@alliances);
256         $c->stash( comma => \&comma_value)
257 }
258
259
260 =head1 AUTHOR
261
262 Michael Andreen (harv@ruin.nu)
263
264 =head1 LICENSE
265
266 GPL 2.0, or later.
267
268 =cut
269
270 1;