diff options
author | Yorhel <git@yorhel.nl> | 2022-08-30 12:43:27 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2022-08-30 12:44:07 +0200 |
commit | fe97972d35d0b3fdb525ee2f2f5fe05bf977b7fe (patch) | |
tree | 7d857deffcba3f1114cf5f95e26f603e5a1bae9d /lib | |
parent | 34fabe3ebeb17119aac578bcb224fd9c74fb93ea (diff) |
Also add trait overrides
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VNWeb/Chars/Page.pm | 49 | ||||
-rw-r--r-- | lib/VNWeb/Chars/VNTab.pm | 1 | ||||
-rw-r--r-- | lib/VNWeb/User/Edit.pm | 13 | ||||
-rw-r--r-- | lib/VNWeb/VN/Page.pm | 18 |
4 files changed, 59 insertions, 22 deletions
diff --git a/lib/VNWeb/Chars/Page.pm b/lib/VNWeb/Chars/Page.pm index 4829fe54..2c8dc24c 100644 --- a/lib/VNWeb/Chars/Page.pm +++ b/lib/VNWeb/Chars/Page.pm @@ -16,6 +16,18 @@ sub enrich_seiyuu { }, @chars; } +sub sql_trait_overrides { + sql '( + WITH RECURSIVE trait_overrides (tid, spoil, childs, lvl) AS ( + SELECT tid, spoil, childs, 0 FROM users_prefs_traits WHERE id =', \auth->uid, ' + UNION ALL + SELECT tp.id, x.spoil, true, lvl+1 + FROM trait_overrides x + JOIN traits_parents tp ON tp.parent = x.tid + WHERE x.childs + ) SELECT DISTINCT ON(tid) tid, spoil FROM trait_overrides ORDER BY tid, lvl + )'; +} sub enrich_item { my($c) = @_; @@ -23,9 +35,17 @@ sub enrich_item { enrich_image_obj image => $c; enrich_merge vid => 'SELECT id AS vid, title, alttitle, c_released AS vn_released FROM vnt WHERE id IN', $c->{vns}; enrich_merge rid => 'SELECT id AS rid, title AS rtitle, original AS roriginal, released AS rel_released FROM releases WHERE id IN', grep $_->{rid}, $c->{vns}->@*; - enrich_merge tid => - 'SELECT t.id AS tid, t.name, t.hidden, t.locked, t.applicable, t.sexual, coalesce(g.id, t.id) AS group, coalesce(g.name, t.name) AS groupname, coalesce(g.order,0) AS order - FROM traits t LEFT JOIN traits g ON t.group = g.id WHERE t.id IN', $c->{traits}; + + # Even with trait overrides, we'll want to see the raw data in revision diffs, + # so fetch the raw spoil as a separate column and do filtering/processing later. + enrich_merge tid => sub { sql ' + SELECT t.id AS tid, t.name, t.hidden, t.locked, t.applicable, t.sexual, x.spoil AS override + , coalesce(g.id, t.id) AS group, coalesce(g.name, t.name) AS groupname, coalesce(g.order,0) AS order + FROM traits t + LEFT JOIN traits g ON t.group = g.id + LEFT JOIN', sql_trait_overrides(), 'x ON x.tid = t.id + WHERE t.id IN', $_ + }, $c->{traits}; $c->{vns} = [ sort { $a->{vn_released} <=> $b->{vn_released} || ($a->{rel_released}||0) <=> ($b->{rel_released}||0) || $a->{title} cmp $b->{title} || idcmp($a->{vid}, $b->{vid}) || idcmp($a->{rid}||'r999999', $b->{rid}||'r999999') } $c->{vns}->@* ]; @@ -53,12 +73,14 @@ sub fetch_chars { }, $l; enrich traits => id => id => sub { sql ' - SELECT ct.id, ct.tid, ct.spoil, t.name, t.hidden, t.locked, t.sexual, coalesce(g.id, t.id) AS group, coalesce(g.name, t.name) AS groupname, coalesce(g.order,0) AS order - FROM chars_traits ct - JOIN traits t ON t.id = ct.tid - LEFT JOIN traits g ON t.group = g.id - WHERE ct.id IN', $_, ' - ORDER BY g.order NULLS FIRST, coalesce(g.name, t.name), t.name' + SELECT ct.id, ct.tid, COALESCE(x.spoil, ct.spoil) AS spoil, t.name, t.hidden, t.locked, t.sexual + , coalesce(g.id, t.id) AS group, coalesce(g.name, t.name) AS groupname, coalesce(g.order,0) AS order + FROM chars_traits ct + JOIN traits t ON t.id = ct.tid + LEFT JOIN traits g ON t.group = g.id + LEFT JOIN', sql_trait_overrides(), 'x ON x.tid = ct.tid + WHERE x.spoil IS DISTINCT FROM 1+1+1 AND ct.id IN', $_, ' + ORDER BY g.order NULLS FIRST, coalesce(g.name, t.name), t.name' }, $l; enrich_seiyuu $vid, $l; @@ -160,13 +182,16 @@ sub chartable_ { } if defined $c->{age}; my @groups; - for(grep !$_->{hidden} && $_->{spoil} <= $view->{spoilers} && (!$_->{sexual} || $view->{traits_sexual}), $c->{traits}->@*) { + for(grep !$_->{hidden} && ($_->{override}//$_->{spoil}) <= $view->{spoilers} && (!$_->{sexual} || $view->{traits_sexual}), $c->{traits}->@*) { push @groups, $_ if !@groups || $groups[$#groups]{group} ne $_->{group}; push $groups[$#groups]{traits}->@*, $_; } tr_ class => "trait_group_$_->{group}", sub { td_ class => 'key', sub { a_ href => "/$_->{group}", $_->{groupname} }; - td_ sub { join_ ', ', sub { a_ href => "/$_->{tid}", $_->{name}; spoil_ $_->{spoil} }, $_->{traits}->@* }; + td_ sub { join_ ', ', sub { + my $spoil = $_->{override}//$_->{spoil}; + a_ href => "/$_->{tid}", class => $spoil==-1?'standout':undef, $_->{name}; spoil_ $spoil + }, $_->{traits}->@* }; } for @groups; my @visvns = grep $_->{spoil} <= $view->{spoilers}, $c->{vns}->@*; @@ -246,7 +271,7 @@ TUWF::get qr{/$RE{crev}} => sub { my $max_spoil = max( $inst_maxspoil||0, - (map $_->{spoil}, grep !$_->{hidden}, $c->{traits}->@*), + (map $_->{override}//$_->{spoil}, grep !$_->{hidden} && !(($_->{override}//0) == 3), $c->{traits}->@*), (map $_->{spoil}, $c->{vns}->@*), defined $c->{spoil_gender} ? 2 : 0, $c->{desc} =~ /\[spoiler\]/i ? 2 : 0, # crude diff --git a/lib/VNWeb/Chars/VNTab.pm b/lib/VNWeb/Chars/VNTab.pm index 3c6fba75..4b4a07d0 100644 --- a/lib/VNWeb/Chars/VNTab.pm +++ b/lib/VNWeb/Chars/VNTab.pm @@ -21,6 +21,7 @@ sub chars_ { my sub opts_ { p_ class => 'mainopts', sub { + debug_ $chars; if($max_spoil) { a_ mkclass(checked => $view->{spoilers} == 0), href => '?view='.viewset(spoilers=>0,traits_sexual=>$view->{traits_sexual}).'#chars', 'Hide spoilers'; a_ mkclass(checked => $view->{spoilers} == 1), href => '?view='.viewset(spoilers=>1,traits_sexual=>$view->{traits_sexual}).'#chars', 'Show minor spoilers'; diff --git a/lib/VNWeb/User/Edit.pm b/lib/VNWeb/User/Edit.pm index 41353615..e52758ff 100644 --- a/lib/VNWeb/User/Edit.pm +++ b/lib/VNWeb/User/Edit.pm @@ -62,12 +62,19 @@ my $FORM = { title_langs => { langpref => 1 }, alttitle_langs => { langpref => 1 }, - tagprefs => { sort_keys => 'tag', maxlength => 500, aoh => { + tagprefs => { sort_keys => 'tid', maxlength => 500, aoh => { tid => { vndbid => 'g' }, spoil => { int => 1, range => [ -1, 3 ] }, childs => { anybool => 1 }, name => {}, } }, + traitprefs => { sort_keys => 'tid', maxlength => 500, aoh => { + tid => { vndbid => 'i' }, + spoil => { int => 1, range => [ -1, 3 ] }, + childs => { anybool => 1 }, + name => {}, + group => { required => 0 }, + } }, # Supporter options nodistract_noads => { anybool => 1 }, @@ -120,6 +127,7 @@ TUWF::get qr{/$RE{uid}/edit}, sub { $u->{prefs}{alttitle_langs} = langpref_parse($u->{prefs}{alttitle_langs}) // $DEFAULT_ALTTITLE_LANGS; $u->{prefs}{traits} = tuwf->dbAlli('SELECT u.tid, t.name, g.name AS "group" FROM users_traits u JOIN traits t ON t.id = u.tid LEFT JOIN traits g ON g.id = t.group WHERE u.id =', \$u->{id}, 'ORDER BY g.order, t.name'); $u->{prefs}{tagprefs} = tuwf->dbAlli('SELECT u.tid, u.spoil, u.childs, t.name FROM users_prefs_tags u JOIN tags t ON t.id = u.tid WHERE u.id =', \$u->{id}, 'ORDER BY t.name'); + $u->{prefs}{traitprefs} = tuwf->dbAlli('SELECT u.tid, u.spoil, u.childs, t.name, g.name as "group" FROM users_prefs_traits u JOIN traits t ON t.id = u.tid LEFT JOIN traits g ON g.id = t.group WHERE u.id =', \$u->{id}, 'ORDER BY g.order, t.name'); } $u->{admin} = auth->permDbmod || auth->permUsermod || auth->permTagmod || auth->permBoardmod ? @@ -172,6 +180,9 @@ elm_api UserEdit => $FORM_OUT, $FORM_IN, sub { tuwf->dbExeci('DELETE FROM users_prefs_tags WHERE id =', \$data->{id}); tuwf->dbExeci('INSERT INTO users_prefs_tags', { id => $data->{id}, tid => $_->{tid}, spoil => $_->{spoil}, childs => $_->{childs} }) for $p->{tagprefs}->@*; + + tuwf->dbExeci('DELETE FROM users_prefs_traits WHERE id =', \$data->{id}); + tuwf->dbExeci('INSERT INTO users_prefs_traits', { id => $data->{id}, tid => $_->{tid}, spoil => $_->{spoil}, childs => $_->{childs} }) for $p->{traitprefs}->@*; } if(auth->permUsermod) { diff --git a/lib/VNWeb/VN/Page.pm b/lib/VNWeb/VN/Page.pm index 68b31c54..ec54dbe7 100644 --- a/lib/VNWeb/VN/Page.pm +++ b/lib/VNWeb/VN/Page.pm @@ -47,19 +47,19 @@ sub enrich_vn { WHERE tv.vid =', \$v->{id}, ' ORDER BY rating DESC, t.name' ) : tuwf->dbAlli(' - WITH RECURSIVE tag_prefs (tid, spoil, childs) AS ( - SELECT tid, spoil, childs FROM users_prefs_tags WHERE id =', \auth->uid, ' - ), tag_overrides (tid, spoil, childs) AS ( - SELECT tid, spoil, childs FROM tag_prefs + WITH RECURSIVE tag_overrides (tid, spoil, childs, lvl) AS ( + SELECT tid, spoil, childs, 0 FROM users_prefs_tags WHERE id =', \auth->uid, ' UNION ALL - SELECT tp.id, x.spoil, true + SELECT tp.id, x.spoil, true, lvl+1 FROM tag_overrides x - JOIN tags_parents tp ON tp.parent = x.tid AND tp.main - WHERE x.childs AND NOT EXISTS(SELECT 1 FROM tag_prefs y WHERE y.tid = tp.id) + JOIN tags_parents tp ON tp.parent = x.tid + WHERE x.childs + ), tag_overrides_grouped (tid, spoil) AS ( + SELECT DISTINCT ON(tid) tid, spoil FROM tag_overrides ORDER BY tid, lvl ) SELECT t.id, t.name, t.cat, tv.rating, COALESCE(x.spoil, tv.spoiler) AS spoiler, tv.lie, x.tid IS NOT NULL AS override FROM tags t JOIN tags_vn_direct tv ON t.id = tv.tag - LEFT JOIN tag_overrides x ON x.tid = tv.tag + LEFT JOIN tag_overrides_grouped x ON x.tid = tv.tag WHERE tv.vid =', \$v->{id}, 'AND x.spoil IS DISTINCT FROM 1+1+1 ORDER BY rating DESC, t.name' ); @@ -923,7 +923,7 @@ sub tags_ { standout => $t->{spoiler} == -1, lie => $view->{spoilers} > 1 && $t->{lie}, parent => !$t->{rating}), $t->{name}; - spoil_ max 0, $t->{spoiler}; + spoil_ $t->{spoiler}; } if $lvl; if($t->{childs}) { |