diff options
author | Yorhel <git@yorhel.nl> | 2019-12-24 11:05:37 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2019-12-24 11:05:37 +0100 |
commit | e77d322d59ea7e741b12ae172b0df5847d161274 (patch) | |
tree | 8d35a20f644ae8750f672524ac5aa15dd3e59c2b | |
parent | 444990e4d924903d28b3f33c53f7df37c23b3f32 (diff) |
ulist: Delete old lists code and redirect old URLs
-rw-r--r-- | lib/VNDB/DB/ULists.pm | 276 | ||||
-rw-r--r-- | lib/VNDB/Handler/ULists.pm | 483 | ||||
-rw-r--r-- | lib/VNWeb/User/Lists.pm | 8 |
3 files changed, 11 insertions, 756 deletions
diff --git a/lib/VNDB/DB/ULists.pm b/lib/VNDB/DB/ULists.pm index 37fd46d4..4c1d10ae 100644 --- a/lib/VNDB/DB/ULists.pm +++ b/lib/VNDB/DB/ULists.pm @@ -7,9 +7,8 @@ use Exporter 'import'; our @EXPORT = qw| - dbRListGet dbVNListGet dbVNListList dbVNListAdd dbVNListDel dbRListAdd dbRListDel - dbVoteGet dbVoteStats dbVoteAdd dbVoteDel - dbWishListGet dbWishListAdd dbWishListDel + dbRListGet dbRListAdd dbRListDel + dbVoteStats |; @@ -30,121 +29,6 @@ sub dbRListGet { ); } -# Options: uid vid -sub dbVNListGet { - my($self, %o) = @_; - - my %where = ( - 'uid = ?' => $o{uid}, - $o{vid} ? ('vid IN(!l)' => [ ref $o{vid} ? $o{vid} : [$o{vid}] ]) : (), - ); - - return $self->dbAll(q| - SELECT uid, vid, status - FROM vnlists - !W|, - \%where - ); -} - - -# Options: uid char voted page results sort reverse -# sort: title vote -sub dbVNListList { - my($self, %o) = @_; - $o{results} ||= 50; - $o{page} ||= 1; - - my %where = ( - 'vl.uid = ?' => $o{uid}, - defined($o{voted}) ? ('vo.vote !s NULL' => $o{voted} ? 'IS NOT' : 'IS') : (), - defined($o{status})? ('vl.status = ?' => $o{status}) : (), - $o{char} ? ('LOWER(SUBSTR(v.title, 1, 1)) = ?' => $o{char} ) : (), - defined $o{char} && !$o{char} ? ( - '(ASCII(v.title) < 97 OR ASCII(v.title) > 122) AND (ASCII(v.title) < 65 OR ASCII(v.title) > 90)' => 1 ) : (), - ); - - my $order = sprintf { - title => 'v.title %s', - vote => 'vo.vote %s NULLS LAST, v.title ASC', - }->{ $o{sort}||'title' }, $o{reverse} ? 'DESC' : 'ASC'; - - # execute query - my($r, $np) = $self->dbPage(\%o, qq| - SELECT vl.vid, v.title, v.original, vl.status, vl.notes, COALESCE(vo.vote, 0) AS vote - FROM vnlists vl - JOIN vn v ON v.id = vl.vid - LEFT JOIN votes vo ON vo.vid = vl.vid AND vo.uid = vl.uid - !W - ORDER BY !s|, - \%where, $order - ); - - # fetch releases and link to VNs - if(@$r) { - my %vns = map { - $_->{rels}=[]; - $_->{vid}, $_->{rels} - } @$r; - - my $rel = $self->dbAll(q| - SELECT rv.vid, rl.rid, r.title, r.original, r.released, r.type, rl.status - FROM rlists rl - JOIN releases r ON rl.rid = r.id - JOIN releases_vn rv ON rv.id = r.id - WHERE rl.uid = ? - AND rv.vid IN(!l) - ORDER BY r.released ASC|, - $o{uid}, [ keys %vns ] - ); - - if(@$rel) { - my %rel = map { $_->{rid} => [] } @$rel; - push(@{$rel{$_->{id}}}, $_->{lang}) for (@{$self->dbAll(q| - SELECT id, lang - FROM releases_lang - WHERE id IN(!l)|, - [ keys %rel ] - )}); - for(@$rel) { - $_->{languages} = $rel{$_->{rid}}; - push @{$vns{$_->{vid}}}, $_; - } - } - } - - return wantarray ? ($r, $np) : $r; -} - - -# Arguments: uid vid status notes -# vid can be an arrayref only when the rows are already present, in which case an update is done -# status and notes can be undef when an update is done, in which case these fields aren't updated -sub dbVNListAdd { - my($self, $uid, $vid, $stat, $notes) = @_; - $self->dbExec( - 'UPDATE vnlists !H WHERE uid = ? AND vid IN(!l)', - {defined($stat) ? ('status = ?' => $stat ):(), - defined($notes)? ('notes = ?' => $notes):()}, - $uid, ref($vid) ? $vid : [ $vid ] - ) - || - $self->dbExec( - 'INSERT INTO vnlists (uid, vid, status, notes) VALUES(?, ?, ?, ?)', - $uid, $vid, $stat||0, $notes||'' - ); -} - - -# Arguments: uid, vid -sub dbVNListDel { - my($self, $uid, $vid) = @_; - $self->dbExec( - 'DELETE FROM vnlists WHERE uid = ? AND vid IN(!l)', - $uid, ref($vid) ? $vid : [ $vid ] - ); -} - # Arguments: uid rid status # rid can be an arrayref only when the rows are already present, in which case an update is done @@ -172,62 +56,6 @@ sub dbRListDel { } -# Options: uid vid hide_ign results page what sort reverse -# what: user, vn, hide_list -sub dbVoteGet { - my($self, %o) = @_; - $o{results} ||= 50; - $o{page} ||= 1; - $o{what} ||= ''; - $o{sort} ||= 'date'; - $o{reverse} //= 1; - - my %where = ( - $o{uid} ? ( 'n.uid = ?' => $o{uid} ) : (), - $o{vid} ? ( 'n.vid = ?' => $o{vid} ) : (), - $o{hide_ign} ? ( '(NOT u.ign_votes OR u.id = ?)' => $self->authInfo->{id}||0 ) : (), - $o{vn_char} ? ( 'LOWER(SUBSTR(v.title, 1, 1)) = ?' => $o{vn_char} ) : (), - defined $o{vn_char} && !$o{vn_char} ? ( - '(ASCII(v.title) < 97 OR ASCII(v.title) > 122) AND (ASCII(v.title) < 65 OR ASCII(v.title) > 90)' => 1 ) : (), - ); - - my @select = ( - qw|n.vid n.vote n.uid|, q|extract('epoch' from n.date) as date|, - $o{what} =~ /user/ ? (VNWeb::DB::sql_user()) : (), - $o{what} =~ /vn/ ? (qw|v.title v.original|) : (), - $o{what} =~ /hide_list/ ? ('u.hide_list') : (), - ); - - my @join = ( - $o{what} =~ /vn/ ? ( - 'JOIN vn v ON v.id = n.vid', - ) : (), - $o{what} =~ /user/ || $o{hide} || $o{what} =~ /hide_list/ ? ( - 'JOIN users u ON u.id = n.uid' - ) : (), - ); - - my $order = sprintf { - date => 'n.date %s', - # Hidden users should not be sorted among the rest. as that would still give them away - username => $o{what} =~ /hide_list/ ? '(CASE WHEN u.hide_list THEN NULL ELSE u.username END) %s, n.date' : 'u.username %s', - title => 'v.title %s', - vote => 'n.vote %s'.($o{what} =~ /vn/ ? ', v.title ASC' : $o{what} =~ /user/ ? ', u.username ASC' : ''), - }->{$o{sort}}, $o{reverse} ? 'DESC' : 'ASC'; - - my($r, $np) = $self->dbPage(\%o, q| - SELECT !s - FROM votes n - !s - !W - ORDER BY !s|, - join(',', @select), join(' ', @join), \%where, $order - ); - - return wantarray ? ($r, $np) : $r; -} - - # Arguments: 'vid', id # Returns an arrayref with 10 elements containing the [ count(vote), sum(vote) ] # for votes in the range of ($index+0.5) .. ($index+1.4) @@ -245,105 +73,5 @@ sub dbVoteStats { return $r; } - -# Adds a new vote or updates an existing one -# Arguments: vid, uid, vote -# vid can be an arrayref only when the rows are already present, in which case an update is done -sub dbVoteAdd { - my($self, $vid, $uid, $vote) = @_; - $self->dbExec(q| - UPDATE votes - SET vote = ? - WHERE vid IN(!l) - AND uid = ?|, - $vote, ref($vid) ? $vid : [$vid], $uid - ) || $self->dbExec(q| - INSERT INTO votes - (vid, uid, vote) - VALUES (!l)|, - [ $vid, $uid, $vote ] - ); -} - - -# Arguments: uid, vid -# vid can be an arrayref -sub dbVoteDel { - my($self, $uid, $vid) = @_; - $self->dbExec('DELETE FROM votes !W', - { 'vid IN(!l)' => [ref($vid)?$vid:[$vid]], 'uid = ?' => $uid } - ); -} - - -# %options->{ uid vid wstat what page results sort reverse } -# what: vn -# sort: title added wstat -sub dbWishListGet { - my($self, %o) = @_; - - $o{page} ||= 1; - $o{results} ||= 50; - $o{what} ||= ''; - - my %where = ( - 'wl.uid = ?' => $o{uid}, - $o{vid} ? ( 'wl.vid = ?' => $o{vid} ) : (), - defined $o{wstat} ? ( 'wl.wstat = ?' => $o{wstat} ) : (), - ); - - my $select = q|wl.vid, wl.wstat, extract('epoch' from wl.added) AS added|; - my @join; - if($o{what} =~ /vn/) { - $select .= ', v.title, v.original'; - push @join, 'JOIN vn v ON v.id = wl.vid'; - } - - no if $] >= 5.022, warnings => 'redundant'; - my $order = sprintf { - title => 'v.title %s', - added => 'wl.added %s', - wstat => 'wl.wstat %2$s, v.title ASC', - }->{ $o{sort}||'added' }, $o{reverse} ? 'DESC' : 'ASC', $o{reverse} ? 'ASC' : 'DESC'; - - my($r, $np) = $self->dbPage(\%o, q| - SELECT !s - FROM wlists wl - !s - !W - ORDER BY !s|, - $select, join(' ', @join), \%where, $order, - ); - - return wantarray ? ($r, $np) : $r; -} - - -# Updates or adds a whishlist item -# Arguments: vid, uid, wstat -sub dbWishListAdd { - my($self, $vid, $uid, $wstat) = @_; - $self->dbExec( - 'UPDATE wlists SET wstat = ? WHERE uid = ? AND vid IN(!l)', - $wstat, $uid, ref($vid) eq 'ARRAY' ? $vid : [ $vid ] - ) - || - $self->dbExec( - 'INSERT INTO wlists (uid, vid, wstat) VALUES(!l)', - [ $uid, $vid, $wstat ] - ); -} - - -# Arguments: uid, vids -sub dbWishListDel { - my($self, $uid, $vid) = @_; - $self->dbExec( - 'DELETE FROM wlists WHERE uid = ? AND vid IN(!l)', - $uid, ref($vid) eq 'ARRAY' ? $vid : [ $vid ] - ); -} - - 1; diff --git a/lib/VNDB/Handler/ULists.pm b/lib/VNDB/Handler/ULists.pm index c605182e..03c079b1 100644 --- a/lib/VNDB/Handler/ULists.pm +++ b/lib/VNDB/Handler/ULists.pm @@ -3,83 +3,17 @@ package VNDB::Handler::ULists; use strict; use warnings; -use TUWF ':html', ':xml'; +use TUWF ':xml'; use VNDB::Func; use VNDB::Types; TUWF::register( - qr{v([1-9]\d*)/vote}, \&vnvote, - qr{v([1-9]\d*)/wish}, \&vnwish, - qr{v([1-9]\d*)/list}, \&vnlist_e, qr{r([1-9]\d*)/list}, \&rlist_e, qr{xml/rlist.xml}, \&rlist_e, - qr{(u)([1-9]\d*)/votes}, \&votelist, - qr{u([1-9]\d*)/wish}, \&wishlist, - qr{u([1-9]\d*)/list}, \&vnlist, ); -sub vnvote { - my($self, $id) = @_; - - my $uid = $self->authInfo->{id}; - return $self->htmlDenied() if !$uid; - - return if !$self->authCheckCode; - my $f = $self->formValidate( - { get => 'v', regex => qr/^(-1|([1-9]|10)(\.[0-9])?)$/ }, - { get => 'ref', required => 0, default => "/v$id" } - ); - return $self->resNotFound if $f->{_err} || ($f->{v} != -1 && ($f->{v} > 10 || $f->{v} < 1)); - - $self->dbVoteDel($uid, $id) if $f->{v} == -1; - $self->dbVoteAdd($id, $uid, $f->{v}*10) if $f->{v} > 0; - - $self->resRedirect($f->{ref}, 'temp'); -} - - -sub vnwish { - my($self, $id) = @_; - - my $uid = $self->authInfo->{id}; - return $self->htmlDenied() if !$uid; - - return if !$self->authCheckCode; - my $f = $self->formValidate( - { get => 's', enum => [ -1, keys %WISHLIST_STATUS ] }, - { get => 'ref', required => 0, default => "/v$id" } - ); - return $self->resNotFound if $f->{_err}; - - $self->dbWishListDel($uid, $id) if $f->{s} == -1; - $self->dbWishListAdd($id, $uid, $f->{s}) if $f->{s} != -1; - - $self->resRedirect($f->{ref}, 'temp'); -} - - -sub vnlist_e { - my($self, $id) = @_; - - my $uid = $self->authInfo->{id}; - return $self->htmlDenied() if !$uid; - - return if !$self->authCheckCode; - my $f = $self->formValidate( - { get => 'e', enum => [ -1, keys %VNLIST_STATUS ] }, - { get => 'ref', required => 0, default => "/v$id" } - ); - return $self->resNotFound if $f->{_err}; - - $self->dbVNListDel($uid, $id) if $f->{e} == -1; - $self->dbVNListAdd($uid, $id, $f->{e}) if $f->{e} != -1; - - $self->resRedirect($f->{ref}, 'temp'); -} - - sub rlist_e { my($self, $id) = @_; @@ -113,420 +47,5 @@ sub rlist_e { } } - -# XXX: $type eq 'v' is not used anymore. -sub votelist { - my($self, $type, $id) = @_; - - my $obj = $type eq 'v' ? $self->dbVNGet(id => $id)->[0] : $self->dbUserGet(uid => $id, what => 'hide_list')->[0]; - return $self->resNotFound if !$obj->{id}; - - my $own = $type eq 'u' && $self->authInfo->{id} && $self->authInfo->{id} == $id; - return $self->resNotFound if $type eq 'u' && !$own && !(!$obj->{hide_list} || $self->authCan('usermod')); - - my $f = $self->formValidate( - { get => 'p', required => 0, default => 1, template => 'page' }, - { get => 'o', required => 0, default => 'd', enum => ['a', 'd'] }, - { get => 's', required => 0, default => 'date', enum => [qw|date title vote|] }, - { get => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] }, - ); - return $self->resNotFound if $f->{_err}; - - if($own && $self->reqMethod eq 'POST') { - return if !$self->authCheckCode; - my $frm = $self->formValidate( - { post => 'vid', required => 1, multi => 1, template => 'id' }, - { post => 'batchvotes', required => 1, regex => qr/^(-1|([1-9]|10)(\.[0-9])?)$/ }, - ); - my @vid = grep $_ && $_ > 0, @{$frm->{vid}}; - if(!$frm->{_err} && @vid && $frm->{batchvotes} > -2) { - $self->dbVoteDel($id, \@vid) if $frm->{batchvotes} == -1; - $self->dbVoteAdd(\@vid, $id, $frm->{batchvotes}*10) if $frm->{batchvotes} > 0; - } - } - - my($list, $np) = $self->dbVoteGet( - $type.'id' => $id, - what => $type eq 'v' ? 'user hide_list' : 'vn', - hide_ign => $type eq 'v', - sort => $f->{s} eq 'title' && $type eq 'v' ? 'username' : $f->{s}, - reverse => $f->{o} eq 'd', - results => 50, - page => $f->{p}, - $type eq 'u' && $f->{c} ne 'all' ? (vn_char => $f->{c}) : (), - ); - - my $title = $type eq 'v' ? "Votes for $obj->{title}" : 'Votes by '.VNWeb::HTML::user_displayname($obj); - $self->htmlHeader(noindex => 1, type => $type, dbobj => $obj, title => $title); - $self->htmlMainTabs($type => $obj, 'votes'); - div class => 'mainbox'; - h1 $title; - if($type eq 'u') { - p class => 'browseopts'; - for ('all', 'a'..'z', 0) { - a href => "/$type$id/votes?c=$_", $_ eq $f->{c} ? (class => 'optselected') : (), $_ eq 'all' ? 'ALL' : $_ ? uc $_ : '#'; - } - end; - } - p 'No votes to list. :-(' if !@$list; - end; - - if($own) { - my $code = $self->authGetCode("/u$id/votes"); - form action => "/u$id/votes?formcode=$code;c=$f->{c};s=$f->{s};p=$f->{p}", method => 'post'; - } - - @$list && $self->htmlBrowse( - class => 'votelist', - items => $list, - options => $f, - nextpage => $np, - pageurl => "/$type$id/votes?c=$f->{c};o=$f->{o};s=$f->{s}", - sorturl => "/$type$id/votes?c=$f->{c}", - header => [ - [ 'Cast', 'date' ], - [ 'Vote', 'vote' ], - [ $type eq 'v' ? 'User' : 'Visual novel', 'title' ], - ], - row => sub { - my($s, $n, $l) = @_; - Tr; - td class => 'tc1'; - input type => 'checkbox', name => 'vid', value => $l->{vid} if $own; - txt ' '.fmtdate $l->{date}; - end; - td class => 'tc2', fmtvote $l->{vote}; - td class => 'tc3'; - if($type eq 'u') { - a href => "/v$l->{vid}", title => $l->{original}||$l->{title}, shorten $l->{title}, 100; - } elsif($l->{hide_list}) { - b class => 'grayedout', 'hidden'; - } else { - VNWeb::HTML::user_($l); - } - end; - end; - }, - $own ? (footer => sub { - Tr; - td colspan => 3, class => 'tc1'; - input type => 'checkbox', class => 'checkall', name => 'vid', value => 0; - txt ' '; - Select name => 'batchvotes', id => 'batchvotes'; - option value => -2, '-- with selected --'; - optgroup label => 'Change vote'; - option value => $_, sprintf '%d (%s)', $_, fmtrating $_ for (reverse 1..10); - option value => -3, 'Other'; - end; - option value => -1, 'revoke'; - end; - end; - end 'tr'; - }) : (), - ); - end if $own; - $self->htmlFooter; -} - - -sub wishlist { - my($self, $uid) = @_; - - my $own = $self->authInfo->{id} && $self->authInfo->{id} == $uid; - my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0]; - return $self->resNotFound if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod')); - - my $f = $self->formValidate( - { get => 'p', required => 0, default => 1, template => 'page' }, - { get => 'o', required => 0, default => 'd', enum => [ 'a', 'd' ] }, - { get => 's', required => 0, default => 'wstat', enum => [qw|title added wstat|] }, - { get => 'f', required => 0, default => -1, enum => [ -1, keys %WISHLIST_STATUS ] }, - ); - return $self->resNotFound if $f->{_err}; - - if($own && $self->reqMethod eq 'POST') { - return if !$self->authCheckCode; - my $frm = $self->formValidate( - { post => 'sel', required => 0, default => 0, multi => 1, template => 'id' }, - { post => 'batchedit', required => 1, enum => [ -1, keys %WISHLIST_STATUS ] }, - ); - $frm->{sel} = [ grep $_, @{$frm->{sel}} ]; # weed out "select all" checkbox - if(!$frm->{_err} && @{$frm->{sel}} && $frm->{sel}[0]) { - $self->dbWishListDel($uid, $frm->{sel}) if $frm->{batchedit} == -1; - $self->dbWishListAdd($frm->{sel}, $uid, $frm->{batchedit}) if $frm->{batchedit} >= 0; - } - } - - my($list, $np) = $self->dbWishListGet( - uid => $uid, - sort => $f->{s}, reverse => $f->{o} eq 'd', - $f->{f} != -1 ? (wstat => $f->{f}) : (), - what => 'vn', - results => 50, - page => $f->{p}, - ); - - my $title = $own ? 'My wishlist' : VNWeb::HTML::user_displayname($u)."'s wishlist"; - $self->htmlHeader(title => $title, noindex => 1, type => 'u', dbobj => $u); - $self->htmlMainTabs('u', $u, 'wish'); - div class => 'mainbox'; - h1 $title; - if(!@$list && $f->{f} == -1) { - p 'Wishlist empty...'; - end; - return $self->htmlFooter; - } - p class => 'browseopts'; - a $f->{f} == $_ ? (class => 'optselected') : (), href => "/u$uid/wish?f=$_", - $_ == -1 ? 'All priorities' : $WISHLIST_STATUS{$_} - for (-1, keys %WISHLIST_STATUS); - end; - end 'div'; - - if($own) { - my $code = $self->authGetCode("/u$uid/wish"); - form action => "/u$uid/wish?formcode=$code;f=$f->{f};o=$f->{o};s=$f->{s};p=$f->{p}", method => 'post'; - } - - $self->htmlBrowse( - class => 'wishlist', - items => $list, - nextpage => $np, - options => $f, - pageurl => "/u$uid/wish?f=$f->{f};o=$f->{o};s=$f->{s}", - sorturl => "/u$uid/wish?f=$f->{f}", - header => [ - [ 'Title' => 'title' ], - [ 'Priority' => 'wstat' ], - [ 'Added' => 'added' ], - ], - row => sub { - my($s, $n, $i) = @_; - Tr; - td class => 'tc1'; - input type => 'checkbox', name => 'sel', value => $i->{vid} - if $own; - a href => "/v$i->{vid}", title => $i->{original}||$i->{title}, ' '.shorten $i->{title}, 70; - end; - td class => 'tc2', $WISHLIST_STATUS{$i->{wstat}}; - td class => 'tc3', fmtdate $i->{added}, 'compact'; - end; - }, - $own ? (footer => sub { - Tr; - td colspan => 3; - input type => 'checkbox', class => 'checkall', name => 'sel', value => 0; - txt ' '; - Select name => 'batchedit', id => 'batchedit'; - option '-- with selected --'; - optgroup label => 'Change priority'; - option value => $_, $WISHLIST_STATUS{$_} - for (keys %WISHLIST_STATUS); - end; - option value => -1, 'remove from wishlist'; - end; - end; - end; - }) : (), - ); - end 'form' if $own; - $self->htmlFooter; -} - - -sub vnlist { - my($self, $uid) = @_; - - my $own = $self->authInfo->{id} && $self->authInfo->{id} == $uid; - my $u = $self->dbUserGet(uid => $uid, what => 'hide_list')->[0]; - return $self->resNotFound if !$u || !$own && !(!$u->{hide_list} || $self->authCan('usermod')); - - my $f = $self->formValidate( - { get => 'p', required => 0, default => 1, template => 'page' }, - { get => 'o', required => 0, default => 'a', enum => [ 'a', 'd' ] }, - { get => 's', required => 0, default => 'title', enum => [ 'title', 'vote' ] }, - { get => 'c', required => 0, default => 'all', enum => [ 'all', 'a'..'z', 0 ] }, - { get => 'v', required => 0, default => 0, enum => [ -1..1 ] }, - { get => 't', required => 0, default => -1, enum => [ -1, keys %VNLIST_STATUS ] }, - ); - return $self->resNotFound if $f->{_err}; - - if($own && $self->reqMethod eq 'POST') { - return if !$self->authCheckCode; - my $frm = $self->formValidate( - { post => 'vid', required => 0, default => 0, multi => 1, template => 'id' }, - { post => 'rid', required => 0, default => 0, multi => 1, template => 'id' }, - { post => 'not', required => 0, default => '', maxlength => 2000 }, - { post => 'vns', required => 1, enum => [ -2, -1, keys %VNLIST_STATUS, 999 ] }, - { post => 'rel', required => 1, enum => [ -2, -1, keys %RLIST_STATUS ] }, - ); - my @vid = grep $_ > 0, @{$frm->{vid}}; - my @rid = grep $_ > 0, @{$frm->{rid}}; - if(!$frm->{_err} && @vid && $frm->{vns} > -2) { - $self->dbVNListDel($uid, \@vid) if $frm->{vns} == -1; - $self->dbVNListAdd($uid, \@vid, $frm->{vns}) if $frm->{vns} >= 0 && $frm->{vns} < 999; - $self->dbVNListAdd($uid, \@vid, undef, $frm->{not}) if $frm->{vns} == 999; - } - if(!$frm->{_err} && @rid && $frm->{rel} > -2) { - $self->dbRListDel($uid, \@rid) if $frm->{rel} == -1; - $self->dbRListAdd($uid, \@rid, $frm->{rel}) if $frm->{rel} >= 0; - } - } - - my($list, $np) = $self->dbVNListList( - uid => $uid, - results => 50, - page => $f->{p}, - sort => $f->{s}, reverse => $f->{o} eq 'd', - voted => $f->{v} == 0 ? undef : $f->{v} < 0 ? 0 : $f->{v}, - $f->{c} ne 'all' ? (char => $f->{c}) : (), - $f->{t} >= 0 ? (status => $f->{t}) : (), - ); - - my $title = $own ? 'My visual novel list' : VNWeb::HTML::user_displayname($u)."'s visual novel list"; - $self->htmlHeader(title => $title, noindex => 1, type => 'u', dbobj => $u); - $self->htmlMainTabs('u', $u, 'list'); - - # url generator - my $url = sub { - my($n, $v) = @_; - $n ||= ''; - local $_ = "/u$uid/list"; - $_ .= '?c='.($n eq 'c' ? $v : $f->{c}); - $_ .= ';v='.($n eq 'v' ? $v : $f->{v}); - $_ .= ';t='.($n eq 't' ? $v : $f->{t}); - if($n eq 'page') { - $_ .= ';o='.($n eq 'o' ? $v : $f->{o}); - $_ .= ';s='.($n eq 's' ? $v : $f->{s}); - } - return $_; - }; - - div class => 'mainbox'; - h1 $title; - p class => 'browseopts'; - for ('all', 'a'..'z', 0) { - a href => $url->(c => $_), $_ eq $f->{c} ? (class => 'optselected') : (), $_ eq 'all' ? 'ALL' : $_ ? uc $_ : '#'; - } - end; - p class => 'browseopts'; - a href => $url->(v => 0), 0 == $f->{v} ? (class => 'optselected') : (), 'All'; - a href => $url->(v => 1), 1 == $f->{v} ? (class => 'optselected') : (), 'Only voted'; - a href => $url->(v => -1), -1 == $f->{v} ? (class => 'optselected') : (), 'Hide voted'; - end; - p class => 'browseopts'; - a href => $url->(t => -1), -1 == $f->{t} ? (class => 'optselected') : (), 'All'; - a href => $url->(t => $_), $_ == $f->{t} ? (class => 'optselected') : (), $VNLIST_STATUS{$_} for keys %VNLIST_STATUS; - end; - end 'div'; - - _vnlist_browse($self, $own, $list, $np, $f, $url, $uid); - $self->htmlFooter; -} - -sub _vnlist_browse { - my($self, $own, $list, $np, $f, $url, $uid) = @_; - - if($own) { - form action => $url->(), method => 'post'; - input type => 'hidden', class => 'hidden', name => 'not', id => 'not', value => ''; - input type => 'hidden', class => 'hidden', name => 'formcode', id => 'formcode', value => $self->authGetCode("/u$uid/list"); - } - - $self->htmlBrowse( - class => 'rlist', - items => $list, - nextpage => $np, - options => $f, - sorturl => $url->(), - pageurl => $url->('page'), - header => [ - [ '' ], - sub { td class => 'tc2', id => 'expandall'; lit '▸'; end; }, - [ 'Title' => 'title' ], - [ '' ], [ '' ], - [ 'Status' ], - [ 'Releases*' ], - [ 'Vote' => 'vote' ], - ], - row => sub { - my($s, $n, $i) = @_; - Tr class => 'nostripe'.($n%2 ? ' odd' : ''); - td class => 'tc1'; input type => 'checkbox', name => 'vid', value => $i->{vid} if $own; end; - if(@{$i->{rels}}) { - td class => 'tc2 collapse_but', id => "vid$i->{vid}"; lit '▸'; end; - } else { - td class => 'tc2', ''; - } - td class => 'tc3_5', colspan => 3; - a href => "/v$i->{vid}", title => $i->{original}||$i->{title}, shorten $i->{title}, 70; - b class => 'grayedout', $i->{notes} if $i->{notes}; - end; - td class => 'tc6', $i->{status} ? $VNLIST_STATUS{$i->{status}} : ''; - td class => 'tc7'; - my $obtained = grep $_->{status}==2, @{$i->{rels}}; - my $total = scalar @{$i->{rels}}; - my $txt = sprintf '%d/%d', $obtained, $total; - $txt = qq|<b class="done">$txt</b>| if $total && $obtained == $total; - $txt = qq|<b class="todo">$txt</b>| if $obtained < $total; - lit $txt; - end; - td class => 'tc8', fmtvote $i->{vote}; - end 'tr'; - - for (@{$i->{rels}}) { - Tr class => "nostripe collapse relhid collapse_vid$i->{vid}".($n%2 ? ' odd':''); - td class => 'tc1', ''; - td class => 'tc2'; - input type => 'checkbox', name => 'rid', value => $_->{rid} if $own; - end; - td class => 'tc3'; - lit fmtdatestr $_->{released}; - end; - td class => 'tc4'; - cssicon "lang $_", $LANGUAGE{$_} for @{$_->{languages}}; - cssicon "rt$_->{type}", $_->{type}; - end; - td class => 'tc5'; - a href => "/r$_->{rid}", title => $_->{original}||$_->{title}, shorten $_->{title}, 50; - end; - td class => 'tc6', $_->{status} ? $RLIST_STATUS{$_->{status}} : ''; - td class => 'tc7_8', colspan => 2, ''; - end 'tr'; - } - }, - - $own ? (footer => sub { - Tr; - td class => 'tc1'; input type => 'checkbox', name => 'vid', value => 0, class => 'checkall'; end; - td class => 'tc2'; input type => 'checkbox', name => 'rid', value => 0, class => 'checkall'; end; - td class => 'tc3_6', colspan => 4; - Select id => 'vns', name => 'vns'; - option value => -2, '-- with selected VNs --'; - optgroup label => 'Change status'; - option value => $_, $VNLIST_STATUS{$_} - for (keys %VNLIST_STATUS); - end; - option value => 999, 'Set note'; - option value => -1, 'remove from list'; - end; - Select id => 'rel', name => 'rel'; - option value => -2, '-- with selected releases --'; - optgroup label => 'Change status'; - option value => $_, $RLIST_STATUS{$_} - for (keys %RLIST_STATUS); - end; - option value => -1, 'remove from list'; - end; - input type => 'submit', value => 'Update'; - end; - td class => 'tc7_8', colspan => 2, '* Obtained/total'; - end 'tr'; - }) : (), - ); - - end 'form' if $own; -} - 1; diff --git a/lib/VNWeb/User/Lists.pm b/lib/VNWeb/User/Lists.pm index e909fa2e..2c0548c1 100644 --- a/lib/VNWeb/User/Lists.pm +++ b/lib/VNWeb/User/Lists.pm @@ -566,4 +566,12 @@ TUWF::get qr{/$RE{uid}/ulist}, sub { }; }; + + +# Redirects for old URLs +TUWF::get qr{/$RE{uid}/votes}, sub { tuwf->resRedirect("/u".tuwf->capture('id').'/ulist?votes=1', 'perm') }; +TUWF::get qr{/$RE{uid}/list}, sub { tuwf->resRedirect("/u".tuwf->capture('id').'/ulist?vnlist=1', 'perm') }; +TUWF::get qr{/$RE{uid}/wish}, sub { tuwf->resRedirect("/u".tuwf->capture('id').'/ulist?wishlist=1', 'perm') }; + + 1; |