/// <summary>
        /// Get info about currently logged in user.
        /// </summary>
        /// <remarks>Uses the REST API <a href="https://www.jetbrains.com/help/youtrack/standalone/Get-Info-For-Current-User.html">Get Info For Current User</a>.</remarks>
        /// <returns>A <see cref="User" /> instance that represents the currently logged in user.</returns>
        /// <exception cref="T:System.Net.HttpRequestException">When the call to the remote YouTrack server instance failed.</exception>
        public async Task <User> GetCurrentUserInfo()
        {
            var url = UserUrls.CurrentUserInfo();

            var request = new YouTrackRestRequest(url, Method.GET);

            var response = await RestClient.ExecuteTaskAsync <User>(request);

            return(response.Data);
        }
        /// <summary>
        ///
        /// </summary>
        /// <remarks>
        /// <a href="https://www.jetbrains.com/help/youtrack/standalone/Log-in-to-YouTrack.html">Login to YouTrack</a>
        ///  </remarks>
        /// <returns></returns>
        public async Task <User> Login()
        {
            var url     = UserUrls.Login();
            var request = new YouTrackRestRequest(url, Method.POST);

            request.AddParameter("login", Connection.Credentials.Login);
            request.AddParameter("password", Connection.Credentials.Password);

            var response = await RestClient.ExecuteTaskAsync(request);

            if (!string.Equals(response.Content, "<login>ok</login>", StringComparison.OrdinalIgnoreCase))
            {
                throw new UnauthorizedConnectionException("Could not authenticate. Server did not return expected authentication response. Check the Response property for more details.", response.StatusCode, response.Content);
            }

            return(await GetCurrentUserInfo());
        }
        public bool Execute(JHSNetworkMessage msg)
        {
            Ask4NewURL packet = msg.ReadMessage <Ask4NewURL>();

            if (packet != null)
            {
                if (userManager == null)
                {
                    userManager = UserManager.Instance;
                }
                uint connectionId = msg.conn.connectionId;

                User user = userManager.GetUserByConnectionId(connectionId);
                if (user != null)
                {
                    lock (user)
                    {
                        if (user.LastViedSite != null)
                        {
                            if (user.LastRequestTime > JHSTime.Time)
                            {
                                msg.conn.Send(NetworkConstants.GET_NEW_URL, new UrlDetails()
                                {
                                    code = ErrorCodes.SUCCESS,
                                    Time = user.LastViedSite.Time,
                                    Url  = user.LastViedSite.url
                                });
                                user.LastRequestTime = JHSTime.Time + user.LastViedSite.Time;
                                return(true);
                            }
                            uint reward = 0;
                            switch (user.MemberType)
                            {
                            case UserType.FREE:
                                reward = (uint)(user.LastViedSite.Time * 0.5f);
                                break;

                            default:
                                reward = user.LastViedSite.Time;
                                break;
                            }
                            User other = userManager.GetUserByUserID(user.LastViedSite.UID);
                            if (other != null)
                            {
                                uint take = other.Credits - user.LastViedSite.Time;
                                if (take > 0)
                                {
                                    other.Credits = take;
                                }
                                else
                                {
                                    other.Credits = 0;
                                }
                                DbService.UpdateEntityIntime(other.UserId, other._data);
                            }
                            user.ViewdSites.Add(user.LastViedSite.id);
                            user.Credits = reward;
                            DbService.UpdateEntityIntime(user.UserId, user._data);
                        }
                        ISession session = DbService.GetDBSession;
                        if (session != null)
                        {
                            var      sql        = "SELECT userurls.id,userurls.UID,userurls.WebsiteName,userurls.region,userurls.url,userurls.Referral,userurls.Time,userurls.ViewCount,userurls.IsActive FROM userurls,useraccounts WHERE userurls.IsActive = 1 AND useraccounts.UserId = userurls.UID AND useraccounts.credits > 120 AND userurls.id NOT IN(" + user.GetViewdSitesString() + ") AND useraccounts.UserId != " + user.UserId + " LIMIT 1";
                            var      query      = session.CreateSQLQuery(sql).AddEntity(typeof(UserUrls));
                            UserUrls objectList = query.UniqueResult <UserUrls>();
                            if (objectList != null)
                            {
                                msg.conn.Send(NetworkConstants.GET_NEW_URL, new UrlDetails()
                                {
                                    code = ErrorCodes.SUCCESS,
                                    Time = objectList.Time,
                                    Url  = objectList.url
                                });
                                user.LastViedSite    = objectList;
                                user.LastRequestTime = JHSTime.Time + user.LastViedSite.Time;
                            }
                            else
                            {
                                msg.conn.Send(NetworkConstants.GET_NEW_URL, new UrlDetails()
                                {
                                    code = ErrorCodes.NO_MORE_SITES
                                });
                            }
                        }
                    }
                }
            }
            return(true);
        }