|
@@ -94,6 +94,16 @@ pub struct PrfOption {
|
|
|
/// default is `false`
|
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
|
pub danger_accept_invalid_certs: Option<bool>,
|
|
|
+
|
|
|
+ pub merge: Option<String>,
|
|
|
+
|
|
|
+ pub script: Option<String>,
|
|
|
+
|
|
|
+ pub rules: Option<String>,
|
|
|
+
|
|
|
+ pub proxies: Option<String>,
|
|
|
+
|
|
|
+ pub groups: Option<String>,
|
|
|
}
|
|
|
|
|
|
impl PrfOption {
|
|
@@ -107,6 +117,11 @@ impl PrfOption {
|
|
|
.danger_accept_invalid_certs
|
|
|
.or(a.danger_accept_invalid_certs);
|
|
|
a.update_interval = b.update_interval.or(a.update_interval);
|
|
|
+ a.merge = b.merge.or(a.merge);
|
|
|
+ a.script = b.script.or(a.script);
|
|
|
+ a.rules = b.rules.or(a.rules);
|
|
|
+ a.proxies = b.proxies.or(a.proxies);
|
|
|
+ a.groups = b.groups.or(a.groups);
|
|
|
Some(a)
|
|
|
}
|
|
|
t => t.0.or(t.1),
|
|
@@ -137,16 +152,8 @@ impl PrfItem {
|
|
|
let desc = item.desc.unwrap_or("".into());
|
|
|
PrfItem::from_local(name, desc, file_data, item.option)
|
|
|
}
|
|
|
- "merge" => {
|
|
|
- let name = item.name.unwrap_or("Merge".into());
|
|
|
- let desc = item.desc.unwrap_or("".into());
|
|
|
- PrfItem::from_merge(name, desc)
|
|
|
- }
|
|
|
- "script" => {
|
|
|
- let name = item.name.unwrap_or("Script".into());
|
|
|
- let desc = item.desc.unwrap_or("".into());
|
|
|
- PrfItem::from_script(name, desc)
|
|
|
- }
|
|
|
+ "merge" => PrfItem::from_merge(),
|
|
|
+ "script" => PrfItem::from_script(),
|
|
|
typ => bail!("invalid profile item type \"{typ}\""),
|
|
|
}
|
|
|
}
|
|
@@ -161,7 +168,24 @@ impl PrfItem {
|
|
|
) -> Result<PrfItem> {
|
|
|
let uid = help::get_uid("l");
|
|
|
let file = format!("{uid}.yaml");
|
|
|
-
|
|
|
+ let opt_ref = option.as_ref();
|
|
|
+ let update_interval = opt_ref.and_then(|o| o.update_interval);
|
|
|
+ let mut merge = opt_ref.and_then(|o| o.merge.clone());
|
|
|
+ let mut script = opt_ref.and_then(|o| o.script.clone());
|
|
|
+ let rules = opt_ref.and_then(|o| o.rules.clone());
|
|
|
+ let proxies = opt_ref.and_then(|o| o.proxies.clone());
|
|
|
+ let groups = opt_ref.and_then(|o| o.groups.clone());
|
|
|
+
|
|
|
+ if merge.is_none() {
|
|
|
+ let merge_item = PrfItem::from_merge()?;
|
|
|
+ Config::profiles().data().append_item(merge_item.clone())?;
|
|
|
+ merge = merge_item.uid;
|
|
|
+ }
|
|
|
+ if script.is_none() {
|
|
|
+ let script_item = PrfItem::from_script()?;
|
|
|
+ Config::profiles().data().append_item(script_item.clone())?;
|
|
|
+ script = script_item.uid;
|
|
|
+ }
|
|
|
Ok(PrfItem {
|
|
|
uid: Some(uid),
|
|
|
itype: Some("local".into()),
|
|
@@ -172,7 +196,12 @@ impl PrfItem {
|
|
|
selected: None,
|
|
|
extra: None,
|
|
|
option: Some(PrfOption {
|
|
|
- update_interval: option.unwrap_or_default().update_interval,
|
|
|
+ update_interval,
|
|
|
+ merge,
|
|
|
+ script,
|
|
|
+ rules,
|
|
|
+ proxies,
|
|
|
+ groups,
|
|
|
..PrfOption::default()
|
|
|
}),
|
|
|
home: None,
|
|
@@ -196,9 +225,23 @@ impl PrfItem {
|
|
|
opt_ref.map_or(false, |o| o.danger_accept_invalid_certs.unwrap_or(false));
|
|
|
let user_agent = opt_ref.and_then(|o| o.user_agent.clone());
|
|
|
let update_interval = opt_ref.and_then(|o| o.update_interval);
|
|
|
-
|
|
|
+ let mut merge = opt_ref.and_then(|o| o.merge.clone());
|
|
|
+ let mut script = opt_ref.and_then(|o| o.script.clone());
|
|
|
+ let rules = opt_ref.and_then(|o| o.rules.clone());
|
|
|
+ let proxies = opt_ref.and_then(|o| o.proxies.clone());
|
|
|
+ let groups = opt_ref.and_then(|o| o.groups.clone());
|
|
|
let mut builder = reqwest::ClientBuilder::new().use_rustls_tls().no_proxy();
|
|
|
|
|
|
+ if merge.is_none() {
|
|
|
+ let merge_item = PrfItem::from_merge()?;
|
|
|
+ Config::profiles().data().append_item(merge_item.clone())?;
|
|
|
+ merge = merge_item.uid;
|
|
|
+ }
|
|
|
+ if script.is_none() {
|
|
|
+ let script_item = PrfItem::from_script()?;
|
|
|
+ Config::profiles().data().append_item(script_item.clone())?;
|
|
|
+ script = script_item.uid;
|
|
|
+ }
|
|
|
// 使用软件自己的代理
|
|
|
if self_proxy {
|
|
|
let port = Config::verge()
|
|
@@ -290,17 +333,11 @@ impl PrfItem {
|
|
|
crate::utils::help::get_last_part_and_decode(url).unwrap_or("Remote File".into()),
|
|
|
),
|
|
|
};
|
|
|
- let option = match update_interval {
|
|
|
- Some(val) => Some(PrfOption {
|
|
|
- update_interval: Some(val),
|
|
|
- ..PrfOption::default()
|
|
|
- }),
|
|
|
+ let update_interval = match update_interval {
|
|
|
+ Some(val) => Some(val),
|
|
|
None => match header.get("profile-update-interval") {
|
|
|
Some(value) => match value.to_str().unwrap_or("").parse::<u64>() {
|
|
|
- Ok(val) => Some(PrfOption {
|
|
|
- update_interval: Some(val * 60), // hour -> min
|
|
|
- ..PrfOption::default()
|
|
|
- }),
|
|
|
+ Ok(val) => Some(val * 60), // hour -> min
|
|
|
Err(_) => None,
|
|
|
},
|
|
|
None => None,
|
|
@@ -340,7 +377,15 @@ impl PrfItem {
|
|
|
url: Some(url.into()),
|
|
|
selected: None,
|
|
|
extra,
|
|
|
- option,
|
|
|
+ option: Some(PrfOption {
|
|
|
+ update_interval,
|
|
|
+ merge,
|
|
|
+ script,
|
|
|
+ rules,
|
|
|
+ proxies,
|
|
|
+ groups,
|
|
|
+ ..PrfOption::default()
|
|
|
+ }),
|
|
|
home,
|
|
|
updated: Some(chrono::Local::now().timestamp() as usize),
|
|
|
file_data: Some(data.into()),
|
|
@@ -349,15 +394,15 @@ impl PrfItem {
|
|
|
|
|
|
/// ## Merge type (enhance)
|
|
|
/// create the enhanced item by using `merge` rule
|
|
|
- pub fn from_merge(name: String, desc: String) -> Result<PrfItem> {
|
|
|
+ pub fn from_merge() -> Result<PrfItem> {
|
|
|
let uid = help::get_uid("m");
|
|
|
let file = format!("{uid}.yaml");
|
|
|
|
|
|
Ok(PrfItem {
|
|
|
uid: Some(uid),
|
|
|
itype: Some("merge".into()),
|
|
|
- name: Some(name),
|
|
|
- desc: Some(desc),
|
|
|
+ name: None,
|
|
|
+ desc: None,
|
|
|
file: Some(file),
|
|
|
url: None,
|
|
|
selected: None,
|
|
@@ -371,15 +416,15 @@ impl PrfItem {
|
|
|
|
|
|
/// ## Script type (enhance)
|
|
|
/// create the enhanced item by using javascript quick.js
|
|
|
- pub fn from_script(name: String, desc: String) -> Result<PrfItem> {
|
|
|
+ pub fn from_script() -> Result<PrfItem> {
|
|
|
let uid = help::get_uid("s");
|
|
|
let file = format!("{uid}.js"); // js ext
|
|
|
|
|
|
Ok(PrfItem {
|
|
|
uid: Some(uid),
|
|
|
itype: Some("script".into()),
|
|
|
- name: Some(name),
|
|
|
- desc: Some(desc),
|
|
|
+ name: None,
|
|
|
+ desc: None,
|
|
|
file: Some(file),
|
|
|
url: None,
|
|
|
home: None,
|