diff options
Diffstat (limited to 'lib/VNWeb/User/Page.pm')
-rw-r--r-- | lib/VNWeb/User/Page.pm | 85 |
1 files changed, 56 insertions, 29 deletions
diff --git a/lib/VNWeb/User/Page.pm b/lib/VNWeb/User/Page.pm index ff4361b0..db4f7a36 100644 --- a/lib/VNWeb/User/Page.pm +++ b/lib/VNWeb/User/Page.pm @@ -8,7 +8,7 @@ sub _info_table_ { my($u, $own) = @_; my sub sup { - b_ ' ⭐supporter⭐' if $u->{user_support_can} && $u->{user_support_enabled}; + strong_ ' ⭐supporter⭐' if $u->{user_support_can} && $u->{user_support_enabled}; } tr_ sub { @@ -19,13 +19,22 @@ sub _info_table_ { }; } if $u->{user_uniname_can} && $u->{user_uniname}; tr_ sub { + my $old = tuwf->dbAlli('SELECT date::date, old FROM users_username_hist WHERE id =', \$u->{id}, + auth->permUsermod ? () : 'AND date > NOW()-\'1 month\'::interval', 'ORDER BY date DESC'); td_ class => 'key', 'Username'; td_ sub { - txt_ ucfirst $u->{user_name}; + txt_ $u->{user_name} if defined $u->{user_name}; + b_ 'Account deleted' if !defined $u->{user_name}; + user_maybebanned_ $u; txt_ ' ('; a_ href => "/$u->{id}", $u->{id}; txt_ ')'; + b_ ' Scheduled for deletion' if auth->isMod && tuwf->dbVali('SELECT delete_at FROM users_shadow WHERE id =', \$u->{id}); debug_ $u; sup if !($u->{user_uniname_can} && $u->{user_uniname}); + for(@$old) { + br_; + small_ "Changed from '$_->{old}' on $_->{date}."; + } }; }; tr_ sub { @@ -47,23 +56,22 @@ sub _info_table_ { a_ href => "/$u->{id}/ulist?votes=1", 'Browse votes »'; } }; - my $lengthvotes = tuwf->dbRowi('SELECT count(*) AS count, sum(length) AS sum FROM vn_length_votes WHERE uid =', \$u->{id}); + my $lengthvotes = tuwf->dbRowi('SELECT count(*) AS count, sum(length) AS sum, bool_or(not private) as haspub FROM vn_length_votes WHERE uid =', \$u->{id}); tr_ sub { td_ 'Play times'; td_ sub { vnlength_ $lengthvotes->{sum}; txt_ sprintf ' from %d submitted play times. ', $lengthvotes->{count}; - a_ href => "/$u->{id}/lengthvotes", 'Browse votes »'; + a_ href => "/$u->{id}/lengthvotes", 'Browse votes »' if $own || $lengthvotes->{haspub}; }; } if $lengthvotes->{count}; tr_ sub { my $vns = tuwf->dbVali( - 'SELECT COUNT(DISTINCT uvl.vid) FROM ulist_vns_labels uvl', - $own ? () : ('JOIN ulist_labels ul ON ul.uid = uvl.uid AND ul.id = uvl.lbl AND NOT ul.private'), - 'WHERE uvl.lbl NOT IN(', \5, ',', \6, ') AND uvl.uid =', \$u->{id} + 'SELECT COUNT(vid) FROM ulist_vns + WHERE NOT (labels && ARRAY[', \5, ',', \6, ']::smallint[]) AND uid =', \$u->{id}, $own ? () : 'AND NOT c_private' )||0; my $privrel = $own ? '1=1' : 'EXISTS( - SELECT 1 FROM releases_vn rv JOIN ulist_vns_labels uvl ON uvl.vid = rv.vid JOIN ulist_labels ul ON ul.id = uvl.lbl AND ul.uid = uvl.uid WHERE rv.id = r.rid AND uvl.uid = r.uid AND NOT ul.private + SELECT 1 FROM releases_vn rv JOIN ulist_vns uv ON uv.vid = rv.vid WHERE uv.uid = r.uid AND rv.id = r.rid AND NOT uv.c_private )'; my $rel = tuwf->dbVali('SELECT COUNT(*) FROM rlists r WHERE', $privrel, 'AND r.uid =', \$u->{id})||0; td_ 'List stats'; @@ -101,8 +109,12 @@ sub _info_table_ { }; } if $u->{c_imgvotes}; tr_ sub { - my $stats = tuwf->dbRowi('SELECT COUNT(*) AS posts, COUNT(*) FILTER (WHERE num = 1) AS threads FROM threads_posts WHERE uid =', \$u->{id}); - $stats->{posts} += tuwf->dbVali('SELECT COUNT(*) FROM reviews_posts WHERE uid =', \$u->{id}); + my $stats = tuwf->dbRowi(' + SELECT COUNT(*) AS posts, COUNT(*) FILTER (WHERE num = 1) AS threads + FROM threads_posts tp + WHERE hidden IS NULL AND uid =', \$u->{id}, ' + AND EXISTS(SELECT 1 FROM threads t WHERE t.id = tp.tid AND NOT t.hidden AND NOT t.private)'); + $stats->{posts} += tuwf->dbVali('SELECT COUNT(*) FROM reviews_posts WHERE hidden IS NULL AND uid =', \$u->{id}); td_ 'Forum stats'; td_ !$stats->{posts} ? '-' : sub { txt_ sprintf '%d post%s, %d new thread%s. ', @@ -111,6 +123,25 @@ sub _info_table_ { a_ href => "/$u->{id}/posts", 'Browse posts »'; }; }; + my $quotes = tuwf->dbVali('SELECT COUNT(*) FROM quotes WHERE addedby =', \$u->{id}, auth->permDbmod ? () : 'AND NOT hidden'); + tr_ sub { + td_ 'Quotes'; + td_ sub { + txt_ sprintf '%d quote%s submitted. ', $quotes, $quotes == 1 ? '' : 's'; + a_ href => "/v/quotes?u=$u->{id}", 'Browse quotes »' if auth; + }; + } if $quotes; + + my $traits = tuwf->dbAlli('SELECT u.tid, t.name, g.id as "group", g.name AS groupname FROM users_traits u JOIN traits t ON t.id = u.tid LEFT JOIN traits g ON g.id = t.gid WHERE u.id =', \$u->{id}, 'ORDER BY g.gorder, t.name'); + my @groups; + for (@$traits) { + push @groups, $_ if !@groups || $groups[$#groups]{group} ne $_->{group}; + push $groups[$#groups]{traits}->@*, $_; + } + tr_ sub { + td_ class => 'key', sub { a_ href => "/$_->{group}", $_->{groupname} }; + td_ sub { join_ ', ', sub { a_ href => "/$_->{tid}", $_->{name} }, $_->{traits}->@* }; + } for @groups; } @@ -136,24 +167,21 @@ sub _votestats_ { }; my $recent = tuwf->dbAlli(' - SELECT vn.id, vn.title, vn.original, uv.vote,', sql_totime('uv.vote_date'), 'AS date + SELECT v.id, v.title, uv.vote,', sql_totime('uv.vote_date'), 'AS date FROM ulist_vns uv - JOIN vn ON vn.id = uv.vid - WHERE uv.vote IS NOT NULL AND uv.uid =', \$u->{id}, - $own ? () : ( - 'AND EXISTS(SELECT 1 FROM ulist_vns_labels uvl JOIN ulist_labels ul ON ul.uid = uvl.uid AND ul.id = uvl.lbl WHERE uvl.uid = uv.uid AND uvl.vid = uv.vid AND NOT ul.private)' - ), ' + JOIN', vnt, 'v ON v.id = uv.vid + WHERE uv.vote IS NOT NULL AND uv.uid =', \$u->{id}, $own ? () : ('AND NOT uv.c_private AND NOT v.hidden'), ' ORDER BY uv.vote_date DESC LIMIT', \8 ); table_ class => 'recentvotes stripe', sub { thead_ sub { tr_ sub { td_ colspan => 3, sub { txt_ 'Recent votes'; - b_ sub { txt_ ' ('; a_ href => "/$u->{id}/ulist?votes=1", 'show all'; txt_ ')' }; + span_ sub { txt_ '('; a_ href => "/$u->{id}/ulist?votes=1", 'show all'; txt_ ')' }; } } }; tr_ sub { my $v = $_; - td_ sub { a_ href => "/$v->{id}", title => $v->{original}||$v->{title}, shorten $v->{title}, 30 }; + td_ sub { a_ href => "/$v->{id}", tattr $v; }; td_ fmtvote $v->{vote}; td_ fmtdate $v->{date}; } for @$recent; @@ -171,36 +199,35 @@ TUWF::get qr{/$RE{uid}}, sub { FROM users u WHERE id =}, \tuwf->capture('id') ); - return tuwf->resNotFound if !$u->{id}; + return tuwf->resNotFound if !$u->{id} || (!$u->{user_name} && !auth->isMod); my $own = (auth && auth->uid eq $u->{id}) || auth->permUsermod; $u->{votes} = tuwf->dbAlli(' SELECT (uv.vote::numeric/10)::int AS idx, COUNT(uv.vote) as votes, SUM(uv.vote) AS total FROM ulist_vns uv - WHERE uv.vote IS NOT NULL AND uv.uid =', \$u->{id}, - $own ? () : ( - 'AND EXISTS(SELECT 1 FROM ulist_vns_labels uvl JOIN ulist_labels ul ON ul.uid = uvl.uid AND ul.id = uvl.lbl WHERE uvl.uid = uv.uid AND uvl.vid = uv.vid AND NOT ul.private)' - ), ' + WHERE uv.vote IS NOT NULL AND uv.uid =', \$u->{id}, $own ? () : 'AND NOT uv.c_private', ' GROUP BY (uv.vote::numeric/10)::int '); my $title = user_displayname($u)."'s profile"; - framework_ title => $title, dbobj => $u, - sub { - div_ class => 'mainbox userpage', sub { + framework_ title => $title, dbobj => $u, sub { + article_ class => 'userpage', sub { + itemmsg_ $u; h1_ $title; table_ class => 'stripe', sub { _info_table_ $u, $own }; }; - div_ class => 'mainbox', sub { + article_ sub { h1_ 'Vote statistics'; div_ class => 'votestats', sub { _votestats_ $u, $own }; } if grep $_->{votes} > 0, $u->{votes}->@*; if($u->{c_changes}) { - h1_ class => 'boxtitle', sub { a_ href => "/$u->{id}/hist", 'Recent changes' }; - VNWeb::Misc::History::tablebox_ $u->{id}, {p=>1}, nopage => 1, results => 10; + nav_ sub { + h1_ sub { a_ href => "/$u->{id}/hist", 'Recent changes' }; + }; + VNWeb::Misc::History::tablebox_ $u->{id}, {p=>1}, nopage => 1, nouser => 1, results => 10; } }; }; |