I am creating a signalr chat app for my workplace to be used by clients and support. Its all working fine but i need to prevent clients from seeing each other and only see the support personnel that are online, and likewise on the support end have them see online clients only and not other support personnel. I googled this and found out the best way to implement such is to use groups such that users in groupA (support guys) can only see online users in groupB (clients) and users in groupB can only see online users in groupA.
This is my hub class:
`#region---Methods---
public void Connect(string UserName, int UserID)
{
var id = Context.ConnectionId;
if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
{
ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = UserName, UserID = UserID });
}
UserDetail CurrentUser = ConnectedUsers.Where(u => u.ConnectionId == id).FirstOrDefault();
// send to caller
Clients.Caller.onConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, ConnectedUsers, CurrentMessage, CurrentUser.UserID);
// send to all except caller client
Clients.AllExcept(CurrentUser.ConnectionId).onNewUserConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, CurrentUser.UserID);
}
public void SendMessageToAll(string userName, string message)
{
// store last 100 messages in cache
//AddMessageinCache(userName, message);
// Broad cast message
//Clients.All.messageReceived(userName, message);
}
public void SendPrivateMessage(string toUserId, string message)
{
try
{
string fromconnectionid = Context.ConnectionId;
string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString();
int _fromUserId = 0;
int.TryParse(strfromUserId, out _fromUserId);
int _toUserId = 0;
int.TryParse(toUserId, out _toUserId);
List<UserDetail> FromUsers = ConnectedUsers.Where(u => u.UserID == _fromUserId).ToList();
List<UserDetail> ToUsers = ConnectedUsers.Where(x => x.UserID == _toUserId).ToList();
if (FromUsers.Count != 0 && ToUsers.Count() != 0)
{
foreach (var ToUser in ToUsers)
{
// send to //Chat Title
Clients.Client(ToUser.ConnectionId).sendPrivateMessage(_fromUserId.ToString(), FromUsers[0].UserName, FromUsers[0].UserName, message);
}
foreach (var FromUser in FromUsers)
{
// send to caller user //Chat Title
Clients.Client(FromUser.ConnectionId).sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, ToUsers[0].UserName, message);
}
// send to caller user
//Clients.Caller.sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, message);
//ChatDB.Instance.SaveChatHistory(_fromUserId, _toUserId, message);
MessageDetail _MessageDeail = new MessageDetail { FromUserID = _fromUserId, FromUserName = FromUsers[0].UserName, ToUserID = _toUserId, ToUserName = ToUsers[0].UserName, Message = message };
AddMessageinCache(_MessageDeail);
}
}
catch { }
}
public void RequestLastMessage(int FromUserID, int ToUserID)
{
List<MessageDetail> CurrentChatMessages = (from u in CurrentMessage where ((u.FromUserID == FromUserID && u.ToUserID == ToUserID) || (u.FromUserID == ToUserID && u.ToUserID == FromUserID)) select u).ToList();
//send to caller user
Clients.Caller.GetLastMessages(ToUserID, CurrentChatMessages);
}
public void SendUserTypingRequest(string toUserId)
{
string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString();
int _toUserId = 0;
int.TryParse(toUserId, out _toUserId);
List<UserDetail> ToUsers = ConnectedUsers.Where(x => x.UserID == _toUserId).ToList();
foreach (var ToUser in ToUsers)
{
// send to
Clients.Client(ToUser.ConnectionId).ReceiveTypingRequest(strfromUserId);
}
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
ConnectedUsers.Remove(item);
if (ConnectedUsers.Where(u => u.UserID == item.UserID).Count() == 0)
{
var id = item.UserID.ToString();
Clients.All.onUserDisconnected(id, item.UserName);
}
}
return base.OnDisconnected(stopCalled);
}
#endregion
#region---private Messages---
private void AddMessageinCache(MessageDetail _MessageDetail)
{
CurrentMessage.Add(_MessageDetail);
if (CurrentMessage.Count > 100)
CurrentMessage.RemoveAt(0);
}
#endregion
public Task JoinGroup(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task LeaveGroup(string groupName)
{
return Groups.Remove(this.Context.ConnectionId, groupName);
}
}
}` My Javascript:
$.connection.hub.start().done(function () {
registerEvents(chatHub);
chatHub.server.joinGroup("GroupA")
});