0

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")

});
Trev
  • 35
  • 6
  • You have not even asked a question? What do you want to know?? – Kelso Sharp May 05 '17 at 20:50
  • I want to know how to implement 2 groups such that group A views online users from group B and vise versa, or in other words a user can not see people in their own group but the ones in the other group – Trev May 08 '17 at 06:34

1 Answers1

0

In the case of broadcasting you would simply user Clients.AllExcept, but since you are trying to display connected users, you are going to need track the users and the groups they belong to yourself and send out the user list manually.

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var connectionID = HttpContext.Request.Cookies["conn-id"].Value;
context.Clients.AllExcept(connectionID).addMessage(message);

This code sample was taken from this SO Question:

Broadcasting message to all clients except self in SignalR

Community
  • 1
  • 1
Kelso Sharp
  • 972
  • 8
  • 12