Webclient: fix some bugs (#2742)

* Handle room join and leave events + case sensitive userlist sort; fix #2307

* Webclient: add autoscroll, but only if already at the bottom; fix #2306
This commit is contained in:
ctrlaltca 2017-06-01 05:04:59 +02:00 committed by Zach H
parent 4c953acebc
commit 03a7a9fafb
2 changed files with 55 additions and 8 deletions

View file

@ -199,6 +199,15 @@ Loading cockatrice web client...
return "Unregistered user"; return "Unregistered user";
} }
function sortUserlist(list) {
var li = $(list + ' li');
li.sort(function(a, b) {
return $(a).text().toLowerCase().localeCompare($(b).text().toLowerCase());
});
$(list).empty().html(li);
$(list).selectable();
}
$("#loginnow").click(connect); $("#loginnow").click(connect);
$("#port, #user, #pass").keydown(function(e) { $("#port, #user, #pass").keydown(function(e) {
if (e.keyCode == 13) { connect(); } if (e.keyCode == 13) { connect(); }
@ -359,7 +368,7 @@ Loading cockatrice web client...
$.each(room["userList"], function(key, value) { $.each(room["userList"], function(key, value) {
$("#tab-room-" + room["roomId"] + " .userlist").append('<li>' + value.name + '</li>'); $("#tab-room-" + room["roomId"] + " .userlist").append('<li>' + value.name + '</li>');
}); });
$("#tab-room-" + room["roomId"] + " .userlist").selectable(); sortUserlist("#tab-room-" + room["roomId"] + " .userlist");
$("#tab-room-" + room["roomId"] + " .say").click(function() { $("#tab-room-" + room["roomId"] + " .say").click(function() {
var msg = $("#tab-room-" + room["roomId"] + " .input").val(); var msg = $("#tab-room-" + room["roomId"] + " .input").val();
@ -376,6 +385,8 @@ Loading cockatrice web client...
}, },
"roomMessageCallback" : function(roomId, message) { "roomMessageCallback" : function(roomId, message) {
var text; var text;
var out = $("#tab-room-" + roomId + " .output")[0];
var isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1;
switch(message["messageType"]) switch(message["messageType"])
{ {
case WebClient.pb.Event_RoomSay.RoomMessageType.Welcome: case WebClient.pb.Event_RoomSay.RoomMessageType.Welcome:
@ -389,7 +400,23 @@ Loading cockatrice web client...
break; break;
} }
$("#tab-room-" + roomId + " .output").append(text + '<br/>'); $("#tab-room-" + roomId + " .output").append(text + '<br/>');
if(isScrolledToBottom)
out.scrollTop = out.scrollHeight - out.clientHeight;
}, },
"roomJoinCallback" : function(roomId, message) {
$("#tab-room-" + roomId + " .userlist").append('<li>' + message['userInfo'].name + '</li>');
sortUserlist("#tab-room-" + roomId + " .userlist");
},
"roomLeaveCallback" : function(roomId, message) {
var name = message['name'];
$("#tab-room-" + roomId + " .userlist li").filter(function() {
return $.text([this]) === name;
}).remove();
sortUserlist("#tab-room-" + roomId + " .userlist");
},
"roomListGamesCallback" : function(roomId, message) {
// TBD
}
}; };
$(this).prop("disabled", true); $(this).prop("disabled", true);

View file

@ -46,17 +46,20 @@ var WebClient = {
"pb/response_join_room.proto", "pb/response_join_room.proto",
"pb/room_event.proto", "pb/room_event.proto",
"pb/event_room_say.proto", "pb/event_room_say.proto",
"pb/serverinfo_user.proto" "pb/event_join_room.proto",
"pb/event_leave_room.proto",
"pb/event_list_games.proto",
"pb/serverinfo_user.proto",
"pb/serverinfo_game.proto"
], ],
initialize : function() initialize : function()
{ {
this.pb = new protobuf.Root({ this.pb = new protobuf.Root();
convertFieldsToCamelCase: true,
});
this.pb.load(this.pbfiles, { this.pb.load(this.pbfiles, { keepCase: false }, function(err, root) {
keepCase: false if (err)
throw err;
}); });
this.initialized=true; this.initialized=true;
@ -340,12 +343,29 @@ var WebClient = {
processRoomEvent : function (raw) processRoomEvent : function (raw)
{ {
if(raw[".Event_ListGames.ext"]) {
if(this.options.roomListGamesCallback)
this.options.roomListGamesCallback(raw["roomId"], raw[".Event_ListGames.ext"]);
return;
}
if(raw[".Event_JoinRoom.ext"]) {
if(this.options.roomJoinCallback)
this.options.roomJoinCallback(raw["roomId"], raw[".Event_JoinRoom.ext"]);
return;
}
if(raw[".Event_LeaveRoom.ext"]) {
if(this.options.roomLeaveCallback)
this.options.roomLeaveCallback(raw["roomId"], raw[".Event_LeaveRoom.ext"]);
return;
}
if(raw[".Event_RoomSay.ext"]) { if(raw[".Event_RoomSay.ext"]) {
if(this.options.roomMessageCallback) if(this.options.roomMessageCallback)
this.options.roomMessageCallback(raw["roomId"], raw[".Event_RoomSay.ext"]); this.options.roomMessageCallback(raw["roomId"], raw[".Event_RoomSay.ext"]);
return; return;
} }
}, },
processJoinRoom : function(raw) processJoinRoom : function(raw)