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()); }
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); }
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)); }
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."); }
/// <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}."); } }