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 TestRequest() { logger.Log("Выполняем тестовый запрос на Rdev."); // Выполняем запрос на Rdev using (var response = await client.PostAsync(rdevUrl, new StringContent("{\"test\": \"testValue \"}", Encoding.UTF8, "application/json")).ConfigureAwait(false)) { if (response.StatusCode != HttpStatusCode.OK) { logger.Warning("Тестовый запрос вернул ошибку, как и ожидалось."); throw new Exception($"Вернулся статус код: {response.StatusCode}."); } } }
public void LogWarning(Exception exception, string msgFormat , params object[] formatVars) { _logger.Warning(exception, msgFormat, formatVars); }
/// <summary> /// Метод отправки файлов из локальной директории на Rdev по http /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void DirUpload_Click(object sender, EventArgs e) { try { // Получаем путь к директории с аудиокнигами var path = ConfigurationManager.AppSettings["Audiobooks"]; int counter = 0; // Заканчиваем работу метода если не удалось найти директорию с аудиокнигами if (!Directory.Exists(path)) { logger.Warning("Директория с аудиокнигами не существует!"); return; } // Получаем список файлов из директории (аудиокниги в директории представлены в виде .zip архива) var files = Directory.GetFiles(path); logger.Debug("Запущена загрузка аудиокниг из локальной директории"); logger.Log($"Количество файлов: {files.Count()}."); // Запускаем цикл на последовательный обход архива с аудиокнигами foreach (var file in files) { if (Path.GetExtension(file) != ".zip") { continue; } using (var zip = ZipFile.Open(file, ZipArchiveMode.Read, Encoding.GetEncoding(866))) { //Получаем список файлов var zipContent = zip.Entries; // Ищем txt файл со ссылкой на аудиокнигу var txtName = zipContent.FirstOrDefault(x => Path.GetExtension(x.Name.Replace('<', ' ').Replace('>', ' ')) == ".txt"); // Копируем содержимое файла в memory stream var memStream = new MemoryStream(); await txtName.Open().CopyToAsync(memStream); // Получаем содержимое файла string txtContnent = Encoding.ASCII.GetString(memStream.ToArray()); // Формируем объект аудиокниги var audiobook = new Audiobook { Title = Path.GetFileNameWithoutExtension(txtName.Name.Replace('<', ' ').Replace('>', ' ')), Url = txtContnent }; // Сохраняем аудиокнигу в таблицу скаченных аудиокниг await db.SaveDownloadAudiobook(audiobook); logger.Debug($"Попытка загрузки аудиокниги {audiobook.Title}, URL:{audiobook.Url}"); // Получаем все mp3 файлы var mp3Content = zipContent.Where(x => Path.GetExtension(x.Name.Replace('<', ' ').Replace('>', ' ')) == ".mp3").ToList(); int chapter = 0; logger.Log($"Аудиокнига {audiobook.Title} из {mp3Content.Count} аудиофайлов."); logger.Debug($"Проверяем была ли аудиокнига: {audiobook.Title} загружена ранее."); // Если книга полностью отдана на Rdev, идем к следующей if (db.IsUploadAudiobook(audiobook)) { logger.Warning($"Аудиокнига {audiobook.Title} была ранее передана на Rdev."); logger.Log($"Количество загруженных книг {++counter}."); continue; } logger.Debug($"Получаем ownerrecid для файла аудиокниги: {audiobook.Title}."); // Получаем идентификатор книги, если книга уже выгружалась на рдев но не все файлы были переданы // получаем значение идентификатора из бд иначе если это первая выгрузка формируем новый идентификатор Guid ownerRecId = db.GetOwnerRecid(audiobook); logger.Debug($"Запускаем upload аудиофайлов книги: {audiobook.Title}."); foreach (var entry in mp3Content) { using (var fs = entry.Open()) { Guid recId = Guid.NewGuid(); // Формируем объект отправляемого файла var sendedFile = new Audiofile() { Name = entry.Name, Chapter = ++chapter, OwnerRecid = ownerRecId.ToString(), AudiobookName = audiobook.Title, AudiobookUrl = audiobook.Url }; logger.Debug($"Проверяем отправлялся ли файл {sendedFile.Name} ранее."); // Проверям был ли отдан файл с таким названием и главой на Rdev, если да, переходим к следующей итерации цикла, // иначе отдаем файл if (db.IsUploadAudiofile(sendedFile)) { logger.Warning($"Файл {sendedFile.Name} уже отправлялся, переходим к следующему."); continue; } logger.Debug($"Отправляем аудиофайл: {sendedFile.Name}"); // Отправляем файл на Rdev await client.Upload(sendedFile, fs, recId); logger.Debug($"Сохраняем информацию о переданном файле {sendedFile.Name}"); // В случае если файл был успешно передан на Rdev (вернулся статус код 200) await db.SaveUploadAudiofile(sendedFile); logger.Success($"Информация о файле {sendedFile.Name} была успешно сохранена."); } } logger.Debug($"Все файлы аудиокниги {audiobook.Title} были переданны, сохраняем аудиокнигу в историю загрузок."); // Добавляем запись о полностью отданной на Rdev книге, если не было ошибки при передаче файлов await db.SaveUploadAudiobook(audiobook); logger.Success($"Информация об аудиокниге {audiobook.Title} была успешно сохранена."); logger.Debug($"Количество загруженных книг{++counter}"); } } } catch (Exception ex) { logger.Error(ex.Message); } }