1 package NDWeb::Controller::JSRPC;
5 use parent 'Catalyst::Controller';
9 NDWeb::Controller::JSRPC - Catalyst Controller
24 sub index :Path :Args(0) {
25 my ( $self, $c ) = @_;
27 $c->response->body('Matched NDWeb::Controller::JSRPC in JSRPC.');
31 my ($self, $c, $raid, $from, $target) = @_;
34 $c->forward('/raids/findRaid');
35 $raid = $c->stash->{raid};
39 my ($timestamp) = $dbh->selectrow_array("SELECT MAX(modified)::timestamp AS modified FROM raid_targets");
40 $c->stash(timestamp => $timestamp);
41 $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r
42 WHERE r.raid = ? AND modified > ?
44 $targets->execute($raid->{id},$from);
46 $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r
47 WHERE r.raid = $1 AND r.id = $2
49 $targets->execute($raid->{id},$target);
52 my $claims = $dbh->prepare(qq{ SELECT username,joinable,launched FROM raid_claims
53 NATURAL JOIN users WHERE target = ? AND wave = ?});
55 while (my $target = $targets->fetchrow_hashref){
57 $target{id} = $target->{id};
59 for (my $i = 1; $i <= $raid->{waves}; $i++){
62 $claims->execute($target->{id},$i);
65 if ($claims->rows != 0){
68 while (my $claim = $claims->fetchrow_hashref){
69 $owner = 1 if ($c->user->username eq $claim->{username});
70 $joinable = 1 if ($claim->{joinable});
71 $claim->{username} .= '*' if ($claim->{launched});
72 push @claimers,$claim->{username};
74 $claimers = join '/', @claimers;
76 $wave{command} = 'unclaim';
78 $wave{command} = 'join';
80 $wave{command} = 'taken';
83 $wave{command} = 'claim';
85 $wave{claimers} = $claimers;
86 $wave{joinable} = $joinable;
89 $target{waves} = \@waves;
90 push @targets,\%target;
92 $c->stash(targets => \@targets);
97 my ($self, $c, $raid, $from, $target, $wave) = @_;
101 $c->forward('assertTarget');
103 my $claims = $dbh->prepare(qq{SELECT username FROM raid_claims
104 NATURAL JOIN users WHERE target = ? AND wave = ?
106 $claims->execute($target,$wave);
107 if ($claims->rows == 0){
108 my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave) VALUES(?,?,?)});
109 $query->execute($target,$c->user->id,$wave);
110 $c->forward('/raids/log',[$raid, "Claimed target $target wave $wave"]);
111 $c->forward('/listTargets');
115 $c->stash(template => 'jsrpc/update.tt2');
116 $c->forward('update');
121 my ($self, $c, $raid, $from, $target, $wave) = @_;
125 $c->forward('assertTarget');
127 my $claims = $dbh->prepare(q{SELECT username FROM raid_claims
128 NATURAL JOIN users WHERE target = ? AND wave = ? AND joinable = TRUE
130 $claims->execute($target,$wave);
131 if ($claims->rows != 0){
132 my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave,joinable)
135 $query->execute($target,$c->user->id,$wave);
136 $c->forward('/raids/log',[$raid, "Joined target $target wave $wave"]);
137 $c->forward('/listTargets');
141 $c->stash(template => 'jsrpc/update.tt2');
142 $c->forward('update');
145 sub unclaim : Local {
146 my ($self, $c, $raid, $from, $target, $wave) = @_;
150 my $query = $dbh->prepare(q{DELETE FROM raid_claims WHERE target = ?
151 AND uid = ? AND wave = ?
153 $query->execute($target,$c->user->id,$wave);
154 $c->forward('/raids/log',[$raid, "Unclaimed target $target wave $wave"]);
157 $c->stash(template => 'jsrpc/update.tt2');
158 $c->forward('/listTargets');
159 $c->forward('update');
162 sub joinable : Local {
163 my ($self, $c, $raid, $from, $target, $wave,$joinable) = @_;
166 my $claims = $dbh->prepare(q{SELECT username FROM raid_claims NATURAL JOIN users
167 WHERE target = ? AND wave = ? AND uid = ?
169 $claims->execute($target,$wave,$c->user->id);
170 if ($claims->rows != 0){
171 my $query = $dbh->prepare(q{UPDATE raid_claims SET joinable = NOT ?
172 WHERE target = ? AND wave = ?
174 $query->execute($joinable,$target,$wave);
175 $c->forward('/listTargets');
178 $c->stash(template => 'jsrpc/update.tt2');
179 $c->forward('/listTargets');
180 $c->forward('update');
183 sub listTargets : Local {
186 $c->stash(template => 'jsrpc/update.tt2');
187 $c->forward('/listTargets');
190 sub access_denied : Local {
193 $c->stash(template => 'jsrcp/access_denied.tt2');
196 sub assertTarget : Private {
197 my ($self, $c, $raid, $from, $target, $wave) = @_;
200 my $findtarget = $dbh->prepare(q{SELECT rt.id FROM raid_targets rt
201 NATURAL JOIN raid_access ra NATURAL JOIN groupmembers
202 WHERE uid = ? AND id = ?
206 my $result = $dbh->selectrow_array($findtarget,undef,$c->user->id,$target);
207 if ($result != $target){
213 sub end : ActionClass('RenderView') {
215 $c->res->content_type('application/xml');
217 if (scalar @{ $c->error } ){
218 if ($c->error->[0] =~ m/Can't call method "id" on an undefined value at/){
219 $c->stash->{template} = 'jsrpc/access_denied.tt2';
221 }elsif ($c->error->[0] =~ m/Missing roles: /){
222 $c->stash->{template} = 'jsrpc/access_denied.tt2';
230 Michael Andreen (harv@ruin.nu)