mirror of
https://github.com/djibux/BoilR.git
synced 2026-09-01 05:53:41 +02:00
Initial commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/target
|
||||
Generated
+1072
File diff suppressed because it is too large
Load Diff
+12
@@ -0,0 +1,12 @@
|
||||
[package]
|
||||
name = "steam_shortcuts_sync"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
steam_shortcuts_util={version="*", path="C:/src/Rust/steam_shortcuts_util"}
|
||||
steamgriddb_api="*"
|
||||
serde={version="*", features=["derive"]}
|
||||
serde_json="*"
|
||||
@@ -0,0 +1,47 @@
|
||||
use std::env::{self, VarError};
|
||||
use std::fs::{DirEntry, File};
|
||||
use std::io::BufReader;
|
||||
use std::path::Path;
|
||||
use std::error::Error;
|
||||
use super::ManifestItem;
|
||||
|
||||
pub fn get_egs_manifests() -> Result<Vec<ManifestItem>, Box<dyn Error>> {
|
||||
let manifest_dir_path = get_manifest_dir_path()?;
|
||||
let manifest_dir_result = std::fs::read_dir(&manifest_dir_path);
|
||||
if let Err(err) = manifest_dir_result {
|
||||
//TODO make a new error type here instead
|
||||
println!("Could not find manifest directory: {}", manifest_dir_path);
|
||||
return Result::Err(Box::new(err));
|
||||
}
|
||||
let manifest_dir = manifest_dir_result?;
|
||||
let manifests = manifest_dir
|
||||
.filter_map(|dir| dir.ok())
|
||||
.filter_map(get_manifest_item)
|
||||
.filter(is_game_installed);
|
||||
Ok(manifests.collect())
|
||||
}
|
||||
|
||||
fn get_manifest_dir_path() -> Result<String, VarError> {
|
||||
let key = "SYSTEMDRIVE";
|
||||
let system_drive = env::var(key)?;
|
||||
Ok(format!(
|
||||
"{system_drive}//ProgramData//Epic//EpicGamesLauncher//Data//Manifests",
|
||||
system_drive = system_drive
|
||||
))
|
||||
}
|
||||
|
||||
fn is_game_installed(manifest:&ManifestItem) -> bool{
|
||||
Path::new(manifest.manifest_location.as_str()).exists()
|
||||
}
|
||||
|
||||
fn get_manifest_item(dir_entry: DirEntry) -> Option<ManifestItem> {
|
||||
if let Some(extension) = dir_entry.path().extension() {
|
||||
if extension.eq("item") {
|
||||
if let Ok(file) = File::open(dir_entry.path()) {
|
||||
let reader = BufReader::new(file);
|
||||
return serde_json::from_reader(reader).ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct ManifestItem {
|
||||
#[serde(alias = "LaunchExecutable")]
|
||||
pub launch_executable: String,
|
||||
|
||||
#[serde(alias = "ManifestLocation")]
|
||||
pub manifest_location: String,
|
||||
|
||||
#[serde(alias = "DisplayName")]
|
||||
pub display_name: String,
|
||||
|
||||
#[serde(alias = "InstallLocation")]
|
||||
pub install_location: String,
|
||||
|
||||
#[serde(alias = "AppName")]
|
||||
pub app_name: String,
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
mod get_manifests;
|
||||
mod manifest_item;
|
||||
pub use manifest_item::*;
|
||||
pub use get_manifests::get_egs_manifests;
|
||||
+91
@@ -0,0 +1,91 @@
|
||||
use std::{
|
||||
env::{self},
|
||||
fmt,
|
||||
path::Path,
|
||||
};
|
||||
mod egs;
|
||||
use egs::get_egs_manifests;
|
||||
use std::error::Error;
|
||||
use steam_shortcuts_util::parse_shortcuts;
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
let egs_manifests = get_egs_manifests()?;
|
||||
println!("Found {} installed EGS Games", egs_manifests.len());
|
||||
|
||||
let shortcut_content = get_shortcuts_content()?;
|
||||
let shortcuts = parse_shortcuts(shortcut_content.as_slice())?;
|
||||
|
||||
println!("Shortcuts found {}", shortcuts.len());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct SteamFolderNotFound {
|
||||
location_tried: String,
|
||||
}
|
||||
|
||||
impl fmt::Display for SteamFolderNotFound {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"Could not find steam user data at location: {} Please specify it in the configuration",
|
||||
self.location_tried
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for SteamFolderNotFound {
|
||||
fn description(&self) -> &str {
|
||||
self.location_tried.as_str()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct SteamUsersDataEmpty {
|
||||
location_tried: String,
|
||||
}
|
||||
|
||||
impl fmt::Display for SteamUsersDataEmpty {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"Steam users data folder is empty: {} Please specify it in the configuration",
|
||||
self.location_tried
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for SteamUsersDataEmpty {
|
||||
fn description(&self) -> &str {
|
||||
self.location_tried.as_str()
|
||||
}
|
||||
}
|
||||
|
||||
fn get_shortcuts_content() -> Result<Vec<u8>, Box<dyn Error>> {
|
||||
let key = "PROGRAMFILES(X86)";
|
||||
let program_files = env::var(key)?;
|
||||
let path_string = format!(
|
||||
"{program_files}//Steam//userdata//",
|
||||
program_files = program_files
|
||||
);
|
||||
let user_data_path = Path::new(path_string.as_str());
|
||||
if !user_data_path.exists() {
|
||||
return Result::Err(Box::new(SteamFolderNotFound {
|
||||
location_tried: path_string,
|
||||
}));
|
||||
}
|
||||
let mut user_folders = std::fs::read_dir(&user_data_path)?;
|
||||
if let Some(Ok(folder)) = user_folders.next() {
|
||||
let path = folder.path();
|
||||
let shortcuts_folder = format!(
|
||||
"{}//config//shortcuts.vdf",
|
||||
path.to_str().expect("We just checked that this was there")
|
||||
);
|
||||
let content = std::fs::read(shortcuts_folder)?;
|
||||
Ok(content)
|
||||
} else {
|
||||
Err(Box::new(SteamUsersDataEmpty {
|
||||
location_tried: path_string,
|
||||
}))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"FormatVersion": 0,
|
||||
"bIsIncompleteInstall": false,
|
||||
"LaunchCommand": "",
|
||||
"LaunchExecutable": "Void Bastards.exe",
|
||||
"ManifestLocation": "E:\\SlowEpic\\VoidBastards/.egstore",
|
||||
"bIsApplication": true,
|
||||
"bIsExecutable": true,
|
||||
"bIsManaged": false,
|
||||
"bNeedsValidation": false,
|
||||
"bRequiresAuth": true,
|
||||
"bAllowMultipleInstances": false,
|
||||
"bCanRunOffline": true,
|
||||
"bAllowUriCmdArgs": false,
|
||||
"BaseURLs": [
|
||||
"http://download.epicgames.com/Builds/Org/o-pldxyabsslnt6jth2z634mmr2pw8lu/9206c13a6dd948f7a0ed1ae95bfa6dfd/default",
|
||||
"http://download2.epicgames.com/Builds/Org/o-pldxyabsslnt6jth2z634mmr2pw8lu/9206c13a6dd948f7a0ed1ae95bfa6dfd/default",
|
||||
"http://download3.epicgames.com/Builds/Org/o-pldxyabsslnt6jth2z634mmr2pw8lu/9206c13a6dd948f7a0ed1ae95bfa6dfd/default",
|
||||
"http://download4.epicgames.com/Builds/Org/o-pldxyabsslnt6jth2z634mmr2pw8lu/9206c13a6dd948f7a0ed1ae95bfa6dfd/default",
|
||||
"http://epicgames-download1.akamaized.net/Builds/Org/o-pldxyabsslnt6jth2z634mmr2pw8lu/9206c13a6dd948f7a0ed1ae95bfa6dfd/default",
|
||||
"http://fastly-download.epicgames.com/Builds/Org/o-pldxyabsslnt6jth2z634mmr2pw8lu/9206c13a6dd948f7a0ed1ae95bfa6dfd/default"
|
||||
],
|
||||
"BuildLabel": "Live",
|
||||
"AppCategories": [
|
||||
"public",
|
||||
"games",
|
||||
"applications"
|
||||
],
|
||||
"ChunkDbs": [],
|
||||
"CompatibleApps": [],
|
||||
"DisplayName": "Void Bastards",
|
||||
"InstallationGuid": "2D5C19734137C4172B48478C09F908BD",
|
||||
"InstallLocation": "E:\\SlowEpic\\VoidBastards",
|
||||
"InstallSessionId": "978E0F85440F5F6EFCDDA7AE5677B1B8",
|
||||
"InstallTags": [],
|
||||
"InstallComponents": [],
|
||||
"HostInstallationGuid": "00000000000000000000000000000000",
|
||||
"PrereqIds": [],
|
||||
"StagingLocation": "E:\\SlowEpic\\VoidBastards/.egstore/bps",
|
||||
"TechnicalType": "public,games,applications",
|
||||
"VaultThumbnailUrl": "",
|
||||
"VaultTitleText": "",
|
||||
"InstallSize": 6180063330,
|
||||
"MainWindowProcessName": "",
|
||||
"ProcessNames": [],
|
||||
"MandatoryAppFolderName": "VoidBastards",
|
||||
"OwnershipToken": "false",
|
||||
"CatalogNamespace": "6b753bd045604be89d9779e741c604b1",
|
||||
"CatalogItemId": "486ccd7673284a02bd62dd6d5fa289e0",
|
||||
"AppName": "595e35287b824902a2f7107139603732",
|
||||
"AppVersionString": "2.0.33",
|
||||
"MainGameCatalogNamespace": "6b753bd045604be89d9779e741c604b1",
|
||||
"MainGameCatalogItemId": "486ccd7673284a02bd62dd6d5fa289e0",
|
||||
"MainGameAppName": "595e35287b824902a2f7107139603732",
|
||||
"AllowedUriEnvVars": []
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"FormatVersion": 0,
|
||||
"bIsIncompleteInstall": false,
|
||||
"LaunchCommand": "",
|
||||
"LaunchExecutable": "Spectrum.exe",
|
||||
"ManifestLocation": "E:\\SlowEpic\\TheSpectrumRetreat/.egstore",
|
||||
"bIsApplication": true,
|
||||
"bIsExecutable": true,
|
||||
"bIsManaged": false,
|
||||
"bNeedsValidation": false,
|
||||
"bRequiresAuth": true,
|
||||
"bAllowMultipleInstances": false,
|
||||
"bCanRunOffline": true,
|
||||
"bAllowUriCmdArgs": false,
|
||||
"BaseURLs": [
|
||||
"http://download.epicgames.com/Builds/Org/o-fbx9l7z95axq9s73trhbttadbareuq/b9018aa99bd1475687cf964588f588e2/default",
|
||||
"http://download2.epicgames.com/Builds/Org/o-fbx9l7z95axq9s73trhbttadbareuq/b9018aa99bd1475687cf964588f588e2/default",
|
||||
"http://download3.epicgames.com/Builds/Org/o-fbx9l7z95axq9s73trhbttadbareuq/b9018aa99bd1475687cf964588f588e2/default",
|
||||
"http://download4.epicgames.com/Builds/Org/o-fbx9l7z95axq9s73trhbttadbareuq/b9018aa99bd1475687cf964588f588e2/default",
|
||||
"http://epicgames-download1.akamaized.net/Builds/Org/o-fbx9l7z95axq9s73trhbttadbareuq/b9018aa99bd1475687cf964588f588e2/default",
|
||||
"http://fastly-download.epicgames.com/Builds/Org/o-fbx9l7z95axq9s73trhbttadbareuq/b9018aa99bd1475687cf964588f588e2/default"
|
||||
],
|
||||
"BuildLabel": "Live",
|
||||
"AppCategories": [
|
||||
"games",
|
||||
"applications"
|
||||
],
|
||||
"ChunkDbs": [],
|
||||
"CompatibleApps": [],
|
||||
"DisplayName": "The Spectrum Retreat",
|
||||
"InstallationGuid": "60D16FC34A870439914B5282434CD35A",
|
||||
"InstallLocation": "E:\\SlowEpic\\TheSpectrumRetreat",
|
||||
"InstallSessionId": "CF352F6B4AD87AB135486E9E76BB5915",
|
||||
"InstallTags": [],
|
||||
"InstallComponents": [],
|
||||
"HostInstallationGuid": "00000000000000000000000000000000",
|
||||
"PrereqIds": [],
|
||||
"StagingLocation": "E:\\SlowEpic\\TheSpectrumRetreat/.egstore/bps",
|
||||
"TechnicalType": "games,applications",
|
||||
"VaultThumbnailUrl": "",
|
||||
"VaultTitleText": "",
|
||||
"InstallSize": 6608600518,
|
||||
"MainWindowProcessName": "",
|
||||
"ProcessNames": [],
|
||||
"MandatoryAppFolderName": "TheSpectrumRetreat",
|
||||
"OwnershipToken": "false",
|
||||
"CatalogNamespace": "32ef234417314b65a4f76041b684f4d0",
|
||||
"CatalogItemId": "7f65d209277f4c10ac7c5eb4f1ed3ae9",
|
||||
"AppName": "7b8fb449c8d3404ba7eda9cd4da1401b",
|
||||
"AppVersionString": "1.0rc",
|
||||
"MainGameCatalogNamespace": "32ef234417314b65a4f76041b684f4d0",
|
||||
"MainGameCatalogItemId": "7f65d209277f4c10ac7c5eb4f1ed3ae9",
|
||||
"MainGameAppName": "7b8fb449c8d3404ba7eda9cd4da1401b",
|
||||
"AllowedUriEnvVars": []
|
||||
}
|
||||
Reference in New Issue
Block a user