client version check on api
This commit is contained in:
90
src/api.rs
90
src/api.rs
@@ -1,3 +1,5 @@
|
|||||||
|
use std::cmp::Ordering;
|
||||||
|
use htmlentity::types::Byte;
|
||||||
use ntex::http::header;
|
use ntex::http::header;
|
||||||
use ntex::web;
|
use ntex::web;
|
||||||
use ntex::web::HttpRequest;
|
use ntex::web::HttpRequest;
|
||||||
@@ -8,6 +10,80 @@ use crate::providers::spankbang::SpankbangProvider;
|
|||||||
use crate::util::cache::VideoCache;
|
use crate::util::cache::VideoCache;
|
||||||
use crate::{providers::*, status::*, videos::*, DbPool};
|
use crate::{providers::*, status::*, videos::*, DbPool};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct ClientVersion{
|
||||||
|
version: u32,
|
||||||
|
subversion: u32,
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl ClientVersion {
|
||||||
|
|
||||||
|
pub fn new(version: u32, subversion: u32, name: String) -> ClientVersion{
|
||||||
|
ClientVersion{
|
||||||
|
version,
|
||||||
|
subversion,
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse(input: &str) -> Option<Self> {
|
||||||
|
// Example input: "Hot%20Tub/22c CFNetwork/1494.0.7 Darwin/23.4.0 0.002478"
|
||||||
|
let parts: Vec<&str> = input.split_whitespace().collect();
|
||||||
|
if let Some(first) = parts.first() {
|
||||||
|
let name_version: Vec<&str> = first.split('/').collect();
|
||||||
|
let name = name_version[1];
|
||||||
|
|
||||||
|
// Extract version and optional subversion
|
||||||
|
let (version, subversion) = if let Some((v, c)) = name.split_at(name.len().saturating_sub(1)).into() {
|
||||||
|
match v.parse::<u32>() {
|
||||||
|
Ok(ver) => (ver, c.chars().next().map(|ch| ch as u32).unwrap_or(0)),
|
||||||
|
Err(_) => {
|
||||||
|
// Try parsing whole string if no subversion exists
|
||||||
|
match name.parse::<u32>() {
|
||||||
|
Ok(ver) => (ver, 0),
|
||||||
|
Err(_) => return None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Some(ClientVersion {
|
||||||
|
version: version,
|
||||||
|
subversion: subversion,
|
||||||
|
name: name.to_string(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implement comparisons
|
||||||
|
impl PartialEq for ClientVersion {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.name == other.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for ClientVersion {}
|
||||||
|
|
||||||
|
impl PartialOrd for ClientVersion {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for ClientVersion {
|
||||||
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
|
self.version
|
||||||
|
.cmp(&other.version)
|
||||||
|
.then_with(|| self.subversion.cmp(&other.subversion))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn config(cfg: &mut web::ServiceConfig) {
|
pub fn config(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(
|
cfg.service(
|
||||||
web::resource("/status")
|
web::resource("/status")
|
||||||
@@ -22,6 +98,16 @@ pub fn config(cfg: &mut web::ServiceConfig) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
||||||
|
|
||||||
|
let clientversion: ClientVersion = match req.headers().get("User-Agent"){
|
||||||
|
Some(v) => match v.to_str(){
|
||||||
|
Ok(useragent) => ClientVersion::parse(useragent).unwrap_or_else(|| ClientVersion::new(999, 0, "999".to_string())),
|
||||||
|
Err(_) => ClientVersion::new(999, 0, "999".to_string())
|
||||||
|
},
|
||||||
|
_=> ClientVersion::new(999, 0, "999".to_string())
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
let host = req
|
let host = req
|
||||||
.headers()
|
.headers()
|
||||||
.get(header::HOST)
|
.get(header::HOST)
|
||||||
@@ -29,6 +115,9 @@ async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
|||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.to_string();
|
.to_string();
|
||||||
let mut status = Status::new();
|
let mut status = Status::new();
|
||||||
|
|
||||||
|
if clientversion >= ClientVersion::new(22,97,"22a".to_string()){
|
||||||
|
//add perverzija
|
||||||
status.add_channel(Channel {
|
status.add_channel(Channel {
|
||||||
id: "perverzija".to_string(),
|
id: "perverzija".to_string(),
|
||||||
name: "Perverzija".to_string(),
|
name: "Perverzija".to_string(),
|
||||||
@@ -95,6 +184,7 @@ async fn status(req: HttpRequest) -> Result<impl web::Responder, web::Error> {
|
|||||||
],
|
],
|
||||||
nsfw: true,
|
nsfw: true,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
status.add_channel(Channel {
|
status.add_channel(Channel {
|
||||||
id: "hanime".to_string(),
|
id: "hanime".to_string(),
|
||||||
name: "Hanime".to_string(),
|
name: "Hanime".to_string(),
|
||||||
|
|||||||
Reference in New Issue
Block a user