Display online users
parent
b3659f1475
commit
73e0935847
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue