Ejemplo n.º 1
0
        public ActionResult PostNewMessage(FormCollection frm)
        {
            if (ModelState.IsValid)
            {
                var invitees = new List <string>();
                if (!string.IsNullOrEmpty(frm["invitees"]))
                {
                    invitees = frm["invitees"].Split(',').ToList();
                }
                var result = _chat.CreateNewChat(frm["Message"], invitees);
            }


            return(RedirectToAction("ShowChat"));
        }
Ejemplo n.º 2
0
        public async Task <MessageModel> SendMessage(MessageModel message)
        {
            var user = await _userManager.FindByNameAsync(Thread.CurrentPrincipal.Identity.Name);

            if (ReferenceEquals(message.ChatId, null))
            {
                var companion = await _userManager.FindByNameAsync(message.ToChatName);

                if (!(await _chat.IsChatExist(user, companion, message)))
                {
                    _chat.CreateNewChat(user, companion, message);
                }
            }

            FileDb fileDb = null;

            if (!ReferenceEquals(message.File, null))
            {
                fileDb          = new FileDb();
                fileDb.FilePath = message.File.FileFullName;
                fileDb.IsImage  = message.File.IsImage;
                fileDb.IsAudio  = message.File.IsVoice;
                fileDb.IsVideo  = message.File.IsVideo;
                _context.Files.Add(fileDb);
                _context.Entry(fileDb).State = EntityState.Added;
            }

            var dbMessage = new Message()
            {
                ChatId  = message.ChatId,
                Content = message.Content,
                UserId  = user.Id,
                File    = ReferenceEquals(message.File, null) ? null : fileDb?.Id,
                Created = DateTime.Now
            };

            _context.Messages.Add(dbMessage);
            _context.Entry(dbMessage).State = EntityState.Added;

            await _context.SaveChangesAsync();

            message.MessageId  = dbMessage.Id;
            message.DateCreate = dbMessage.Created;

            var dbCurrentStatusMessage = new MessageStatus()
            {
                MessageId = dbMessage.Id,
                IsRead    = true,
                UserId    = user.Id,
            };

            _context.MessagesStatus.Add(dbCurrentStatusMessage);

            if ((await _context.Chats.FindAsync(message.ChatId)).ChatType == ChatEnum.ChatForTwo)
            {
                var chatForTwo = _context.ChatsForTwo.FirstOrDefault(x => String.Equals(x.ChatId, message.ChatId));
                var dbCompanionStatusMessage = new MessageStatus()
                {
                    MessageId = dbMessage.Id,
                    UserId    = String.Equals(Thread.CurrentPrincipal.Identity.Name, chatForTwo.FirstUser.UserName) ? chatForTwo.SecondUser.Id : chatForTwo.FirstUser.Id
                };

                _context.MessagesStatus.Add(dbCompanionStatusMessage);
                message.ToChatName = String.Equals(user.UserName, chatForTwo.FirstUser.UserName) ? chatForTwo.FirstUser.UserName : chatForTwo.SecondUser.UserName;
                await _hubContext.Clients.User(dbCompanionStatusMessage.UserId).SendAsync("ReceiveMessage", message);

                message.ToChatName = user.UserName;
            }
            else
            {
                var chatForGroup = _context.ChatsForGroup.FirstOrDefault(x => String.Equals(x.ChatId, message.ChatId));
                var sorted       = chatForGroup.GroupsUsers.Where(x => !String.Equals(user.Id, x.UserId)).Select(x => x.UserId);

                if (!chatForGroup.GroupsUsers.Any(x => String.Equals(user.Id, x.UserId)))
                {
                    _context.GroupsUsers.Add(new GroupsUsers()
                    {
                        GroupId = chatForGroup.Id, UserId = user.Id
                    });

                    var newChat = new ChatListModel()
                    {
                        ChatId   = chatForGroup.ChatId,
                        ChatName = chatForGroup.Chat.ChatName,
                        ChatEnum = ChatEnum.ChatForGroup
                    };

                    await _hubContext.Clients.User(user.Id).SendAsync("NewChat", newChat);
                }


                foreach (var userId in sorted)
                {
                    var dbCompanionStatusMessage = new MessageStatus()
                    {
                        MessageId = dbMessage.Id,
                        UserId    = userId
                    };
                    _context.MessagesStatus.Add(dbCompanionStatusMessage);
                }
                await _hubContext.Clients.Users(sorted.ToList()).SendAsync("ReceiveMessage", message);
            }

            await _context.SaveChangesAsync();

            message.IsMyMessage = true;

            return(message);
        }