mirror of
https://github.com/djibux/BoilR.git
synced 2026-09-01 05:53:41 +02:00
Amazon Games for Windows (#91)
This commit is contained in:
Generated
+31
@@ -245,6 +245,7 @@ dependencies = [
|
|||||||
"rusty-leveldb",
|
"rusty-leveldb",
|
||||||
"serde 1.0.136",
|
"serde 1.0.136",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
"sqlite",
|
||||||
"steam_shortcuts_util",
|
"steam_shortcuts_util",
|
||||||
"steamgriddb_api",
|
"steamgriddb_api",
|
||||||
"sysinfo",
|
"sysinfo",
|
||||||
@@ -2695,6 +2696,36 @@ dependencies = [
|
|||||||
"lock_api",
|
"lock_api",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sqlite"
|
||||||
|
version = "0.26.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3fb1a534c07ec276fbbe0e55a1c00814d8563da3a2f4d9d9d4c802bd1278db6a"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"sqlite3-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sqlite3-src"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a260b07ce75a0644c6f5891f34f46db9869e731838e95293469ab17999abcfa3"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"pkg-config",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sqlite3-sys"
|
||||||
|
version = "0.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "04d2f028faeb14352df7934b4771806f60d61ce61be1928ec92396d7492e2e54"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"sqlite3-src",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "static_assertions"
|
name = "static_assertions"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ egui = { version = "0.17.0" }
|
|||||||
image = { version = "0.24.1", features = ["png"] }
|
image = { version = "0.24.1", features = ["png"] }
|
||||||
toml = { version = "^0.5.8" }
|
toml = { version = "^0.5.8" }
|
||||||
sysinfo = "0.23.10"
|
sysinfo = "0.23.10"
|
||||||
|
sqlite = "0.26.0"
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
winreg = "0.10.1"
|
winreg = "0.10.1"
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ Optionally you can set BoilR up to automatically download artwork from [SteamGri
|
|||||||
- [x] [Legendary](https://github.com/derrod/legendary)
|
- [x] [Legendary](https://github.com/derrod/legendary)
|
||||||
- [x] [Rare](https://github.com/Dummerle/Rare/releases)
|
- [x] [Rare](https://github.com/Dummerle/Rare/releases)
|
||||||
- [x] [Heroic Launcher](https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher) (Linux Only)
|
- [x] [Heroic Launcher](https://github.com/Heroic-Games-Launcher/HeroicGamesLauncher) (Linux Only)
|
||||||
|
- [x] [Amazon Games](https://gaming.amazon.com) (Windows Only)
|
||||||
- [ ] XBox/Microsoft Store integration
|
- [ ] XBox/Microsoft Store integration
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
use steam_shortcuts_util::{shortcut::ShortcutOwned, Shortcut};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct AmazonGame{
|
||||||
|
pub title : String,
|
||||||
|
pub id : String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
impl From<AmazonGame> for ShortcutOwned {
|
||||||
|
fn from(game: AmazonGame) -> Self {
|
||||||
|
let launch = format!("amazon-games://play/{}", game.id);
|
||||||
|
Shortcut::new(
|
||||||
|
"0",
|
||||||
|
game.title.as_str(),
|
||||||
|
launch.as_str(),
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
)
|
||||||
|
.to_owned()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
use std::{error::Error, path::{PathBuf, Path}};
|
||||||
|
|
||||||
|
use sqlite::State;
|
||||||
|
|
||||||
|
use crate::platform::Platform;
|
||||||
|
|
||||||
|
use super::{AmazonSettings, AmazonGame};
|
||||||
|
|
||||||
|
|
||||||
|
pub struct AmazonPlatform{
|
||||||
|
pub settings:AmazonSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Platform<AmazonGame, Box<dyn Error>> for AmazonPlatform{
|
||||||
|
#[cfg(windows)]
|
||||||
|
fn enabled(&self) -> bool {
|
||||||
|
self.settings.enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_family="unix")]
|
||||||
|
fn enabled(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"Amazon"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_shortcuts(&self) -> Result<Vec<AmazonGame>, Box<dyn Error>> {
|
||||||
|
let sqllite_path = get_sqlite_path().expect("This should enver get called if settings are invalid");
|
||||||
|
let mut result = vec![];
|
||||||
|
let connection = sqlite::open(sqllite_path)?;
|
||||||
|
let mut statement = connection.prepare("SELECT Id, ProductTitle FROM DbSet WHERE Installed = 1")?;
|
||||||
|
while let State::Row = statement.next().unwrap() {
|
||||||
|
let id = statement.read::<String>(0);
|
||||||
|
let title = statement.read::<String>(1);
|
||||||
|
if let (Ok(id),Ok(title)) = (id,title){
|
||||||
|
result.push(AmazonGame { title, id });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn settings_valid(&self) -> crate::platform::SettingsValidity {
|
||||||
|
let path = get_sqlite_path();
|
||||||
|
if path.is_some(){
|
||||||
|
crate::platform::SettingsValidity::Valid
|
||||||
|
}else{
|
||||||
|
crate::platform::SettingsValidity::Invalid { reason: format!("Could not find Amazon Games installation")}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_family ="unix")]
|
||||||
|
fn create_symlinks(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn needs_proton(&self, _input: &AmazonGame) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn get_sqlite_path() -> Option<PathBuf> {
|
||||||
|
match std::env::var("LOCALAPPDATA") {
|
||||||
|
Ok(localdata) => {
|
||||||
|
let path = Path::new(&localdata).join("Amazon Games").join("Data").join("Games").join("Sql").join("GameInstallInfo.sqlite");
|
||||||
|
if path.exists() {
|
||||||
|
Some(path)
|
||||||
|
}else{
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_e) => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Serialize, Clone)]
|
||||||
|
pub struct AmazonSettings{
|
||||||
|
pub enabled:bool
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
pub mod amazon_platform;
|
||||||
|
pub use amazon_platform::*;
|
||||||
|
|
||||||
|
pub mod amazon_game;
|
||||||
|
pub use amazon_game::*;
|
||||||
|
|
||||||
|
pub mod amazon_settings;
|
||||||
|
pub use amazon_settings::*;
|
||||||
@@ -34,6 +34,9 @@ enabled = false
|
|||||||
[heroic]
|
[heroic]
|
||||||
enabled = true
|
enabled = true
|
||||||
|
|
||||||
|
[amazon]
|
||||||
|
enabled = true
|
||||||
|
|
||||||
[steam]
|
[steam]
|
||||||
create_collections = false
|
create_collections = false
|
||||||
optimize_for_big_picture = false
|
optimize_for_big_picture = false
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ mod steamgriddb;
|
|||||||
mod sync;
|
mod sync;
|
||||||
mod uplay;
|
mod uplay;
|
||||||
mod ui;
|
mod ui;
|
||||||
|
mod amazon;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
|||||||
+2
-1
@@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
egs::EpicGamesLauncherSettings, gog::GogSettings, itch::ItchSettings,
|
egs::EpicGamesLauncherSettings, gog::GogSettings, itch::ItchSettings,
|
||||||
legendary::LegendarySettings, lutris::settings::LutrisSettings, origin::OriginSettings,
|
legendary::LegendarySettings, lutris::settings::LutrisSettings, origin::OriginSettings,
|
||||||
steam::SteamSettings, steamgriddb::SteamGridDbSettings, uplay::UplaySettings, heroic::HeroicSettings,
|
steam::SteamSettings, steamgriddb::SteamGridDbSettings, uplay::UplaySettings, heroic::HeroicSettings, amazon::AmazonSettings,
|
||||||
};
|
};
|
||||||
|
|
||||||
use config::{Config, ConfigError, Environment, File};
|
use config::{Config, ConfigError, Environment, File};
|
||||||
@@ -22,6 +22,7 @@ pub struct Settings {
|
|||||||
pub uplay: UplaySettings,
|
pub uplay: UplaySettings,
|
||||||
pub lutris: LutrisSettings,
|
pub lutris: LutrisSettings,
|
||||||
pub heroic: HeroicSettings,
|
pub heroic: HeroicSettings,
|
||||||
|
pub amazon: AmazonSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Settings {
|
impl Settings {
|
||||||
|
|||||||
@@ -194,6 +194,13 @@ pub fn get_platform_shortcuts(settings: &Settings) -> Vec<(String, Vec<ShortcutO
|
|||||||
settings: settings.heroic.clone(),
|
settings: settings.heroic.clone(),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
{
|
||||||
|
platform_results.push(update_platform_shortcuts(&crate::amazon::AmazonPlatform {
|
||||||
|
settings: settings.amazon.clone(),
|
||||||
|
}));
|
||||||
|
}
|
||||||
platform_results.iter().filter_map(|p| p.clone()).collect()
|
platform_results.iter().filter_map(|p| p.clone()).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -286,6 +286,10 @@ impl MyEguiApp{
|
|||||||
self.render_gog_settings(ui);
|
self.render_gog_settings(ui);
|
||||||
self.render_uplay_settings(ui);
|
self.render_uplay_settings(ui);
|
||||||
self.render_lutris_settings(ui);
|
self.render_lutris_settings(ui);
|
||||||
|
#[cfg(windows)]
|
||||||
|
{
|
||||||
|
self.render_amazon_settings(ui);
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -303,6 +307,13 @@ impl MyEguiApp{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
ui.add_space(SECTION_SPACING);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render_amazon_settings(&mut self, ui: &mut egui::Ui) {
|
||||||
|
ui.heading("Amazon");
|
||||||
|
ui.checkbox(&mut self.settings.amazon.enabled, "Import form Amazon");
|
||||||
|
ui.add_space(SECTION_SPACING);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_uplay_settings(&mut self, ui: &mut egui::Ui) {
|
fn render_uplay_settings(&mut self, ui: &mut egui::Ui) {
|
||||||
|
|||||||
Reference in New Issue
Block a user