Example #1
0
        public OperationResult <List <User> > FindUsers(string param)
        {
            Console.WriteLine("AccountUpdateServiceprovider  FindUsers");
            try
            {
                using (db = new DbMain.EFDbContext.ChatEntities())
                {
                    var user   = db.Users.FirstOrDefault(x => x.Id == curUser.Id);
                    var logins = db.Users.Where(x => x.Login.Contains(param) || x.Name.Contains(param)).Select(x => x.Login).ToList();
                    logins.Remove(curUser.Login);
                    var users = FromUserDbToUserClient(logins, db);
                    //var list = db.Users.Where(x => x.Login.Contains(param) || x.Name.Contains(param)).Select(x => new User()
                    //{
                    //    Login = x.Login,
                    //    Name = x.Name,
                    //    ConversationId = -1,
                    //    Icon = x.Icon,
                    //    NetworkStatus = NetworkStatus.Unknown
                    //}).ToList();

                    //list.ForEach(x =>
                    //{
                    //    var cont1 = user.Contacts.FirstOrDefault(y => y.User1.Login == x.Login);
                    //    if (cont1 != null)
                    //    {
                    //        x.RelationStatus = (RelationStatus)cont1.RelationTypeId;
                    //        return;
                    //    }
                    //    var cont2 = user.Contacts1.FirstOrDefault(y => y.User1.Login == x.Login);
                    //    if (cont2 != null)
                    //    {
                    //        x.RelationStatus = (RelationStatus)cont2.RelationTypeId;
                    //        return;
                    //    }
                    //    x.RelationStatus = RelationStatus.None;
                    //});
                    return(new OperationResult <List <User> >(users));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <List <User> >(new List <User>(), false, "Internal server error"));
            }
        }
Example #2
0
        private List <User> GetBlockedUsers(DbMain.EFDbContext.ChatEntities db, List <String> logins)
        {
            var users = db.Users.Where(x => logins.Contains(x.Login)).ToList();
            //  var user = db.Users.FirstOrDefault(x => x.Id == curUser.Id);
            var usersToLocal = users.Select(x => new User
            {
                Login          = x.Login,
                Name           = x.Name,
                Icon           = x.Icon,
                RelationStatus = db.Contacts
                                 .FirstOrDefault(y =>
                                                 (y.AdderId == x.Id && y.InvitedId == curUser.Id) ||
                                                 (y.AdderId == curUser.Id && y.InvitedId == x.Id))
                                 .RelationTypeId == (int)RelationStatus.BlockedBoth ? RelationStatus.BlockedBoth : RelationStatus.BlockedByMe,
                NetworkStatus  = NetworkStatus.Unknown,
                ConversationId = db.Conversations.FirstOrDefault(c => (c.AuthorId == x.Id && c.PartnerId == curUser.Id) || (c.PartnerId == x.Id && c.AuthorId == curUser.Id)).Id
            }).ToList();

            return(usersToLocal);
        }
Example #3
0
        public OperationResult <Conversation> CreateConversation(string Name, bool IsOpen = false)
        {
            Console.WriteLine("Create conversation");
            try
            {
                using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities())
                {
                    DbMain.EFDbContext.Conversation conversation = new DbMain.EFDbContext.Conversation()
                    {
                        AuthorId           = curUser.Id,
                        Name               = Name,
                        ConversationTypeId = (int)(IsOpen ? ConversationType.OpenConversation : ConversationType.PrivateConversation)
                    };
                    db.ConversationMembers.Add(new DbMain.EFDbContext.ConversationMember()
                    {
                        Conversation   = conversation,
                        MemberId       = curUser.Id,
                        MemberStatusId = (int)ConversationMemberStatus.Admin
                    });
                    db.Conversations.Add(conversation);

                    if (db.SaveChanges() > 0)
                    {
                        return(new OperationResult <Conversation>(new Conversation()
                        {
                            ConversationType = IsOpen ? ConversationType.OpenConversation : ConversationType.PrivateConversation,
                            Id = conversation.Id,
                            MyStatus = ConversationMemberStatus.Admin,
                            Name = Name
                        }));
                    }
                    return(new OperationResult <Conversation>(null, false, "Internal error"));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <Conversation>(null, false, "Internal error"));
            }
        }
Example #4
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
                });
            }
        }
Example #5
0
        public OperationResult <List <User> > GetUsersByRelationStatus(RelationStatus relationStatus)
        {
            Console.WriteLine($"AccountUpdateServiceprovider  GetUsersByRelationStatus. Login {curUser.Login}, staus - {relationStatus} ");

            try
            {
                using (db = new DbMain.EFDbContext.ChatEntities())
                {
                    List <User>   res = new List <User>();
                    List <String> contactsLogins;
                    contactsLogins = GetContacts(db, relationStatus);
                    // contactsLogins.AddRange(GetUsers(db, relationStatus));
                    switch (relationStatus)
                    {
                    case RelationStatus.Friendship:
                        res = GetFriends(db, contactsLogins);
                        break;

                    case RelationStatus.FriendshipRequestSent:
                        res = GetFriendshipRequestSendUsers(db, contactsLogins);
                        break;

                    case RelationStatus.FrienshipRequestRecive:
                        res = GetFriendshipRequestReceiveUsers(db, contactsLogins);
                        break;

                    case RelationStatus.BlockedByMe:
                        res = GetBlockedUsers(db, contactsLogins);
                        break;
                    }
                    return(new OperationResult <List <User> >(res));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <List <User> >(new List <User>(), false, "Internal error. Try again later"));
            }
        }
Example #6
0
 public OperationResult <bool> ReadMessage(long MessageId)
 {
     try
     {
         using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities())
         {
             var message = db.ConversationReplies.FirstOrDefault(x => x.Id == MessageId);
             if (message != null)
             {
                 message.ConversationReplyStatusId = (int)ConversationReplyStatus.AlreadyRead;
                 if (db.SaveChanges() > 0)
                 {
                     return(new OperationResult <bool>(true));
                 }
             }
             return(new OperationResult <bool>(false, false, "Internal Error"));
         }
     }
     catch (Exception ex)
     {
         return(new OperationResult <bool>(false, false, "Internal Error"));
     }
 }
Example #7
0
 public OperationResult <UserExt> Authentication(string token)
 {
     Console.WriteLine("ChatServiceProvider  Auth");
     try
     {
         using (db = new DbMain.EFDbContext.ChatEntities())
         {
             var access = db.AccessTokens.FirstOrDefault(x => x.IsActive && x.Token == token);
             if (access == null)
             {
                 return(new OperationResult <UserExt>(null, false, "Faild authorization"));
             }
             curUser = access.User;
             if ((NetworkStatus)curUser.NetworkStatusId != NetworkStatus.Hidden)
             {
                 access.User.NetworkStatusId = (int)NetworkStatus.OnLine;
             }
             db.SaveChanges();
             // UserRelationsMain.OnlineUsers.TryAdd(curUser.Login, this);
             ChatServiceCallbackModel.OnlineUsers.TryAdd(curUser.Id, this);
             return(new OperationResult <UserExt>(new UserExt()
             {
                 BirthDate = curUser.Birthdate,
                 Icon = curUser.Icon,
                 Login = curUser.Login,
                 Name = curUser.Name,
                 NetworkStatus = (NetworkStatus)curUser.NetworkStatusId,
                 Phone = curUser.Phone
             }));
         }
     }
     catch (Exception ex)
     {
         return(new OperationResult <UserExt>(null, false, "Internal error. Try again later"));
     }
 }
Example #8
0
        public OperationResult <List <Conversation> > GetConversations()
        {
            try
            {
                using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities())
                {
                    var conv = db.ConversationMembers.Include(x => x.Conversation).Include(x => x.ConversationMemberStatus).Where(x => x.MemberId == curUser.Id).Distinct().Select(x => new Conversation
                    {
                        Descriptiom      = x.Conversation.Description,
                        Icon             = x.Conversation.Icon,
                        ConversationType = (ConversationType)x.Conversation.ConversationTypeId,
                        LastChange       = x.Conversation.LastChange,
                        Id       = x.Conversation.Id,
                        MyStatus = (ConversationMemberStatus)x.MemberStatusId,
                        Name     = x.Conversation.Name
                    }).ToList();
                    var user = db.Users.FirstOrDefault(x => x.Id == curUser.Id);
                    var a    = db.ConversationReplies.Where(x => x.ReceiverId == curUser.Id || x.AuthorId == curUser.Id).GroupBy(x => x.ConversationId).ToList();

                    conv.ForEach((x) =>
                    {
                        x.Messages = new System.Collections.ObjectModel.ObservableCollection <ConversationReply>(
                            db.ConversationReplies
                            .Where(y => y.ConversationId == x.Id && y.ReceiverId == curUser.Id)
                            .Select(y => new ConversationReply()
                        {
                            Author         = y.User.Login,
                            Body           = y.Body,
                            ConversationId = y.ConversationId,
                            Id             = y.Id,
                            SendingTime    = y.SendingTime,
                            Status         = (ConversationReplyStatus)y.ConversationReplyStatusId
                        }));
                        if (x.ConversationType == ConversationType.Dialog)
                        {
                            var contact = db.Conversations.Include(y => y.User).Include(y => y.User1).FirstOrDefault(y => y.Id == x.Id);
                            if (contact.AuthorId == curUser.Id)
                            {
                                x.Partner = FromDbUserToLocal(contact.User1, x.Id);
                            }
                            else
                            {
                                x.Partner = FromDbUserToLocal(contact.User, x.Id);
                            }
                        }
                        else
                        {
                            var participants = db.ConversationMembers.Where(y => y.ConversationId == x.Id).Select(y => y.User.Login).ToList();
                            //  participants.Remove(curUser.Login);
                            x.ParticipantsLogin = participants;
                        }
                    });
                    conv = conv.Where(x => !(x.ConversationType == ConversationType.Dialog && x.Messages.Count == 0 && (x.MyStatus == ConversationMemberStatus.Blocked || x.MyStatus == ConversationMemberStatus.None))).ToList();
                    return(new OperationResult <List <Conversation> >(conv));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <List <Conversation> >(null, false, "InternalError GetConversations"));
            }
        }
Example #9
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"));
            }
        }
Example #10
0
        public OperationResult <bool> ChangeRelationType(string login, RelationStatus status)
        {
            Console.WriteLine("AccountUpdateServiceprovider  ChangeRelationType");

            try
            {
                using (db = new DbMain.EFDbContext.ChatEntities())
                {
                    RelationStatus statusForPartner = status;
                    if (login == curUser.Login)
                    {
                        return(new OperationResult <bool>(false, false, "Login error"));
                    }
                    var user = db.Users.FirstOrDefault(x => x.Login == login);
                    if (user == null)
                    {
                        return(new OperationResult <bool>(false, false, "User not found"));
                    }
                    var contact = db.Contacts.FirstOrDefault(x => (x.AdderId == curUser.Id && x.InvitedId == user.Id) || (x.InvitedId == curUser.Id && x.AdderId == user.Id));
                    if (contact != null && contact.RelationTypeId == (int)status)
                    {
                        return(new OperationResult <bool>(false, false, "Status is the same"));
                    }
                    if (contact == null)
                    {
                        CreateContactAndDialog(db, out contact, user, status);
                    }
                    else
                    {
                        var convMember = user.ConversationMembers.FirstOrDefault(x => x.Conversation == contact.Conversation);
                        switch (status)
                        {
                        case RelationStatus.None:
                            convMember.MemberStatusId = (int)ConversationMemberStatus.None;
                            contact.RelationTypeId    = (int)status;
                            break;

                        case RelationStatus.Friendship:
                            convMember.MemberStatusId = (int)ConversationMemberStatus.Admin;
                            contact.RelationTypeId    = (int)status;
                            break;

                        case RelationStatus.FrienshipRequestRecive:
                            if (contact.AdderId == curUser.Id)
                            {
                                contact.RelationTypeId = (int)status;
                            }
                            else
                            {
                                contact.RelationTypeId = (int)RelationStatus.FriendshipRequestSent;
                            }
                            statusForPartner = RelationStatus.FriendshipRequestSent;
                            break;

                        case RelationStatus.BlockedByMe:
                            if (contact.AdderId == curUser.Id && (RelationStatus)contact.RelationTypeId != RelationStatus.BlockedByPartner)
                            {
                                contact.RelationTypeId = (int)status;
                                statusForPartner       = RelationStatus.BlockedByPartner;
                            }
                            else if (contact.AdderId == curUser.Id && contact.RelationTypeId == (int)RelationStatus.BlockedByPartner ||
                                     contact.InvitedId == curUser.Id && contact.RelationTypeId == (int)RelationStatus.BlockedByMe)
                            {
                                contact.RelationTypeId = (int)RelationStatus.BlockedBoth;
                                statusForPartner       = RelationStatus.BlockedBoth;
                            }
                            else if (contact.InvitedId == curUser.Id && (RelationStatus)contact.RelationTypeId != RelationStatus.BlockedByMe)
                            {
                                contact.RelationTypeId = (int)RelationStatus.BlockedByPartner;
                                statusForPartner       = RelationStatus.BlockedByPartner;
                            }
                            convMember.MemberStatusId = (int)ConversationMemberStatus.Blocked;
                            break;
                        }
                    }
                    var res = db.SaveChanges();
                    if (res < 1)
                    {
                        return(new OperationResult <bool>(false, false, "Faild"));
                    }
                    if (status == RelationStatus.Friendship)
                    {
                        UserRelationsMain.UserNetworkStatusChange(new List <string>()
                        {
                            curUser.Login
                        }, user.Login, (NetworkStatus)user.NetworkStatusId);
                        UserRelationsMain.UserNetworkStatusChange(new List <string>()
                        {
                            user.Login
                        }, curUser.Login, (NetworkStatus)curUser.NetworkStatusId);
                    }
                    else
                    {
                        UserRelationsMain.UserNetworkStatusChange(new List <string>()
                        {
                            curUser.Login
                        }, user.Login, NetworkStatus.Unknown);
                        UserRelationsMain.UserNetworkStatusChange(new List <string>()
                        {
                            user.Login
                        }, curUser.Login, NetworkStatus.Unknown);
                    }
                    UserRelationsMain.RelationTypeChanged(user.Login, curUser.Login, statusForPartner);
                    return(new OperationResult <bool>(true));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <bool>(false, false, "Internal error. Try again later"));
            }
        }
Example #11
0
        public OperationResult <User> FriendshipRequest(string body, string userLogin)
        {
            try
            {
                using (db = new DbMain.EFDbContext.ChatEntities())
                {
                    var invited = db.Users.FirstOrDefault(x => x.Login == userLogin);
                    if (userLogin == curUser.Login || invited == null)
                    {
                        return(new OperationResult <User>(null, false, "Login error"));
                    }
                    var contact = db.Contacts.FirstOrDefault(x => (x.InvitedId == curUser.Id && x.AdderId == invited.Id) || (x.InvitedId == invited.Id && x.AdderId == curUser.Id));
                    if (contact != null)
                    {
                        RelationStatus status      = (RelationStatus)contact.RelationTypeId;
                        bool           IsInitiator = contact.AdderId == curUser.Id;
                        String         message     = String.Empty;
                        switch (status)
                        {
                        case RelationStatus.Friendship: message = "Friendship already confirmed"; break;

                        case RelationStatus.FriendshipRequestSent: message = IsInitiator ? "Friendship Request already Sent" : "Frienship Request already Recive"; break;

                        case RelationStatus.FrienshipRequestRecive: message = IsInitiator ? "Frienship Request already Recive" : "Friendship Request already Sent"; break;

                        case RelationStatus.BlockedByMe: message = IsInitiator ? "You blocked partner" : "You are Blocked By Partner"; break;

                        case RelationStatus.BlockedByPartner: message = IsInitiator ? "you are Blocked By Partner" : "You blocked partner"; break;

                        case RelationStatus.BlockedBoth: message = "Blocked Both"; break;

                        default:
                            break;
                        }
                        if (!String.IsNullOrEmpty(message))
                        {
                            return(new OperationResult <User>(null, false, message));
                        }
                    }
                    else
                    {
                        CreateContactAndDialog(db, out contact, invited, RelationStatus.FriendshipRequestSent);
                    }

                    if (contact.AdderId == curUser.Id)
                    {
                        contact.RelationTypeId = (int)RelationStatus.FriendshipRequestSent;
                    }
                    else
                    {
                        contact.RelationTypeId = (int)RelationStatus.FrienshipRequestRecive;
                    }
                    if (db.SaveChanges() > 0)
                    {
                        UserRelationsMain.SendFrienshipRequest(invited.Login, new User()
                        {
                            ConversationId = contact.ConversationId,
                            Icon           = curUser.Icon,
                            Login          = curUser.Login,
                            Name           = curUser.Name,
                            NetworkStatus  = NetworkStatus.Unknown,
                            RelationStatus = RelationStatus.FrienshipRequestRecive
                        }, "Hello");
                        return(new OperationResult <User>(new User
                        {
                            ConversationId = contact.Conversation.Id,
                            Login = userLogin,
                            Name = invited.Name,
                            RelationStatus = RelationStatus.FriendshipRequestSent,
                            Icon = invited.Icon,
                            NetworkStatus = NetworkStatus.Unknown
                        }));
                    }
                    return(new OperationResult <User>(null, false, "Internal error. Try again later"));
                }
            }
            catch (Exception ex)
            {
                return(new OperationResult <User>(null, false, "Internal error"));
            }
        }