Display online users

pull/1/merge
Thibault Duplessis 2012-05-21 10:46:34 +02:00
parent b3659f1475
commit 73e0935847
6 changed files with 50 additions and 46 deletions

View File

@ -6,6 +6,7 @@ import views._
import play.api._
import play.api.mvc._
import play.api.mvc.Results._
import scalaz.effects._
object User extends LilaController {
@ -15,9 +16,11 @@ object User extends LilaController {
def show(username: String) = TODO
def list(page: Int) = Open { implicit ctx
Ok(
html.user.list(paginator elo page)
)
IOk(onlineUsers map { html.user.list(paginator elo page, _) })
}
val online = Open { implicit ctx
IOk(onlineUsers map { html.user.online(_) })
}
val autocomplete = Action { implicit req
@ -30,4 +33,6 @@ object User extends LilaController {
val signUp = TODO
val stats = TODO
val onlineUsers: IO[List[User]] = userRepo byUsernames env.user.usernameMemo.keys
}

View File

@ -28,9 +28,11 @@ class UserRepo(
}
def byUsername(username: String): IO[Option[User]] = io {
findOne(
DBObject("usernameCanonical" -> username.toLowerCase)
)
findOne(DBObject("usernameCanonical" -> username.toLowerCase))
}
def byUsernames(usernames: Iterable[String]): IO[List[User]] = io {
find("usernameCanonical" $in usernames).toList
}
def setElo(userId: ObjectId, elo: Int): IO[Unit] = io {

View File

@ -1,4 +1,4 @@
@(paginator: Paginator[User])(implicit ctx: Context)
@(paginator: Paginator[User], onlineUsers: List[User])(implicit ctx: Context)
@title = @{ "%s - page %d".format(trans.chessPlayers(), paginator.currentPage) }
@ -23,12 +23,14 @@ goodies = goodies.some) {
<div class="infinitescroll">
<div class="pager"><a href="@routes.User.list(paginator.nextPage | 1)">Next</a></div>
<ol start="@{ 1+(paginator.currentPage-1)*paginator.maxPerPage }" class="users paginated_element">
@paginator.currentPageResults.map { user =>
<li>@userLink(user, None, true)</li>
}
@paginator.currentPageResults.map { u => <li>@userLink(u, None, true)</li> }
</ol>
</div>
</div>
<div data-reload-url="@routes.User.online" class="online_users">
@user.online(onlineUsers)
</div>
</div>
</div>
</div>
}

View File

@ -0,0 +1,5 @@
@(users: List[User])(implicit ctx: Context)
<h1>@trans.namedPlayers() (@users.size)</h1>
<br />
<br />
<ul class="users">@users.map { u => <li>@userLink(u, None, true)<li> }</ul>

View File

@ -65,6 +65,7 @@ GET /signup controllers.User.signUp
GET /people controllers.User.list(page: Int ?= 1)
GET /people/stats controllers.User.stats
GET /people/autocomplete controllers.User.autocomplete
GET /people/online controllers.User.online
# Wiki
GET /wiki controllers.Wiki.home

View File

@ -1,40 +1,29 @@
$(function()
{
if($users = $('#lichess_user div.online_users').orNot()) {
// Update online users
var onlineUserUrl = $users.attr('data-reload-url');
function reloadOnlineUsers() {
setTimeout(function() {
$.get(onlineUserUrl, function(html) {
$users.find('div.online_users_inner').html(html);
reloadOnlineUsers();
});
}, 3000);
};
reloadOnlineUsers();
var $nbPlayersTag = $users.find('.players_count');
var $anonsTag = $users.find('.anonymous_users');
var prev = lichess.socketDefaults.events["n"];
lichess.socketDefaults.events["n"] = function(e) {
if ($.isFunction(prev)) prev(e);
$nbPlayersTag.html(e).removeClass('none');
$anonsTag.html(str_repeat('<li></li>', e));
};
}
if($searchForm = $('form.search_user_form').orNot()) {
$searchInput = $searchForm.find('input.search_user');
$searchInput.on('autocompleteselect', function(e, ui) {
setTimeout(function() {$searchForm.submit();},10);
$(function() {
if($users = $('div.online_users').orNot()) {
// Update online users
var onlineUserUrl = $users.attr('data-reload-url');
function reloadOnlineUsers() {
setTimeout(function() {
$.get(onlineUserUrl, function(html) {
$users.html(html);
reloadOnlineUsers();
});
$searchForm.submit(function() {
location.href = $searchForm.attr('action')+'/'+$searchInput.val();
return false;
});
}
}, 3000);
};
reloadOnlineUsers();
}
if($searchForm = $('form.search_user_form').orNot()) {
$searchInput = $searchForm.find('input.search_user');
$searchInput.on('autocompleteselect', function(e, ui) {
setTimeout(function() {$searchForm.submit();},10);
});
$searchForm.submit(function() {
location.href = $searchForm.attr('action')+'/'+$searchInput.val();
return false;
});
}
});
function str_repeat(input, multiplier) {
function str_repeat(input, multiplier) {
return new Array(multiplier + 1).join(input);
}