diff --git a/include/global/Const.hpp b/include/global/Const.hpp index c395ea4..b073f88 100644 --- a/include/global/Const.hpp +++ b/include/global/Const.hpp @@ -32,6 +32,7 @@ namespace Configs { namespace GeoAssets { inline QStringList GeoIPURLs = {"https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db", "https://raw.githubusercontent.com/Chocolate4U/Iran-sing-box-rules/release/geoip.db"}; inline QStringList GeoSiteURLs = {"https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db", "https://raw.githubusercontent.com/Chocolate4U/Iran-sing-box-rules/release/geosite.db"}; + inline QList ResetAssetsOptions = {0, 86400, 259200, 604800}; } namespace TestConfig diff --git a/include/global/DataStore.hpp b/include/global/DataStore.hpp index ef5e6f8..f87c2ff 100644 --- a/include/global/DataStore.hpp +++ b/include/global/DataStore.hpp @@ -98,6 +98,8 @@ namespace Configs { // Assets QString geoip_download_url = ""; QString geosite_download_url = ""; + int auto_reset_assets_idx = 0; + long long last_asset_reset_epoch_secs = 0; // Security bool skip_cert = false; diff --git a/include/ui/mainwindow.h b/include/ui/mainwindow.h index 46c8bd2..18d6dde 100644 --- a/include/ui/mainwindow.h +++ b/include/ui/mainwindow.h @@ -86,7 +86,7 @@ public: void DownloadAssets(const QString &geoipUrl, const QString &geositeUrl); - void ResetAssets(QString geoipUrl, QString geositeUrl); + void ResetAssets(const QString& geoipUrl, const QString& geositeUrl); void UpdateConnectionList(const QMap& toUpdate, const QMap& toAdd); @@ -198,6 +198,7 @@ private: // QMutex mu_download_assets; QMutex mu_download_update; + QMutex mu_reset_assets; // int toolTipID; // diff --git a/include/ui/setting/dialog_basic_settings.ui b/include/ui/setting/dialog_basic_settings.ui index 9905ab6..0ab9daf 100644 --- a/include/ui/setting/dialog_basic_settings.ui +++ b/include/ui/setting/dialog_basic_settings.ui @@ -765,6 +765,41 @@ + + + + + + Auto Reset Assets + + + + + + + + Disabled + + + + + Every Day + + + + + Every 3 Days + + + + + Every Week + + + + + + diff --git a/src/global/Configs.cpp b/src/global/Configs.cpp index 04408ba..ec76bd1 100644 --- a/src/global/Configs.cpp +++ b/src/global/Configs.cpp @@ -292,6 +292,8 @@ namespace Configs { _add(new configItem("ntp_interval", &ntp_interval, itemType::string)); _add(new configItem("geoip_download_url", &geoip_download_url, itemType::string)); _add(new configItem("geosite_download_url", &geosite_download_url, itemType::string)); + _add(new configItem("auto_reset_assets_idx", &auto_reset_assets_idx, itemType::integer)); + _add(new configItem("last_asset_reset_unix_secs", &last_asset_reset_epoch_secs, itemType::integer64)); _add(new configItem("enable_dns_server", &enable_dns_server, itemType::boolean)); _add(new configItem("dns_server_listen_lan", &dns_server_listen_lan, itemType::boolean)); _add(new configItem("dns_server_listen_port", &dns_server_listen_port, itemType::integer)); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 25c50c8..c06d422 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -573,7 +573,19 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi TM_auto_update_subsctiption_Reset_Minute(Configs::dataStore->sub_auto_update); // asset updater timer - + auto TM_auto_reset_assets = new QTimer(this); + connect(TM_auto_reset_assets, &QTimer::timeout, this, [&]() + { + auto reset_interval = Configs::GeoAssets::ResetAssetsOptions[Configs::dataStore->auto_reset_assets_idx]; + if (reset_interval > 0 && QDateTime::currentSecsSinceEpoch() - Configs::dataStore->last_asset_reset_epoch_secs > reset_interval) + { + runOnNewThread([=] + { + ResetAssets(Configs::dataStore->geoip_download_url, Configs::dataStore->geosite_download_url); + }); + } + }); + TM_auto_reset_assets->start(1000 * 60 * 5); // check every 5 minutes if (!Configs::dataStore->flag_tray) show(); @@ -2317,10 +2329,13 @@ void MainWindow::DownloadAssets(const QString &geoipUrl, const QString &geositeU MW_show_log(tr("Geo Asset update completed!")); } -void MainWindow::ResetAssets(QString geoipUrl, QString geositeUrl) +void MainWindow::ResetAssets(const QString& geoipUrl, const QString& geositeUrl) { - if (geoipUrl.isEmpty()) geoipUrl = Configs::dataStore->geoip_download_url; - if (geositeUrl.isEmpty()) geositeUrl = Configs::dataStore->geosite_download_url; + if (!mu_reset_assets.try_lock()) + { + MW_show_log(tr("A reset of assets is already in progress")); + return; + } DownloadAssets(geoipUrl, geositeUrl); auto entries = QDir(RULE_SETS_DIR).entryList(QDir::Files); for (const auto &item: entries) { @@ -2334,6 +2349,8 @@ void MainWindow::ResetAssets(QString geoipUrl, QString geositeUrl) { if (Configs::dataStore->started_id >= 0) profile_start(Configs::dataStore->started_id); }); + Configs::dataStore->last_asset_reset_epoch_secs = QDateTime::currentSecsSinceEpoch(); + mu_reset_assets.unlock(); } // to parse versions of format Throne-1.2.3-beta.2 or Throne-1.2.3 diff --git a/src/ui/setting/dialog_basic_settings.cpp b/src/ui/setting/dialog_basic_settings.cpp index 0dab1ae..d4f05bd 100644 --- a/src/ui/setting/dialog_basic_settings.cpp +++ b/src/ui/setting/dialog_basic_settings.cpp @@ -116,6 +116,7 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent) ui->geosite_url->addItems(Configs::GeoAssets::GeoSiteURLs); ui->geoip_url->setCurrentText(Configs::dataStore->geoip_download_url); ui->geosite_url->setCurrentText(Configs::dataStore->geosite_download_url); + ui->auto_reset->setCurrentIndex(Configs::dataStore->auto_reset_assets_idx); connect(ui->download_geo_btn, &QPushButton::clicked, this, [=]() { MW_dialog_message(Dialog_DialogBasicSettings, "DownloadAssets;"+ui->geoip_url->currentText()+";"+ui->geosite_url->currentText()); @@ -214,6 +215,7 @@ void DialogBasicSettings::accept() { // Assets Configs::dataStore->geoip_download_url = ui->geoip_url->currentText(); Configs::dataStore->geosite_download_url = ui->geosite_url->currentText(); + Configs::dataStore->auto_reset_assets_idx = ui->auto_reset->currentIndex(); // Mux D_SAVE_INT(mux_concurrency)