add auto reset assets feature

This commit is contained in:
Nova 2025-08-01 11:49:19 +03:30
parent 1e47e7a626
commit fdffa32191
7 changed files with 65 additions and 5 deletions

View File

@ -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

View File

@ -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;

View File

@ -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<QString, Stats::ConnectionMetadata>& toUpdate, const QMap<QString, Stats::ConnectionMetadata>& toAdd);
@ -198,6 +198,7 @@ private:
//
QMutex mu_download_assets;
QMutex mu_download_update;
QMutex mu_reset_assets;
//
int toolTipID;
//

View File

@ -765,6 +765,41 @@
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item>
<widget class="QLabel" name="label_19">
<property name="text">
<string>Auto Reset Assets</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="auto_reset">
<item>
<property name="text">
<string>Disabled</string>
</property>
</item>
<item>
<property name="text">
<string>Every Day</string>
</property>
</item>
<item>
<property name="text">
<string>Every 3 Days</string>
</property>
</item>
<item>
<property name="text">
<string>Every Week</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_11">
<item>

View File

@ -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));

View File

@ -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

View File

@ -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)