#include "app.h" #include "filesystem.h" #include "lotromanager.h" #include #include #include #include #include #include #include #include #include ANetwork::ANetwork(QObject*) { } QString ANetwork::query(QUrl url){ QNetworkAccessManager* manager = new QNetworkAccessManager(); QNetworkRequest request(url); QNetworkReply* reply = manager->get(request); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QString content = reply->readAll(); if (reply->error() != QNetworkReply::NoError){ content = "error"; qDebug() << reply->errorString(); } reply->deleteLater(); return content; } QByteArray ANetwork::query_binary(QUrl url){ QNetworkAccessManager* manager = new QNetworkAccessManager(); QNetworkRequest request(url); QNetworkReply* reply = manager->get(request); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); QByteArray bytes = reply->readAll(); return bytes; } QString ANetwork::getCoupon(){ App *app = &App::getInstance(); app->logSectionStart("Код купона"); QString content = this->query(app->config->getValue("Network", "coupon") + ".txt"); if (content != "error"){ app->config->setValue("Values", "coupon", content); qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toUtf8().data()); qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены. Производим установку значений."); } else { qWarning("%s:%i: %s", __FILE__, __LINE__, "Не удалось получить информацию с сервера"); content = app->config->getValue("Values", "coupon"); } app->window->ui->couponButton->setText(content); qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); return content; } QString ANetwork::getFootMessage(){ App *app = &App::getInstance(); app->logSectionStart("Информация о профилактике"); // app->window->ui->footRed->setText("Профилактика. Все сервера отключены. Примерное время окончания работ - 40:00 (МСК)."); QString content = this->query(app->config->getValue("Network", "foot") + ".txt"); if (content != "error"){ qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены"); app->config->setValue("Values", "foot", content); qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toUtf8().data()); } else { qWarning("%s:%i: %s", __FILE__, __LINE__, "Не удалось получить информацию с сервера"); content = app->config->getValue("Values", "foot"); app->logSectionEnd(); return content; } if(content != ""){ qInfo("%s:%i: %s", __FILE__, __LINE__, "Есть сообщения о профилактике. Производим разбор и установку значений"); QStringList list = content.split(":::"); //QStringList date = list[2].split(" "); QString day = list[2]; QString month = " " + list[3]; app->window->ui->footYellow->show(); app->window->ui->footYellow->setText("Профилактика игровых серверов состоится " + day + month + " с " + list[0] +" до " + list[1] + " (МСК)."); } else { qInfo("%s:%i: %s", __FILE__, __LINE__, "Сообщения о профилактике отсутствуют."); } qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); return content; } QString ANetwork::getServers(){ App *app = &App::getInstance(); QString time = ""; app->logSectionStart("Статусы серверов"); QString content = this->query(app->config->getValue("Network", "servers") + ".txt"); if (content != "error"){ qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toUtf8().data()); qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены. Производим установку значений."); app->config->setValue("Values", "servers", content); qDebug() << content; } else { qWarning("%s:%i: %s", __FILE__, __LINE__, "Не удалось получить информацию с сервера."); content = app->config->getValue("Values", "servers"); qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); return content; } if(content == "profilaktika"){ qInfo("%s:%i: %s", __FILE__, __LINE__, "По данным сервера в данный момент идут техработы."); foreach(QObject * obj, app->window->ui->serversbox->children()){ if (obj != nullptr && obj->objectName() != ""){ QLabel * label = dynamic_cast(obj); label->setStyleSheet("QLabel{ background-color:#8A0808; }"); } } qInfo("%s:%i: %s", __FILE__, __LINE__, "Парсим данные о профилактике."); content = app->config->getValue("Values", "foot"); if(content != ""){ QStringList list = content.split(":::"); time = "Примерное время окончания работ - " + list[1] + " (МСК)"; } qInfo("%s:%i: %s", __FILE__, __LINE__, "Выводим сообщение о профилактике."); app->window->ui->footRed->show(); app->window->ui->footRed->setText("Профилактика. Все сервера отключены. " + time); if(app->window->ui->footYellow->text() != "") app->window->ui->footYellow->setText(""); qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); return content; } qInfo("%s:%i: %s", __FILE__, __LINE__, "Раскрашиваем индикаторы серверов."); QStringList data = content.split("|||"); foreach(QString item, data){ QStringList server = item.split(":::"); QString color = server[1] == "on" ? "#173B0B" : "#8A0808"; QLabel* obj = app->window->ui->serversbox->findChild(server[0]); if (obj != nullptr){ obj->setStyleSheet("QLabel{ background-color:" + color + "; }"); } } qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); return content; } void ANetwork::UpdatePatches() { App *app = &App::getInstance(); if (app->state != "free") { qInfo("%s:%i: %s", __FILE__, __LINE__, "Проверка актуальности патчей запущена во время выполения другой операции. Прерываю проверку"); return; } app->helper->setState("busy"); emit changeHint("Проверка обновлений патчей", "Выполняется поиск обновлений патчей..."); app->downloader->resetDownloadedCount(); QUrlQuery query; QStringList names; QString version; qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем проверку актуальности патчей."); names << "sounds" << "texts" << "images" << "videos" << "loadscreens" << "textures" << "fonts"; QUrl url(app->config->getValue("Network", "releases")); QString datafolder = QApplication::applicationDirPath() + "/data"; QDir dir(datafolder); if (!dir.exists()) QDir().mkdir(datafolder); foreach(QString s, names) { emit changeHint("Проверка обновлений патчей", "Проверка патча " + LotroManager::getInstance().patchTitleFromName(s) + "..."); if(app->config->getValue("Editor", s) == "false") { emit changePatchStatus(s, "Не выбран"); continue; } QStringList paths = dir.entryList(QStringList(s + "*")); qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Найденные патчи: ", QString(paths.join(' ')).toUtf8().data()); QString dateline = app->config->getValue("Datetime", s); if (dateline != "-1") { qDebug("%s:%i: %s", __FILE__, __LINE__, "Проставляем даты патчей."); QStringList date = dateline.split(" "); emit changePatchStatus(s, date[0]); } if (paths.empty()) { qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Патч отсутствует: ", s.toUtf8().data()); version = "100"; emit changePatchStatus(s, "В очереди"); query.addQueryItem(s.left(s.length() - 1), version); continue; } version = QString::number(app->helper->getVersion(paths.first())); QString hash = FileSystem::fileHash(datafolder + "/" + paths.first(), QCryptographicHash::Md5); if(hash != app->config->getValue("Hashes", s)) { qDebug("%s:%i: %s\n%s%s\n%s%s\n%s%s", __FILE__, __LINE__, "Неверный хэш файла! (удаляю файл)", "Файл: " , paths.first().toUtf8().data(), "Высчитанный хэш: ", hash.toUtf8().data(), "Хэш конфигурации: ", app->config->getValue("Hashes", s).toUtf8().data() ); QFile base(datafolder + "/" + paths.first()); base.remove(); version="100"; emit changePatchStatus(s, "В очереди"); } query.addQueryItem(s.left(s.length() - 1), version); } url.setQuery(query.query()); qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Запрашиваем информацию о патчах: ", url.fileName().toUtf8().data()); qDebug() << "\nЗапрос на сервер: " << url; QString content = this->query(url); if(content == "error"){ qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствует связь с сервером. Прервано."); app->logSectionEnd(); emit changeHint("Ошибка проверки обновлений", "Отсутствует связь с сервером. Проверка обновлений прервана."); app->helper->setState("free"); return; } qDebug() << "\nОтвет сервера: " << content; if (content == "Запросы GET или POST отсутствуют!!!!") { qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствуют запросы к серверу."); app->helper->setState("free"); return; } if (content == "") { qInfo("%s:%i: %s", __FILE__, __LINE__, "Все версии патчей соответствуют актуальным."); emit changeHint("Проверка завершена", "Все версии патчей соответствуют актуальным."); app->helper->setState("free"); return; } qInfo("%s:%i: %s", __FILE__, __LINE__, "Составляем список загрузок."); QStringList downloads = content.split( "|" ); foreach (QString item, downloads){ QStringList values = item.split( ":::" ); QStringList pathline = values[0].split( "_" ); pathline = pathline[0].split( "/" ); QUrl url = values[0]; app->config->setValue("Hashes", pathline.last(), values[1]); app->config->setValue("Datetime", pathline.last(), values[2]); // Удаляем устаревшие патчи QStringList old = dir.entryList(QStringList(pathline.last() + "*")); if(old.count() > 0){ foreach(QString filename, old){ QFile::remove(QApplication::applicationDirPath() + "/data/" + filename); } } // Добавляем новый файл в список закачек app->downloader->append(url); } qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем загрузку патчей."); app->helper->setState("free"); app->downloader->startDownloads(); } QString ANetwork::getMicroPath(int timestamp){ App *app = &App::getInstance(); app->logSectionStart("Загрузка последних обновлений"); qInfo("%s:%i: %s", __FILE__, __LINE__, "Уточняем наличие обновлений"); QString microfolder = QApplication::applicationDirPath() + "/data/micro/"; QDir dir(microfolder); if(!dir.exists()) QDir().mkdir(microfolder); QString baseurl = app->config->getValue("Network", "update"); QString url = baseurl + "/1/" + QString::number(timestamp); qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Стартуем загрузку ", url.toStdString().c_str()); QNetworkAccessManager m_NetworkMngr; QNetworkReply *reply= m_NetworkMngr.get(QNetworkRequest(url)); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()),&loop, SLOT(quit())); loop.exec(); QUrl aUrl(url); QFileInfo fileInfo=aUrl.path(); QString filename = micropatch; QFile file(filename); file.open(QIODevice::WriteOnly); file.write(reply->readAll()); delete reply; qInfo("%s:%i: %s", __FILE__, __LINE__, "Загрузка микропатча завершена."); //LotroManager::getInstance().database_.InitDatabase(filename.toUtf8().data()); //int indb = LotroManager::getInstance().database_.CountRows(); //qInfo("%s:%i: %s%i", __FILE__, __LINE__, "Патч содержит строк: ", indb); //for(int i = 0; i<=indb; i++) LotroManager::getInstance().processFile(); //qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); //LotroManager::getInstance().saveDatFiles(); //LotroManager::getInstance().database_.CloseDatabase(); //app->logSectionEnd(); return filename; }