diff options
Diffstat (limited to 'lib/VNDB.pm')
-rw-r--r-- | lib/VNDB.pm | 247 |
1 files changed, 0 insertions, 247 deletions
diff --git a/lib/VNDB.pm b/lib/VNDB.pm deleted file mode 100644 index 94edf82e..00000000 --- a/lib/VNDB.pm +++ /dev/null @@ -1,247 +0,0 @@ -package VNDB; - -use strict; -use warnings; - -BEGIN { require 'global.pl'; } -our $DEBUG; - -require Time::HiRes if $DEBUG; -require Data::Dumper if $DEBUG; -use VNDB::Util::Template; -use VNDB::Util::Request; -use VNDB::Util::Response; -use VNDB::Util::DB; -use VNDB::Util::Tools; -use VNDB::Util::Auth; -use VNDB::Discussions; -use VNDB::HomePages; -use VNDB::Producers; -use VNDB::Releases; -use VNDB::VNLists; -use VNDB::Users; -use VNDB::VN; - - -my %VNDBuris = ( # wildcards: * -> (.+), + -> ([0-9]+) - '/' => sub { shift->HomePage }, - 'd+' => sub { shift->DocPage(shift) }, - 'd+.+' => sub { shift->ResRedirect('/d'.$_[0][0].'#'.$_[0][1]) }, - nospam => sub { shift->ResAddTpl(error => { err => 'formerr' }) }, - hist => {'*'=> sub { shift->History(undef, undef, $_[1]) } }, - # users - u => { - login => sub { shift->UsrLogin }, - logout => sub { shift->UsrLogout }, - register => sub { shift->UsrReg }, - newpass => sub { shift->UsrPass }, - list => { - '/' => sub { shift->UsrList }, - '*' => sub { $_[3] =~ /^([a-z0]|all)$/ ? shift->UsrList($_[2]) : shift->ResNotFound }, - }, - }, - 'u+' => { - '/' => sub { shift->UsrPage(shift) }, - edit => sub { shift->UsrEdit(shift) }, - del => sub { shift->UsrDel(shift) }, - list => sub { shift->RList(shift) }, - vlist => sub { shift->VNMyList(shift) }, - wish => sub { shift->WList(shift) }, - hist => {'*'=> sub { shift->History('u', shift, $_[1]) } }, - }, - # visual novels - v => { - '/' => sub { shift->VNBrowse }, - new => sub { shift->VNEdit(0); }, - '*' => sub { $_[2] =~ /^([a-z0]|all|search)$/ ? shift->VNBrowse($_[1]) : shift->ResNotFound; }, - }, - 'v+' => { - '/' => sub { shift->VNPage(shift) }, - stats => sub { shift->VNPage(shift, shift) }, - rg => sub { shift->VNPage(shift, shift) }, - scr => sub { shift->VNPage(shift, shift) }, - edit => sub { shift->VNEdit(shift) }, - vote => sub { shift->VNVote(shift) }, - wish => sub { shift->WListMod(shift) }, - add => sub { shift->REdit('v', shift) }, - lock => sub { shift->VNLock(shift) }, - hide => sub { shift->VNHide(shift) }, - hist => {'*'=> sub { shift->History('v', shift, $_[1]) } }, - }, - 'v+.+' => sub { shift->VNPage($_[0][0], '', $_[0][1]) }, - # releases - 'r+' => { - '/' => sub { shift->RPage(shift) }, - edit => sub { shift->REdit('r', shift) }, - lock => sub { shift->RLock(shift) }, - hide => sub { shift->RHide(shift) }, - list => sub { shift->RListMod(shift) }, - hist => {'*'=> sub { shift->History('r', shift, $_[1]) } }, - }, - 'r+.+' => sub { shift->RPage($_[0][0], $_[0][1]) }, - # producers - p => { - '/' => sub { shift->PBrowse }, - add => sub { shift->PEdit(0) }, - '*' => sub { $_[2] =~ /^([a-z0]|all)$/ ? shift->PBrowse($_[1]) : shift->ResNotFound; } - }, - 'p+' => { - '/' => sub { shift->PPage(shift) }, - edit => sub { shift->PEdit(shift) }, - lock => sub { shift->PLock(shift) }, - hide => sub { shift->PHide(shift) }, - hist => {'*'=> sub { shift->History('p', shift, $_[1]) } }, - }, - 'p+.+' => sub { shift->PPage($_[0][0], $_[0][1]) }, - # discussions - t => { - '/' => sub { shift->TIndex }, - '*' => { - '/' => sub { shift->TTag($_[1]) }, - new => sub { shift->TEdit(0, 0, $_[1]) }, - }, - }, - 't+' => { - '/' => sub { shift->TThread(shift) }, - reply => sub { shift->TEdit(shift) }, - '+' => sub { shift->TThread(shift, shift) }, - }, - 't+.+' => { - edit => sub { shift->TEdit($_[0][0], $_[0][1]) }, - '/' => sub { $_[0]->ResRedirect('/t'.$_[1][0].($_[1][1]>$_[0]->{postsperpage}?'/'.ceil($_[1][1]/$_[0]->{postsperpagee}):'').'#'.$_[1][1], 'perm') }, - }, - # stuff (.xml extension to make sure they aren't counted as pageviews) - xml => { - 'producers.xml' => sub { shift->PXML }, - 'vn.xml' => sub { shift->VNXML }, - 'screenshots.xml' => sub { shift->VNScrXML }, - }, -); - - -# provide redirects for old URIs -my %OLDuris = ( - faq => sub { shift->ResRedirect('/d6', 'perm') }, - notes => sub { shift->ResRedirect('/d8', 'perm') }, - vn => { - rss => sub { shift->ResRedirect('/hist/rss?t=v&e=1', 'perm') }, - '*' => sub { shift->ResRedirect('/v/'.$_[1], 'perm') }, - }, - v => { - cat => sub { - my $f = $_[0]->FormCheck({name=>'i',required=>0},{name=>'e',required=>0},{name=>'l',required=>0}, - {name=>'p',required=>0},{name=>'o',required=>0},{name=>'s',required=>0}); - my %f; - $f{$_} = $f->{$_} for (qw|p o s|); - $f{q} = join ' ', (map $VNDB::CAT->{substr($_,0,1)}[1]{substr($_,1,2)}, split /,/, $f->{i}), - (map '-'.$VNDB::CAT->{substr($_,0,1)}[1]{substr($_,1,2)}, split /,/, $f->{e}), - (map $VNDB::LANG->{$_}, split /,/, $f->{l}); - !$f{$_}&&delete $f{$_} for keys %f; - $_[0]->ResRedirect('/v/search'.(!(keys %f)?'':'?'.join(';', map $_.'='.$f{$_}, keys %f) ), 'perm'); - }, - }, - 'v+' => { - votes => sub { shift->ResRedirect('/v'.(shift).'/stats', 'perm') }, - hist=>{rss => sub { shift->ResRedirect('/v'.(shift).'/hist/rss.xml', 'perm') } }, - }, - u => { - '*' => { - '*' => sub { - if($_[2] =~ /^_(login|logout|register|newpass|list)$/) { - $_[3] eq '/' ? $_[0]->ResRedirect('/u/'.$1, 'perm') : $_[0]->ResRedirect('/u/'.$1.'/'.$_[3], 'perm'); - } else { - my $id = $_[0]->DBGetUser(username => $_[2])->[0]{id}; - $id ? $_[0]->ResRedirect('/u'.$id.'/'.$_[3], 'perm') : $_[0]->ResNotFound; - } - }, - } - }, - 'u+' => { - votes => sub { shift->ResRedirect('/u'.(shift).'/list', 'perm') }, - hist=>{rss => sub { shift->ResRedirect('/u'.(shift).'/hist/rss.xml', 'perm') } }, - }, - 'p+' => { - hist=>{rss => sub { shift->ResRedirect('/p'.(shift).'/hist/rss.xml', 'perm') } }, - }, - 'r+' => { - hist=>{rss => sub { shift->ResRedirect('/r'.(shift).'/hist/rss.xml', 'perm') } }, - }, - hist=>{rss => sub { shift->ResRedirect('/hist/rss.xml', 'perm') } }, -); - - - -sub new { - my $self = shift; - my $type = ref($self) || $self; - my %args = @_; - - my $me = bless { - debug => $VNDB::DEBUG, - %args, - _DB => VNDB::Util::DB->new(@VNDB::DBLOGIN), - _TPL => VNDB::Util::Template->new(%{$args{tplopts}}), - cmds => [], - }, $type; - - return $me; -} - - -sub get_page { - my $self = shift; - my $r = shift; - - $self->{_Req} = VNDB::Util::Request->new($r); - $self->{_Res} = VNDB::Util::Response->new($self->{_TPL}); - - $self->AuthCheckCookie(); - $self->checkuri(); - - my $res = $self->ResSetModPerl($r); - $self->DBCommit(); - - # commands have to be executed _after_ the call to DBCommit, - # otherwise Multi can't see the new additions - $self->RunCmd(); - - return($self, $res); -} - - -sub checkuri { - my $self = shift; - (my $uri = lc($self->ReqUri)) =~ s/^\/+//; - $uri =~ s/\?.*$//; - return $self->ResRedirect("/$uri", 'perm') if $uri =~ s/\/+$//; - $uri =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; # ugly hack, but we only accept ASCII anyway - return $self->ResNotFound() if $uri !~ /^[a-z0-9\-\._~\/]*$/; # rfc3986 section 2.3, "Unreserved Characters" - my @uri; - defined $_ and push(@uri, $_) for (split(/\/+/, $uri)); - my @ouri = @uri; # items in @uri can be modified by uri2page - $self->uri2page(\%VNDBuris, \@uri, 0); - $self->uri2page(\%OLDuris, \@ouri, 0) # provide redirects for old uris - if $self->{_Res}->{code} == 404; -} - - -sub uri2page { - my($s, $o, $u, $i) = @_; - $u->[$i] = '/' if !defined $u->[$i]; - my $n = $o->{$u->[$i]} ? $u->[$i] : ((map { - if(/[\*\+]/) { - (my $t = "^$_\$") =~ s/\./\\./g; - /\*/ ? ($t =~ s/\*/(.+)/g) : ($t =~ s/\+/([1-9][0-9]*)/g); - $u->[$i] =~ /$t/ ? ($u->[$i] = $2?[$1,$2]:$1) && $_ : (); - } else { () } } - sort { length($b) <=> length($a) } keys %$o)[0] || '*'); - ref($o->{$n}) eq 'HASH' && $n ne '/' ? - $s->uri2page($o->{$n}, $u, ++$i) : - ref($o->{$n}) eq 'CODE' && $i == $#$u ? - &{$o->{$n}}($s, @$u) : - $s->ResNotFound(); -} - - -1; - |