yavsc/src/Yavsc/wwwroot/js/chat.js

288 lines
7.7 KiB
JavaScript
Raw Normal View History

2017-03-22 03:31:29 +01:00
+(function ($) {
2019-05-10 09:58:09 +01:00
/*
# chat control ids
2017-03-17 22:42:50 +01:00
2019-05-10 09:58:09 +01:00
## inputs
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
* msg_<rname> : input providing a room message
* pv_<uname> : input providing a private message
* command : input providing server command
* roomname : input (hidden or not) providing a room name
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
## persistent containers
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
* chatview : the global container
* rooms : container from room displays
* pvs : container from pv displays
* server : container for server messages
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
## temporary containers
* room_<rname> : room message list
* pv_<uname> : private discussion display
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
## css classes
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
* form-control
* btn btn-default
*/
2019-05-22 17:27:44 +01:00
$.fn.filterByData = function (prop, val) {
return this.filter(
function () { return $(this).data(prop) == val; }
)
}
2019-05-10 09:58:09 +01:00
var ChatView = function ($view, full)
{
if (!full) throw "not implemented";
// build a channel list
var chans = Array();
2019-05-22 17:27:44 +01:00
var users = Array();
var frontRoomName;
2019-05-22 17:27:44 +01:00
var ulist = $("<ul></ul>").addClass('userlist');
var notifications = $("<ul></ul>").addClass('notifs');
ulist.appendTo($view);
notifications.appendTo($view);
2019-05-10 09:58:09 +01:00
var chat = $.connection.chatHub
// Create a function that the hub can call back to display messages.
chat.client.addMessage = function (name, room, message) {
// Add the message to the page.
$('#room_'+room).append('<li class="discussion"><strong>' + htmlEncode(name)
+ '</strong>: ' + htmlEncode(message) + '</li>')
2017-03-22 03:31:29 +01:00
}
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
chat.client.addPV = function (name, message) {
if (!$('#mute').prop('checked')) {
audio.play()
2017-03-22 03:31:29 +01:00
}
2019-05-10 09:58:09 +01:00
// Add the pv to the page.
$('#pv_'+name).append('<li class="pv"><strong>' + htmlEncode(name)
+ '</strong>: ' + htmlEncode(message) + '</li>')
}
2019-05-22 17:27:44 +01:00
chat.client.notify = function (tag, message) {
2019-05-10 09:58:09 +01:00
// Add the notification to the page.
2019-05-22 17:27:44 +01:00
if (tag === 'connected' || tag === "reconnected") {
onUserConnected(message);
2019-05-10 09:58:09 +01:00
}
else if (tag === 'disconnected') {
2019-05-22 17:27:44 +01:00
onUserDisconnected(message)
2019-05-10 09:58:09 +01:00
} // reconnected userpart userjoin deniedpv
2019-05-22 17:27:44 +01:00
$("<li></li>").append(tag+": ").append(message).addClass(tag).
appendTo(notifications);
2017-03-22 03:31:29 +01:00
}
2019-05-10 09:58:09 +01:00
2019-05-11 02:50:19 +01:00
var setActiveRoom = function(room) {
var frontRoom;
if (frontRoomName!=='') {
frontRoom=$("#vroom_"+frontRoomName);
2019-05-11 02:50:19 +01:00
// TODO animate
frontRoom.addClass("hidden");
$("#sel_"+frontRoomName).addClass("btn-primary");
}
frontRoomName = room;
frontRoom=$("#vroom_"+room);
$("#sel_"+room).removeClass("btn-primary");
frontRoom.removeClass("hidden");
2019-05-11 02:50:19 +01:00
}
2019-05-22 17:27:44 +01:00
var chatbar = $('<div class="chatbar"></div>');
var roomjoin = $('<div class="chatctl" class=\"form-control\"></div>');
2019-05-10 09:58:09 +01:00
2019-05-11 02:50:19 +01:00
var roomlist = $('<div class="roomlist"></div>');
2019-05-22 17:27:44 +01:00
roomlist.appendTo(chatbar);
$("<label for=\"channame\">Join&nbsp;:</label>")
.appendTo(roomjoin);
var chanName = $("<input id=\"channame\" title=\"channel name\" hint=\"yavsc\" >");
chanName.appendTo(roomjoin);
roomjoin.appendTo(chatbar);
chatbar.appendTo($view);
2019-05-11 02:50:19 +01:00
var chatlist = $('<div class="chatlist" ></div>');
chatlist.appendTo($view);
2019-05-10 09:58:09 +01:00
var buildRoom = function (room)
{
var roomTag = $("<a>"+room+"</a>").addClass("btn");
2019-05-11 02:50:19 +01:00
roomTag.prop("id","sel_"+room)
2019-05-10 09:58:09 +01:00
.click(function(){
2019-05-11 02:50:19 +01:00
setActiveRoom(room);
$(this).removeClass("btn-primary");
2019-05-10 09:58:09 +01:00
});
roomTag.appendTo(roomlist);
2019-05-11 02:50:19 +01:00
var roomview = $("<div></div>").addClass("container");
roomview.appendTo(chatlist);
2019-05-10 09:58:09 +01:00
roomview.prop('id',"vroom_"+room);
2019-05-11 02:50:19 +01:00
var msglist = $("<ul></ul>").addClass("mesglist");
2019-05-10 09:58:09 +01:00
msglist.prop('id',"room_"+room);
msglist.appendTo(roomview);
$("<input type=\"text\">")
.prop('id','inp_'+room)
.prop('enable',false)
.prop('hint','hello')
.prop('title','send to '+room)
2019-05-11 02:50:19 +01:00
.addClass('form-control')
.keydown(function(ev) {
2019-05-10 09:58:09 +01:00
if (ev.which == 13) {
2019-05-11 02:50:19 +01:00
if (this.value.length==0) return;
2019-05-22 17:27:44 +01:00
2019-05-11 02:50:19 +01:00
chat.server.send(room, this.value);
this.value="";
}}).appendTo(roomview);
2019-05-10 09:58:09 +01:00
chans.push(room);
2019-05-11 02:50:19 +01:00
setActiveRoom(room);
2019-05-10 09:58:09 +01:00
}
$view.data("chans").split(",").forEach(function(chan) {
buildRoom(chan)
});
function onCx () {
setTimeout(function () {
getUsers()
}, 120),
$('#chatview').removeClass('disabled');
chans.forEach(function(room) {
2019-05-14 21:22:44 +01:00
chat.server.join(room).done(function(chatInfo)
2019-05-22 17:27:44 +01:00
{
2019-05-14 21:22:44 +01:00
setActiveRoom(chatInfo.Name);
});
2019-05-10 09:58:09 +01:00
})
}
function onDisCx () {
$('#chatview').addClass('disabled');
}
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
// Start the connection.
$.connection.hub.start().done(function () {
onCx()
2017-03-22 03:31:29 +01:00
})
2017-03-17 21:09:24 +01:00
2019-05-10 09:58:09 +01:00
$.connection.hub.disconnected(function () {
2019-05-11 02:50:19 +01:00
2019-05-10 09:58:09 +01:00
onDisCx()
setTimeout(function () {
$.connection.hub.start().done(function () {
// $('#mySignalRConnectionIdHidden').val($.connection.hub.id)
onCx()
}, 30000); // Re-start connection after 30 seconds
})
2017-03-22 03:31:29 +01:00
})
2019-05-10 09:58:09 +01:00
chanName.keydown(
function (event) {
2017-03-22 03:31:29 +01:00
if (event.which == 13) {
2019-05-11 02:50:19 +01:00
if (this.value.length==0) return;
2019-05-10 09:58:09 +01:00
buildRoom(this.value);
2019-05-14 21:22:44 +01:00
chat.server.join(this.value).done(function(chatInfo)
2019-05-22 17:27:44 +01:00
{
2019-05-14 21:22:44 +01:00
setActiveRoom(chatInfo.Name);
});
2019-05-10 09:58:09 +01:00
this.value=""
} else {
// TODO showRoomInfo(this.value);
2017-03-22 03:31:29 +01:00
}
2019-05-10 09:58:09 +01:00
});
2019-05-11 02:50:19 +01:00
2019-05-10 09:58:09 +01:00
var pvuis
// TODO get this data from the chatview element
var audio = new Audio('/sounds/bell.mp3')
var sendPV = function () {
var msg = $('#pv').val()
// Call the Send method on the hub.
$.each(pvuis.CXs, function () {
chat.server.sendPV(this, msg)
})
$('#discussion').append('<li class="pv">' + htmlEncode(pvuis.UserName)
+ '<< ' + htmlEncode(msg) + '</li>')
// Clear text box and reset focus for next comment.
$('#pv').val('')
}
2017-03-22 03:31:29 +01:00
$('#pv').keydown(function (event) {
if (event.which == 13) {
sendPV()
}
})
2019-05-10 09:58:09 +01:00
$('#command').keydown(function (event) {
if (event.which == 13) {
sendCommand()
}
2017-03-22 03:31:29 +01:00
})
2017-03-17 22:42:50 +01:00
2019-05-22 17:27:44 +01:00
var addChatUser = function (uname) {
$("#u_"+uname).remove();
// ulist.remove("li.user[data='"+uname+"']");
2019-05-10 09:58:09 +01:00
$('<li class="user"><img src="/Avatars/' + uname + '.xs.png"> ' + uname + '</li>')
2019-05-22 17:27:44 +01:00
.prop('id', 'u_'+uname)
2019-05-10 09:58:09 +01:00
.css('cursor', 'pointer')
.click(function () { setPrivateTarget(this); })
.appendTo(ulist)
}
2019-05-22 17:27:44 +01:00
var getUsers = function () {
2019-05-10 09:58:09 +01:00
$.get('/api/chat/users').done(
function (users) {
$.each(users, function () {
var user = this
2019-05-22 17:27:44 +01:00
addChatUser(user.UserName)
2019-05-10 09:58:09 +01:00
})
}
)
}
// This optional function html-encodes messages for display in the page.
function htmlEncode (value) {
var encodedValue = $('<div />').text(value).html()
return encodedValue
}
var setPrivateTarget = function (li) {
$('#rooms').addClass('hidden')
$('#sendpvbox').removeClass('hidden')
pvuis = { CXs: $(li).data('cxids'), UserName: $(li).data('name') }
$('#sendpvdest').html(pvuis.UserName)
$('#pvs').focus()
}
var setPublic = function () {
$('#rooms').removeClass('hidden')
$('#sendpvbox').addClass('hidden')
$('#message').focus()
}
$('#pubChan').css('cursor', 'pointer')
$('#pubChan').click(setPublic)
setPublic()
2019-05-22 17:27:44 +01:00
var onUserDisconnected = function (uname) {
$("#u_"+uname).remove();
2019-05-10 09:58:09 +01:00
}
2019-05-22 17:27:44 +01:00
var onUserConnected = function (username) {
addChatUser(username)
2019-05-10 09:58:09 +01:00
}
$(window).unload(function () { chat.server.abort(); })
}
$(document).ready(function($){
ChatView($('#chatview'),true);
});
2019-05-13 14:44:28 +01:00
})(jQuery);