Files
tyforum/script/user_list.pl
2023-10-16 19:17:15 +09:00

217 lines
7.3 KiB
Perl
Executable File

#!/usr/bin/perl
#------------------------------------------------------------------------------
# mwForum - Web-based discussion forum
# Copyright (c) 1999-2015 Markus Wichitill
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#------------------------------------------------------------------------------
use strict;
use warnings;
no warnings qw(uninitialized redefine);
# Imports
use TyfMain;
#------------------------------------------------------------------------------
# Init
my ( $m, $cfg, $lng, $user, $userId ) = TyfMain->new( $_[0] );
# Check if access should be denied
$cfg->{userList} or $m->error('errNoAccess');
$cfg->{userList} != 2 || $userId or $m->error('errNoAccess');
# Print header
$m->printHeader();
# Get CGI parameters
my $page = $m->paramInt('pg') || 1;
my $search = $m->paramStr('search') || "";
my $field = $m->paramStrId('field') || 'userName';
my $sort = $m->paramStrId('sort') || 'field';
my $order = $m->paramStrId('order') || 'desc';
my $hideEmpty = $m->paramBool('hide');
# Define values and names for selectable fields
my %fields = (
userName => $lng->{uifProfUName},
realName => $lng->{uifProfRName},
homepage => $lng->{uifProfPage},
occupation => $lng->{uifProfOccup},
hobbies => $lng->{uifProfHobby},
location => $lng->{uifProfLocat},
icq => $lng->{uifProfIcq},
avatar => $lng->{uifProfAvat},
birthday => $lng->{uifProfBdate},
regTime => $lng->{uifStatRegTm},
postNum => $lng->{uifStatPNum},
);
$fields{extra1} = $cfg->{extra1} if $cfg->{extra1} && $cfg->{showExtra1};
$fields{extra2} = $cfg->{extra2} if $cfg->{extra2} && $cfg->{showExtra2};
$fields{extra3} = $cfg->{extra3} if $cfg->{extra3} && $cfg->{showExtra3};
# Enforce valid options
$field = 'userName' if !$fields{$field};
$sort = 'userName' if $sort !~ /^(?:userName|id|field)\z/;
$order = 'desc' if $order !~ /^(?:asc|desc)\z/;
# Preserve parameters in links
my @params = (
search => $search,
field => $field,
sort => $sort,
order => $order,
hide => $hideEmpty
);
# Search for username
my $fieldCast = $m->{pgsql} ? "CAST($field AS VARCHAR)" : $field;
my $hideEmptyStr = $hideEmpty ? "AND $fieldCast <> ''" : "";
my $searchEsc = $m->escHtml($search);
my $searchLike = "%" . $m->dbEscLike($searchEsc) . "%";
my $like = $m->{pgsql} ? 'ILIKE' : 'LIKE';
my $searchStr = $search ? "AND $fieldCast $like :search" : "";
# Sort list by
my $orderStr = "";
if ( $sort eq 'userName' ) { $orderStr = "userName $order" }
elsif ( $sort eq 'field' ) { $orderStr = "$field $order" }
else { $orderStr = "id $order" }
# Get ids of users
my $users = $m->fetchAllArray( "
SELECT id
FROM users
WHERE 1 = 1
$searchStr
$hideEmptyStr
ORDER BY $orderStr",
{ search => $searchLike } );
# Print page bar
my $usersPP = $cfg->{usersPP} || 25;
my $pageNum = int( @$users / $usersPP ) + ( @$users % $usersPP != 0 );
my @pageLinks
= $pageNum < 2
? ()
: $m->pageLinks( 'user_list', \@params, $page, $pageNum );
my @navLinks
= ( { url => $m->url('forum_show'), txt => 'comUp', ico => 'up' } );
$m->printPageBar(
mainTitle => $lng->{uliTitle},
navLinks => \@navLinks,
pageLinks => \@pageLinks
);
# Get users on page
my @pageUsers = @$users[ ( $page - 1 )
* $usersPP .. $m->min( $page * $usersPP, scalar @$users ) - 1 ];
my @pageUserIds = map( $_->[0], @pageUsers );
$users = $m->fetchAllHash( "
SELECT id, userName, email, birthyear, $field
FROM users
WHERE id IN (:pageUserIds)
ORDER BY $orderStr",
{ pageUserIds => \@pageUserIds } );
# Determine checkbox, radiobutton and listbox states
my $hideEmptyChk = $hideEmpty ? 'checked' : "";
my %state = (
$sort => 'selected',
$order => 'selected',
"field$field" => 'selected'
);
# Print user list form
print
"<form action=\"user_list$m->{ext}\" method=\"GET\">\n",
"<div class=\"frm\">\n",
"<div class=\"hcl\"><span class=\"htt\">$lng->{uliLfmTtl}</span></div>\n",
"<div class=\"ccl\">\n",
"<div class=\"cli\">\n",
"<label>$lng->{uliLfmField}\n", "<select name=\"field\" size=\"1\">\n",
map( "<option value=\"$_\" $state{\"field$_\"}>$fields{$_}</option>\n",
sort( { $fields{$a} cmp $fields{$b} } keys(%fields) ) ),
"</select></label>\n",
"<label>$lng->{uliLfmSort}\n",
"<select name=\"sort\" size=\"1\">\n",
"<option value=\"field\" $state{field}>$lng->{uliLfmSrtFld}</option>\n",
"<option value=\"userName\" $state{userName}>$lng->{uliLfmSrtNam}</option>\n",
"<option value=\"id\" $state{id}>$lng->{uliLfmSrtUid}</option>\n",
"</select></label>\n",
"<label>$lng->{uliLfmOrder}\n",
"<select name=\"order\" size=\"1\">\n",
"<option value=\"desc\" $state{desc}>$lng->{uliLfmOrdDsc}</option>\n",
"<option value=\"asc\" $state{asc}>$lng->{uliLfmOrdAsc}</option>\n",
"</select></label>\n",
"<label>$lng->{uliLfmSearch}\n",
"<input type=\"text\" name=\"search\" style=\"width: 100px\" value=\"$searchEsc\"></label>\n",
"<label><input type=\"checkbox\" name=\"hide\" $hideEmptyChk>$lng->{uliLfmHide}</label>\n",
$m->submitButton( 'uliLfmListB', 'search' ),
"</div>\n",
"</div>\n",
"</div>\n",
"</form>\n\n";
# Print user list header
print
"<table class=\"tbl\">\n",
"<tr class=\"hrw\">\n",
"<th class=\"shr\">$lng->{uliLstName}</th>\n",
$field ne 'userName' ? "<th>$fields{$field}</th>\n" : "",
"</tr>\n";
# Print user list
for my $listUser (@$users) {
# Get string for selectable field
my $fieldStr = $listUser->{$field};
if ( $field eq 'userName' ) { $fieldStr = "" }
elsif ( $field eq 'postNum' ) {
$fieldStr .= " " . $m->formatUserRank($fieldStr);
}
elsif ( $field eq 'birthday' && $listUser->{birthyear} ) {
$fieldStr = "$listUser->{birthyear}-$fieldStr";
}
elsif ( $field =~ /Time\z/ ) {
$fieldStr = $m->formatTime( $fieldStr, $user->{timezone} );
}
elsif ( $fieldStr =~ /^https?:/ ) {
$fieldStr = "<a href=\"$fieldStr\">$fieldStr</a>";
}
elsif ( $field eq 'avatar' && $fieldStr ) {
my $url = "";
if ( index( $fieldStr, "gravatar:" ) == 0 ) {
my $md5 = $m->md5( substr( $fieldStr, 9 ) );
$url = "//gravatar.com/avatar/$md5?s=$cfg->{avatarWidth}";
}
else {
$url = "$cfg->{attachUrlPath}/avatars/$fieldStr";
}
$fieldStr = "<img src=\"$url\" alt=\"\">";
}
my $url = $m->url( 'user_info', uid => $listUser->{id} );
print
"<tr class=\"crw\">\n",
"<td><a href=\"$url\">$listUser->{userName}</a></td>\n",
$field ne 'userName' ? "<td>$fieldStr</td>\n" : "",
"</tr>\n";
}
print "</table>\n\n";
# Log action and finish
$m->logAction( 3, 'user', 'list', $userId );
$m->printFooter();
$m->finish();