Example #1
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 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}.");
                }
            }
        }
Example #3
0
 public void LogWarning(Exception exception, string msgFormat
                        , params object[] formatVars)
 {
     _logger.Warning(exception, msgFormat, formatVars);
 }
Example #4
0
        /// <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);
            }
        }