public async Task <GameJoltResponse> SessionOpenAsync()
        {
            if (!WebsiteIsUp)
            {
                var ctor = typeof(GameJoltResponse).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(string) }, null);
                return((GameJoltResponse)ctor.Invoke(new object[] { "Website is down!" }));
            }

            var openRequest = RequestProvider.Sessions.Open(Username, Token);
            await Client.ExecuteRequestAsync(openRequest);

            if (openRequest.Response.Success)
            {
                _lastSessionPing = DateTime.UtcNow;
            }
            else
            {
                _lastSessionPing = null;
            }

            if (openRequest.Response.Success)
            {
                var request = RequestProvider.Storage.GetKeys(Username, Token);
                await OldClient.ExecuteRequestAsync(request);
            }

            return(openRequest.Response);
        }
        public async Task MigrateAsync()
        {
            var userRequest = RequestProvider.Users.Fetch(Username);
            await Client.ExecuteRequestAsync(userRequest);



            var keysRequest = RequestProvider.Storage.GetKeys(Username, Token);
            await OldClient.ExecuteRequestAsync(keysRequest).ConfigureAwait(false);

            var keyDictionary = new Dictionary <string, string>();

            foreach (var key in keysRequest.Response.Keys)
            {
                var keyRequest = RequestProvider.Storage.Fetch(key, Username, Token);
                await OldClient.ExecuteRequestAsync(keyRequest).ConfigureAwait(false);

                keyDictionary.Add(key, keyRequest.Response.Data);
            }

            foreach (var keyValuePair in keyDictionary)
            {
                var keyRequest = RequestProvider.Storage.Set(keyValuePair.Key, keyValuePair.Value, Username, Token);
                await Client.ExecuteRequestAsync(keyRequest).ConfigureAwait(false);
            }


            var emblemRequest = RequestProvider.Storage.Fetch($"saveStorageV1|{userRequest.Response.Users[0].Id}|emblem", Username, Token);
            var genderRequest = RequestProvider.Storage.Fetch($"saveStorageV1|{userRequest.Response.Users[0].Id}|gender", Username, Token);
            var pointsRequest = RequestProvider.Storage.Fetch($"saveStorageV1|{userRequest.Response.Users[0].Id}|points", Username, Token);
            await OldClient.ExecuteRequestAsync(emblemRequest).ConfigureAwait(false);

            await OldClient.ExecuteRequestAsync(genderRequest).ConfigureAwait(false);

            await OldClient.ExecuteRequestAsync(pointsRequest).ConfigureAwait(false);

            var emblemRequest1 = RequestProvider.Storage.Set($"saveStorageV1|{userRequest.Response.Users[0].Id}|emblem", emblemRequest.Response.Data, Username, Token);
            var genderRequest1 = RequestProvider.Storage.Set($"saveStorageV1|{userRequest.Response.Users[0].Id}|gender", genderRequest.Response.Data, Username, Token);
            var pointsRequest1 = RequestProvider.Storage.Set($"saveStorageV1|{userRequest.Response.Users[0].Id}|points", pointsRequest.Response.Data, Username, Token);
            await Client.ExecuteRequestAsync(emblemRequest1).ConfigureAwait(false);

            await Client.ExecuteRequestAsync(genderRequest1).ConfigureAwait(false);

            await Client.ExecuteRequestAsync(pointsRequest1).ConfigureAwait(false);


            var migratedRequest = RequestProvider.Storage.Set($"saveStorageV1|{userRequest.Response.Users[0].Id}|migrated", "", Username, Token);
            await OldClient.ExecuteRequestAsync(migratedRequest).ConfigureAwait(false);
        }
        public async Task <bool> IsMigratedAsync()
        {
            if (!await IsConnectedAsync() || !WebsiteIsUp)
            {
                return(false);
            }

            var userRequest = RequestProvider.Users.Fetch(Username);
            await Client.ExecuteRequestAsync(userRequest);

            if (userRequest.Response?.Users?.Any() == null)
            {
                return(false);
            }

            var request = RequestProvider.Storage.Fetch($"saveStorageV1|{userRequest.Response.Users[0].Id}|migrated", Username, Token);
            await OldClient.ExecuteRequestAsync(request).ConfigureAwait(false);

            return(request.Response.Success);
        }