2016-07-18 16:39:37 +00:00
< ? 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 " ;
2020-06-25 12:41:16 +00:00
if ( $esc_sex == " M " ) {
2016-07-18 16:39:37 +00:00
$esc_sex = " ♂ " ;
$col_sex = " color:blue " ;
2020-06-25 12:41:16 +00:00
} elseif ( $esc_sex == " F " ) {
2016-07-18 16:39:37 +00:00
$esc_sex = " ♀ " ;
$col_sex = " color:red " ;
} else {
$esc_sex = " " ;
$col_sex = " color:black " ;
}
$esc_motto = HTML :: escape ( $user [ 'motto' ]);
?>
2019-09-10 02:15:20 +00:00
< 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) ?> " />
2016-07-18 16:39:37 +00:00
</ div >
2019-09-10 02:15:20 +00:00
< div class = " col-md-8 order-md-1 " >
2016-07-18 16:39:37 +00:00
< 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 ;
2021-04-25 13:58:47 +00:00
$result = DB :: query ( " select contest_id, `rank`, user_rating from contests_registrants where username = ' { $user [ 'username' ] } ' and has_participated = 1 order by contest_id " );
2016-07-18 16:39:37 +00:00
$is_first_row = true ;
$last_rating = 1500 ;
2017-11-25 15:29:18 +00:00
while ( $row = DB :: fetch ( $result )) {
2016-07-18 16:39:37 +00:00
$contest = queryContest ( $row [ 'contest_id' ]);
$rating_delta = $row [ 'user_rating' ] - $last_rating ;
if ( ! $is_first_row ) {
2021-04-25 13:58:47 +00:00
echo " [ $last_contest_time , { $row [ 'user_rating' ] } , $last_contest_id , $last_contest_name , $last_rank , $rating_delta ], " ;
2016-07-18 16:39:37 +00:00
} 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 ;
2021-04-25 13:58:47 +00:00
$last_contest_name = json_encode ( $contest [ 'name' ]);
2016-07-18 16:39:37 +00:00
$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 ;
2021-04-25 13:58:47 +00:00
echo " [ $last_contest_time , { $user [ 'rating' ] } , $last_contest_id , $last_contest_name , $last_rank , $rating_delta ] " ;
2016-07-18 16:39:37 +00:00
}
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 ( '不存在该用户' . ' - 用户信息' ) ?>
2019-09-10 02:15:20 +00:00
< div class = " card border-danger " >
< div class = " card-header bg-danger " > 用户信息 </ div >
< div class = " card-body " >
2016-07-18 16:39:37 +00:00
< h4 > 不存在该用户 </ h4 >
</ div >
</ div >
< ? php endif ?>
< ? php echoUOJPageFooter () ?>