Example #1
0
        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."
                });
            }
        }
Example #2
0
        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);
        }