network.cpp 13 KB

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