Ejemplo n.º 1
0
        // Create new chat room with given settings and for specific users only if it's private.
        public void CreateChatRoom(string roomId = null, bool isGameRoom = false, bool isPrivate = false, IList<string> recipientNames = null)
        {
            using (var context = new MagicDbContext())
            {
                var chatRoom = new ChatRoom(roomId)
                {
                    IsGameRoom = isGameRoom,
                    IsPrivate = isPrivate,
                    Name = (isGameRoom ? "Game" : null),
                    TabColorCode = (isGameRoom ? string.Empty.AssignRandomColorCode() : null)
                };
                context.Insert(chatRoom);

                if (!isPrivate) return;

                // TODO: check how recipients behave after chacking chatroom existance and if thee can be any null exception
                var recipients = recipientNames.Distinct().Select(userName => context.Users.FirstOrDefault(u => u.UserName == userName)).ToList();

                foreach (var user in recipients)
                {
                    AddUserToRoom(chatRoom.Id, user.Id);
                    SubscribeActiveConnections(chatRoom.Id, user.Id);
                }
            }
        }
Ejemplo n.º 2
0
        public static void SubscribeActiveConnections(string roomId, string userId)
        {
            using (var context = new MagicDbContext())
            {
                var activeConnectionIds = context.Connections.Where(c => c.UserId == userId).Select(c => c.Id);
                var subscribedConnectionIds = context.ChatRoomConnections.Where(crc => crc.UserId == userId && crc.ChatRoomId == roomId).Select(crc => crc.ConnectionId);
                var unsubscribedConnectionIds = activeConnectionIds.Except(subscribedConnectionIds);

                if (!unsubscribedConnectionIds.Any()) return;

                var groupsProcessed = new List<Task>();
                foreach (var connectionId in unsubscribedConnectionIds)
                {
                    var chatRoomConnection = new ChatRoomConnection
                    {
                        ChatRoomId = roomId,
                        ConnectionId = connectionId,
                        UserId = userId
                    };

                    var chatHubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
                    groupsProcessed.Add(chatHubContext.Groups.Add(connectionId, roomId));
                    context.Insert(chatRoomConnection);
                }

                Task.WhenAll(groupsProcessed.ToArray());
            }
        }
Ejemplo n.º 3
0
        public void SubscribeActiveChatRooms(string connectionId, string userId)
        {
            using (var context = new MagicDbContext())
            {
                var activeChatRoomIds = context.ChatRoomConnections.Where(rc => rc.UserId == userId && rc.ChatRoomId != DefaultRoomId).Select(rc => rc.ChatRoomId).Distinct();

                foreach (var roomId in activeChatRoomIds)
                {
                    var chatRoomConnection = new ChatRoomConnection
                    {
                        ChatRoomId = roomId,
                        ConnectionId = connectionId,
                        UserId = userId
                    };

                    Groups.Add(connectionId, roomId);
                    context.Insert(chatRoomConnection);
                }
            }
        }
Ejemplo n.º 4
0
        public async void SubscribeChatRoom(string roomId)
        {
            var chatHubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            var addToGroup = chatHubContext.Groups.Add(Context.ConnectionId, roomId);

            using (var context = new MagicDbContext())
            {
                var chatRoomConnection = new ChatRoomConnection
                {
                    ChatRoomId = roomId,
                    ConnectionId = Context.ConnectionId,
                    UserId = Context.User.Identity.GetUserId()
                };
                context.Insert(chatRoomConnection);
            }

            await addToGroup;

            if (roomId != DefaultRoomId)
            {
                UpdateChatRoomUsers(roomId);
            }
        }
Ejemplo n.º 5
0
 public static void AddUserToRoom(string roomId, string userId)
 {
     using (var context = new MagicDbContext())
     {
         var chatRoomAllowedUser = new ChatRoomUser
         {
             ChatRoomId = roomId,
             UserId = userId
         };
         context.Insert(chatRoomAllowedUser);
     }
 }
Ejemplo n.º 6
0
        public void Send(string messageText, string roomId)
        {
            using (var context = new MagicDbContext())
            {
                var userId = Context.User.Identity.GetUserId();
                var sender = context.Users.Find(userId);
                var message = new ChatMessage(messageText)
                {
                    Sender = sender,
                    Message = messageText
                };

                var chatRoom = context.ChatRooms.Include(r => r.Users.Select(u => u.User)).First(r => r.Id == roomId);
                foreach (var user in chatRoom.Users)
                {
                    SubscribeActiveConnections(chatRoom.Id, user.UserId);
                }

                Clients.Group(roomId).addMessage(roomId, message.TimeSend.ToString("HH:mm:ss"), message.Sender.UserName, message.Sender.ColorCode, message.Message);
                
                chatRoom.AddMessageToLog(message);
                context.InsertOrUpdate(chatRoom);

                foreach (var notification in chatRoom.Users.Where(u => u.User.Status == UserStatus.Offline).Select(u => new ChatMessageNotification
                    {
                        RecipientId = u.UserId,
                        MessageId = message.Id,
                        LogId = message.LogId
                    }))
                {
                    context.Insert(notification);
                }
            }
        }