1 package NDWeb::Controller::JSRPC;
5 use parent 'Catalyst::Controller';
7 use DateTime::TimeZone;
11 NDWeb::Controller::JSRPC - Catalyst Controller
26 sub index :Path :Args(0) {
27 my ( $self, $c ) = @_;
29 $c->response->body('Matched NDWeb::Controller::JSRPC in JSRPC.');
33 my ($self, $c, $raid, $from, $target) = @_;
36 $c->forward('/raids/findRaid');
37 $raid = $c->stash->{raid};
41 my ($timestamp) = $dbh->selectrow_array(q{SELECT MAX(modified)::timestamp AS modified
42 FROM raid_targets WHERE raid = $1},undef,$raid->{id});
43 $c->stash(timestamp => $timestamp);
44 $targets = $dbh->prepare(q{SELECT r.id,r.pid FROM raid_targets r
45 WHERE r.raid = ? AND modified > ?
47 $targets->execute($raid->{id},$from);
49 $targets = $dbh->prepare(q{SELECT r.id,r.pid FROM raid_targets r
50 WHERE r.raid = $1 AND r.id = $2
52 $targets->execute($raid->{id},$target);
55 my $claims = $dbh->prepare(qq{ SELECT username,joinable,launched FROM raid_claims
56 NATURAL JOIN users WHERE target = ? AND wave = ?});
58 while (my $target = $targets->fetchrow_hashref){
60 $target{id} = $target->{id};
62 for (my $i = 1; $i <= $raid->{waves}; $i++){
65 $claims->execute($target->{id},$i);
68 if ($claims->rows != 0){
71 while (my $claim = $claims->fetchrow_hashref){
72 $owner = 1 if ($c->user->username eq $claim->{username});
73 $joinable = 1 if ($claim->{joinable});
74 $claim->{username} .= '*' if ($claim->{launched});
75 push @claimers,$claim->{username};
77 $claimers = join '/', @claimers;
79 $wave{command} = 'unclaim';
81 $wave{command} = 'join';
83 $wave{command} = 'taken';
86 $wave{command} = 'claim';
88 $wave{claimers} = $claimers;
89 $wave{joinable} = $joinable;
92 $target{waves} = \@waves;
93 push @targets,\%target;
95 $c->stash(targets => \@targets);
100 my ($self, $c, $raid, $from, $target, $wave) = @_;
104 $c->forward('assertTarget');
106 my $claims = $dbh->prepare(qq{SELECT username FROM raid_claims
107 NATURAL JOIN users WHERE target = ? AND wave = ?
109 $claims->execute($target,$wave);
110 if ($claims->rows == 0){
111 my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave) VALUES(?,?,?)});
112 $query->execute($target,$c->user->id,$wave);
113 $c->forward('/raids/log',[$raid, "Claimed target $target wave $wave"]);
114 $c->forward('/listTargets');
118 $c->stash(template => 'jsrpc/update.tt2');
119 $c->forward('update');
124 my ($self, $c, $raid, $from, $target, $wave) = @_;
128 $c->forward('assertTarget');
130 my $claims = $dbh->prepare(q{SELECT username FROM raid_claims
131 NATURAL JOIN users WHERE target = ? AND wave = ? AND joinable = TRUE
133 $claims->execute($target,$wave);
134 if ($claims->rows != 0){
135 my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave,joinable)
138 $query->execute($target,$c->user->id,$wave);
139 $c->forward('/raids/log',[$raid, "Joined target $target wave $wave"]);
140 $c->forward('/listTargets');
144 $c->stash(template => 'jsrpc/update.tt2');
145 $c->forward('update');
148 sub unclaim : Local {
149 my ($self, $c, $raid, $from, $target, $wave) = @_;
153 my $query = $dbh->prepare(q{DELETE FROM raid_claims WHERE target = ?
154 AND uid = ? AND wave = ?
156 $query->execute($target,$c->user->id,$wave);
157 $c->forward('/raids/log',[$raid, "Unclaimed target $target wave $wave"]);
160 $c->stash(template => 'jsrpc/update.tt2');
161 $c->forward('/listTargets');
162 $c->forward('update');
165 sub joinable : Local {
166 my ($self, $c, $raid, $from, $target, $wave,$joinable) = @_;
169 my $claims = $dbh->prepare(q{SELECT username FROM raid_claims NATURAL JOIN users
170 WHERE target = ? AND wave = ? AND uid = ?
172 $claims->execute($target,$wave,$c->user->id);
173 if ($claims->rows != 0){
174 my $query = $dbh->prepare(q{UPDATE raid_claims SET joinable = NOT ?
175 WHERE target = ? AND wave = ?
177 $query->execute($joinable,$target,$wave);
180 $c->stash(template => 'jsrpc/update.tt2');
181 $c->forward('/listTargets');
182 $c->forward('update');
185 sub listTargets : Local {
188 $c->stash(template => 'jsrpc/update.tt2');
189 $c->forward('/listTargets');
192 sub tzcountries : Local {
193 my ($self, $c, $cat) = @_;
195 my @countries = DateTime::TimeZone->names_in_category($cat);
196 $c->stash(tzcountries => \@countries);
199 sub access_denied : Private {
201 $c->stash(template => 'jsrpc/access_denied.tt2');
202 $c->res->status(403);
205 sub assertTarget : Private {
206 my ($self, $c, $raid, $from, $target, $wave) = @_;
209 my $findtarget = $dbh->prepare(q{SELECT rt.id FROM raid_targets rt
210 NATURAL JOIN raid_access ra NATURAL JOIN groupmembers
211 WHERE uid = ? AND id = ?
215 my $result = $dbh->selectrow_array($findtarget,undef,$c->user->id,$target);
216 if ($result != $target){
222 sub end : ActionClass('RenderView') {
224 $c->res->content_type('application/xml');
226 if (scalar @{ $c->error } ){
227 if ($c->error->[0] =~ m/Can't call method "id" on an undefined value at/){
228 $c->stash->{template} = 'jsrpc/access_denied.tt2';
229 $c->res->status(403);
231 }elsif ($c->error->[0] =~ m/Missing roles: /){
232 $c->stash->{template} = 'jsrpc/access_denied.tt2';
233 $c->res->status(403);
241 Michael Andreen (harv@ruin.nu)