diff --git a/src/Yavsc/wwwroot/js/chat.js b/src/Yavsc/wwwroot/js/chat.js index 6429b480..b0f9e1ae 100644 --- a/src/Yavsc/wwwroot/js/chat.js +++ b/src/Yavsc/wwwroot/js/chat.js @@ -2,31 +2,30 @@ window.ChatHubHandler = (function ($) { /* # chat control ids - ## inputs - - * msg_ : input providing a room message - * pv_ : input providing a private message - * command : input providing server command - * roomname : input (hidden or not) providing a room name - + + * msg_ : input providing a room message + * pv_ : input providing a private message + * command : input providing server command + * roomname : input (hidden or not) providing a room name + ## persistent containers - - * chatview : the global container - * rooms : container from room displays - * pvs : container from pv displays - * server : container for server messages - + + * chatview : the global container + * rooms : container from room displays + * pvs : container from pv displays + * server : container for server messages + ## temporary containers - + * room_ : room message list * pv_ : private discussion display - + ## css classes - + * form-control * btn btn-default - + */ $.fn.filterByData = function (prop, val) { return this.filter(function () { return $(this).data(prop) == val; }); @@ -35,9 +34,14 @@ window.ChatHubHandler = (function ($) { if (!full) throw new Error('not implemented'); - // build a channel list + // the channel list var chans = []; - var frontRoomName; + // authencitated flagf from server + var is_auth = $view.data('is_auth'); + // private chat list + var userlist = []; + + var frontChanId; var ulist = $('
    ').addClass('userlist'); var notifications = $('
      ').addClass('notifs'); @@ -49,15 +53,22 @@ window.ChatHubHandler = (function ($) { // 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('
    • ' + htmlEncode(name) + ': ' + htmlEncode(message) + '
    • '); + var $userTag = $("" + htmlEncode(name) + "").click(function(){ + buildPv(name); + }); + var $li = $('
    • '); + $userTag.appendTo($li) + $li.append(' '+ htmlEncode(message)); + $li.appendTo($('#r' + room)); }; chat.client.addPV = function (name, message) { if (!$('#mute').prop('checked')) { audio.play(); } + buildPv(name); // Add the pv to the page. - $('#pv_' + name).append('
    • ' + htmlEncode(name) + ': ' + htmlEncode(message) + '
    • '); + $('#u' + name).append('
    • ' + htmlEncode(name) + ': ' + htmlEncode(message) + '
    • '); }; chat.client.notifyRoom = function (tag, targetid, message) { @@ -78,19 +89,15 @@ window.ChatHubHandler = (function ($) { $('
    • ').append(tag + ': ' + targetid).append(message).addClass(tag).appendTo(notifications); }; - var setActiveRoom = function (room) { - var frontRoom; - if (frontRoomName !== '') { - frontRoom = $('#vroom_' + frontRoomName); - // eslint-disable-next-line no-warning-comments - // TODO animate - frontRoom.addClass('hidden'); - $('#sel_' + frontRoomName).addClass('btn-primary'); + var setActiveChan = function (chanId) { + if (frontChanId != chanId) { + $('#sel_' + frontChanId).addClass('btn-primary'); + $('#v' + frontChanId).addClass('hidden'); } - frontRoomName = room; - frontRoom = $('#vroom_' + room); - $('#sel_' + room).removeClass('btn-primary'); - frontRoom.removeClass('hidden'); + frontChanId = chanId; + $('#sel_' + chanId).removeClass('btn-primary'); + $('#v' + chanId).removeClass('hidden'); + $('#inp_' + chanId).focus(); }; var chatbar = $('
      '); @@ -108,36 +115,53 @@ window.ChatHubHandler = (function ($) { chatbar.appendTo($view); var chatlist = $('
      '); chatlist.appendTo($view); - var buildRoom = function (room) { - var roomTag = $('' + room + '').addClass('btn'); - roomTag.prop('id', 'sel_' + room).click(function () { - setActiveRoom(room); + + var buildChan = function (chdp, chanType, chanName, sendCmd) { + var chanId = chanType + chanName; + // if ($('#' + chanId)) return; + var roomTag = $('' + chdp + chanName + '').addClass('btn'); + roomTag.prop('id', 'sel_' + chanId).click(function () { + setActiveChan(chanId); $(this).removeClass('btn-primary'); }); roomTag.appendTo(roomlist); var roomview = $('
      ').addClass('container'); roomview.appendTo(chatlist); - roomview.prop('id', 'vroom_' + room); + roomview.prop('id', 'v' + chanId); var msglist = $('
        ').addClass('mesglist'); - msglist.prop('id', 'room_' + room); + msglist.prop('id', chanId); msglist.appendTo(roomview); $('') - .prop('id', 'inp_' + room) + .prop('id', 'inp_' + chanId) .prop('enable', false) .prop('hint', 'hello') - .prop('title', 'send to ' + room) + .prop('title', 'send to ' + chanName) .addClass('form-control') .keydown(function (ev) { if (ev.which == 13) { if (this.value.length == 0) return; - chat.server.send(room, this.value); + sendCmd(chanName, this.value); + // chat.server.send(chanName, this.value); this.value = ''; } }).appendTo(roomview); - chans.push(room); - setActiveRoom(room); + if (chanType == 'r') + chans.push(chanName); + else if (chanType == 'u') + userlist.push(chanName); + setActiveChan(chanId); }; + var buildRoom = function (roomName) { + if (chans.some(function(cname){ return cname == roomName ; })) + setActiveChan('r' + roomName); + else + buildChan('#', 'r', roomName, chat.server.send); }; + var buildPv = function (userName) { + if (userlist.some(function(uname){ return uname == userName ; })) + setActiveChan('u' + userName); + else + buildChan('@', 'u', userName, chat.server.sendPV); }; $view.data('chans').split(',').forEach(function (chan) { buildRoom(chan); @@ -145,20 +169,19 @@ window.ChatHubHandler = (function ($) { function onCx() { setTimeout(function () { - getUsers(); + if (is_auth) getUsers(); + chans.forEach(function (room) { + chat.server.join(room).done(function (chatInfo) { + setActiveChan('r' + chatInfo.Name); + }); + }); }, 120); - $('#chatview').removeClass('disabled'); - - chans.forEach(function (room) { - chat.server.join(room).done(function (chatInfo) { - setActiveRoom(chatInfo.Name); - }); - }); + $view.removeClass('disabled'); } function onDisCx() { - $('#chatview').addClass('disabled'); + $view.addClass('disabled'); } // Start the connection. @@ -171,7 +194,6 @@ window.ChatHubHandler = (function ($) { onDisCx(); setTimeout(function () { $.connection.hub.start().done(function () { - // $('#mySignalRConnectionIdHidden').val($.connection.hub.id) onCx(); }, 30000); // Re-start connection after 30 seconds }); @@ -182,35 +204,15 @@ window.ChatHubHandler = (function ($) { if (this.value.length == 0) return; buildRoom(this.value); chat.server.join(this.value).done(function (chatInfo) { - setActiveRoom(chatInfo.Name); + setActiveChan('r' + chatInfo.Name); }); this.value = ''; } // else TODO showRoomInfo(this.value); }); - - var pvuis; // eslint-disable-next-line no-warning-comments // 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('
      • ' + htmlEncode(pvuis.UserName) + '<< ' + htmlEncode(msg) + '
      • '); - // Clear text box and reset focus for next comment. - $('#pv').val(''); - }; - - $('#pv').keydown(function (event) { - if (event.which == 13) { - sendPV(); - } - }); - $('#command').keydown(function (event) { if (event.which == 13) { // eslint-disable-next-line no-warning-comments @@ -220,13 +222,15 @@ window.ChatHubHandler = (function ($) { var addChatUser = function (uname) { - $('#u_' + uname).remove(); + $('#u' + uname).remove(); // ulist.remove("li.user[data='"+uname+"']"); $('
      • ' + uname + '
      • ') .prop('id', 'u_' + uname) .css('cursor', 'pointer') - .click(function () { setPrivateTarget(this); }) + .click(function () { + buildPv(uname); + }) .appendTo(ulist); }; @@ -245,26 +249,8 @@ window.ChatHubHandler = (function ($) { 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(); - var onUserDisconnected = function (uname) { - $('#u_' + uname).remove(); + $('#u' + uname).remove(); }; var onUserConnected = function (username) {