summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2022-08-30 12:43:27 +0200
committerYorhel <git@yorhel.nl>2022-08-30 12:44:07 +0200
commitfe97972d35d0b3fdb525ee2f2f5fe05bf977b7fe (patch)
tree7d857deffcba3f1114cf5f95e26f603e5a1bae9d /lib
parent34fabe3ebeb17119aac578bcb224fd9c74fb93ea (diff)
Also add trait overrides
Diffstat (limited to 'lib')
-rw-r--r--lib/VNWeb/Chars/Page.pm49
-rw-r--r--lib/VNWeb/Chars/VNTab.pm1
-rw-r--r--lib/VNWeb/User/Edit.pm13
-rw-r--r--lib/VNWeb/VN/Page.pm18
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}) {