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); }
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." })); }
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 }); }
public Task GetMessagesForThread([NotNull] PrivateConversation thread) { return(Bouncer.StartSingleTask(() => { Messages = _chattingService.GetThreadMessages(thread); OnPropertyChanged("Messages"); })); }
public Task ThreadSelected([NotNull] PrivateConversation thread) { if (thread.NewMessages > 0) { var secBouncer = new ProcessBouncer(this); secBouncer.StartSingleTask(() => _dataService.MarkRead(thread)); } return(GetMessagesForThread(thread)); }
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); }
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); }
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); }
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); }
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); }
public Task GetConversersForThread([NotNull] PrivateConversation thread) { return(Bouncer.StartSingleTask(() => _conversers = _chattingService.GetGroupThreadConversers(thread))); }
public void MarkRead(PrivateConversation thread) { throw new NotImplementedException(); }
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)); }
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." })); }
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)); }