S2OJ/web/app/controllers/user_info.php
billchenchina 78846bc1b8
Fix #88
Thanks to @qz-cqy!
2021-04-25 22:00:22 +08:00

255 lines
8.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
$username = $_GET['username'];
requireLib('flot');
?>
<?php if (validateUsername($username) && ($user = queryUser($username))): ?>
<?php echoUOJPageHeader($user['username'] . ' - ' . UOJLocale::get('user profile')) ?>
<?php
$esc_email = HTML::escape($user['email']);
$esc_qq = HTML::escape($user['qq'] != 0 ? $user['qq'] : 'Unfilled');
$esc_sex = HTML::escape($user['sex']);
$col_sex="color:blue";
if ($esc_sex == "M") {
$esc_sex="♂";
$col_sex="color:blue";
} elseif ($esc_sex == "F") {
$esc_sex="♀";
$col_sex="color:red";
} else {
$esc_sex="";
$col_sex="color:black";
}
$esc_motto = HTML::escape($user['motto']);
?>
<div class="card border-info">
<h5 class="card-header bg-info"><?= UOJLocale::get('user profile') ?></h5>
<div class="card-body">
<div class="row mb-4">
<div class="col-md-4 order-md-9">
<img class="media-object img-thumbnail d-block mx-auto" alt="<?= $user['username'] ?> Avatar" src="<?= HTML::avatar_addr($user, 256) ?>" />
</div>
<div class="col-md-8 order-md-1">
<h2><span class="uoj-honor" data-rating="<?= $user['rating'] ?>"><?= $user['username'] ?></span> <span><strong style="<?= $col_sex ?>"><?= $esc_sex ?></strong></span></h2>
<div class="list-group">
<div class="list-group-item">
<h4 class="list-group-item-heading"><?= UOJLocale::get('rating') ?></h4>
<p class="list-group-item-text"><strong style="color:red"><?= $user['rating'] ?></strong></p>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading"><?= UOJLocale::get('email') ?></h4>
<p class="list-group-item-text"><?= $esc_email ?></p>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading"><?= UOJLocale::get('QQ') ?></h4>
<p class="list-group-item-text"><?= $esc_qq ?></p>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading"><?= UOJLocale::get('motto') ?></h4>
<p class="list-group-item-text"><?= $esc_motto ?></p>
</div>
<?php if (isSuperUser($myUser)): ?>
<div class="list-group-item">
<h4 class="list-group-item-heading">register time</h4>
<p class="list-group-item-text"><?= $user['register_time'] ?></p>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">remote_addr</h4>
<p class="list-group-item-text"><?= $user['remote_addr'] ?></p>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">http_x_forwarded_for</h4>
<p class="list-group-item-text"><?= $user['http_x_forwarded_for'] ?></p>
</div>
<?php endif ?>
</div>
</div>
</div>
<?php if (Auth::check()): ?>
<?php if (Auth::id() != $user['username']): ?>
<a type="button" class="btn btn-info btn-sm" href="/user/msg?enter=<?= $user['username'] ?>"><span class="glyphicon glyphicon-envelope"></span> <?= UOJLocale::get('send private message') ?></a>
<?php else: ?>
<a type="button" class="btn btn-info btn-sm" href="/user/modify-profile"><span class="glyphicon glyphicon-pencil"></span> <?= UOJLocale::get('modify my profile') ?></a>
<?php endif ?>
<?php endif ?>
<a type="button" class="btn btn-success btn-sm" href="<?= HTML::blog_url($user['username'], '/') ?>"><span class="glyphicon glyphicon-arrow-right"></span> <?= UOJLocale::get('visit his blog', $username) ?></a>
<div class="top-buffer-lg"></div>
<div class="list-group">
<div class="list-group-item">
<h4 class="list-group-item-heading"><?= UOJLocale::get('rating changes') ?></h4>
<div class="list-group-item-text" id="rating-plot" style="height:500px;"></div>
</div>
<div class="list-group-item">
<?php
$ac_problems = DB::selectAll("select problem_id from best_ac_submissions where submitter = '{$user['username']}'");
?>
<h4 class="list-group-item-heading"><?= UOJLocale::get('accepted problems').''.UOJLocale::get('n problems in total', count($ac_problems))?> </h4>
<p class="list-group-item-text">
<?php
foreach ($ac_problems as $problem) {
echo '<a href="/problem/', $problem['problem_id'], '" style="display:inline-block; width:4em;">', $problem['problem_id'], '</a>';
}
if (empty($ac_problems)) {
echo UOJLocale::get('none');
}
?>
</p>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var rating_data = [[
<?php
$user_rating_min = $user_rating_max = 1500;
$result = DB::query("select contest_id, `rank`, user_rating from contests_registrants where username = '{$user['username']}' and has_participated = 1 order by contest_id");
$is_first_row = true;
$last_rating = 1500;
while ($row = DB::fetch($result)) {
$contest = queryContest($row['contest_id']);
$rating_delta = $row['user_rating'] - $last_rating;
if (!$is_first_row) {
echo "[$last_contest_time, {$row['user_rating']}, $last_contest_id, $last_contest_name, $last_rank, $rating_delta],";
} else {
$is_first_row = false;
}
$contest_start_time = new DateTime($contest['start_time']);
$last_contest_time = ($contest_start_time->getTimestamp() + $contest_start_time->getOffset()) * 1000;
$last_contest_name = json_encode($contest['name']);
$last_contest_id = $contest['id'];
$last_rank = $row['rank'];
$last_rating = $row['user_rating'];
if ($row['user_rating'] < $user_rating_min) {
$user_rating_min = $row['user_rating'];
}
if ($row['user_rating'] > $user_rating_max) {
$user_rating_max = $row['user_rating'];
}
}
if ($is_first_row) {
$time_now_stamp = (UOJTime::$time_now->getTimestamp() + UOJTime::$time_now->getOffset()) * 1000;
echo "[{$time_now_stamp}, {$user['rating']}, 0]";
} else {
$rating_delta = $user['rating'] - $last_rating;
echo "[$last_contest_time, {$user['rating']}, $last_contest_id, $last_contest_name, $last_rank, $rating_delta]";
}
if ($user['rating'] < $user_rating_min) {
$user_rating_min = $user['rating'];
}
if ($user['rating'] > $user_rating_max) {
$user_rating_max = $user['rating'];
}
$user_rating_min -= 400;
$user_rating_max += 400;
?>
]];
var rating_plot = $.plot($("#rating-plot"), [{
color: "#3850eb",
label: "<?= $user['username'] ?>",
data: rating_data[0]
}], {
series: {
lines: {
show: true
},
points: {
show: true
}
},
xaxis: {
mode: "time"
},
yaxis: {
min: <?= $user_rating_min ?>,
max: <?= $user_rating_max ?>
},
legend: {
labelFormatter: function(username) {
return getUserLink(username, <?= $user['rating'] ?>, false);
}
},
grid: {
clickable: true,
hoverable: true
},
hooks: {
drawBackground: [
function(plot, ctx) {
var plotOffset = plot.getPlotOffset();
for (var y = 0; y < plot.height(); y++) {
var rating = <?= $user_rating_max ?> - <?= $user_rating_max - $user_rating_min ?> * y / plot.height();
ctx.fillStyle = getColOfRating(rating);
ctx.fillRect(plotOffset.left, plotOffset.top + y, plot.width(), Math.min(5, plot.height() - y));
}
}
]
}
});
function showTooltip(x, y, contents) {
$('<div id="rating-tooltip">' + contents + '</div>').css({
position: 'absolute',
display: 'none',
top: y - 20,
left: x + 10,
border: '1px solid #fdd',
padding: '2px',
'font-size' : '11px',
'background-color': '#fee',
opacity: 0.80
}).appendTo("body").fadeIn(200);
}
var prev = -1;
function onHoverRating(event, pos, item) {
if (prev != item.dataIndex) {
$("#rating-tooltip").remove();
var params = rating_data[item.seriesIndex][item.dataIndex];
var total = params[1];
var contestId = params[2];
if (contestId != 0) {
var change = params[5] > 0 ? "+" + params[5] : params[5];
var contestName = params[3];
var rank = params[4];
var html = "= " + total + " (" + change + "), <br/>"
+ "Rank: " + rank + "<br/>"
+ '<a href="' + '/contest/' + contestId + '">' + contestName + '</a>';
} else {
var html = "= " + total + "<br/>"
+ "Unrated";
}
showTooltip(item.pageX, item.pageY, html);
prev = item.dataIndex;
}
}
$("#rating-plot").bind("plothover", function (event, pos, item) {
if (item) {
onHoverRating(event, pos, item);
}
});
$("#rating-plot").bind("plotclick", function (event, pos, item) {
if (item && prev == -1) {
onHoverRating(event, pos, item);
} else {
$("#rating-tooltip").fadeOut(200);
prev = -1;
}
});
</script>
<?php else: ?>
<?php echoUOJPageHeader('不存在该用户' . ' - 用户信息') ?>
<div class="card border-danger">
<div class="card-header bg-danger">用户信息</div>
<div class="card-body">
<h4>不存在该用户</h4>
</div>
</div>
<?php endif ?>
<?php echoUOJPageFooter() ?>