public override async Task OnDisconnected(bool stopCalled) { var client = (from p in _clientModel where p.ConnectionID == Context.ConnectionId select p).FirstOrDefault(); if (client != null) { await base.Clients.Others.AlertNewUserOnline(new Message() { Username = client.UserName, MessageContent = $"{client.UserName} has left the chat.", CreateTime = DateTime.UtcNow, IsAdmin = true }); _clientModel.Remove(client); await base.Clients.Others.UserOff(client); await _messageModel.Create(new Message() { Username = null, MessageContent = $"{client.UserName} has left the chat." }); } }
public object FetchMessages([FromQuery] TokenQueryModel tokenInfo, [FromQuery] GroupIdentityModel groupIdentity, [FromQuery] MessageRangeInfoModel rangeInfo) { var userContext = tokenRepository.ValidateToken(userRepository, tokenInfo.Token); if (!groupRepository.IsMember(userContext.user.Uuid, groupIdentity.GroupId)) { throw new AuthorizationException($"User {userContext.user.Uuid} isn't group member", "not a group member"); } var ascendingOrder = rangeInfo.Ascending; var offset = rangeInfo.Offset; var limit = rangeInfo.Limit > MaxFetchLimit ? MaxFetchLimit : rangeInfo.Limit == 0 ? DefaultFetchLimit : rangeInfo.Limit; var result = new List <MessageModel>(); var forward = rangeInfo.Direction >= 0; if (rangeInfo.StartId == 0) { var range = messageRepository.SelectRange(groupIdentity.GroupId, offset, limit); foreach (var messageData in (ascendingOrder ? range.Reverse() : range)) { result.Add(MessageModel.Create(messageData)); } } else { var range = forward ? messageRepository.SelectMessagesAfterGiven(groupIdentity.GroupId, offset, limit, rangeInfo.StartId) : messageRepository.SelectMessagesBeforeGiven(groupIdentity.GroupId, offset, limit, rangeInfo.StartId); foreach (var messageData in (ascendingOrder ? range : range.Reverse())) { result.Add(MessageModel.Create(messageData)); } } return(result); }