version checker logic
This commit is contained in:
parent
a3eef3bc11
commit
e090a7adf1
6 changed files with 99 additions and 6 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1 +1,3 @@
|
|||
/target
|
||||
|
||||
/data
|
||||
|
|
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1153,6 +1153,8 @@ version = "0.1.0"
|
|||
dependencies = [
|
||||
"actix-web",
|
||||
"octocrab",
|
||||
"regex",
|
||||
"semver",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
|
|
|
@ -12,4 +12,6 @@ license = "AGPL-3.0-or-later"
|
|||
[dependencies]
|
||||
actix-web = "4.4"
|
||||
octocrab = "0.30"
|
||||
regex = "1.9.5"
|
||||
semver = "1.0.18"
|
||||
tokio = "1.32.0"
|
||||
|
|
26
src/main.rs
26
src/main.rs
|
@ -1,9 +1,21 @@
|
|||
use std::{
|
||||
thread,
|
||||
fs, thread,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
mod revanced;
|
||||
mod utils;
|
||||
|
||||
/// Initialize
|
||||
pub fn init() {
|
||||
// Make data directory
|
||||
if let Err(why) = fs::create_dir(utils::get_data_directory()) {
|
||||
match why.kind() {
|
||||
std::io::ErrorKind::AlreadyExists => (),
|
||||
_ => eprintln!("{:?}", why.kind()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[actix_web::main]
|
||||
async fn main() {
|
||||
|
@ -22,10 +34,15 @@ async fn main() {
|
|||
println!("Scheduler starting");
|
||||
|
||||
// Prepare threads
|
||||
let thread_a = thread::spawn(revanced::search);
|
||||
let thread_revanced = thread::spawn(revanced::worker);
|
||||
|
||||
// Run threads
|
||||
rt.block_on(async { thread_a.join().expect("Thread A panicked").await });
|
||||
rt.block_on(async {
|
||||
thread_revanced
|
||||
.join()
|
||||
.expect("Thread Revanced panicked")
|
||||
.await
|
||||
});
|
||||
|
||||
let runtime = start.elapsed();
|
||||
|
||||
|
@ -40,6 +57,9 @@ async fn main() {
|
|||
}
|
||||
});
|
||||
|
||||
// Initializations
|
||||
init();
|
||||
|
||||
// Run scheduler
|
||||
scheduler.join().expect("Scheduler panicked");
|
||||
}
|
||||
|
|
|
@ -1,9 +1,53 @@
|
|||
use octocrab::models::repos::Release;
|
||||
use crate::utils;
|
||||
use octocrab::models::repos::{Asset, Release};
|
||||
use regex::Regex;
|
||||
use semver::Version;
|
||||
use std::fs;
|
||||
|
||||
pub async fn search() {
|
||||
println!("{:#?}", get_latest_version().await)
|
||||
/// Revanced worker
|
||||
pub async fn worker() {
|
||||
if let Some(patches_url) = search().await {
|
||||
// Download
|
||||
println!("TODO // Download {}", patches_url);
|
||||
}
|
||||
}
|
||||
|
||||
/// Search for the latest version
|
||||
/// Returns option if update has been found with the right URL
|
||||
async fn search() -> Option<String> {
|
||||
let github_latest_version = get_latest_version().await;
|
||||
|
||||
let latest_version = {
|
||||
let mut tag = github_latest_version.tag_name.chars();
|
||||
tag.next();
|
||||
Version::parse(tag.as_str()).unwrap()
|
||||
};
|
||||
|
||||
if let Some(current_version) = get_current_version() {
|
||||
// No need to update
|
||||
if latest_version <= current_version {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
|
||||
// Either no current version, or version outdated, we need an update
|
||||
github_latest_version
|
||||
.assets
|
||||
.iter()
|
||||
.filter(|ele| ele.browser_download_url.path().ends_with(".jar"))
|
||||
.collect::<Vec<&Asset>>()
|
||||
.first()
|
||||
.map(|asset| {
|
||||
format!(
|
||||
"{}://{}{}",
|
||||
asset.browser_download_url.scheme(),
|
||||
asset.browser_download_url.host().unwrap(),
|
||||
asset.browser_download_url.path()
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
/// Grab the latest patches version published by ReVanced
|
||||
async fn get_latest_version() -> Release {
|
||||
let octocrab = octocrab::instance();
|
||||
|
||||
|
@ -14,3 +58,22 @@ async fn get_latest_version() -> Release {
|
|||
.await
|
||||
.expect("Can't find the latest version of Revanced")
|
||||
}
|
||||
|
||||
/// Find the current version already downloaded
|
||||
fn get_current_version() -> Option<semver::Version> {
|
||||
match fs::read_dir(utils::get_data_directory()) {
|
||||
Err(why) => {
|
||||
eprintln!("Error reading directory: {:?}", why.kind());
|
||||
None
|
||||
}
|
||||
Ok(paths) => {
|
||||
for path in paths {
|
||||
let re = Regex::new(r"revanced-patches-(?P<version>\d+\.\d+\.\d+)\.jar").unwrap();
|
||||
if let Some(caps) = re.captures(&path.unwrap().path().display().to_string()) {
|
||||
return Some(Version::parse(&caps["version"]).unwrap());
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
4
src/utils.rs
Normal file
4
src/utils.rs
Normal file
|
@ -0,0 +1,4 @@
|
|||
/// Data directory
|
||||
pub fn get_data_directory() -> String {
|
||||
"./data".to_owned()
|
||||
}
|
Loading…
Reference in a new issue