diff options
-rw-r--r-- | data/lang.txt | 45 | ||||
-rw-r--r-- | lib/VNDB/DB/Chars.pm | 42 | ||||
-rw-r--r-- | lib/VNDB/Handler/Chars.pm | 60 | ||||
-rw-r--r-- | util/sql/func.sql | 6 | ||||
-rw-r--r-- | util/updates/update_2.19.sql | 9 |
5 files changed, 141 insertions, 21 deletions
diff --git a/data/lang.txt b/data/lang.txt index 34213637..5f0e28c9 100644 --- a/data/lang.txt +++ b/data/lang.txt @@ -1230,6 +1230,37 @@ hu*: nl : Beide +# Character roles + +:_charrole_main +en : Protagonist +ru*: +cs*: +hu*: +nl : + +:_charrole_primary +en : Primary character +ru*: +cs*: +hu*: +nl : Belangrijke rol + +:_charrole_side +en : Side character +ru*: +cs*: +hu*: +nl : Onbelangrijke rol + +:_charrole_appears +en : Makes an appearance +ru*: +cs*: +hu*: +nl : Figurant + + ############################################################################# @@ -4913,6 +4944,13 @@ cs*: hu*: nl : Kenmerken +:_revfield_c_vns +en : Visual novels +ru*: +cs*: +hu*: +nl : + :_chdiff_image_proc en : ~[processing~] ru : ~[обработка~] @@ -5222,6 +5260,13 @@ cs*: hu*: nl : Nog geen kenmerken aanwezig. +:_chare_vns +en : Visual novels +ru*: +cs*: +hu*: +nl : + diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm index c5c16932..03771132 100644 --- a/lib/VNDB/DB/Chars.pm +++ b/lib/VNDB/DB/Chars.pm @@ -9,7 +9,7 @@ our @EXPORT = qw|dbCharGet dbCharRevisionInsert dbCharImageId|; # options: id rev traitspoil trait_inc trait_exc what results page -# what: extended traits changes +# what: extended traits vns changes sub dbCharGet { my $self = shift; my %o = ( @@ -48,27 +48,41 @@ sub dbCharGet { join(', ', @select), join(' ', @join), \%where ); - if(@$r && $o{what} =~ /traits/) { + if(@$r && $o{what} =~ /(vns|traits)/) { my %r = map { $_->{traits} = []; - ($_->{cid}, $_->{traits}) + $_->{vns} = []; + ($_->{cid}, $_) } @$r; - push @{$r{ delete $_->{cid} }}, $_ for (@{$self->dbAll(q| - SELECT ct.cid, ct.tid, ct.spoil, t.name, t."group", tg.name AS groupname - FROM chars_traits ct - JOIN traits t ON t.id = ct.tid - LEFT JOIN traits tg ON tg.id = t."group" - WHERE cid IN(!l)|, [ keys %r ] - )}); + if($o{what} =~ /traits/) { + push @{$r{ delete $_->{cid} }{traits}}, $_ for (@{$self->dbAll(q| + SELECT ct.cid, ct.tid, ct.spoil, t.name, t."group", tg.name AS groupname + FROM chars_traits ct + JOIN traits t ON t.id = ct.tid + LEFT JOIN traits tg ON tg.id = t."group" + WHERE cid IN(!l)|, [ keys %r ] + )}); + } + + if($o{what} =~ /vns/) { + push @{$r{ delete $_->{cid} }{vns}}, $_ for (@{$self->dbAll(q| + SELECT cv.cid, cv.vid, cv.rid, cv.spoil, cv.role, vr.title AS vntitle, rr.title AS rtitle + FROM chars_vns cv + JOIN vn v ON cv.vid = v.id + JOIN vn_rev vr ON vr.id = v.latest + LEFT JOIN releases r ON cv.rid = r.id + LEFT JOIN releases_rev rr ON rr.id = r.latest + WHERE cv.cid IN(!l)|, [ keys %r ] + )}); + } } - return wantarray ? ($r, $np) : $r; } # Updates the edit_* tables, used from dbItemEdit() -# Arguments: { columns in chars_rev + traits }, +# Arguments: { columns in chars_rev + traits + vns }, sub dbCharRevisionInsert { my($self, $o) = @_; @@ -80,6 +94,10 @@ sub dbCharRevisionInsert { $self->dbExec('DELETE FROM edit_char_traits'); $self->dbExec('INSERT INTO edit_char_traits (tid, spoil) VALUES (?,?)', $_->[0],$_->[1]) for (@{$o->{traits}}); } + if($o->{vns}) { + $self->dbExec('DELETE FROM edit_char_vns'); + $self->dbExec('INSERT INTO edit_char_vns (vid, rid, spoil, role) VALUES(!l)', $_) for (@{$o->{vns}}); + } } diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm index 5a6d2e0e..ef15b823 100644 --- a/lib/VNDB/Handler/Chars.pm +++ b/lib/VNDB/Handler/Chars.pm @@ -19,7 +19,7 @@ sub page { my $r = $self->dbCharGet( id => $id, - what => 'extended traits'.($rev ? ' changes' : ''), + what => 'extended traits vns'.($rev ? ' changes' : ''), $rev ? ( rev => $rev ) : () )->[0]; return $self->resNotFound if !$r->{id}; @@ -29,7 +29,7 @@ sub page { return if $self->htmlHiddenMessage('c', $r); if($rev) { - my $prev = $rev && $rev > 1 && $self->dbCharGet(id => $id, rev => $rev-1, what => 'changes extended traits')->[0]; + my $prev = $rev && $rev > 1 && $self->dbCharGet(id => $id, rev => $rev-1, what => 'changes extended traits vns')->[0]; $self->htmlRevision('c', $prev, $r, [ name => diff => 1 ], [ original => diff => 1 ], @@ -53,6 +53,11 @@ sub page { $_->{tid}, $_->{name}, mt("_spoil_$_->{spoil}")), sort { ($a->{groupname}||$a->{name}) cmp ($b->{groupname}||$b->{name}) || $a->{name} cmp $b->{name} } @{$_[0]} }], + [ vns => join => '<br />', split => sub { + map sprintf('<a href="/v%d">v%d</a> %s %s (%s)', $_->{vid}, $_->{vid}, + $_->{rid}?sprintf('[<a href="/r%d">r%d</a>]', $_->{rid}, $_->{rid}):'', + mt("_charrole_$_->{role}"), mt("_spoil_$_->{spoil}")), @{$_[0]}; + }], ); } @@ -130,6 +135,42 @@ sub page { end; } + # vns + # TODO: handle spoilers! + if(@{$r->{vns}}) { + my %vns; + push @{$vns{$_->{vid}}}, $_ for(sort { !defined($a->{rid})?1:!defined($b->{rid})?-1:$a->{rtitle} cmp $b->{rtitle} } @{$r->{vns}}); + Tr ++$i % 2 ? (class => 'odd') : (); + td class => 'key', 'Visual novels'; + td; + my $first = 0; + for my $g (sort { $vns{$a}[0]{vntitle} cmp $vns{$b}[0]{vntitle} } keys %vns) { + br if $first++; + my @r = @{$vns{$g}}; + # special case: all releases, no exceptions + if(@r == 1 && !$r[0]{rid}) { + txt mt("_charrole_$r[0]{role}").' - '; + a href => "/v$r[0]{vid}", $r[0]{vntitle}; + next; + } + # otherwise, print VN title and list releases separately + a href => "/v$r[0]{vid}", $r[0]{vntitle}; + for(@r) { + br; + b class => 'grayedout', '> '; + txt mt("_charrole_$_->{role}").' - '; + if($_->{rid}) { + b class => 'grayedout', "r$_->{rid}:"; + a href => "/r$_->{rid}", $_->{rtitle}; + } else { + txt 'All other releases'; + } + } + } + end; + end; + } + # description if($r->{desc}) { Tr; @@ -156,7 +197,7 @@ sub page { sub edit { my($self, $id, $rev) = @_; - my $r = $id && $self->dbCharGet(id => $id, what => 'changes extended traits', $rev ? (rev => $rev) : ())->[0]; + my $r = $id && $self->dbCharGet(id => $id, what => 'changes extended vns traits', $rev ? (rev => $rev) : ())->[0]; return $self->resNotFound if $id && !$r->{id}; $rev = undef if !$r || $r->{cid} == $r->{latest}; @@ -166,7 +207,9 @@ sub edit { my %b4 = !$id ? () : ( (map +($_ => $r->{$_}), qw|name original alias desc image ihid ilock s_bust s_waist s_hip height weight bloodt gender|), bday => $r->{b_month} ? sprintf('%02d-%02d', $r->{b_month}, $r->{b_day}) : '', - traits => join(' ', map sprintf('%d-%d', $_->{tid}, $_->{spoil}), @{$r->{traits}}), + traits => join(' ', map sprintf('%d-%d', $_->{tid}, $_->{spoil}), sort { $a->{tid} <=> $b->{tid} } @{$r->{traits}}), + vns => join(' ', map sprintf('%d-%d-%d-%s', $_->{vid}, $_->{rid}||0, $_->{spoil}, $_->{role}), + sort { $a->{vid} <=> $b->{vid} || ($a->{rid}||0) <=> ($b->{rid}||0) } @{$r->{vns}}), ); my $frm; @@ -187,6 +230,7 @@ sub edit { { post => 'weight', required => 0, default => 0, template => 'int' }, { post => 'bloodt', required => 0, default => 'unknown', enum => $self->{blood_types} }, { post => 'traits', required => 0, default => '', regex => [ qr/^(?:[1-9]\d*-[0-2])(?: +[1-9]\d*-[0-2])*$/, 'Incorrect trait format.' ] }, + { post => 'vns', required => 0, default => '', regex => [ qr/^(?:[1-9]\d*-\d+-[0-2]-[a-z]+)(?: +[1-9]\d*-\d+-[0-2]-[a-z]+)*$/, 'Incorrect VN format.' ] }, { post => 'editsum', required => 0, maxlength => 5000 }, { post => 'ihid', required => 0 }, { post => 'ilock', required => 0 }, @@ -199,7 +243,9 @@ sub edit { if(!$frm->{_err}) { # parse and normalize my @traits = sort { $a->[0] <=> $b->[0] } map /^(\d+)-(\d+)$/&&[$1,$2], split / /, $frm->{traits}; + my @vns = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } map [split /-/], split / /, $frm->{vns}; $frm->{traits} = join(' ', map sprintf('%d-%d', @$_), @traits); + $frm->{vns} = join(' ', map sprintf('%d-%d-%d-%s', @$_), @vns); $frm->{ihid} = $frm->{ihid} ?1:0; $frm->{ilock} = $frm->{ilock}?1:0; @@ -210,6 +256,8 @@ sub edit { # modify for dbCharRevisionInsert ($frm->{b_month}, $frm->{b_day}) = delete($frm->{bday}) =~ /^(\d{2})-(\d{2})$/ ? ($1, $2) : (0, 0); $frm->{traits} = \@traits; + $_->[1]||=undef for (@vns); + $frm->{vns} = \@vns; my $nrev = $self->dbItemEdit(c => $id ? $r->{cid} : undef, %$frm); @@ -279,6 +327,10 @@ sub edit { td colspan => 2, ''; end; end 'table'; }], + ], + + chare_vns => [ mt('_chare_vns'), + [ input => short => 'vns', name => 'VNs (debug)' ], ]); $self->htmlFooter; } diff --git a/util/sql/func.sql b/util/sql/func.sql index 6ae0312b..5a43ae0f 100644 --- a/util/sql/func.sql +++ b/util/sql/func.sql @@ -415,8 +415,10 @@ BEGIN ALTER TABLE edit_char DROP COLUMN cid; CREATE TEMPORARY TABLE edit_char_traits (LIKE chars_traits INCLUDING DEFAULTS INCLUDING CONSTRAINTS); ALTER TABLE edit_char_traits DROP COLUMN cid; + CREATE TEMPORARY TABLE edit_char_vns (LIKE chars_vns INCLUDING DEFAULTS INCLUDING CONSTRAINTS); + ALTER TABLE edit_char_vns DROP COLUMN cid; EXCEPTION WHEN duplicate_table THEN - TRUNCATE edit_char, edit_char_traits; + TRUNCATE edit_char, edit_char_traits, edit_char_vns; END; PERFORM edit_revtable('c', hid); -- new char @@ -426,6 +428,7 @@ BEGIN ELSE INSERT INTO edit_char SELECT name, original, alias, image, "desc", gender, s_bust, s_waist, s_hip, b_month, b_day, height, weight, bloodt FROM chars_rev WHERE id = hid; INSERT INTO edit_char_traits SELECT tid, spoil FROM chars_traits WHERE cid = hid; + INSERT INTO edit_char_vns SELECT vid, rid, spoil, role FROM chars_vns WHERE cid = hid; END IF; END; $$ LANGUAGE plpgsql; @@ -442,6 +445,7 @@ BEGIN SELECT INTO r * FROM edit_commit(); INSERT INTO chars_rev SELECT r.cid, r.iid, name, original, alias, image, "desc", gender, s_bust, s_waist, s_hip, b_month, b_day, height, weight, bloodt FROM edit_char; INSERT INTO chars_traits SELECT r.cid, tid, spoil FROM edit_char_traits; + INSERT INTO chars_vns SELECT r.cid, vid, rid, spoil, role FROM edit_char_vns; UPDATE chars SET latest = r.cid WHERE id = r.iid; RETURN r; END; diff --git a/util/updates/update_2.19.sql b/util/updates/update_2.19.sql index c8fb1119..bc1b5afe 100644 --- a/util/updates/update_2.19.sql +++ b/util/updates/update_2.19.sql @@ -73,11 +73,12 @@ CREATE TABLE chars_traits ( CREATE TABLE chars_vns ( cid integer NOT NULL REFERENCES chars_rev (id), vid integer NOT NULL REFERENCES vn (id), - rid integer REFERENCES releases (id), - spoil boolean NOT NULL DEFAULT false, - role char_role NOT NULL DEFAULT 'main', - PRIMARY KEY(cid, vid, rid) + rid integer NULL REFERENCES releases (id), + spoil smallint NOT NULL DEFAULT 0, + role char_role NOT NULL DEFAULT 'main' ); +-- primary key won't work when one column allows NULL +CREATE UNIQUE INDEX chars_vns_pkey ON chars_vns (cid, vid, COALESCE(rid, 0)); -- cache table CREATE TABLE traits_chars ( |