Ejemplo n.º 1
0
        public async Task <AkinatorQuestion> StartNewGame(CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var apiKey = await GetSession().ConfigureAwait(false);

            var url = AkiUrlBuilder.NewGame(apiKey, m_usedLanguage, m_usedServerType);

            var response = await m_webClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync();

            var match = m_regexStartGameResult.Match(content);

            if (!match.Success && match.Groups.Count != 2)
            {
                throw new InvalidCastException($"Invalid result received from Akinator. Result was {response}");
            }

            var result = JsonConvert.DeserializeObject <BaseResponse <NewGameParameters> >(match.Groups[1].Value,
                                                                                           new JsonSerializerSettings()
            {
                MissingMemberHandling = MissingMemberHandling.Ignore
            });

            m_session   = result.Parameters.Identification.Session;
            m_signature = result.Parameters.Identification.Signature;
            m_step      = result.Parameters.StepInformation.Step;
            return(ToAkinatorQuestion(result.Parameters.StepInformation));
        }
Ejemplo n.º 2
0
        public async Task <AkinatorGuess[]> GetGuess(CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var url      = AkiUrlBuilder.GetGuessUrl(BuildGuessRequest(), m_server);
            var response = await m_webClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = JsonConvert.DeserializeObject <BaseResponse <Guess> >(content,
                                                                               new JsonSerializerSettings
            {
                MissingMemberHandling = MissingMemberHandling.Ignore
            });

            m_lastGuessStep = m_step;

            return(result.Parameters.Characters.Select(p =>
                                                       new AkinatorGuess(p.Name, p.Description)
            {
                ID = p.Id,
                PhotoPath = p.PhotoPath,
                Probabilty = p.Probabilty
            }).ToArray());
        }
Ejemplo n.º 3
0
        public async Task <AkinatorQuestion> UndoAnswer(CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (m_step == 0)
            {
                return(null);
            }

            var url = AkiUrlBuilder.UndoAnswer(m_session, m_signature, m_step, m_server);

            var response = await m_webClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = JsonConvert.DeserializeObject <BaseResponse <Question> >(content,
                                                                                  new JsonSerializerSettings
            {
                MissingMemberHandling = MissingMemberHandling.Ignore
            });

            m_step          = result.Parameters.Step;
            CurrentQuestion = ToAkinatorQuestion(result.Parameters);
            return(ToAkinatorQuestion(result.Parameters));
        }
Ejemplo n.º 4
0
        public async Task <AkinatorQuestion> StartNewGame(CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var apiKey = await GetSession(cancellationToken).ConfigureAwait(false);

            var url      = AkiUrlBuilder.NewGame(apiKey, _mServer, _mChildMode);
            var response = await _mWebClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var match = _mRegexStartGameResult.Match(content);

            if (!match.Success && match.Groups.Count != 2)
            {
                throw new ApiErrorException(url, content, "Invalid response while creating new game");
            }

            var result = EnsureNoError <NewGameParameters>(url, match.Groups[1].Value);

            _mSession       = result.Identification.Session;
            _mSignature     = result.Identification.Signature;
            _mStep          = result.StepInformation.Step;
            CurrentQuestion = ToAkinatorQuestion(result.StepInformation);

            return(CurrentQuestion);
        }
Ejemplo n.º 5
0
        public async Task <AkinatorHallOfFameEntries[]> GetHallOfFame(CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var hallOfFameRequestUrl = AkiUrlBuilder.MapHallOfFame(m_server);
            var response             = await m_webClient.GetAsync(hallOfFameRequestUrl, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var data = XmlConverter.ToClass <HallOfFame>(content);

            return(ToHallOfFameEntry(data.Awards.Award));
        }
Ejemplo n.º 6
0
        public async Task <AkinatorQuestion> Answer(AnswerOptions answer, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var url = AkiUrlBuilder.Answer(BuildAnswerRequest(answer), _mServer);

            var response = await _mWebClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = EnsureNoError <Question>(url, content);

            _mStep          = result.Step;
            CurrentQuestion = ToAkinatorQuestion(result);
            return(CurrentQuestion);
        }
Ejemplo n.º 7
0
        public async Task <AkinatorQuestion> Answer(AnswerOptions answer, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var url = AkiUrlBuilder.Answer(BuildAnswerRequest(answer), m_usedLanguage, m_usedServerType);

            var response = await m_webClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject <BaseResponse <Question> >(content,
                                                                                  new JsonSerializerSettings()
            {
                MissingMemberHandling = MissingMemberHandling.Ignore
            });

            m_step = result.Parameters.Step;
            return(ToAkinatorQuestion(result.Parameters));
        }
Ejemplo n.º 8
0
        public async Task <AkinatorGuess[]> SearchCharacter(string search, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var url = AkiUrlBuilder.SearchCharacter(search, _mSession, _mSignature, _mStep, _mServer);

            var response = await _mWebClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = EnsureNoError <Characters>(url, content);

            return(result.AllCharacters.Select(p =>
                                               new AkinatorGuess(p.Name, p.Description)
            {
                ID = p.IdBase,
                PhotoPath = p.PhotoPath,
            }).ToArray());
        }
Ejemplo n.º 9
0
        public async Task <AkinatorGuess[]> GetGuess(CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var url      = AkiUrlBuilder.GetGuessUrl(BuildGuessRequest(), _mServer);
            var response = await _mWebClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = EnsureNoError <Guess>(url, content);

            _mLastGuessStep = _mStep;

            return(result.Characters.Select(p =>
                                            new AkinatorGuess(p.Name, p.Description)
            {
                ID = p.Id,
                PhotoPath = p.PhotoPath,
                Probabilty = p.Probabilty
            }).ToArray());
        }
Ejemplo n.º 10
0
        public async Task <AkinatorQuestion> ExclusionGame(CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (_mStep == 0)
            {
                return(null);
            }

            var url = AkiUrlBuilder.Exclusion(_mSession, _mSignature, _mStep, _mServer);

            var response = await _mWebClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = EnsureNoError <Question>(url, content);

            _mStep          = result.Step;
            CurrentQuestion = ToAkinatorQuestion(result);
            return(CurrentQuestion);
        }
Ejemplo n.º 11
0
        public async Task <AkinatorGuess[]> SearchCharacter(string search, CancellationToken cancellationToken = default)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var url = AkiUrlBuilder.SearchCharacter(search, m_session, m_signature, m_step, m_server);

            var response = await m_webClient.GetAsync(url, cancellationToken).ConfigureAwait(false);

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = JsonConvert.DeserializeObject <BaseResponse <Characters> >(content,
                                                                                    new JsonSerializerSettings()
            {
                MissingMemberHandling = MissingMemberHandling.Ignore
            });

            return(result.Parameters.AllCharacters.Select(p =>
                                                          new AkinatorGuess(p.Name, p.Description)
            {
                ID = p.IdBase,
                PhotoPath = p.PhotoPath,
            }).ToArray());
        }