Exemple #1
0
        public ApiResponse <AuthResponse> RequestToken(AuthRequest req)
        {
            var user = _users.Find(req.Login, req.PasswordHash);

            if (user == null)
            {
                if (_users.Find(req.Login) == null)
                {
                    _logger.Debug(this, $"No user in repository with login '{req.Login}'");
                }
                else
                {
                    _logger.Debug(this, $"Invalid password for user with login '{req.Login}'");
                }
                return(new ClientError("Invalid login or password").AsError <AuthResponse>());
            }
            var token  = _token.CreateToken(user);
            var config = _config.Get();
            var state  = _states.FindOrCreate(user, s => _init.Init(s, config));

            state.Time.LastSyncTime = _time.RealTime;
            _states.Save(user, state.UpdateVersion());
            var response = new AuthResponse(token, state, config);

            _logger.Debug(this, $"User is logged in: '{user.Login}'");
            return(response.AsResult());
        }
Exemple #2
0
        async Task <ApiResponse <TResponse> > PostJson <TResponse>(string relativeUrl, object req)
        {
            var jsonReq = _converter.ToJson(req);

            _logger.Debug(this, $"Request ({req.GetType().Name}) to '{relativeUrl}': '{jsonReq}'");
            var netResponse = await _network.PostJson(relativeUrl, jsonReq);

            ApiResponse <TResponse> result;

            if (netResponse.Success)
            {
                var response = _converter.FromJson <TResponse>(netResponse.Text);
                result = response.AsResult();
            }
            else
            {
                var error = ConvertToError(netResponse);
                _errorHandle.OnError(error);
                result = error.AsError <TResponse>();
            }
            _logger.Debug(this, $"Response ({typeof(TResponse).Name}) from '{relativeUrl}': {result.Success}, '{result.Result}', {result.Error}");
            if (!result.Success)
            {
                OnError(result.Error);
            }
            return(result);
        }
        /// <summary>
        /// Метод скачивает архив с аудиокнигой и передает по файлам на сервер Rdev
        /// </summary>
        /// <param name="audiobook">Аудиокнига которую необходимо загрузить</param>
        /// <returns></returns>
        public async Task Grab(Audiobook audiobook)
        {
            logger.Debug("Запускаем авторизацию на сервере Rdev.");

            // Авторизуемся на сервере Rdev
            await client.Authorize();

            logger.Debug("Запускаем скачивание с удаленного сервера.");

            // Скачиваем аудиокнигу в локальную директорию
            await Download(audiobook);

            logger.Debug("Запускаем выгрузку файлов аудиокниги на сервер Rdev.");

            // Выгружаем аудиокнигу на Rdev из локальной директроии
            await Upload(audiobook);
        }
Exemple #4
0
        protected virtual Task <ApiResponse <TResponse> > Post <TRequest, TResponse>(TRequest req, Func <TRequest, ApiResponse <TResponse> > handler)
        {
            _logger.Debug(this, $"Request ({typeof(TRequest).Name}): '{req.ToString()}'");
            ApiResponse <TResponse> resp;

            try {
                resp = handler(req);
            } catch (Exception e) {
                _logger.Error(this, $"Post: {e}");
                resp = new ServerError(e.ToString()).AsError <TResponse>();
            }
            _logger.Debug(this, $"Response ({typeof(TResponse).Name}): '{resp.Success}, '{resp.Result}', {resp.Error?.Message}");
            if (!resp.Success)
            {
                OnError(resp.Error);
            }
            return(Task.FromResult(resp));
        }
Exemple #5
0
        public ApiResponse <IntentResponse> CreateCommands(IntentRequest req)
        {
            if (string.IsNullOrEmpty(req.ExpectedVersion))
            {
                return(new ClientError("invalid state version").AsError <IntentResponse>());
            }
            var user = _users.Find(req.Login);

            if (user == null)
            {
                _logger.Warning(this, $"Can't find user with login: '******'");
                return(new ServerError().AsError <IntentResponse>());
            }
            var state = _states.Find(user);

            if (state == null)
            {
                _logger.Warning(this, $"Can't find state for user with login: '******'");
                return(new ServerError().AsError <IntentResponse>());
            }
            if (state.Version != req.ExpectedVersion)
            {
                _logger.Warning(this, $"Current state version don't match expected version: '{state.Version}' != '{req.ExpectedVersion}'");
                return(new ConflictError($"Current state version is '{state.Version}'").AsError <IntentResponse>());
            }
            var config  = _config.Get();
            var command = req.Command;

            if (!IsValidAsFirstCommand(command))
            {
                return(new ClientError($"Trying to execute internal command: '{command}'").AsError <IntentResponse>());
            }
            var runner = new CommandRunner(_time.RealTime - state.Time.LastSyncTime, command, state, config);

            foreach (var item in runner)
            {
                if ((item.Command is IDebugCommand) && !_env.IsDebugMode)
                {
                    return(new ClientError($"Invalid debug command: '{item.Command}'").AsError <IntentResponse>());
                }
                if (!item.IsValid())
                {
                    return(new ClientError($"Invalid command: '{item.Command}'").AsError <IntentResponse>());
                }
                item.Execute();
            }
            var oldVersion = state.Version;

            state.UpdateVersion();
            state = _states.Save(user, state);
            _logger.Debug(this, $"State updated: version was '{oldVersion}', changed to '{state.Version}'");
            return(new IntentResponse(state.Version).AsResult());
        }
        public async Task Update(ICommand command)
        {
            var state  = _state.State;
            var config = _state.Config;
            var runner = new CommandRunner(_offsetTime.Offset, command, state, config);

            foreach (var item in runner)
            {
                _logger.DebugFormat(this, "Start executing command: {0}", item.Command);
                if (!item.IsValid())
                {
                    _logger.ErrorFormat(this, "Command is invalid: {0}", item.Command);
                    return;
                }
                item.Execute();
                _logger.DebugFormat(this, "End executing command: {0}", item.Command);
                var container = _handlers.GetOrDefault(item.Command.GetType());
                if (container != null)
                {
                    var handlers = container.GetHandlers();
                    foreach (var handler in handlers)
                    {
                        await container.Invoke(handler, item.Command);

                        OnStateUpdated(state);
                    }
                }
                OnStateUpdated(state);
            }
            var response = await _api.Post(new IntentRequest(_state.User.Login, state.Version, command));

            if (!response.Success)
            {
                _logger.Error(this, "State declined from server.");
                return;
            }
            var result = response.Result;

            state.Version = result.NewVersion;
            _logger.Debug(this, "State approved from server.");
        }
Exemple #7
0
        /// <summary>
        /// Метод скачивания файлов с сайта и последующей выгрузкой на сторону Rdev-a
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void AbooksBtn_Click(object sender, EventArgs e)
        {
            try
            {
                // Количество скаченных со страницы аудиокниг
                int countDownloaded = 0;

                // Формируем объект категории "Новинки"
                var novelty = new Category {
                    Name = "Новинки", Url = baseUrl
                };

                logger.Debug("Получаем общее количество страниц в категории Новинки.");

                // Получаем общее количество страниц на сайте в категории "Новинки"
                int countPage = await service.GetPagesCount(novelty);

                // Запускаем цикл обхода страниц с книгам начиная с конца (самые новые книги находятся на 1 странице)
                for (int page = countPage; page >= 1; page--)
                {
                    logger.Debug($"Получаем количество аудиокниг со страницы {page}.");

                    // Получаем  список аудиокниг со страницы
                    var audiobooks = await service.GetAudiobooks(novelty, page);

                    logger.Debug($"Количество аудиокниг на странице {page}: {audiobooks.Count}.");

                    // Запускаем цикл на последовательное скачивание аудиокниг со страницы
                    foreach (var audiobook in audiobooks)
                    {
                        logger.Log($"Загружаем аудиокнигу: {audiobook.Title}.");

                        await grabber.Grab(audiobook);

                        ++countDownloaded;

                        logger.Success($"Аудиокнига {audiobook.Title} загружена, " +
                                       $"оставшееся количество аудиокниг на странице {audiobooks.Count - countDownloaded}."
                                       );
                    }

                    countDownloaded = 0;
                }
            }
            catch (Exception ex)
            {
                logger.Error($"Скачивание остановлено по причине ошибки: {ex.Message}.");
            }
        }