From 95a25d52d65c0bafa408a9af553e06954f08131a Mon Sep 17 00:00:00 2001 From: parhelia512 <0011d3@gmail.com> Date: Wed, 20 Aug 2025 13:52:10 +0800 Subject: [PATCH] feat: add Enable AdBlock option --- include/global/DataStore.hpp | 1 + src/configs/ConfigBuilder.cpp | 8 +++++ src/dataStore/RouteEntity.cpp | 8 +++++ src/global/Configs.cpp | 1 + src/ui/mainwindow.cpp | 55 ++++++++++++++++++++++------------- 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/include/global/DataStore.hpp b/include/global/DataStore.hpp index ad6c085..3d0cd31 100644 --- a/include/global/DataStore.hpp +++ b/include/global/DataStore.hpp @@ -117,6 +117,7 @@ namespace Configs { // Routing QString custom_route_global = "{\"rules\": []}"; QString active_routing = "Default"; + bool adblock_enable = false; // VPN bool fake_dns = false; diff --git a/src/configs/ConfigBuilder.cpp b/src/configs/ConfigBuilder.cpp index 7e8d8fe..152db48 100644 --- a/src/configs/ConfigBuilder.cpp +++ b/src/configs/ConfigBuilder.cpp @@ -780,6 +780,14 @@ namespace Configs { }; } } + if (Configs::dataStore->adblock_enable) { + ruleSetArray += QJsonObject{ + {"type", "remote"}, + {"tag", "throne-adblocksingbox"}, + {"format", "binary"}, + {"url", get_jsdelivr_link("https://raw.githubusercontent.com/217heidai/adblockfilters/main/rules/adblocksingbox.srs")}, + }; + } routeObj["rule_set"] = ruleSetArray; // DNS settings diff --git a/src/dataStore/RouteEntity.cpp b/src/dataStore/RouteEntity.cpp index 5633497..2979816 100644 --- a/src/dataStore/RouteEntity.cpp +++ b/src/dataStore/RouteEntity.cpp @@ -567,6 +567,14 @@ namespace Configs { QJsonArray RoutingChain::get_route_rules(bool forView, std::map outboundMap) { QJsonArray res; + if (Configs::dataStore->adblock_enable) { + QJsonObject obj; + obj["action"] = "reject"; + QJsonArray jarray; + jarray.append("throne-adblocksingbox"); + obj["rule_set"] = jarray; + res += obj; + } for (const auto &item: Rules) { auto outboundTag = QString(); if (outboundMap.contains(item->outboundID)) outboundTag = outboundMap[item->outboundID]; diff --git a/src/global/Configs.cpp b/src/global/Configs.cpp index 512a792..ad509ce 100644 --- a/src/global/Configs.cpp +++ b/src/global/Configs.cpp @@ -311,6 +311,7 @@ namespace Configs { _add(new configItem("speed_test_mode", &speed_test_mode, itemType::integer)); _add(new configItem("use_mozilla_certs", &use_mozilla_certs, itemType::boolean)); _add(new configItem("allow_beta_update", &allow_beta_update, itemType::boolean)); + _add(new configItem("adblock_enable", &adblock_enable, itemType::boolean)); } void DataStore::UpdateStartedId(int id) { diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index cabe3d3..75ec45e 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -426,7 +426,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi } }); - auto srslist = QFile(QString("%1/%2").arg(qApp->applicationDirPath(), "srslist")); + auto srslist = QFile(QApplication::applicationDirPath() + "/srslist"); if (srslist.exists()) { if (srslist.open(QIODevice::ReadOnly)) { QByteArray byteArray = srslist.readAll(); @@ -435,27 +435,27 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi srsvec.assign(byteArray.begin(), byteArray.end()); ruleSetMap = spb::pb::deserialize(srsvec).items; } - } - - auto getRuleSet = [=,this] - { - QString err; - for(int retry = 0; retry < 5; retry++) { - auto resp = NetworkRequestHelper::HttpGet(Configs::get_jsdelivr_link("https://raw.githubusercontent.com/throneproj/routeprofiles/rule-set/list")); - if (resp.error.isEmpty()) { - std::vector respvec; - respvec.assign(resp.data.begin(), resp.data.end()); - auto reply = spb::pb::deserialize(respvec); - ruleSetMap = reply.items; - return; + } else { + auto getRuleSet = [=,this] + { + QString err; + for(int retry = 0; retry < 5; retry++) { + auto resp = NetworkRequestHelper::HttpGet(Configs::get_jsdelivr_link("https://raw.githubusercontent.com/throneproj/routeprofiles/rule-set/list")); + if (resp.error.isEmpty()) { + std::vector respvec; + respvec.assign(resp.data.begin(), resp.data.end()); + auto reply = spb::pb::deserialize(respvec); + ruleSetMap = reply.items; + return; + } + else + err = resp.error; + QThread::sleep(30); } - else - err = resp.error; - QThread::sleep(30); - } - MW_show_log(QObject::tr("Requesting rule-set list error: %1").arg(err)); - }; - runOnNewThread(getRuleSet); + MW_show_log(QObject::tr("Requesting rule-set list error: %1").arg(err)); + }; + runOnNewThread(getRuleSet); + } auto getRemoteRouteProfiles = [=,this] { @@ -483,6 +483,19 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi runOnNewThread(getRemoteRouteProfiles); ui->menuRouting_Menu->clear(); ui->menuRouting_Menu->addAction(ui->menu_routing_settings); + + auto* actionAdblock = new QAction(ui->menuRouting_Menu); + actionAdblock->setText("Enable AdBlock"); + actionAdblock->setCheckable(true); + actionAdblock->setChecked(Configs::dataStore->adblock_enable); + connect(actionAdblock, &QAction::triggered, this, [=,this](bool checked) { + Configs::dataStore->adblock_enable = checked; + actionAdblock->setChecked(checked); + Configs::dataStore->Save(); + if (Configs::dataStore->started_id >= 0) profile_start(Configs::dataStore->started_id); + }); + ui->menuRouting_Menu->addAction(actionAdblock); + mu_remoteRouteProfiles.lock(); if(!remoteRouteProfiles.isEmpty()) { QMenu* profilesMenu = ui->menuRouting_Menu->addMenu(QObject::tr("Download Profiles"));