Esempio n. 1
0
        private async void SendMessageToAllMembers(IEnumerable <long> listUserId, DbMain.EFDbContext.ConversationReply reply)
        {
            List <ConversationReply> conversationReplies          = new List <ConversationReply>();
            List <DbMain.EFDbContext.ConversationReply> dbReplies = new List <DbMain.EFDbContext.ConversationReply>();
            await Task.Run(() =>
            {
                using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities())
                {
                    int status = (int)ConversationReplyStatus.Received;
                    foreach (var item in listUserId)
                    {
                        var DBreply = new DbMain.EFDbContext.ConversationReply()
                        {
                            AuthorId                  = reply.AuthorId,
                            Body                      = reply.Body,
                            ConversationId            = reply.ConversationId,
                            ConversationReplyStatusId = status,
                            ReceiverId                = item
                        };
                        db.ConversationReplies.Add(DBreply);
                        dbReplies.Add(DBreply);
                    }
                    db.SaveChanges();
                }
            });

            for (int i = 0; i < listUserId.Count(); i++)
            {
                ChatServiceCallbackModel.SendMessageToUser(listUserId.ElementAt(i), new ConversationReply
                {
                    Author         = curUser.Login,
                    Body           = reply.Body,
                    ConversationId = reply.ConversationId,
                    SendingTime    = DateTimeOffset.UtcNow,
                    Status         = ConversationReplyStatus.Received,
                    Id             = dbReplies[i].Id
                });
            }
        }
Esempio n. 2
0
        public OperationResult <bool> InviteFriendToConversation(string Login, long conversationId)
        {
            Console.WriteLine("Invite to conversation");
            try
            {
                using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities())
                {
                    var conv = db.Conversations.Include(x => x.ConversationMembers).FirstOrDefault(x => x.Id == conversationId);
                    if (conv == null)
                    {
                        return(new OperationResult <bool>(false, false, "Conversation not found"));
                    }
                    var member = conv.ConversationMembers.FirstOrDefault(x => x.MemberId == curUser.Id);
                    if (member == null)
                    {
                        return(new OperationResult <bool>(false, false, "You are not in conversation"));
                    }
                    var invitedUser = db.Users.FirstOrDefault(x => x.Login == Login);
                    if (invitedUser == null)
                    {
                        return(new OperationResult <bool>(false, false, "User not found"));
                    }
                    var contact = db.Contacts.FirstOrDefault(x => (x.AdderId == curUser.Id && x.InvitedId == invitedUser.Id) || (x.AdderId == invitedUser.Id && x.InvitedId == curUser.Id) && x.RelationTypeId == (int)RelationStatus.Friendship);
                    if (contact == null)
                    {
                        return(new OperationResult <bool>(false, false, "User not your friend"));
                    }
                    var convStatus = (ConversationType)conv.ConversationTypeId;
                    if (convStatus == ConversationType.Dialog)
                    {
                        return(new OperationResult <bool>(false, false, "Can't add users to Dialog"));
                    }
                    var memberStatus = (ConversationMemberStatus)member.MemberStatusId;
                    switch (memberStatus)
                    {
                    case ConversationMemberStatus.None:

                    case ConversationMemberStatus.Blocked:
                    case ConversationMemberStatus.ReadOnly:
                    case ConversationMemberStatus.LeftConversation:
                        return(new OperationResult <bool>(false, false, "No permission to add users"));

                    case ConversationMemberStatus.Active:
                        if (convStatus == ConversationType.OpenConversation)
                        {
                            return(new OperationResult <bool>(false, false, "No permission to add users"));
                        }
                        break;

                    default:
                        break;
                    }
                    db.ConversationMembers.Add(new DbMain.EFDbContext.ConversationMember()
                    {
                        AddedId        = curUser.Id,
                        ConversationId = conversationId,
                        MemberId       = invitedUser.Id,
                        MemberStatusId = (int)ConversationMemberStatus.Active
                    });
                    if (db.SaveChanges() > 0)
                    {
                        conv = db.Conversations.Include(x => x.ConversationMembers).FirstOrDefault(x => x.Id == conversationId);
                        var members = conv.ConversationMembers.Select(x => x.User.Id).ToList();
                        members.Remove(curUser.Id);
                        SendMessageToAllMembers(members, new DbMain.EFDbContext.ConversationReply()
                        {
                            AuthorId                  = curUser.Id,
                            Body                      = $"{curUser.Name} Added {invitedUser.Name}",
                            ConversationId            = conversationId,
                            ConversationReplyStatusId = (int)ConversationReplyStatus.SystemMessage
                        });
                        //ChatServiceCallbackModel.SendMessageToGroup(members, new ConversationReply()
                        //{
                        //    Author = curUser.Login,
                        //    Body = $"{curUser.Name} Added {invitedUser.Name}",
                        //    ConversationId = conversationId,
                        //    SendingTime = DateTimeOffset.UtcNow,
                        //    Status = ConversationReplyStatus.SystemMessage
                        //});
                        ChatServiceCallbackModel.AddingToConversation(curUser.Login, invitedUser.Id, new Conversation()
                        {
                            ConversationType = (ConversationType)conv.ConversationTypeId,
                            Id                = conv.Id,
                            Descriptiom       = conv.Description,
                            Icon              = conv.Icon,
                            LastChange        = DateTimeOffset.UtcNow,
                            MyStatus          = ConversationMemberStatus.Active,
                            Name              = conv.Name,
                            ParticipantsLogin = conv.ConversationMembers.Select(x => x.User.Login).ToList()
                        });
                        return(new OperationResult <bool>(true));
                    }
                    return(new OperationResult <bool>(false, false, "Internal error"));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <bool>(false, false, "Internal error"));
            }
        }