anetwork.cpp 13 KB

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