summaryrefslogtreecommitdiff
path: root/lib/VNDB/Handler/VNBrowse.pm
blob: c2a923b541956a42b27472a22fb49d272827448f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127

package VNDB::Handler::VNBrowse;

use strict;
use warnings;
use TUWF ':html', 'uri_escape';
use VNDB::Func;


TUWF::register(
  qr{v/([a-z0]|all)}  => \&list,
);


sub list {
  my($self, $char) = @_;

  my $f = $self->formValidate(
    { get => 's', required => 0, default => 'tagscore', enum => [ qw|title rel pop tagscore rating| ] },
    { get => 'o', required => 0, enum => [ 'a','d' ] },
    { get => 'p', required => 0, default => 1, template => 'int' },
    { get => 'q', required => 0, default => '' },
    { get => 'sq', required => 0, default => '' },
    { get => 'fil',required => 0 },
    { get => 'vnlist', required => 0, default => 2, enum => [ '0', '1' ] }, # 2: use pref
    { get => 'wish',   required => 0, default => 2, enum => [ '0', '1' ] }, # 2: use pref
  );
  return $self->resNotFound if $f->{_err};
  $f->{q} ||= $f->{sq};
  $f->{fil} //= $self->authPref('filter_vn');
  my %compat = _fil_compat($self);
  my $uid = $self->authInfo->{id};

  my $read_write_pref = sub {
    my($type, $pref_name) = @_;

    return 0 if !$uid; # no data to display anyway
    return $self->authPref($pref_name)?1:0 if $f->{$type} == 2;

    $self->authPref($pref_name => $f->{$type}?1:0) if ($self->authPref($pref_name)?1:0) != $f->{$type};
    return $f->{$type};
  };

  $f->{vnlist} = $read_write_pref->('vnlist', 'vn_list_own');
  $f->{wish}   = $read_write_pref->('wish',   'vn_list_wish');

  return $self->resRedirect('/'.$1.$2.(!$3 ? '' : $1 eq 'd' ? '#'.$3 : '.'.$3), 'temp')
    if $f->{q} && $f->{q} =~ /^([gvrptudcis])([0-9]+)(?:\.([0-9]+))?$/;

  $f->{s} = 'title' if $f->{fil} !~ /tag_inc-/ && $f->{s} eq 'tagscore';
  $f->{o} = $f->{s} eq 'tagscore' ? 'd' : 'a' if !$f->{o};

  my($list, $np) = $self->filFetchDB(vn => $f->{fil}, {
    %compat,
    tagspoil => $self->authPref('spoilers')||0,
  }, {
    what =>               ' rating' .
         ($f->{vnlist}  ? ' vnlist'   : '').
         ($f->{wish}    ? ' wishlist' : ''),
    $char ne 'all' ? ( char => $char ) : (),
    $f->{q} ? ( search => $f->{q} ) : (),
    results => 50,
    page => $f->{p},
    sort => $f->{s}, reverse => $f->{o} eq 'd',
  });

  $self->resRedirect('/v'.$list->[0]{id}, 'temp')
    if $f->{q} && @$list == 1 && $f->{p} == 1;

  $self->htmlHeader(title => mt('_vnbrowse_title'), search => $f->{q});

  my $quri = uri_escape($f->{q});
  form action => '/v/all', 'accept-charset' => 'UTF-8', method => 'get';

  # url generator
  my $url = sub {
    my($char, $toggle) = @_;

    return "/v/$char?q=$quri;fil=$f->{fil};s=$f->{s};o=$f->{o}" .
           ($toggle ? ";$toggle=".($f->{$toggle}?0:1) : '');
  };

  div class => 'mainbox';
   h1 mt '_vnbrowse_title';
   $self->htmlSearchBox('v', $f->{q});
   p class => 'browseopts';
    for ('all', 'a'..'z', 0) {
      a href => $url->($_), $_ eq $char ? (class => 'optselected') : (), $_ eq 'all' ? mt('_char_all') : $_ ? uc $_ : '#';
    }
   end;
   if($uid) {
     p class => 'browseopts';
      a href => $url->($char, 'vnlist'), $f->{vnlist} ? (class => 'optselected') : (), mt('_vnbrowse_vnlist');
      a href => $url->($char, 'wish'  ), $f->{wish}   ? (class => 'optselected') : (), mt('_vnbrowse_wishlist');
     end 'p';
   }

   a id => 'filselect', href => '#v';
    lit '<i>&#9656;</i> '.mt('_js_fil_filters').'<i></i>';
   end;
   input type => 'hidden', class => 'hidden', name => 'fil', id => 'fil', value => $f->{fil};
  end;
  end 'form';

  $self->htmlBrowseVN($list, $f, $np, "/v/$char?q=$quri;fil=$f->{fil}", $f->{fil} =~ /tag_inc-/);
  $self->htmlFooter(pref_code => 1);
}


sub _fil_compat {
  my $self = shift;
  my %c;
  my $f = $self->formValidate(
    { get => 'ln', required => 0, multi => 1, enum => $self->{languages}, default => '' },
    { get => 'pl', required => 0, multi => 1, enum => $self->{platforms}, default => '' },
    { get => 'sp', required => 0, default => ($self->reqCookie('tagspoil')||'') =~ /^([0-2])$/ ? $1 : 0, enum => [0..2] },
  );
  return () if $f->{_err};
  $c{lang}     //= $f->{ln} if $f->{ln}[0];
  $c{plat}     //= $f->{pl} if $f->{pl}[0];
  $c{tagspoil} //= $f->{sp};
  return %c;
}


1;