Files
tyforum/script/user_list.pl
2015-01-03 11:43:36 +01:00

193 lines
6.6 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 MwfMain;
#------------------------------------------------------------------------------
# Init
my ($m, $cfg, $lng, $user, $userId) = MwfMain->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();