anetwork.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #include "app.h"
  2. #include "filesystem.h"
  3. #include "lotromanager.h"
  4. #include <QtNetwork/QNetworkAccessManager>
  5. #include <QUrl>
  6. #include <QUrlQuery>
  7. #include <QNetworkRequest>
  8. #include <QNetworkReply>
  9. #include <QObject>
  10. #include <QEventLoop>
  11. #include <QDir>
  12. #include <QMap>
  13. ANetwork::ANetwork(QObject*) {
  14. }
  15. QString ANetwork::query(QUrl url){
  16. QNetworkAccessManager* manager = new QNetworkAccessManager();
  17. QNetworkRequest request(url);
  18. QNetworkReply* reply = manager->get(request);
  19. QEventLoop loop;
  20. QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  21. loop.exec();
  22. QString content = reply->readAll();
  23. if (reply->error() != QNetworkReply::NoError){
  24. content = "error";
  25. qDebug() << reply->errorString();
  26. }
  27. reply->deleteLater();
  28. return content;
  29. }
  30. QByteArray ANetwork::query_binary(QUrl url){
  31. QNetworkAccessManager* manager = new QNetworkAccessManager();
  32. QNetworkRequest request(url);
  33. QNetworkReply* reply = manager->get(request);
  34. QEventLoop loop;
  35. QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  36. loop.exec();
  37. QByteArray bytes = reply->readAll();
  38. return bytes;
  39. }
  40. QString ANetwork::getCoupon(){
  41. App *app = &App::getInstance();
  42. app->logSectionStart("Код купона");
  43. QString content = this->query(app->config->getValue("Network", "coupon") + ".txt");
  44. if (content != "error"){
  45. app->config->setValue("Values", "coupon", content);
  46. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toUtf8().data());
  47. qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены. Производим установку значений.");
  48. } else {
  49. qWarning("%s:%i: %s", __FILE__, __LINE__, "Не удалось получить информацию с сервера");
  50. content = app->config->getValue("Values", "coupon");
  51. }
  52. app->window->ui->couponButton->setText(content);
  53. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  54. app->logSectionEnd();
  55. return content;
  56. }
  57. QString ANetwork::getFootMessage(){
  58. App *app = &App::getInstance();
  59. app->logSectionStart("Информация о профилактике");
  60. // app->window->ui->footRed->setText("Профилактика. Все сервера отключены. Примерное время окончания работ - 40:00 (МСК).");
  61. QString content = this->query(app->config->getValue("Network", "foot") + ".txt");
  62. if (content != "error"){
  63. qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены");
  64. app->config->setValue("Values", "foot", content);
  65. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toUtf8().data());
  66. } else {
  67. qWarning("%s:%i: %s", __FILE__, __LINE__, "Не удалось получить информацию с сервера");
  68. content = app->config->getValue("Values", "foot");
  69. app->logSectionEnd();
  70. return content;
  71. }
  72. if(content != ""){
  73. qInfo("%s:%i: %s", __FILE__, __LINE__, "Есть сообщения о профилактике. Производим разбор и установку значений");
  74. QStringList list = content.split(":::");
  75. //QStringList date = list[2].split(" ");
  76. QString day = list[2];
  77. QString month = " " + list[3];
  78. app->window->ui->footYellow->show();
  79. app->window->ui->footYellow->setText("Профилактика игровых серверов состоится " + day + month + " с " + list[0] +" до " + list[1] + " (МСК).");
  80. } else {
  81. qInfo("%s:%i: %s", __FILE__, __LINE__, "Сообщения о профилактике отсутствуют.");
  82. }
  83. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  84. app->logSectionEnd();
  85. return content;
  86. }
  87. QString ANetwork::getServers(){
  88. App *app = &App::getInstance();
  89. QString time = "";
  90. app->logSectionStart("Статусы серверов");
  91. QString content = this->query(app->config->getValue("Network", "servers") + ".txt");
  92. if (content != "error"){
  93. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Ответ сервера: ", content.toUtf8().data());
  94. qInfo("%s:%i: %s", __FILE__, __LINE__, "Данные получены. Производим установку значений.");
  95. app->config->setValue("Values", "servers", content);
  96. qDebug() << content;
  97. } else {
  98. qWarning("%s:%i: %s", __FILE__, __LINE__, "Не удалось получить информацию с сервера.");
  99. content = app->config->getValue("Values", "servers");
  100. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  101. app->logSectionEnd();
  102. return content;
  103. }
  104. if(content == "profilaktika"){
  105. qInfo("%s:%i: %s", __FILE__, __LINE__, "По данным сервера в данный момент идут техработы.");
  106. foreach(QObject * obj, app->window->ui->serversbox->children()){
  107. if (obj != nullptr && obj->objectName() != ""){
  108. QLabel * label = dynamic_cast<QLabel*>(obj);
  109. label->setStyleSheet("QLabel{ background-color:#8A0808; }");
  110. }
  111. }
  112. qInfo("%s:%i: %s", __FILE__, __LINE__, "Парсим данные о профилактике.");
  113. content = app->config->getValue("Values", "foot");
  114. if(content != ""){
  115. QStringList list = content.split(":::");
  116. time = "Примерное время окончания работ - " + list[1] + " (МСК)";
  117. }
  118. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выводим сообщение о профилактике.");
  119. app->window->ui->footRed->show();
  120. app->window->ui->footRed->setText("Профилактика. Все сервера отключены. " + time);
  121. if(app->window->ui->footYellow->text() != "") app->window->ui->footYellow->setText("");
  122. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  123. app->logSectionEnd();
  124. return content;
  125. }
  126. qInfo("%s:%i: %s", __FILE__, __LINE__, "Раскрашиваем индикаторы серверов.");
  127. QStringList data = content.split("|||");
  128. foreach(QString item, data){
  129. QStringList server = item.split(":::");
  130. QString color = server[1] == "on" ? "#173B0B" : "#8A0808";
  131. QLabel* obj = app->window->ui->serversbox->findChild<QLabel*>(server[0]);
  132. if (obj != nullptr){
  133. obj->setStyleSheet("QLabel{ background-color:" + color + "; }");
  134. }
  135. }
  136. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  137. app->logSectionEnd();
  138. return content;
  139. }
  140. void ANetwork::UpdatePatches() {
  141. App *app = &App::getInstance();
  142. if (app->state != "free") {
  143. qInfo("%s:%i: %s", __FILE__, __LINE__, "Проверка актуальности патчей запущена во время выполения другой операции. Прерываю проверку");
  144. return;
  145. }
  146. app->helper->setState("busy");
  147. emit changeHint("Проверка обновлений патчей", "Выполняется поиск обновлений патчей...");
  148. app->downloader->resetDownloadedCount();
  149. QUrlQuery query;
  150. QStringList names;
  151. QString version;
  152. qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем проверку актуальности патчей.");
  153. names << "sounds" << "texts" << "images" << "videos" << "loadscreens" << "textures" << "fonts";
  154. QUrl url(app->config->getValue("Network", "releases"));
  155. QString datafolder = QApplication::applicationDirPath() + "/data";
  156. QDir dir(datafolder);
  157. if (!dir.exists())
  158. QDir().mkdir(datafolder);
  159. foreach(QString s, names) {
  160. emit changeHint("Проверка обновлений патчей", "Проверка патча " + LotroManager::getInstance().patchTitleFromName(s) + "...");
  161. if(app->config->getValue("Editor", s) == "false") {
  162. emit changePatchStatus(s, "Не выбран");
  163. continue;
  164. }
  165. QStringList paths = dir.entryList(QStringList(s + "*"));
  166. qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Найденные патчи: ", QString(paths.join(' ')).toUtf8().data());
  167. QString dateline = app->config->getValue("Datetime", s);
  168. if (dateline != "-1") {
  169. qDebug("%s:%i: %s", __FILE__, __LINE__, "Проставляем даты патчей.");
  170. QStringList date = dateline.split(" ");
  171. emit changePatchStatus(s, date[0]);
  172. }
  173. if (paths.empty()) {
  174. qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Патч отсутствует: ", s.toUtf8().data());
  175. version = "100";
  176. emit changePatchStatus(s, "В очереди");
  177. query.addQueryItem(s.left(s.length() - 1), version);
  178. continue;
  179. }
  180. version = QString::number(app->helper->getVersion(paths.first()));
  181. QString hash = FileSystem::fileHash(datafolder + "/" + paths.first(), QCryptographicHash::Md5);
  182. if(hash != app->config->getValue("Hashes", s)) {
  183. qDebug("%s:%i: %s\n%s%s\n%s%s\n%s%s", __FILE__, __LINE__, "Неверный хэш файла! (удаляю файл)",
  184. "Файл: " , paths.first().toUtf8().data(),
  185. "Высчитанный хэш: ", hash.toUtf8().data(),
  186. "Хэш конфигурации: ", app->config->getValue("Hashes", s).toUtf8().data()
  187. );
  188. QFile base(datafolder + "/" + paths.first());
  189. base.remove();
  190. version="100";
  191. emit changePatchStatus(s, "В очереди");
  192. }
  193. query.addQueryItem(s.left(s.length() - 1), version);
  194. }
  195. url.setQuery(query.query());
  196. qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Запрашиваем информацию о патчах: ", url.fileName().toUtf8().data());
  197. qDebug() << "\nЗапрос на сервер: " << url;
  198. QString content = this->query(url);
  199. if(content == "error"){
  200. qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствует связь с сервером. Прервано.");
  201. app->logSectionEnd();
  202. emit changeHint("Ошибка проверки обновлений", "Отсутствует связь с сервером. Проверка обновлений прервана.");
  203. app->helper->setState("free");
  204. return;
  205. }
  206. qDebug() << "\nОтвет сервера: " << content;
  207. if (content == "Запросы GET или POST отсутствуют!!!!") {
  208. qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствуют запросы к серверу.");
  209. app->helper->setState("free");
  210. return;
  211. }
  212. if (content == "") {
  213. qInfo("%s:%i: %s", __FILE__, __LINE__, "Все версии патчей соответствуют актуальным.");
  214. emit changeHint("Проверка завершена", "Все версии патчей соответствуют актуальным.");
  215. app->helper->setState("free");
  216. return;
  217. }
  218. qInfo("%s:%i: %s", __FILE__, __LINE__, "Составляем список загрузок.");
  219. QStringList downloads = content.split( "|" );
  220. foreach (QString item, downloads){
  221. QStringList values = item.split( ":::" );
  222. QStringList pathline = values[0].split( "_" );
  223. pathline = pathline[0].split( "/" );
  224. QUrl url = values[0];
  225. app->config->setValue("Hashes", pathline.last(), values[1]);
  226. app->config->setValue("Datetime", pathline.last(), values[2]);
  227. // Удаляем устаревшие патчи
  228. QStringList old = dir.entryList(QStringList(pathline.last() + "*"));
  229. if(old.count() > 0){
  230. foreach(QString filename, old){
  231. QFile::remove(QApplication::applicationDirPath() + "/data/" + filename);
  232. }
  233. }
  234. // Добавляем новый файл в список закачек
  235. app->downloader->append(url);
  236. }
  237. qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем загрузку патчей.");
  238. app->helper->setState("free");
  239. app->downloader->startDownloads();
  240. }
  241. QString ANetwork::getMicroPath(int timestamp){
  242. App *app = &App::getInstance();
  243. app->logSectionStart("Загрузка последних обновлений");
  244. qInfo("%s:%i: %s", __FILE__, __LINE__, "Уточняем наличие обновлений");
  245. QString microfolder = QApplication::applicationDirPath() + "/data/micro/";
  246. QDir dir(microfolder);
  247. if(!dir.exists()) QDir().mkdir(microfolder);
  248. QString baseurl = app->config->getValue("Network", "update");
  249. QString url = baseurl + "/1/" + QString::number(timestamp);
  250. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Стартуем загрузку ", url.toStdString().c_str());
  251. QNetworkAccessManager m_NetworkMngr;
  252. QNetworkReply *reply= m_NetworkMngr.get(QNetworkRequest(url));
  253. QEventLoop loop;
  254. QObject::connect(reply, SIGNAL(finished()),&loop, SLOT(quit()));
  255. loop.exec();
  256. QUrl aUrl(url);
  257. QFileInfo fileInfo=aUrl.path();
  258. QString filename = micropatch;
  259. QFile file(filename);
  260. file.open(QIODevice::WriteOnly);
  261. file.write(reply->readAll());
  262. delete reply;
  263. qInfo("%s:%i: %s", __FILE__, __LINE__, "Загрузка микропатча завершена.");
  264. //LotroManager::getInstance().database_.InitDatabase(filename.toUtf8().data());
  265. //int indb = LotroManager::getInstance().database_.CountRows();
  266. //qInfo("%s:%i: %s%i", __FILE__, __LINE__, "Патч содержит строк: ", indb);
  267. //for(int i = 0; i<=indb; i++) LotroManager::getInstance().processFile();
  268. //qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  269. //LotroManager::getInstance().saveDatFiles();
  270. //LotroManager::getInstance().database_.CloseDatabase();
  271. //app->logSectionEnd();
  272. return filename;
  273. }