]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Root.pm
Ignore accidental calls to smsconfirm
[ndwebbie.git] / lib / NDWeb / Controller / Root.pm
1 package NDWeb::Controller::Root;
2
3 use strict;
4 use warnings;
5 use parent 'Catalyst::Controller';
6
7 use ND::Include;
8 use Geo::IP;
9
10
11 #
12 # Sets the actions in this controller to be registered with no prefix
13 # so they function identically to actions created in MyApp.pm
14 #
15 __PACKAGE__->config->{namespace} = '';
16
17 =head1 NAME
18
19 NDWeb::Controller::Root - Root Controller for NDWeb
20
21 =head1 DESCRIPTION
22
23 [enter your description here]
24
25 =head1 METHODS
26
27 =cut
28
29 =head2 default
30
31 =cut
32
33 sub index : Local Path Args(0) {
34         my ( $self, $c ) = @_;
35
36         $c->visit('/wiki/main');
37 }
38
39 sub default : Path {
40         my ( $self, $c ) = @_;
41         $c->stash(template => 'default.tt2');
42         $c->response->status(410);
43 }
44
45 sub login : Local {
46         my ($self, $c) = @_;
47
48         if ($c->login){
49                 my $gi = Geo::IP->new("/usr/share/GeoIP/GeoIP.dat");
50                 my $country = $gi->country_code_by_addr($c->req->address) || '??';
51
52                 my $remember = 0;
53                 if ($c->req->param('remember')){
54                         $c->session_time_to_live( 604800 ); # expire in one week.
55                         $remember = 1;
56                 }
57                 my $log = $c->model->prepare(q{INSERT INTO session_log
58                         (uid,time,ip,country,session,remember)
59                         VALUES ($1,NOW(),$2,$3,$4,$5)
60                 });
61                 $log->execute($c->user->id,$c->req->address
62                         ,$country,$c->sessionid,$remember);
63
64                 $c->forward('redirect');
65                 return;
66         } elsif ($c->req->method eq 'POST'){
67                 $c->res->status(400);
68         }
69 }
70
71 sub logout : Local {
72         my ($self, $c) = @_;
73         $c->logout;
74         $c->delete_session("logout");
75         $c->res->redirect($c->uri_for('index'));
76 }
77
78 my %clickatellstatus = (
79         "001", "Message unknown. The delivering network did not recognise the message type or content.",
80         "002", "Message queued. The message could not be delivered and has been queued for attempted redelivery.",
81         "003", "Delivered. Delivered to the network or gateway (delivered to the recipient).",
82         "004", "Received by recipient. Confirmation of receipt on the handset of the recipient.",
83         "005", "Error with message. There was an error with the message, probably caused by the content of the message itself.",
84         "006", "User cancelled message delivery. Client cancelled the message by setting the validity period, or the message was terminated by an internal mechanism.",
85         "007", "Error delivering message An error occurred delivering the message to the handset.",
86         "008", " OK. Message received by gateway.",
87         "009", "Routing error. The routing gateway or network has had an error routing the message.",
88         "010", "Message expired. Message has expired at the network due to the handset being off, or out of reach.",
89         "011", "Message queued for later delivery. Message has been queued at the Clickatell gateway for delivery at a later time (delayed delivery).",
90         "012", "Out of credit. The message cannot be delivered due to a lack of funds in your account. Please re-purchase credits."
91 );
92
93
94 sub smsconfirm : Local {
95         my ($self, $c) = @_;
96         my $dbh = $c->model;
97
98         return unless $c->req->param('apiMsgId');
99
100         my $sms = $dbh->prepare(q{
101 UPDATE sms SET status = $2, cost = $3
102         ,time = TIMESTAMP WITH TIME ZONE 'epoch' + $4 * INTERVAL '1 second'
103 WHERE msgid = $1
104                 });
105
106         $sms->execute($c->req->param('apiMsgId')
107                 ,$clickatellstatus{$c->req->param('status')}
108                 ,$c->req->param('charge')
109                 ,$c->req->param('timestamp'));
110
111         $c->stash(template => 'default.tt2');
112 }
113
114
115 sub begin : Private {
116         my ($self, $c) = @_;
117
118          $c->res->header( 'Cache-Control' =>
119                 'no-store, no-cache, must-revalidate,'.
120                 'post-check=0, pre-check=0, max-age=0'
121         );
122         $c->res->header( 'Pragma' => 'no-cache' );
123         $c->res->header( 'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT' );
124 }
125
126 sub listTargets : Private {
127         my ($self, $c) = @_;
128
129         my $dbh = $c ->model;
130
131         my $query = $dbh->prepare(q{SELECT t.id, r.id AS raid, r.tick+c.wave-1 AS landingtick, 
132                 (released_coords AND old_claim(timestamp)) AS released_coords, coords(x,y,z),c.launched,c.wave,c.joinable
133 FROM raid_claims c
134         JOIN raid_targets t ON c.target = t.id
135         JOIN raids r ON t.raid = r.id
136         JOIN current_planet_stats p USING (pid)
137 WHERE c.uid = $1 AND r.tick+c.wave > tick() AND r.open AND not r.removed
138 ORDER BY r.tick+c.wave,x,y,z});
139         $query->execute($c->user->id) or die $dbh->errstr;
140         my @targets;
141         while (my $target = $query->fetchrow_hashref){
142                 push @targets, $target;
143         }
144
145         $c->stash(claimedtargets => \@targets);
146 }
147
148 sub listAlliances : Private {
149         my ($self, $c) = @_;
150         my @alliances;
151         push @alliances,{aid => '', alliance => ''};
152         my $query = $c->model->prepare(q{SELECT aid,alliance FROM alliances ORDER BY LOWER(alliance)});
153         $query->execute;
154         while (my $ally = $query->fetchrow_hashref){
155                 push @alliances,$ally;
156         }
157         $c->stash(alliances => \@alliances);
158 }
159
160 sub sslurl {
161         return $_[0];
162 }
163
164 sub auto : Private {
165         my ($self, $c) = @_;
166         my $dbh = $c ->model;
167
168         $c->stash(dbh => $dbh);
169
170         $c->stash(sslurl => \&sslurl);
171
172         $dbh->do(q{SET timezone = 'GMT'});
173
174         $c->stash(TICK =>$dbh->selectrow_array('SELECT tick()',undef));
175         $c->stash(STICK =>$dbh->selectrow_array('SELECT max(tick) FROM planet_stats',undef));
176         $c->stash->{game}->{tick} = $c->stash->{TICK};
177
178         if ($c->user_exists){
179                 $c->stash(UID => $c->user->id);
180         }else{
181                 $c->stash(UID => -4);
182         }
183 }
184
185 sub redirect : Private {
186         my ($self, $c) = @_;
187         $c->res->redirect($c->uri_for('/'.$c->session->{referrer}));
188 }
189
190 sub access_denied : Private {
191         my ($self, $c, $action) = @_;
192
193         $c->stash->{template} = 'access_denied.tt2';
194         $c->res->status(403);
195
196 }
197
198 =head2 end
199
200 Attempt to render a view, if needed.
201
202 =cut 
203
204 sub end : ActionClass('RenderView') {
205         my ($self, $c) = @_;
206
207         if ($c->res->status >= 300 && $c->res->status <= 400 ){
208                 return;
209         }
210
211         my $dbh = $c ->model;
212
213         if (scalar @{ $c->error } ){
214                 if ($c->error->[0] =~ m/Can't call method "id" on an undefined value at/){
215                         $c->stash->{template} = 'access_denied.tt2';
216                         $c->res->status(403);
217                         $c->clear_errors;
218                 }elsif ($c->error->[0] =~ m/Missing roles: /){
219                         $c->stash->{template} = 'access_denied.tt2';
220                         $c->res->status(403);
221                         $c->clear_errors;
222                 }
223         }
224
225         if ($c->user_exists){
226                 my $fleetupdate = 0;
227                 if ($c->check_user_roles(qw/member_menu/)){
228                         $fleetupdate = $dbh->selectrow_array(q{
229 SELECT tick FROM fleets WHERE pid = ? AND tick > tick() - 24
230 AND mission = 'Full fleet' AND name IN ('Main','Advanced Unit');
231                                 },undef,$c->user->planet);
232                         $fleetupdate = 0 unless defined $fleetupdate;
233                 }
234
235                 my ($unread,$newposts) = $dbh->selectrow_array(q{SELECT * FROM unread_posts($1)}
236                         ,undef,$c->user->id);
237
238                 $c->stash(user => {
239                         id => $c->user->id,
240                         name => $c->user->username,
241                         css => $c->user->css,
242                         newposts => $newposts,
243                         unreadposts => $unread
244                 });
245                 $c->stash->{user}->{attacker} = $c->check_user_roles(qw/attack_menu/)
246                         && (!$c->check_user_roles(qw/member_menu/)
247                                 || ($c->user->planet && (($c->stash->{TICK} - $fleetupdate < 24)
248                                         || $c->check_user_roles(qw/no_fleet_update/)))),
249                 $c->forward('listTargets');
250         }
251         my $birthdays = $dbh->prepare(q{SELECT username
252                         ,date_part('year',age(birthday)) AS age
253                         FROM users WHERE birthday IS NOT NULL
254                                 AND mmdd(birthday) = mmdd(CURRENT_DATE)
255                 });
256         $birthdays->execute;
257         $c->stash(birthdays => $birthdays->fetchall_arrayref({}));
258
259         if ($c->res->status == 200 || $c->req->method eq 'GET'){
260                 $c->session->{referrer} = $c->req->path;
261         }
262 }
263
264 =head1 AUTHOR
265
266 Michael Andreen (harv@ruin.nu)
267
268 =head1 LICENSE
269
270 GPL 2, or later.
271
272 =cut
273
274 1;