2017-03-20 12:14:49 +00:00
|
|
|
use chrono::UTC;
|
|
|
|
use std::fmt;
|
|
|
|
use std::hash::{Hash, Hasher};
|
2017-03-20 15:20:37 +00:00
|
|
|
use std::collections::HashMap;
|
2017-03-20 12:14:49 +00:00
|
|
|
use std::collections::hash_map::DefaultHasher;
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
pub struct Token {
|
|
|
|
pub access_token: String,
|
|
|
|
pub expires_in: u16,
|
|
|
|
pub token_type: String,
|
|
|
|
pub scope: String,
|
|
|
|
pub session_id: String,
|
|
|
|
pub refresh_token: String,
|
|
|
|
pub user_id: String,
|
|
|
|
#[serde(default = "timestamp")]
|
|
|
|
pub timestamp: i64,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Token {
|
|
|
|
pub fn is_expired(&self) -> bool {
|
|
|
|
let now = UTC::now().timestamp();
|
|
|
|
|
|
|
|
now > self.timestamp + self.expires_in as i64
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn timestamp() -> i64 {
|
|
|
|
UTC::now().timestamp()
|
|
|
|
}
|
|
|
|
|
2017-03-20 15:20:37 +00:00
|
|
|
#[derive(Serialize, Deserialize)]
|
2017-03-21 15:55:19 +00:00
|
|
|
#[serde(rename_all = "camelCase")]
|
2017-03-20 15:20:37 +00:00
|
|
|
pub struct Config {
|
2017-03-22 08:40:48 +00:00
|
|
|
#[serde(default)]
|
2017-03-22 14:39:46 +00:00
|
|
|
pub game_storage: String,
|
2017-03-22 08:40:48 +00:00
|
|
|
#[serde(default)]
|
2017-03-21 21:28:03 +00:00
|
|
|
pub movie_storage: String,
|
2017-03-20 15:20:37 +00:00
|
|
|
#[serde(default = "default_map")]
|
2017-03-22 14:39:46 +00:00
|
|
|
pub content: HashMap<String, u64>,
|
2017-03-20 15:20:37 +00:00
|
|
|
#[serde(default = "default_map")]
|
2017-03-22 14:39:46 +00:00
|
|
|
pub data: HashMap<String, u64>,
|
2017-03-20 15:20:37 +00:00
|
|
|
#[serde(default = "default_map")]
|
|
|
|
pub extras: HashMap<String, u64>,
|
2017-03-21 15:55:19 +00:00
|
|
|
#[serde(default = "default_list")]
|
|
|
|
pub os_filters: Vec<String>,
|
|
|
|
#[serde(default = "default_list")]
|
|
|
|
pub language_filters: Vec<String>,
|
2017-03-22 13:40:54 +00:00
|
|
|
#[serde(default)]
|
|
|
|
pub skip_movies: bool,
|
|
|
|
#[serde(default)]
|
|
|
|
pub skip_games: bool,
|
2017-03-20 15:20:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn default_map() -> HashMap<String, u64> {
|
|
|
|
HashMap::new()
|
|
|
|
}
|
|
|
|
|
2017-03-21 15:55:19 +00:00
|
|
|
fn default_list() -> Vec<String> {
|
|
|
|
Vec::new()
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Config {
|
|
|
|
pub fn new() -> Config {
|
|
|
|
Config {
|
2017-03-22 14:39:46 +00:00
|
|
|
game_storage: String::from("."),
|
2017-03-21 21:28:03 +00:00
|
|
|
movie_storage: String::from("."),
|
2017-03-22 14:39:46 +00:00
|
|
|
content: HashMap::new(),
|
|
|
|
data: HashMap::new(),
|
2017-03-21 15:55:19 +00:00
|
|
|
extras: HashMap::new(),
|
|
|
|
os_filters: Vec::new(),
|
|
|
|
language_filters: Vec::new(),
|
2017-03-22 13:40:54 +00:00
|
|
|
skip_movies: false,
|
|
|
|
skip_games: false,
|
2017-03-21 15:55:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-20 12:14:49 +00:00
|
|
|
#[derive(Hash)]
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
2017-03-22 14:39:46 +00:00
|
|
|
pub struct Content {
|
2017-03-20 12:14:49 +00:00
|
|
|
pub title: String,
|
|
|
|
pub cd_key: String,
|
|
|
|
#[serde(skip_deserializing)]
|
2017-03-21 21:28:03 +00:00
|
|
|
pub is_movie: bool,
|
|
|
|
#[serde(skip_deserializing)]
|
2017-03-22 14:39:46 +00:00
|
|
|
pub data: Vec<Data>,
|
2017-03-20 12:14:49 +00:00
|
|
|
pub extras: Vec<Extra>,
|
|
|
|
}
|
|
|
|
|
2017-03-22 14:39:46 +00:00
|
|
|
impl fmt::Display for Content {
|
2017-03-20 12:14:49 +00:00
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
write!(f, "({})", self.title)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Hash)]
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
2017-03-22 14:39:46 +00:00
|
|
|
pub struct Data {
|
2017-03-20 12:14:49 +00:00
|
|
|
pub manual_url: String,
|
|
|
|
pub version: String,
|
|
|
|
pub os: String,
|
|
|
|
pub language: String,
|
|
|
|
}
|
|
|
|
|
2017-03-22 14:39:46 +00:00
|
|
|
impl fmt::Display for Data {
|
2017-03-20 12:14:49 +00:00
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
write!(f,
|
|
|
|
"({}, {}, {}, {})",
|
|
|
|
self.manual_url,
|
|
|
|
self.version,
|
|
|
|
self.os,
|
|
|
|
self.language)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Hash)]
|
|
|
|
#[derive(Serialize, Deserialize)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
pub struct Extra {
|
|
|
|
pub manual_url: String,
|
|
|
|
pub name: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for Extra {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
|
|
write!(f, "({}, {})", self.manual_url, self.name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn get_hash<T>(obj: &T) -> u64
|
|
|
|
where T: Hash
|
|
|
|
{
|
|
|
|
let mut s = DefaultHasher::new();
|
|
|
|
obj.hash(&mut s);
|
|
|
|
s.finish()
|
|
|
|
}
|