From 213c4505f2dfb0918b8cea3e98c1f8d49e5e49f0 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Thu, 6 Jun 2019 08:24:44 +0100 Subject: [PATCH] Fixes JS panic when server goes down --- src/Yavsc/wwwroot/js/chat.js | 51 +++++++++++++++++--------------- src/Yavsc/wwwroot/js/chat.min.js | 19 ++++++++---- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/Yavsc/wwwroot/js/chat.js b/src/Yavsc/wwwroot/js/chat.js index b0f9e1ae..9611cd71 100644 --- a/src/Yavsc/wwwroot/js/chat.js +++ b/src/Yavsc/wwwroot/js/chat.js @@ -49,6 +49,15 @@ window.ChatHubHandler = (function ($) { ulist.appendTo($view); notifications.appendTo($view); + + var onUserDisconnected = function (uname) { + $('#u' + uname).remove(); + }; + + var onUserConnected = function (username) { + addChatUser(username); + }; + var chat = $.connection.chatHub; // Create a function that the hub can call back to display messages. chat.client.addMessage = function (name, room, message) { @@ -148,7 +157,7 @@ window.ChatHubHandler = (function ($) { }).appendTo(roomview); if (chanType == 'r') chans.push(chanName); - else if (chanType == 'u') + else if (chanType == 'u' || chanType == 'a') userlist.push(chanName); setActiveChan(chanId); }; @@ -161,15 +170,23 @@ window.ChatHubHandler = (function ($) { if (userlist.some(function(uname){ return uname == userName ; })) setActiveChan('u' + userName); else - buildChan('@', 'u', userName, chat.server.sendPV); }; + if (userName[0]=='?') buildChan('@?', 'a', userName.slice(1), chat.server.sendPV); + else buildChan('@', 'u', userName, chat.server.sendPV); + }; $view.data('chans').split(',').forEach(function (chan) { buildRoom(chan); }); - - function onCx() { + var getUsers = function () { + $.get('/api/chat/users').done(function (users) { + $.each(users, function () { + var user = this; + addChatUser(user.UserName); + }); + }); + }; + function onCx(recting) { setTimeout(function () { - if (is_auth) getUsers(); chans.forEach(function (room) { chat.server.join(room).done(function (chatInfo) { setActiveChan('r' + chatInfo.Name); @@ -186,7 +203,7 @@ window.ChatHubHandler = (function ($) { // Start the connection. $.connection.hub.start().done(function () { - onCx(); + onCx(false); }); $.connection.hub.disconnected(function () { @@ -194,9 +211,9 @@ window.ChatHubHandler = (function ($) { onDisCx(); setTimeout(function () { $.connection.hub.start().done(function () { - onCx(); - }, 30000); // Re-start connection after 30 seconds - }); + onCx(true); + }); } + , 30000); // Re-start connection after 30 seconds }); chanName.keydown(function (event) { @@ -234,14 +251,7 @@ window.ChatHubHandler = (function ($) { .appendTo(ulist); }; - var getUsers = function () { - $.get('/api/chat/users').done(function (users) { - $.each(users, function () { - var user = this; - addChatUser(user.UserName); - }); - }); - }; + // This optional function html-encodes messages for display in the page. function htmlEncode(value) { @@ -249,13 +259,6 @@ window.ChatHubHandler = (function ($) { return encodedValue; } - var onUserDisconnected = function (uname) { - $('#u' + uname).remove(); - }; - - var onUserConnected = function (username) { - addChatUser(username); - }; $(window).unload(function () { chat.server.abort(); }); diff --git a/src/Yavsc/wwwroot/js/chat.min.js b/src/Yavsc/wwwroot/js/chat.min.js index cd63e4b2..6711e3f1 100644 --- a/src/Yavsc/wwwroot/js/chat.min.js +++ b/src/Yavsc/wwwroot/js/chat.min.js @@ -1,7 +1,14 @@ -window.ChatHubHandler=(function($){$.fn.filterByData=function(prop,val){return this.filter(function(){return $(this).data(prop)==val;});};var ChatView=function($view,full){if(!full)throw new Error('not implemented');var chans=[];var frontRoomName;var ulist=$('').addClass('userlist');var notifications=$('').addClass('notifs');ulist.appendTo($view);notifications.appendTo($view);var chat=$.connection.chatHub;chat.client.addMessage=function(name,room,message){$('#room_'+room).append('
  • '+htmlEncode(name)+': '+htmlEncode(message)+'
  • ');};chat.client.addPV=function(name,message){if(!$('#mute').prop('checked')){audio.play();} -$('#pv_'+name).append('
  • '+htmlEncode(name)+': '+htmlEncode(message)+'
  • ');};chat.client.notifyRoom=function(tag,targetid,message){if(tag==='connected'||tag==='reconnected')onUserConnected(targetid,message);else if(tag==='disconnected')onUserDisconnected(targetid,message);$('
  • ').addClass(tag).append(tag+': '+targetid+' ').append(message).addClass(tag).appendTo($('#room_'+targetid));};chat.client.notifyUser=function(tag,targetid,message){if(tag==='connected'||tag==='reconnected')onUserConnected(targetid,message);else if(tag==='disconnected')onUserDisconnected(targetid,message);$('
  • ').append(tag+': '+targetid).append(message).addClass(tag).appendTo(notifications);};var setActiveRoom=function(room){var frontRoom;if(frontRoomName!==''){frontRoom=$('#vroom_'+frontRoomName);frontRoom.addClass('hidden');$('#sel_'+frontRoomName).addClass('btn-primary');} -frontRoomName=room;frontRoom=$('#vroom_'+room);$('#sel_'+room).removeClass('btn-primary');frontRoom.removeClass('hidden');};var chatbar=$('
    ');var roomjoin=$('
    ');var roomlist=$('
    ');roomlist.appendTo(chatbar);$('').appendTo(roomjoin);var chanName=$('');chanName.appendTo(roomjoin);roomjoin.appendTo(chatbar);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);$(this).removeClass('btn-primary');});roomTag.appendTo(roomlist);var roomview=$('
    ').addClass('container');roomview.appendTo(chatlist);roomview.prop('id','vroom_'+room);var msglist=$('').addClass('mesglist');msglist.prop('id','room_'+room);msglist.appendTo(roomview);$('').prop('id','inp_'+room).prop('enable',false).prop('hint','hello').prop('title','send to '+room).addClass('form-control').keydown(function(ev){if(ev.which==13){if(this.value.length==0)return;chat.server.send(room,this.value);this.value='';}}).appendTo(roomview);chans.push(room);setActiveRoom(room);};$view.data('chans').split(',').forEach(function(chan){buildRoom(chan);});function onCx(){setTimeout(function(){getUsers();},120);$('#chatview').removeClass('disabled');chans.forEach(function(room){chat.server.join(room).done(function(chatInfo){setActiveRoom(chatInfo.Name);});});} -function onDisCx(){$('#chatview').addClass('disabled');} -$.connection.hub.start().done(function(){onCx();});$.connection.hub.disconnected(function(){onDisCx();setTimeout(function(){$.connection.hub.start().done(function(){onCx();},30000);});});chanName.keydown(function(event){if(event.which==13){if(this.value.length==0)return;buildRoom(this.value);chat.server.join(this.value).done(function(chatInfo){setActiveRoom(chatInfo.Name);});this.value='';}});var pvuis;var audio=new Audio('/sounds/bell.mp3');var sendPV=function(){var msg=$('#pv').val();$.each(pvuis.CXs,function(){chat.server.sendPV(this,msg);});$('#discussion').append('
  • '+htmlEncode(pvuis.UserName)+'<< '+htmlEncode(msg)+'
  • ');$('#pv').val('');};$('#pv').keydown(function(event){if(event.which==13){sendPV();}});$('#command').keydown(function(event){if(event.which==13){}});var addChatUser=function(uname){$('#u_'+uname).remove();$('
  • '+uname+'
  • ').prop('id','u_'+uname).css('cursor','pointer').click(function(){setPrivateTarget(this);}).appendTo(ulist);};var getUsers=function(){$.get('/api/chat/users').done(function(users){$.each(users,function(){var user=this;addChatUser(user.UserName);});});};function htmlEncode(value){var encodedValue=$('
    ').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();var onUserDisconnected=function(uname){$('#u_'+uname).remove();};var onUserConnected=function(username){addChatUser(username);};$(window).unload(function(){chat.server.abort();});};$(document).ready(function($){ChatView($('#chatview'),true);});})(window.jQuery); \ No newline at end of file +window.ChatHubHandler=(function($){$.fn.filterByData=function(prop,val){return this.filter(function(){return $(this).data(prop)==val;});};var ChatView=function($view,full){if(!full)throw new Error('not implemented');var chans=[];var is_auth=$view.data('is_auth');var userlist=[];var frontChanId;var ulist=$('').addClass('userlist');var notifications=$('').addClass('notifs');ulist.appendTo($view);notifications.appendTo($view);var onUserDisconnected=function(uname){$('#u'+uname).remove();};var onUserConnected=function(username){addChatUser(username);};var chat=$.connection.chatHub;chat.client.addMessage=function(name,room,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);$('#u'+name).append('
  • '+htmlEncode(name)+': '+htmlEncode(message)+'
  • ');};chat.client.notifyRoom=function(tag,targetid,message){if(tag==='connected'||tag==='reconnected')onUserConnected(targetid,message);else if(tag==='disconnected')onUserDisconnected(targetid,message);$('
  • ').addClass(tag).append(tag+': '+targetid+' ').append(message).addClass(tag).appendTo($('#room_'+targetid));};chat.client.notifyUser=function(tag,targetid,message){if(tag==='connected'||tag==='reconnected')onUserConnected(targetid,message);else if(tag==='disconnected')onUserDisconnected(targetid,message);$('
  • ').append(tag+': '+targetid).append(message).addClass(tag).appendTo(notifications);};var setActiveChan=function(chanId){if(frontChanId!=chanId){$('#sel_'+frontChanId).addClass('btn-primary');$('#v'+frontChanId).addClass('hidden');} +frontChanId=chanId;$('#sel_'+chanId).removeClass('btn-primary');$('#v'+chanId).removeClass('hidden');$('#inp_'+chanId).focus();};var chatbar=$('
    ');var roomjoin=$('
    ');var roomlist=$('
    ');roomlist.appendTo(chatbar);$('').appendTo(roomjoin);var chanName=$('');chanName.appendTo(roomjoin);roomjoin.appendTo(chatbar);chatbar.appendTo($view);var chatlist=$('
    ');chatlist.appendTo($view);var buildChan=function(chdp,chanType,chanName,sendCmd){var chanId=chanType+chanName;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','v'+chanId);var msglist=$('').addClass('mesglist');msglist.prop('id',chanId);msglist.appendTo(roomview);$('').prop('id','inp_'+chanId).prop('enable',false).prop('hint','hello').prop('title','send to '+chanName).addClass('form-control').keydown(function(ev){if(ev.which==13){if(this.value.length==0)return;sendCmd(chanName,this.value);this.value='';}}).appendTo(roomview);if(chanType=='r') +chans.push(chanName);else if(chanType=='u'||chanType=='a') +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 +if(userName[0]=='?')buildChan('@?','a',userName.slice(1),chat.server.sendPV);else buildChan('@','u',userName,chat.server.sendPV);};$view.data('chans').split(',').forEach(function(chan){buildRoom(chan);});var getUsers=function(){$.get('/api/chat/users').done(function(users){$.each(users,function(){var user=this;addChatUser(user.UserName);});});};function onCx(recting){setTimeout(function(){chans.forEach(function(room){chat.server.join(room).done(function(chatInfo){setActiveChan('r'+chatInfo.Name);});});},120);$view.removeClass('disabled');} +function onDisCx(){$view.addClass('disabled');} +$.connection.hub.start().done(function(){onCx(false);});$.connection.hub.disconnected(function(){onDisCx();setTimeout(function(){$.connection.hub.start().done(function(){onCx(true);});},30000);});chanName.keydown(function(event){if(event.which==13){if(this.value.length==0)return;buildRoom(this.value);chat.server.join(this.value).done(function(chatInfo){setActiveChan('r'+chatInfo.Name);});this.value='';}});var audio=new Audio('/sounds/bell.mp3');$('#command').keydown(function(event){if(event.which==13){}});var addChatUser=function(uname){$('#u'+uname).remove();$('
  • '+uname+'
  • ').prop('id','u_'+uname).css('cursor','pointer').click(function(){buildPv(uname);}).appendTo(ulist);};function htmlEncode(value){var encodedValue=$('
    ').text(value).html();return encodedValue;} +$(window).unload(function(){chat.server.abort();});};$(document).ready(function($){ChatView($('#chatview'),true);});})(window.jQuery); \ No newline at end of file