network.cpp 13 KB

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