implements web chat rooms

vnext
Paul Schneider 5 years ago
parent 7a84e2965b
commit cb8a6aec60
6 changed files with 54 additions and 48 deletions

@ -1 +1 @@
01 02

@ -19,19 +19,17 @@
// You should have received a copy of the GNU Lesser General Public License // You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
using Microsoft.AspNet.SignalR; using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hosting;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System;
using System.Collections.Concurrent;
using Microsoft.Data.Entity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
namespace Yavsc namespace Yavsc
{ {
using System;
using System.Collections.Concurrent;
using Microsoft.AspNet.WebUtilities;
using Microsoft.Data.Entity;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Models; using Models;
using Models.Chat; using Models.Chat;
@ -113,7 +111,12 @@ namespace Yavsc
return Context.User.Identity.Name; return Context.User.Identity.Name;
} }
anonymousSequence++; anonymousSequence++;
var aname = $"{Constants.AnonymousUserNamePrefix}{anonymousSequence}"; var reqKeys = Context.Request.QueryString.Select(pv => pv.Key);
_logger.LogInformation(string.Join(" ", reqKeys));
var queryUname = Context.Request.QueryString[Constants.KeyParamChatUserName] ;
var aname = $"{Constants.AnonymousUserNamePrefix}{queryUname}{anonymousSequence}";
ChatUserNames[Context.ConnectionId]=aname; ChatUserNames[Context.ConnectionId]=aname;
_logger.LogInformation($"Anonymous chat user name set to : {aname}"); _logger.LogInformation($"Anonymous chat user name set to : {aname}");
return aname; return aname;

@ -13,11 +13,10 @@
@if (!ViewBag.IsAuthenticated) { // Get the user name and store it to prepend to messages. @if (!ViewBag.IsAuthenticated) { // Get the user name and store it to prepend to messages.
<script> <script>
$('#chatview').data("anonuname", prompt('Entrez votre nom:', '')); // var uname = prompt('Entrez votre nom:', '');
</script> </script>
} }
<script src="~/js/chat.js"></script> <script src="~/js/chat.js"></script>
<script>
</script>
} }

@ -32,7 +32,6 @@
{ {
if (!full) throw "not implemented"; if (!full) throw "not implemented";
var chat = $.connection.chatHub var chat = $.connection.chatHub
// Create a function that the hub can call back to display messages. // Create a function that the hub can call back to display messages.
chat.client.addMessage = function (name, room, message) { chat.client.addMessage = function (name, room, message) {
@ -72,8 +71,7 @@
chat.client.onJoined = function (rinfo) chat.client.onJoined = function (rinfo)
{ {
console.log(rinfo); console.log(rinfo);
$('#inp_'+rinfo.Name).prop('enable',true) setActiveRoom(rinfo.Name);
} }
$.fn.filterByData = function (prop, val) { $.fn.filterByData = function (prop, val) {
@ -82,44 +80,54 @@
) )
} }
var roomlist = $("<div class='roomlist' border='dashed'></div>"); var activeRoom;
var activeRoomName;
var setActiveRoom = function(room) {
if (activeRoom) {
// TODO animate
activeRoom.addClass("hidden");
$("sel_"+activeRoomName).addClass("btn-primary");
}
activeRoom=$("#vroom_"+room);
activeRoomName=room;
activeRoom.removeClass("hidden");
}
var roomlist = $('<div class="roomlist"></div>');
roomlist.appendTo($view); roomlist.appendTo($view);
var chatlist = $('<div class="chatlist" ></div>');
chatlist.appendTo($view);
var buildRoom = function (room) var buildRoom = function (room)
{ {
console.log('building:'+room); var roomTag = $("<a>"+room+"</a>").addClass("btn").addClass("btn-primary");
roomTag.prop("id","sel_"+room)
var roomTag = $("<a>"+room+"</a>");
roomTag.addClass('btn').addClass('default')
.click(function(){ .click(function(){
setRoom(room) setActiveRoom(room);
$(this).removeClass("btn-primary");
}); });
var roomview = $("<div></div>");
roomTag.appendTo(roomlist); roomTag.appendTo(roomlist);
var roomview = $("<div></div>").addClass("container");
roomview.appendTo(chatlist);
roomview.prop('id',"vroom_"+room); roomview.prop('id',"vroom_"+room);
var msglist = $("<ul class=\"mesglist\"></ul>"); var msglist = $("<ul></ul>").addClass("mesglist");
msglist.prop('id',"room_"+room); msglist.prop('id',"room_"+room);
msglist.appendTo(roomview); msglist.appendTo(roomview);
$("<input type=\"text\">") $("<input type=\"text\">")
.prop('id','inp_'+room) .prop('id','inp_'+room)
.prop('enable',false) .prop('enable',false)
.prop('hint','hello') .prop('hint','hello')
.prop('title','send to '+room) .prop('title','send to '+room)
.keydown(function(ev){ .addClass('form-control')
.keydown(function(ev) {
if (ev.which == 13) { if (ev.which == 13) {
console.log('sending:'+room+' '+this.value); if (this.value.length==0) return;
chat.server.send(room, this.value) console.log("sending to "+room+" "+this.value)
this.value="" chat.server.send(room, this.value);
} this.value="";
}).appendTo(roomview); }}).appendTo(roomview);
chans.push(room); chans.push(room);
roomview.appendTo($view); setActiveRoom(room);
console.log('done with built:');
console.log(chans);
} }
// build a channel list // build a channel list
@ -151,6 +159,7 @@
}) })
$.connection.hub.disconnected(function () { $.connection.hub.disconnected(function () {
onDisCx() onDisCx()
setTimeout(function () { setTimeout(function () {
$.connection.hub.start().done(function () { $.connection.hub.start().done(function () {
@ -160,16 +169,19 @@
}) })
}) })
$("<label for=\"channame\">&gt;&nbsp;</label>") $("<label for=\"channame\">&gt;&nbsp;</label>")
.appendTo($view); .appendTo($view);
var chanName = $("<input name=\"channame\" title=\"channel name\" hint=\"yavsc\">"); var chanName = $("<input name=\"channame\" title=\"channel name\" hint=\"yavsc\">");
chanName.appendTo($view); chanName.appendTo($view);
chanName.keydown( chanName.keydown(
function (event) { function (event) {
if (event.which == 13) { if (event.which == 13) {
if (this.value.length==0) return;
buildRoom(this.value); buildRoom(this.value);
chat.server.join(this.value);
this.value="" this.value=""
} else { } else {
// TODO showRoomInfo(this.value); // TODO showRoomInfo(this.value);
@ -180,15 +192,7 @@
ulist.appendTo($view); ulist.appendTo($view);
var activeRoom;
var setRoom = function(room) {
if (activeRoom) {
// TODO animate
activeRoom.addClass("hidden");
}
activeRoom=$("#vroom_"+room);
activeRoom.removeClass("hidden")
}
var pvuis var pvuis
// TODO get this data from the chatview element // TODO get this data from the chatview element
var audio = new Audio('/sounds/bell.mp3') var audio = new Audio('/sounds/bell.mp3')

@ -1 +1 @@
!function(t){var s,e=new Audio("/sounds/bell.mp3");function a(n,s){t('<li class="user"><button><img src="/Avatars/'+n+'.xs.png"> '+n+"</button></li>").data("name",n).data("cxids",s).css("cursor","pointer").click(function(){i(this)}).appendTo("#userlist")}function n(){setTimeout(function(){t("#userlist").empty(),t("#to").empty(),t.get("/api/chat/users").done(function(n){t.each(n,function(){var n=this,s=t("#userlist li").filterByData("name",n.UserName);0<s.length&&s.remove();var e=[];t.each(n.Connections,function(){e.push(this.ConnectionId)}),a(n.UserName,e)})})},120),t("#chatview").removeClass("disabled"),t("#sendmessage").prop("disabled",!1),t("#sendpv").prop("disabled",!1)}function o(n){return t("<div />").text(n).html()}var i=function(n){t("#sendmessagebox").addClass("hidden"),t("#sendpvbox").removeClass("hidden"),s={CXs:t(n).data("cxids"),UserName:t(n).data("name")},t("#sendpvdest").html(s.UserName),t("#pv").focus()},c=function(){t("#sendmessagebox").removeClass("hidden"),t("#sendpvbox").addClass("hidden"),t("#message").focus()};t("#pubChan").css("cursor","pointer"),t("#pubChan").click(c),c();var d=t.connection.chatHub;d.client.addMessage=function(n,s){t("#discussion").append('<li class="discussion"><strong>'+o(n)+"</strong>: "+o(s)+"</li>")},d.client.addPV=function(n,s){t("#mute").prop("checked")||e.play(),t("#discussion").append('<li class="pv"><strong>'+o(n)+"</strong>: "+o(s)+"</li>")},t.fn.filterByData=function(n,s){return this.filter(function(){return t(this).data(n)==s})};d.client.notify=function(n,s,e){var i;e&&("connected"===n?(!function(n,s){var e=t("#userlist li").filterByData("name",s);if(0<e.length){var i=e.data("cxids");i.push(n),e.data("cxids",i)}else a(s,[n])}(s,e),t("#discussion").append('<li class="notif"><i>'+o(n)+"</i> "+o(e)+"</li>")):"disconnected"===n?(i=s,t("#userlist li").filter(function(){var n=t(this).data("cxids").filter(function(){return t(this)!==i});0==n.Length?t(this).remove():t(this).data("cxids",n)}),t("#discussion").append('<li class="notif"><i>'+o(n)+"</i> "+o(e)+"</li>")):t("#discussion").append('<li class="notif"><i>'+o(n)+"</i> "+o(s)+" : "+o(e)+"</li>"))};var u=function(){d.server.send(t("#displayname").val(),t("#message").val()),t("#message").val("")},l=function(){var n=t("#pv").val();t.each(s.CXs,function(){d.server.sendPV(this,n)}),t("#discussion").append('<li class="pv">'+o(s.UserName)+"<< "+o(n)+"</li>"),t("#pv").val("")};t.connection.hub.start().done(function(){n(),t("#sendmessage").click(function(){u(),t("#message").focus()}),t("#message").keydown(function(n){13==n.which&&u()}),t("#pv").keydown(function(n){13==n.which&&l()}),t("#sendpv").click(function(){l(),t("#sendpv").focus()})}),t.connection.hub.disconnected(function(){t("#chatview").addClass("disabled"),t("#sendmessage").prop("disabled",!0),t("#sendpv").prop("disabled",!0),setTimeout(function(){t.connection.hub.start().done(function(){t("#mySignalRConnectionIdHidden").val(t.connection.hub.id),n()},3e4)})}),t(window).unload(function(){d.server.abort()})}(jQuery); !function(C){var e=function(o,n){if(!n)throw"not implemented";var a=C.connection.chatHub;a.client.addMessage=function(n,e,i){C("#room_"+e).append('<li class="discussion"><strong>'+f(n)+"</strong>: "+f(i)+"</li>")},a.client.addPV=function(n,e){C("#mute").prop("checked")||p.play(),C("#pv_"+n).append('<li class="pv"><strong>'+f(n)+"</strong>: "+f(e)+"</li>")},a.client.notify=function(n,e,i){i&&("connected"===n?(g(l,e,i),C("#notifications").append('<li class="notif"><i>'+f(n)+"</i> "+f(i)+"</li>")):"disconnected"===n?(b(l,e,i),C("#notifications").append('<li class="notif"><i>'+f(n)+"</i> "+f(i)+"</li>")):C("#notifications").append('<li class="notif"><i>'+f(n)+"</i> "+f(e)+" : <code>"+f(i)+"</code></li>"))},a.client.onJoined=function(n){console.log(n),C("#inp_"+n.Name).prop("enable",!0)},C.fn.filterByData=function(n,e){return this.filter(function(){return C(this).data(n)==e})};var s=C("<div class='roomlist' border='dashed'></div>");s.appendTo(o);var e=function(e){console.log("building:"+e);var n=C("<a>"+e+"</a>");n.addClass("btn").addClass("default").click(function(){u(e)});var i=C("<div></div>");n.appendTo(s),i.prop("id","vroom_"+e);var t=C('<ul class="mesglist"></ul>');t.prop("id","room_"+e),t.appendTo(i),C('<input type="text">').prop("id","inp_"+e).prop("enable",!1).prop("hint","hello").prop("title","send to "+e).keydown(function(n){13==n.which&&(console.log("sending:"+e+" "+this.value),a.server.send(e,this.value),this.value="")}).appendTo(i),c.push(e),i.appendTo(o),console.log("done with built:"),console.log(c)},c=Array();function i(){setTimeout(function(){var t;C("#userlist").empty(),C("#to").empty(),C.get("/api/chat/users").done(function(n){C.each(n,function(){var n=this,e=C("#userlist li").filterByData("name",n.UserName);0<e.length&&e.remove();var i=[];C.each(n.Connections,function(){i.push(this.ConnectionId)}),h(t,n.UserName,i)})})},120),C("#chatview").removeClass("disabled"),c.forEach(function(n){a.server.join(n)})}o.data("chans").split(",").forEach(function(n){e(n)}),C.connection.hub.start().done(function(){i()}),C.connection.hub.disconnected(function(){C("#chatview").addClass("disabled"),setTimeout(function(){C.connection.hub.start().done(function(){i()},3e4)})}),C('<label for="channame">&gt;&nbsp;</label>').appendTo(o);var t=C('<input name="channame" title="channel name" hint="yavsc">');t.appendTo(o),t.keydown(function(n){13==n.which&&(e(this.value),this.value="")});var d,l=C("<ul></ul>").addClass("userlist");l.appendTo(o);var r,u=function(n){d&&d.addClass("hidden"),(d=C("#vroom_"+n)).removeClass("hidden")},p=new Audio("/sounds/bell.mp3");function h(n,e,i){C('<li class="user"><img src="/Avatars/'+e+'.xs.png"> '+e+"</li>").data("name",e).data("cxids",i).css("cursor","pointer").click(function(){v(this)}).appendTo(n)}function f(n){return C("<div />").text(n).html()}C("#pv").keydown(function(n){var e;13==n.which&&(e=C("#pv").val(),C.each(r.CXs,function(){a.server.sendPV(this,e)}),C("#discussion").append('<li class="pv">'+f(r.UserName)+"<< "+f(e)+"</li>"),C("#pv").val(""))}),C("#command").keydown(function(n){13==n.which&&sendCommand()});var v=function(n){C("#rooms").addClass("hidden"),C("#sendpvbox").removeClass("hidden"),r={CXs:C(n).data("cxids"),UserName:C(n).data("name")},C("#sendpvdest").html(r.UserName),C("#pvs").focus()},m=function(){C("#rooms").removeClass("hidden"),C("#sendpvbox").addClass("hidden"),C("#message").focus()};C("#pubChan").css("cursor","pointer"),C("#pubChan").click(m),m();var b=function(e){C("#userlist li").filter(function(){var n=C(this).data("cxids").filter(function(){return C(this)!==e});0==n.length?C(this).remove():C(this).data("cxids",n)})},g=function(n,e,i){var t=C("#userlist li").filterByData("name",i);if(0<t.length){var o=t.data("cxids");o.push(e),t.data("cxids",o)}else h(n,i,[e])};C(window).unload(function(){a.server.abort()})};C(document).ready(function(n){e(n("#chatview"),!0)})}(jQuery);

@ -1 +1 @@
$(document).ready(function(o){var u=o(window),p=o(window).width(),b=o(window).height(),a=function(t,r,e){var n=t.data("speed"),o=(u.scrollLeft()+r-p/2)/n,a=(u.scrollTop()+e-b/2)/n,g=t.attr("orgbgpx")-Math.round(o),s=t.attr("orgbgpy")-Math.round(a),i=""+g+t.attr("orgbgpxu")+s+t.attr("orgbgpyu");t.css({backgroundPosition:i})},g=0,s=0;o('[data-type="background"]').each(function(){var r=o(this),t=r.css("backgroundPosition").split(" "),e=t[0],n=t[1];/%$/.test(e)?(e=e.substr(0,e.length-1),r.attr("orgbgpxu","% ")):/em$/.test(e)?(e=e.substr(0,e.length-2),r.attr("orgbgpxu","em ")):(/px$/.test(e)&&(e=e.substr(0,e.length-2)),r.attr("orgbgpxu","px ")),/%$/.test(n)?(n=n.substr(0,n.length-1),r.attr("orgbgpyu","% ")):/em$/.test(n)?(n=n.substr(0,n.length-2),r.attr("orgbgpyu","em ")):(/px$/.test(n)&&(n=n.substr(0,n.length-2)),r.attr("orgbgpyu","px ")),r.attr("orgbgpx",parseInt(e)),r.attr("orgbgpy",parseInt(n)),o(window).scroll(function(){a(r,g,s)}),window.DeviceOrientationEvent&&(320<p&&320<b&&window.addEventListener("deviceorientation",function(t){g=p*Math.sin(t.gamma*Math.PI/180),s=b*Math.sin(t.beta*Math.PI/90),a(r,g,s)},!1),o(window).mousemove(function(t){g=t.pageX,s=t.pageY,a(r,t.pageX,t.pageY)}))})}(jQuery)); $(document).ready(function(e){var u=e(window),p=e(window).width(),b=e(window).height(),a=function(t,r,n){d=r,c=n;var o=t.data("speed"),e=(u.scrollLeft()+r-p/2)/o,a=(u.scrollTop()+n-b/2)/o,g=t.attr("orgbgpx")-Math.round(e),s=t.attr("orgbgpy")-Math.round(a),i=""+g+t.attr("orgbgpxu")+s+t.attr("orgbgpyu");t.css({backgroundPosition:i})},d=0,c=0;e('[data-type="background"]').each(function(){var r=e(this),t=r.css("backgroundPosition").split(" "),n=t[0],o=t[1];/%$/.test(n)?(n=n.substr(0,n.length-1),r.attr("orgbgpxu","% ")):/em$/.test(n)?(n=n.substr(0,n.length-2),r.attr("orgbgpxu","em ")):(/px$/.test(n)&&(n=n.substr(0,n.length-2)),r.attr("orgbgpxu","px ")),/%$/.test(o)?(o=o.substr(0,o.length-1),r.attr("orgbgpyu","% ")):/em$/.test(o)?(o=o.substr(0,o.length-2),r.attr("orgbgpyu","em ")):(/px$/.test(o)&&(o=o.substr(0,o.length-2)),r.attr("orgbgpyu","px ")),r.attr("orgbgpx",parseInt(n)),r.attr("orgbgpy",parseInt(o)),e(window).scroll(function(){a(r,d,c)}),window.DeviceOrientationEvent&&(320<p&&320<b&&window.addEventListener("deviceorientation",function(t){a(r,p*Math.sin(t.gamma*Math.PI/180),b*Math.sin(t.beta*Math.PI/90))},!1),e(window).mousemove(function(t){a(r,t.pageX,t.pageY)}))})}(jQuery));
Loading…