]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/JSRPC.pm
Converted raids page
[ndwebbie.git] / lib / NDWeb / Controller / JSRPC.pm
1 package NDWeb::Controller::JSRPC;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 =head1 NAME
8
9 NDWeb::Controller::JSRPC - 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 index :Path :Args(0) {
25         my ( $self, $c ) = @_;
26
27         $c->response->body('Matched NDWeb::Controller::JSRPC in JSRPC.');
28 }
29
30 sub update : Local {
31         my ($self, $c, $raid, $from, $target) = @_;
32         my $dbh = $c->model;
33
34         $c->forward('/raids/findRaid');
35         $raid = $c->stash->{raid};
36
37         my $targets;;
38         if ($from){
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 > ?
43                 });
44                 $targets->execute($raid->{id},$from);
45         }elsif($target){
46                 $targets = $dbh->prepare(q{SELECT r.id,r.planet FROM raid_targets r
47                         WHERE r.raid = $1 AND r.id = $2
48                 });
49                 $targets->execute($raid->{id},$target);
50         }
51
52         my $claims =  $dbh->prepare(qq{ SELECT username,joinable,launched FROM raid_claims
53                 NATURAL JOIN users WHERE target = ? AND wave = ?});
54         my @targets;
55         while (my $target = $targets->fetchrow_hashref){
56                 my %target;
57                 $target{id} = $target->{id};
58                 my @waves;
59                 for (my $i = 1; $i <= $raid->{waves}; $i++){
60                         my %wave;
61                         $wave{id} = $i;
62                         $claims->execute($target->{id},$i);
63                         my $joinable = 0;
64                         my $claimers;
65                         if ($claims->rows != 0){
66                                 my $owner = 0;
67                                 my @claimers;
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};
73                                 }
74                                 $claimers = join '/', @claimers;
75                                 if ($owner){
76                                         $wave{command} = 'unclaim';
77                                 }elsif ($joinable){
78                                         $wave{command} = 'join';
79                                 }else{
80                                         $wave{command} = 'taken';
81                                 }
82                         }else{
83                                 $wave{command} = 'claim';
84                         }
85                         $wave{claimers} = $claimers;
86                         $wave{joinable} = $joinable;
87                         push @waves,\%wave;
88                 }
89                 $target{waves} = \@waves;
90                 push @targets,\%target;
91         }
92         $c->stash(targets => \@targets);
93
94 }
95
96 sub claim : Local {
97         my ($self, $c, $raid, $from, $target, $wave) = @_;
98         my $dbh = $c->model;
99
100         $dbh->begin_work;
101         $c->forward('assertTarget');
102
103         my $claims = $dbh->prepare(qq{SELECT username FROM raid_claims
104                 NATURAL JOIN users WHERE target = ? AND wave = ?
105                 });
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');
112         }
113         $dbh->commit;
114
115         $c->stash(template => 'jsrpc/update.tt2');
116         $c->forward('update');
117 }
118
119
120 sub join : Local {
121         my ($self, $c, $raid, $from, $target, $wave) = @_;
122         my $dbh = $c->model;
123
124         $dbh->begin_work;
125         $c->forward('assertTarget');
126
127         my $claims = $dbh->prepare(q{SELECT username FROM raid_claims
128                 NATURAL JOIN users WHERE target = ? AND wave = ? AND joinable = TRUE
129                 });
130         $claims->execute($target,$wave);
131         if ($claims->rows != 0){
132                 my $query = $dbh->prepare(q{INSERT INTO raid_claims (target,uid,wave,joinable)
133                         VALUES(?,?,?,TRUE)
134                 });
135                 $query->execute($target,$c->user->id,$wave);
136                 $c->forward('/raids/log',[$raid, "Joined target $target wave $wave"]);
137                 $c->forward('/listTargets');
138         }
139         $dbh->commit;
140
141         $c->stash(template => 'jsrpc/update.tt2');
142         $c->forward('update');
143 }
144
145 sub unclaim : Local {
146         my ($self, $c, $raid, $from, $target, $wave) = @_;
147         my $dbh = $c->model;
148
149         $dbh->begin_work;
150         my $query = $dbh->prepare(q{DELETE FROM raid_claims WHERE target = ?
151                 AND uid = ? AND wave = ?
152                 });
153         $query->execute($target,$c->user->id,$wave);
154         $c->forward('/raids/log',[$raid, "Unclaimed target $target wave $wave"]);
155         $dbh->commit;
156
157         $c->stash(template => 'jsrpc/update.tt2');
158         $c->forward('/listTargets');
159         $c->forward('update');
160 }
161
162 sub joinable : Local {
163         my ($self, $c, $raid, $from, $target, $wave,$joinable) = @_;
164         my $dbh = $c->model;
165
166         my $claims = $dbh->prepare(q{SELECT username FROM raid_claims NATURAL JOIN users
167                 WHERE target = ? AND wave = ? AND uid = ?
168                 });
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 = ?
173                 });
174                 $query->execute($joinable,$target,$wave);
175                 $c->forward('/listTargets');
176         }
177
178         $c->stash(template => 'jsrpc/update.tt2');
179         $c->forward('/listTargets');
180         $c->forward('update');
181 }
182
183 sub listTargets : Local {
184         my ($self, $c) = @_;
185
186         $c->stash(template => 'jsrpc/update.tt2');
187         $c->forward('/listTargets');
188 }
189
190 sub assertTarget : Private {
191         my ($self, $c, $raid, $from, $target, $wave) = @_;
192         my $dbh = $c->model;
193
194         my $findtarget = $dbh->prepare(q{SELECT rt.id FROM raid_targets rt
195                 NATURAL JOIN raid_access ra NATURAL JOIN groupmembers
196                 WHERE uid = ? AND id = ?
197                 FOR UPDATE
198         });
199
200         my $result = $dbh->selectrow_array($findtarget,undef,$c->user->id,$target);
201         if ($result != $target){
202                 $dbh->rollback;
203                 die 'Access denied';
204         }
205 }
206
207 sub end : ActionClass('RenderView') {
208         my ($self,$c) = @_;
209         $c->res->content_type('application/xml');
210 }
211
212 =head1 AUTHOR
213
214 Michael Andreen (harv@ruin.nu)
215
216 =head1 LICENSE
217
218 GPL 2.0, or later
219
220 =cut
221
222 1;