Exemple #1
0
        private void CreateUserConversations(int conversationsNumber, int messagesPerConversation)
        {
            _conversations = new List <PrivateConversation>();
            _messages      = new List <Message>();
            for (int conversationIndex = 0; conversationIndex < conversationsNumber; conversationIndex++)
            {
                var conversation = new PrivateConversation()
                {
                    ConversationType = ConversationType.Private,
                    User1Id          = _users[0].Id,
                    User2Id          = _users[1].Id
                };
                _context.PrivateConversation.Add(conversation);
                _context.SaveChanges();
                conversation = _context.PrivateConversation.ToList().Last();
                _conversations.Add(conversation);

                for (int messageIndex = 0; messageIndex < messagesPerConversation; messageIndex++)
                {
                    var message = new Message()
                    {
                        ConversationId   = conversation.Id,
                        ConversationType = conversation.ConversationType,
                        SenderId         = _users[messageIndex % 2].Id,
                        MessageContent   = $"Test {conversation.ConversationType}/{conversation.Id}/{messageIndex}",
                        SendTime         = DateTime.Today
                    };

                    _context.Message.Add(message);
                    _context.SaveChanges();
                    message = _context.Message.ToList().Last();
                    _messages.Add(message);
                }
            }
        }
        public async Task <bool> DeleteConversationAsync(PrivateConversation conversation)
        {
            Context.Remove(conversation);
            await Context.SaveChangesAsync();

            return(true);
        }
Exemple #3
0
        public async Task <IActionResult> CompleteRequest(CompleteRequestAddressModel model)
        {
            var user = await GetKahlaUser();

            var request = await _dbContext
                          .Requests
                          .Include(t => t.Creator)
                          .ThenInclude(t => t.HisDevices)
                          .Include(t => t.Target)
                          .ThenInclude(t => t.HisDevices)
                          .SingleOrDefaultAsync(t => t.Id == model.Id);

            if (request == null)
            {
                return(this.Protocol(ErrorType.NotFound, "We can not find target request."));
            }
            if (request.TargetId != user.Id)
            {
                return(this.Protocol(ErrorType.Unauthorized, "The target user of this request is not you."));
            }
            if (request.Completed)
            {
                return(this.Protocol(ErrorType.HasDoneAlready, "The target request is already completed."));
            }
            PrivateConversation newConversation = null;

            newConversation = await AcceptRequest(request, model.Accept);

            return(Json(new AiurValue <int?>(newConversation?.Id)
            {
                Code = ErrorType.Success,
                Message = "You have successfully completed this request."
            }));
        }
Exemple #4
0
 private void SyncFriendRequestToContacts(Request request, PrivateConversation createdConversation)
 {
     _contacts.Add(new ContactInfo
     {
         DisplayName = request.TargetId == BuildBot.Profile.Id ?
                       request.Creator.NickName :
                       request.Target.NickName,
         DisplayImagePath = request.TargetId == BuildBot.Profile.Id ?
                            request.Creator.IconFilePath :
                            request.Target.IconFilePath,
         LatestMessage  = null,
         UnReadAmount   = 0,
         ConversationId = createdConversation.Id,
         Discriminator  = createdConversation.Discriminator,
         UserId         = request.TargetId == BuildBot.Profile.Id ?
                          request.Creator.Id :
                          request.Target.Id,
         AesKey      = createdConversation.AESKey,
         Muted       = createdConversation.Muted(BuildBot.Profile.Id),
         SomeoneAtMe = false,
         Online      = request.TargetId == BuildBot.Profile.Id ?
                       request.Creator.IsOnline :
                       request.Target.IsOnline
     });
 }
Exemple #5
0
 public Task GetMessagesForThread([NotNull] PrivateConversation thread)
 {
     return(Bouncer.StartSingleTask(() =>
     {
         Messages = _chattingService.GetThreadMessages(thread);
         OnPropertyChanged("Messages");
     }));
 }
Exemple #6
0
 public Task ThreadSelected([NotNull] PrivateConversation thread)
 {
     if (thread.NewMessages > 0)
     {
         var secBouncer = new ProcessBouncer(this);
         secBouncer.StartSingleTask(() => _dataService.MarkRead(thread));
     }
     return(GetMessagesForThread(thread));
 }
Exemple #7
0
        public PrivateConversation AddFriend(string userId1, string userId2)
        {
            var conversation = new PrivateConversation
            {
                RequesterId = userId1,
                TargetId    = userId2,
                AESKey      = Guid.NewGuid().ToString("N")
            };

            PrivateConversations.Add(conversation);
            return(conversation);
        }
Exemple #8
0
        public ConversationDTO ParseConversation(PrivateConversation conversation, int crtUserId)
        {
            if (conversation is null)
            {
                return(null);
            }

            var otherUser       = (crtUserId == conversation.User1Id) ? conversation.User2 : conversation.User1;
            var conversationDTO = new ConversationDTO()
            {
                Id = conversation.Id,
                ConversationType = conversation.ConversationType,
                ConversationName = otherUser.Username
            };

            return(conversationDTO);
        }
Exemple #9
0
        public ConversationDTO ParseConversation(PrivateConversation conversation, Message message, int userId)
        {
            var otherUser       = (userId == conversation.User1Id) ? conversation.User2 : conversation.User1;
            var conversationDTO = new ConversationDTO()
            {
                Id = conversation.Id,
                ConversationType        = conversation.ConversationType,
                ConversationPhoto       = otherUser.PhotoFileName,
                ConversationLastMessage = (message.SenderId == userId) ? $"You: {message.MessageContent}" : message.MessageContent,
                ConversationName        = otherUser.Username,
                LastMessageSendTime     = message.SendTime
            };

            _photosUrlResolver.ResolveUrl(conversationDTO);

            return(conversationDTO);
        }
Exemple #10
0
        public Conversation ParseConversation(ConversationDTO conversationDTO)
        {
            Conversation pc;

            if (conversationDTO.ConversationType == ConversationType.Private)
            {
                pc = new PrivateConversation()
                {
                    Id = conversationDTO.Id
                };
            }
            else
            {
                pc = new GroupConversation()
                {
                    Id = conversationDTO.Id
                };
            }

            return(pc);
        }
        public async Task <PrivateConversation> GetConversationWithUser(int userId, string otherUser)
        {
            var user1 = await Context.BookUser
                        .FirstOrDefaultAsync(bu => bu.Id == userId);

            var user2 = await Context.BookUser
                        .FirstOrDefaultAsync(bu => bu.Username == otherUser);

            if (user1 is null || user2 is null)
            {
                return(null);
            }

            var conversation = await Context.PrivateConversation
                               .Include(pc => pc.User1)
                               .Include(pc => pc.User2)
                               .FirstOrDefaultAsync(pc => ((pc.User1Id == userId && pc.User2.Username == otherUser) ||
                                                           (pc.User2Id == userId && pc.User1.Username == otherUser)) &&
                                                    pc.User1Id != pc.User2Id);

            if (conversation != null)
            {
                return(conversation);
            }

            conversation = new PrivateConversation()
            {
                ConversationType = ConversationType.Private,
                User1Id          = user1.Id,
                User2Id          = user2.Id
            };

            await Context.PrivateConversation
            .AddAsync(conversation);

            await Context.SaveChangesAsync();

            return(conversation);
        }
Exemple #12
0
        private async Task <PrivateConversation> AcceptRequest(Request request, bool accept)
        {
            PrivateConversation newConversation = null;

            request.Completed = true;
            await semaphoreSlim.WaitAsync();

            try
            {
                if (accept)
                {
                    if (await _dbContext.AreFriends(request.CreatorId, request.TargetId))
                    {
                        await _dbContext.SaveChangesAsync();

                        throw new AiurAPIModelException(ErrorType.HasSuccessAlready, "You two are already friends.");
                    }
                    newConversation = _dbContext.AddFriend(request.CreatorId, request.TargetId);
                }
                await _dbContext.SaveChangesAsync();
            }
            finally
            {
                semaphoreSlim.Release();
            }
            await Task.WhenAll(
                _pusher.FriendsChangedEvent(
                    request.Creator,
                    request,
                    accept,
                    newConversation?.Build(request.CreatorId, _onlineJudger) as PrivateConversation),
                _pusher.FriendsChangedEvent(
                    request.Target,
                    request,
                    accept,
                    newConversation?.Build(request.TargetId, _onlineJudger) as PrivateConversation));

            return(newConversation);
        }
Exemple #13
0
 public Task GetConversersForThread([NotNull] PrivateConversation thread)
 {
     return(Bouncer.StartSingleTask(() => _conversers = _chattingService.GetGroupThreadConversers(thread)));
 }
 public void MarkRead(PrivateConversation thread)
 {
     throw new NotImplementedException();
 }
Exemple #15
0
        public async Task FriendsChangedEvent(KahlaUser target, Request request, bool result, PrivateConversation conversation)
        {
            var token = await _appsContainer.AccessToken();

            var friendAcceptedEvent = new FriendsChangedEvent
            {
                Request             = request,
                Result              = result,
                CreatedConversation = conversation
            };

            if (target.CurrentChannel > 0)
            {
                _cannonService.FireAsync <PushMessageService>(s => s.PushMessageAsync(token, target.CurrentChannel, friendAcceptedEvent));
            }
            _cannonService.FireAsync <ThirdPartyPushService>(s => s.PushAsync(target.HisDevices, friendAcceptedEvent));
        }
Exemple #16
0
        public async Task <IActionResult> CompleteRequest(CompleteRequestAddressModel model)
        {
            var user = await GetKahlaUser();

            var request = await _dbContext
                          .Requests
                          .Include(t => t.Creator)
                          .ThenInclude(t => t.HisDevices)
                          .Include(t => t.Target)
                          .ThenInclude(t => t.HisDevices)
                          .SingleOrDefaultAsync(t => t.Id == model.Id);

            if (request == null)
            {
                return(this.Protocol(ErrorType.NotFound, "We can not find target request."));
            }
            if (request.TargetId != user.Id)
            {
                return(this.Protocol(ErrorType.Unauthorized, "The target user of this request is not you."));
            }
            if (request.Completed)
            {
                return(this.Protocol(ErrorType.HasDoneAlready, "The target request is already completed."));
            }
            request.Completed = true;
            PrivateConversation newConversation = null;

            if (model.Accept)
            {
                if (await _dbContext.AreFriends(request.CreatorId, request.TargetId))
                {
                    await _dbContext.SaveChangesAsync();

                    return(this.Protocol(ErrorType.RequireAttention, "You two are already friends."));
                }
                newConversation = _dbContext.AddFriend(request.CreatorId, request.TargetId);
                await _dbContext.SaveChangesAsync();
            }
            else
            {
                await _dbContext.SaveChangesAsync();
            }
            await Task.WhenAll(
                _pusher.FriendsChangedEvent(
                    request.Creator,
                    request,
                    model.Accept,
                    newConversation?.Build(request.CreatorId, _onlineJudger) as PrivateConversation),
                _pusher.FriendsChangedEvent(
                    request.Target,
                    request,
                    model.Accept,
                    newConversation?.Build(request.TargetId, _onlineJudger) as PrivateConversation)
                );

            return(Json(new AiurValue <int?>(newConversation?.Id)
            {
                Code = ErrorType.Success,
                Message = "You have successfully completed this request."
            }));
        }
Exemple #17
0
        public async Task FriendsChangedEvent(KahlaUser target, Request request, bool result, PrivateConversation conversation)
        {
            var token = await _appsContainer.AccessToken();

            var friendAcceptedEvent = new FriendsChangedEvent
            {
                Request             = request,
                Result              = result,
                CreatedConversation = conversation
            };

            if (target.CurrentChannel != -1)
            {
                await _stargatePushService.PushMessageAsync(token, target.CurrentChannel, JsonConvert.SerializeObject(friendAcceptedEvent), true);
            }
            await _thirdPartyPushService.PushAsync(target.HisDevices, "*****@*****.**", JsonConvert.SerializeObject(friendAcceptedEvent));
        }