]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Members.pm
Converted launch confirmation
[ndwebbie.git] / lib / NDWeb / Controller / Members.pm
1 package NDWeb::Controller::Members;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 =head1 NAME
8
9 NDWeb::Controller::Members - 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 points : Local {
25         my ( $self, $c, $order ) = @_;
26         my $dbh = $c->model;
27
28         if ($order =~ /^((?:defense|attack|total|humor|scan|raid)_points)$/){
29                 $order = "$1 DESC";
30         }else{
31                 $order = 'total_points DESC';
32         }
33
34         my $limit = 'LIMIT 10';
35         $limit = '' if $c->check_user_roles(qw/members_points_nolimit/);
36
37         my $query = $dbh->prepare(qq{SELECT username,defense_points,attack_points
38                 ,scan_points,humor_points
39                 ,(attack_points+defense_points+scan_points/20) as total_points
40                 , count(NULLIF(rc.launched,FALSE)) AS raid_points
41                 FROM users u LEFT OUTER JOIN raid_claims rc USING (uid)
42                 WHERE uid IN (SELECT uid FROM groupmembers WHERE gid = 2)
43                 GROUP BY username,defense_points,attack_points,scan_points,humor_points,rank
44                 ORDER BY $order $limit});
45         $query->execute;
46         my @members;
47         while (my $member = $query->fetchrow_hashref){
48                 push @members,$member;
49         }
50         $c->stash(members => \@members);
51 }
52
53 sub addintel : Local {
54         my ( $self, $c, $order ) = @_;
55
56         $c->stash(intel => $c->flash->{intel});
57         $c->stash(scans => $c->flash->{scans});
58         $c->stash(intelmessage => $c->flash->{intelmessage});
59 }
60
61 sub postintel : Local {
62         my ( $self, $c, $order ) = @_;
63
64         $c->forward('insertintel');
65
66         $c->res->redirect($c->uri_for('addintel'));
67 }
68
69 sub postintelmessage : Local {
70         my ( $self, $c, $order ) = @_;
71
72         unless ($c->req->param('subject')){
73                 if ($c->req->param('message') =~ /(.*\w.*)/){
74                         $c->req->param(subject => $1);
75                 }
76         }
77
78         $c->forward('/forum/insertThread',[12]);
79         $c->forward('/forum/insertPost',[$c->stash->{thread}]);
80         $c->flash(intelmessage => 1);
81
82         $c->forward('insertintel');
83
84         $c->res->redirect($c->uri_for('addintel'));
85 }
86
87 sub insertintel : Private {
88         my ( $self, $c, $order ) = @_;
89         my $dbh = $c->model;
90
91         $dbh->begin_work;
92         my $findscan = $dbh->prepare(q{SELECT scan_id FROM scans
93                 WHERE scan_id = ? AND tick >= tick() - 168 AND groupscan = ?
94                 });
95         my $addscan = $dbh->prepare(q{INSERT INTO scans (scan_id,tick,uid,groupscan)
96                 VALUES (?,tick(),?,?)
97                 });
98         my $addpoint = $dbh->prepare(q{UPDATE users SET scan_points = scan_points + 1
99                 WHERE uid = ?
100                 });
101         my @scans;
102         my $intel = $c->req->param('message');
103         while ($intel =~ m{http://[\w.]+/.+?scan(_id|_grp)?=(\d+)}g){
104                 my $groupscan = (defined $1 && $1 eq '_grp') || 0;
105                 my %scan;
106                 $scan{id} = $2;
107                 $scan{group} = $groupscan;
108                 $findscan->execute($2,$groupscan);
109                 if ($findscan->rows == 0){
110                         if ($addscan->execute($2,$c->user->id,$groupscan)){
111                                 $addpoint->execute($c->user->id) unless $groupscan;
112                                 $scan{added} = 1;
113                         }
114                 }else{
115                         $scan{message} = 'already exists';
116                 }
117                 push @scans,\%scan;
118         }
119         my $tick = $c->req->param('tick');
120         unless ($tick =~ /^(\d+)$/){
121                 $tick = $c->stash->{game}->{tick};
122         }
123         my $addintel = $dbh->prepare(q{INSERT INTO fleets 
124                 (name,mission,tick,target,sender,eta,amount,ingal,back,uid)
125                 VALUES($1,$2,$3,planetid($4,$5,$6,$10),planetid($7,$8,$9,$10)
126                         ,$11,$12,$13,$14,$15)
127         });
128         my @intel;
129         while ($intel =~ m/(\d+):(\d+):(\d+)\*?\s+(\d+):(\d+):(\d+)
130                 \*?\s+(.+)(?:Ter|Cat|Xan|Zik|Etd)?
131                 \s+(\d+)\s+(Attack|Defend)\s+(\d+)/gx){
132                 my $ingal = ($1 == $4 && $2 == $5) || 0;
133                 my $lt = $tick + $10;
134                 my $back = ($ingal ? $lt + 4 : undef);
135                 eval {
136                         $addintel->execute($7,$9,$lt,$1,$2,$3,$4,$5,$6,$tick,$10,$8
137                                 ,$ingal,$back, $c->user->id);
138                         push @intel,"Added $&";
139                 };
140                 if ($@){
141                         push @intel,"Couldn't add $&: ".$dbh->errstr;
142                 }
143         }
144         $dbh->commit;
145         $c->flash(intel => \@intel);
146         $c->flash(scans => \@scans);
147 }
148
149 sub launchConfirmation : Local {
150         my ( $self, $c ) = @_;
151
152         $c->stash(missions => $c->flash->{missions});
153 }
154
155 sub postconfirmation : Local {
156         my ( $self, $c ) = @_;
157         my $dbh = $c->model;
158
159         eval {
160                 my $missions = $c->req->param('mission');
161                 my $findplanet = $dbh->prepare("SELECT planetid(?,?,?,?)");
162                 my $findattacktarget = $dbh->prepare(q{SELECT c.target,c.wave,c.launched
163                         FROM  raid_claims c
164                                 JOIN raid_targets t ON c.target = t.id
165                                 JOIN raids r ON t.raid = r.id
166                         WHERE c.uid = ? AND r.tick+c.wave-1 = ? AND t.planet = ?
167                                 AND r.open AND not r.removed
168                         });
169                 my $finddefensetarget = $dbh->prepare(q{SELECT c.id FROM calls c
170                                 JOIN users u ON c.member = u.uid
171                         WHERE u.planet = $1 AND c.landing_tick = $2
172                 });
173                 my $informDefChannel = $dbh->prepare(q{INSERT INTO defense_missions
174                         (fleet,call) VALUES (?,?)
175                         });
176                 my $addattackpoint = $dbh->prepare(q{UPDATE users SET
177                         attack_points = attack_points + 1 WHERE uid = ?
178                         });
179                 my $launchedtarget = $dbh->prepare(q{UPDATE raid_claims SET launched = True
180                         WHERE uid = ? AND target = ? AND wave = ?
181                         });
182                 my $addfleet = $dbh->prepare(q{INSERT INTO fleets
183                         (uid,name,mission,sender,target,tick,eta,back,amount)
184                         VALUES ($1,$2,$3,(SELECT planet FROM users WHERE uid = $1),$4,$5,$6,$7,$8)
185                         RETURNING id
186                         });
187                 my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (id,ship,amount)
188                         VALUES (?,?,?)
189                         });
190                 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
191                         (SELECT ftid FROM users WHERE uid = $1),$1,$2)
192                         });
193                 my @missions;
194                 $dbh->begin_work;
195                 while ($missions =~ m/([^\n]+)\s+(\d+):(\d+):(\d+)\s+(\d+):(\d+):(\d+)
196                         \s+\((?:(\d+)\+)?(\d+)\).*?(?:\d+hrs\s+)?\d+mins?\s+
197                         (Attack|Defend|Return|Fake\ Attack|Fake\ Defend)
198                         (.*?)
199                         (?:Launching\ in\ tick\ (\d+),\ arrival\ in\ tick\ (\d+)
200                                 |ETA:\ \d+,\ Return\ ETA:\ (\d+)
201                                 |Return\ ETA:\ (\d+)
202                                 )/sgx){
203                         next if $10 eq 'Return';
204                         my %mission;
205                         my $name = $1;
206                         my $tick = $c->stash->{TICK}+$9;
207                         $tick += $8 if defined $8;
208                         my $eta = $9;
209                         my $mission = $10;
210                         my $x = $5;
211                         my $y = $6;
212                         my $z = $7;
213                         my $back = $tick + $eta - 1;
214                         if ($13){
215                                 $tick = $13;
216                         }elsif ($14){
217                                 $back += $14;
218                         }
219                         $mission{tick} = $tick;
220                         $mission{mission} = $mission;
221                         $mission{target} = "$x:$y:$z";
222                         $mission{back} = $back;
223
224                         my ($planet_id) = $dbh->selectrow_array($findplanet,undef,$x,$y,$z,$c->stash->{TICK});
225
226                         my $findtarget = $finddefensetarget;
227                         if ($mission eq 'Attack'){
228                                 $findtarget = $findattacktarget;
229                                 $findtarget->execute($c->user->id,$tick,$planet_id);
230                         }elsif ($mission eq 'Defend'){
231                                 $findtarget = $finddefensetarget;
232                                 $findtarget->execute($planet_id,$tick);
233                         }
234
235                         my $ships = $11;
236                         my @ships;
237                         my $amount = 0;
238                         while ($ships =~ m/((?:\w+ )*\w+)\s+\w+\s+(?:(?:\w+|-)\s+){3}(?:Steal|Normal|Emp|Normal\s+Cloaked|Pod|Structure Killer)\s+(\d+)/g){
239                                 $amount += $2;
240                                 push @ships,{ship => $1, amount => $2};
241                         }
242                         $mission{ships} = \@ships;
243
244                         if ($amount == 0){
245                                 warn "No ships in: $ships";
246                                 next;
247                         }
248                         my $fleet = $dbh->selectrow_array($addfleet,undef,$c->user->id,$name,$mission
249                                 ,$planet_id,$tick,$eta,$back,$amount);
250                         $mission{fleet} = $fleet;
251                         for my $ship (@ships){
252                                 $addships->execute($fleet,$ship->{ship},$ship->{amount});
253                         }
254
255                         if ($findtarget->rows == 0){
256                                 $mission{warning} = 'No matching target!';
257                         }elsif ($mission eq 'Attack'){
258                                 my $claim = $findtarget->fetchrow_hashref;
259                                 if ($claim->{launched}){
260                                         $mission{warning} = "Already launched on this target:$claim->{target},$claim->{wave},$claim->{launched}";
261                                 }else{
262                                         $addattackpoint->execute($c->user->id);
263                                         $launchedtarget->execute($c->user->id,$claim->{target},$claim->{wave});
264                                         $mission{warning} = "OK:$claim->{target},$claim->{wave},$claim->{launched}";
265                                         $log->execute($c->user->id,"Gave attack point for confirmation on $mission mission to $x:$y:$z, landing tick $tick");
266                                 }
267                         }elsif ($mission eq 'Defend'){
268                                 my $call = $findtarget->fetchrow_hashref;
269                                 $informDefChannel->execute($fleet,$call->{id});
270                         }
271
272                         $log->execute($c->user->id,"Pasted confirmation for $mission mission to $x:$y:$z, landing tick $tick");
273                         push @missions,\%mission;
274                 }
275                 $dbh->commit;
276                 $c->flash(missions => \@missions);
277         };
278         if ($@){
279                 $dbh->rollback;
280                 die $@;
281         }
282
283         $c->res->redirect($c->uri_for('launchConfirmation'));
284 }
285
286 =head1 AUTHOR
287
288 Michael Andreen (harv@ruin.nu)
289
290 =head1 LICENSE
291
292 GPL 2.0, or later.
293
294 =cut
295
296 1;