1 package NDWeb::Controller::Members;
5 use parent 'Catalyst::Controller';
9 NDWeb::Controller::Members - Catalyst Controller
25 my ( $self, $c, $order ) = @_;
28 if ($order =~ /^((?:defense|attack|total|humor|scan|raid)_points)$/){
31 $order = 'total_points DESC';
34 my $limit = 'LIMIT 10';
35 $limit = '' if $c->check_user_roles(qw/members_points_nolimit/);
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});
47 while (my $member = $query->fetchrow_hashref){
48 push @members,$member;
50 $c->stash(members => \@members);
53 sub addintel : Local {
54 my ( $self, $c, $order ) = @_;
56 $c->stash(intel => $c->flash->{intel});
57 $c->stash(scans => $c->flash->{scans});
58 $c->stash(intelmessage => $c->flash->{intelmessage});
61 sub postintel : Local {
62 my ( $self, $c, $order ) = @_;
64 $c->forward('insertintel');
66 $c->res->redirect($c->uri_for('addintel'));
69 sub postintelmessage : Local {
70 my ( $self, $c, $order ) = @_;
72 unless ($c->req->param('subject')){
73 if ($c->req->param('message') =~ /(.*\w.*)/){
74 $c->req->param(subject => $1);
78 $c->forward('/forum/insertThread',[12]);
79 $c->forward('/forum/insertPost',[$c->stash->{thread}]);
80 $c->flash(intelmessage => 1);
82 $c->forward('insertintel');
84 $c->res->redirect($c->uri_for('addintel'));
87 sub insertintel : Private {
88 my ( $self, $c, $order ) = @_;
92 my $findscan = $dbh->prepare(q{SELECT scan_id FROM scans
93 WHERE scan_id = ? AND tick >= tick() - 168 AND groupscan = ?
95 my $addscan = $dbh->prepare(q{INSERT INTO scans (scan_id,tick,uid,groupscan)
98 my $addpoint = $dbh->prepare(q{UPDATE users SET scan_points = scan_points + 1
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;
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;
115 $scan{message} = 'already exists';
119 my $tick = $c->req->param('tick');
120 unless ($tick =~ /^(\d+)$/){
121 $tick = $c->stash->{game}->{tick};
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)
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);
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 $&";
141 push @intel,"Couldn't add $&: ".$dbh->errstr;
145 $c->flash(intel => \@intel);
146 $c->flash(scans => \@scans);
149 sub launchConfirmation : Local {
150 my ( $self, $c ) = @_;
152 $c->stash(missions => $c->flash->{missions});
155 sub postconfirmation : Local {
156 my ( $self, $c ) = @_;
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
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
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
173 my $informDefChannel = $dbh->prepare(q{INSERT INTO defense_missions
174 (fleet,call) VALUES (?,?)
176 my $addattackpoint = $dbh->prepare(q{UPDATE users SET
177 attack_points = attack_points + 1 WHERE uid = ?
179 my $launchedtarget = $dbh->prepare(q{UPDATE raid_claims SET launched = True
180 WHERE uid = ? AND target = ? AND wave = ?
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)
187 my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (id,ship,amount)
190 my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message) VALUES(
191 (SELECT ftid FROM users WHERE uid = $1),$1,$2)
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)
199 (?:Launching\ in\ tick\ (\d+),\ arrival\ in\ tick\ (\d+)
200 |ETA:\ \d+,\ Return\ ETA:\ (\d+)
203 next if $10 eq 'Return';
206 my $tick = $c->stash->{TICK}+$9;
207 $tick += $8 if defined $8;
213 my $back = $tick + $eta - 1;
219 $mission{tick} = $tick;
220 $mission{mission} = $mission;
221 $mission{target} = "$x:$y:$z";
222 $mission{back} = $back;
224 my ($planet_id) = $dbh->selectrow_array($findplanet,undef,$x,$y,$z,$c->stash->{TICK});
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);
238 while ($ships =~ m/((?:\w+ )*\w+)\s+\w+\s+(?:(?:\w+|-)\s+){3}(?:Steal|Normal|Emp|Normal\s+Cloaked|Pod|Structure Killer)\s+(\d+)/g){
240 push @ships,{ship => $1, amount => $2};
242 $mission{ships} = \@ships;
245 warn "No ships in: $ships";
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});
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}";
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");
267 }elsif ($mission eq 'Defend'){
268 my $call = $findtarget->fetchrow_hashref;
269 $informDefChannel->execute($fleet,$call->{id});
272 $log->execute($c->user->id,"Pasted confirmation for $mission mission to $x:$y:$z, landing tick $tick");
273 push @missions,\%mission;
276 $c->flash(missions => \@missions);
283 $c->res->redirect($c->uri_for('launchConfirmation'));
288 Michael Andreen (harv@ruin.nu)