// 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); } } }
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()); } }
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); } } }
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); } }
public static void AddUserToRoom(string roomId, string userId) { using (var context = new MagicDbContext()) { var chatRoomAllowedUser = new ChatRoomUser { ChatRoomId = roomId, UserId = userId }; context.Insert(chatRoomAllowedUser); } }
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); } } }