X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=ND.pm;h=e9bc401f83138574447f6e1b9855782effd3d753;hb=8250eb360c341a4eeaa76e5e3fc0f57cf0014a60;hp=3c053b853e66606e9d72c3573122deab9b4bef7d;hpb=3434a018e5752f33d863d7cccd1be8ca9426e777;p=ndwebbie.git diff --git a/ND.pm b/ND.pm index 3c053b8..e9bc401 100755 --- a/ND.pm +++ b/ND.pm @@ -20,136 +20,46 @@ package ND; use CGI qw/:standard/; -use HTML::Template; use DBI; use DBD::Pg qw(:pg_types); use Apache2::Request; -use ND::Web::Include; +use Apache2::Response; +use Apache2::RequestUtil; use ND::DB; -use Tie::File; -use Fcntl 'O_RDONLY'; +use NDWeb::Page; use strict; -use warnings FATAL => 'all'; +use warnings; -chdir '/var/www/ndawn/code'; -our %PAGES; -our $NOACCESS = HTML::Template->new(filename => 'templates/NoAccess.tmpl', global_vars => 1, cache => 1); +$SIG{__WARN__} = sub {$ND::ERROR .= p $_[0]}; + +chdir '/var/www/ndawn'; sub handler { - local $ND::r = shift; - local $ND::req = Apache2::Request->new($ND::r, POST_MAX => "1M"); - local $ND::DBH; - local $ND::USER; + my $r = shift; + my $req = Apache2::Request->new($r, POST_MAX => "1M"); + local $ND::DBH = ND::DB::DB(); local $ND::UID; - local $ND::PLANET; - local $ND::TEMPLATE; - local $ND::BODY; - local $ND::TICK; - local %ND::GROUPS; local $ND::ERROR; - local $ND::PAGE = $ND::req->param('page'); + my $page = $req->param('page'); + $r->no_cache; if ($ENV{'SCRIPT_NAME'} =~ /(\w+)(\.(pl|php|pm))?$/){ - $ND::PAGE = $1 unless $1 eq 'index' and $3 eq 'pl'; - } - $ND::PAGE = 'main' unless (defined $ND::PAGE and exists $PAGES{$ND::PAGE}); - - $PAGES{$ND::PAGE}->{parse}->($ENV{REQUEST_URI}); - - page($ND::PAGE); - return Apache2::Const::OK; -} - -sub page { - my ($PAGE) = @_; - our $DBH = ND::DB::DB(); - $DBH->do(q{SET timezone = 'GMT'}); - - our $ERROR; - - chdir '/var/www/ndawn/code'; - - our $TEMPLATE = HTML::Template->new(filename => 'templates/skel.tmpl', global_vars => 1, cache => 1); - - our ($UID,$PLANET,$USER) = $DBH->selectrow_array('SELECT uid,planet,username FROM users WHERE username ILIKE ?' - ,undef,$ENV{'REMOTE_USER'}); - - our ($TICK) = $DBH->selectrow_array('SELECT tick()',undef); - $TICK = 0 unless defined $TICK; - - - my $query = $DBH->prepare('SELECT groupname,attack,gid from groupmembers NATURAL JOIN groups WHERE uid = ?'); - $query->execute($UID); - - our $ATTACKER = 0; - undef our %GROUPS; - while (my ($name,$attack,$gid) = $query->fetchrow()){ - $GROUPS{$name} = $gid; - $ATTACKER = 1 if $attack; + $page = $1 unless $1 eq 'index' and $3 eq 'pl'; } + $page = NDWeb::Page->new(PAGE => $page, DBH => $ND::DBH, URI => $ENV{REQUEST_URI}, USER_AGENT => $ENV{HTTP_USER_AGENT}, HTTP_ACCEPT => $ENV{HTTP_ACCEPT}, R => $r); + $page->render; - our $XML = 0; - our $AJAX = 1; - - $PAGES{$PAGE}->{process}->(); - - my $type = 'text/html'; - if ($XML){ - $type = 'text/xml'; - $ND::TEMPLATE = HTML::Template->new(filename => "templates/xml.tmpl", cache => 1); - $ND::BODY = HTML::Template->new(filename => "templates/$ND::PAGE.xml.tmpl", cache => 1); - }else{ - $ND::BODY = HTML::Template->new(filename => "templates/$ND::PAGE.tmpl", global_vars => 1, cache => 1); - $ND::BODY->param(PAGE => '/'.$ND::PAGE); - } - - $ND::BODY = $PAGES{$PAGE}->{render}->($DBH,$ND::BODY); - - unless ($XML){ - my $fleetupdate = $DBH->selectrow_array('SELECT landing_tick FROM fleets WHERE uid = ? AND fleet = 0',undef,$UID); + $ND::DBH->rollback unless $ND::DBH->{AutoCommit}; + $ND::DBH->disconnect; - $fleetupdate = 0 unless defined $fleetupdate; - - my ($unread) = $DBH->selectrow_array(q{ - SELECT count(*) AS unread -FROM forum_boards fb NATURAL JOIN forum_threads ft - JOIN forum_posts fp USING (ftid) LEFT OUTER JOIN - (SELECT * FROM forum_thread_visits WHERE uid = $1) ftv ON ftv.ftid = ft.ftid -WHERE (ftv.time IS NULL OR fp.time > ftv.time) AND fbid > 0 AND - fbid IN (SELECT fbid FROM forum_access WHERE gid IN (SELECT groups($1))) - },undef,$UID) or $ERROR .= p($DBH->errstr); - - $TEMPLATE->param(UnreadPosts => $unread); - $TEMPLATE->param(Tick => $TICK); - $TEMPLATE->param(isMember => (($TICK - $fleetupdate < 24) || isScanner()) && $PLANET && isMember()); - $TEMPLATE->param(isHC => isHC()); - $TEMPLATE->param(isDC => isDC()); - $TEMPLATE->param(isBC => isBC()); - $TEMPLATE->param(isIntel => isBC()); - $TEMPLATE->param(isAttacker => $ATTACKER && (!isMember() || ((($TICK - $fleetupdate < 24) || isScanner()) && $PLANET))); - if ($ATTACKER && (!isMember() || ((($TICK - $fleetupdate < 24) || isScanner()) && $PLANET))){ - $ND::TEMPLATE->param(Targets => listTargets()); + if ($page->{RETURN}){ + if($page->{RETURN} eq 'REDIRECT'){ + $r->headers_out->set(Location => $page->{REDIR_LOCATION}); + $r->status(Apache2::Const::REDIRECT); + $r->rflush; } - $TEMPLATE->param(Coords => param('coords') ? param('coords') : '1:1:1'); - } - $TEMPLATE->param(Error => $ERROR); - $ND::TEMPLATE->param(BODY => $ND::BODY->output); - my $output = $TEMPLATE->output; - print header(-type=> $type, -charset => 'utf-8', -Content_Length => length $output); - print $output; - - - $DBH->rollback; - $DBH->disconnect; - $DBH = undef; - $UID = undef; - $USER = undef; - $PLANET = undef; - $TEMPLATE = undef; - $TICK = undef; - undef %GROUPS; - $ND::BODY = undef; + return Apache2::Const::OK; } 1;