]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Root.pm
6fab7f29fcde410fb1f674a54405c9cd18db8f6b
[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/index');
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(GEOIP_STANDARD);
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         my $sms = $dbh->prepare(q{
99 UPDATE sms SET status = $2, cost = $3
100         ,time = TIMESTAMP WITH TIME ZONE 'epoch' + $4 * INTERVAL '1 second'
101 WHERE msgid = $1
102                 });
103
104         $sms->execute($c->req->param('apiMsgId')
105                 ,$clickatellstatus{$c->req->param('status')}
106                 ,$c->req->param('charge')
107                 ,$c->req->param('timestamp'));
108
109         $c->stash(template => 'default.tt2');
110 }
111
112
113 sub begin : Private {
114         my ($self, $c) = @_;
115
116          $c->res->header( 'Cache-Control' =>
117                 'no-store, no-cache, must-revalidate,'.
118                 'post-check=0, pre-check=0, max-age=0'
119         );
120         $c->res->header( 'Pragma' => 'no-cache' );
121         $c->res->header( 'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT' );
122 }
123
124 sub listTargets : Private {
125         my ($self, $c) = @_;
126
127         my $dbh = $c ->model;
128
129         my $query = $dbh->prepare(q{SELECT t.id, r.id AS raid, r.tick+c.wave-1 AS landingtick, 
130                 (released_coords AND old_claim(timestamp)) AS released_coords, coords(x,y,z),c.launched,c.wave,c.joinable
131 FROM raid_claims c
132         JOIN raid_targets t ON c.target = t.id
133         JOIN raids r ON t.raid = r.id
134         JOIN current_planet_stats p USING (pid)
135 WHERE c.uid = $1 AND r.tick+c.wave > tick() AND r.open AND not r.removed
136 ORDER BY r.tick+c.wave,x,y,z});
137         $query->execute($c->user->id) or die $dbh->errstr;
138         my @targets;
139         while (my $target = $query->fetchrow_hashref){
140                 push @targets, $target;
141         }
142
143         $c->stash(claimedtargets => \@targets);
144 }
145
146 sub listAlliances : Private {
147         my ($self, $c) = @_;
148         my @alliances;
149         push @alliances,{aid => '', alliance => ''};
150         my $query = $c->model->prepare(q{SELECT aid,alliance FROM alliances ORDER BY LOWER(alliance)});
151         $query->execute;
152         while (my $ally = $query->fetchrow_hashref){
153                 push @alliances,$ally;
154         }
155         $c->stash(alliances => \@alliances);
156 }
157
158 sub sslurl {
159         return $_[0];
160 }
161
162 sub auto : Private {
163         my ($self, $c) = @_;
164         my $dbh = $c ->model;
165
166         $c->stash(dbh => $dbh);
167
168         $c->stash(sslurl => \&sslurl);
169
170         $dbh->do(q{SET timezone = 'GMT'});
171
172         $c->stash(TICK =>$dbh->selectrow_array('SELECT tick()',undef));
173         $c->stash(STICK =>$dbh->selectrow_array('SELECT max(tick) FROM planet_stats',undef));
174         $c->stash->{game}->{tick} = $c->stash->{TICK};
175
176         if ($c->user_exists){
177                 $c->stash(UID => $c->user->id);
178         }else{
179                 $c->stash(UID => -4);
180         }
181 }
182
183 sub redirect : Private {
184         my ($self, $c) = @_;
185         $c->res->redirect($c->uri_for('/'.$c->session->{referrer}));
186 }
187
188 sub access_denied : Private {
189         my ($self, $c, $action) = @_;
190
191         $c->stash->{template} = 'access_denied.tt2';
192         $c->res->status(403);
193
194 }
195
196 =head2 end
197
198 Attempt to render a view, if needed.
199
200 =cut 
201
202 sub end : ActionClass('RenderView') {
203         my ($self, $c) = @_;
204
205         if ($c->res->status >= 300 && $c->res->status <= 400 ){
206                 return;
207         }
208
209         my $dbh = $c ->model;
210
211         if (scalar @{ $c->error } ){
212                 if ($c->error->[0] =~ m/Can't call method "id" on an undefined value at/){
213                         $c->stash->{template} = 'access_denied.tt2';
214                         $c->res->status(403);
215                         $c->clear_errors;
216                 }elsif ($c->error->[0] =~ m/Missing roles: /){
217                         $c->stash->{template} = 'access_denied.tt2';
218                         $c->res->status(403);
219                         $c->clear_errors;
220                 }
221         }
222
223         if ($c->user_exists){
224                 my $fleetupdate = 0;
225                 if ($c->check_user_roles(qw/member_menu/)){
226                         $fleetupdate = $dbh->selectrow_array(q{
227 SELECT tick FROM fleets WHERE pid = ? AND tick > tick() - 24
228 AND mission = 'Full fleet' AND name IN ('Main','Advanced Unit');
229                                 },undef,$c->user->planet);
230                         $fleetupdate = 0 unless defined $fleetupdate;
231                 }
232
233                 my ($unread,$newposts) = $dbh->selectrow_array(q{SELECT * FROM unread_posts($1)}
234                         ,undef,$c->user->id);
235
236                 $c->stash(user => {
237                         id => $c->user->id,
238                         name => $c->user->username,
239                         css => $c->user->css,
240                         newposts => $newposts,
241                         unreadposts => $unread
242                 });
243                 $c->stash->{user}->{attacker} = $c->check_user_roles(qw/attack_menu/)
244                         && (!$c->check_user_roles(qw/member_menu/)
245                                 || ($c->user->planet && (($c->stash->{TICK} - $fleetupdate < 24)
246                                         || $c->check_user_roles(qw/no_fleet_update/)))),
247                 $c->forward('listTargets');
248         }
249         my $birthdays = $dbh->prepare(q{SELECT username
250                         ,date_part('year',age(birthday)) AS age
251                         FROM users WHERE birthday IS NOT NULL
252                                 AND mmdd(birthday) = mmdd(CURRENT_DATE)
253                 });
254         $birthdays->execute;
255         $c->stash(birthdays => $birthdays->fetchall_arrayref({}));
256
257         if ($c->res->status == 200 || $c->req->method eq 'GET'){
258                 $c->session->{referrer} = $c->req->path;
259         }
260 }
261
262 =head1 AUTHOR
263
264 Michael Andreen (harv@ruin.nu)
265
266 =head1 LICENSE
267
268 GPL 2, or later.
269
270 =cut
271
272 1;