123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- #include "app.h"
- #include "filesystem.h"
- #include "lotromanager.h"
- #include <QtNetwork/QNetworkAccessManager>
- #include <QUrl>
- #include <QUrlQuery>
- #include <QNetworkRequest>
- #include <QNetworkReply>
- #include <QObject>
- #include <QEventLoop>
- #include <QDir>
- #include <QMap>
- 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<QLabel*>(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<QLabel*>(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;
- }
|