Amazon Games for Windows (#91)

This commit is contained in:
Philip Kristoffersen
2022-04-19 21:24:17 +02:00
committed by GitHub
parent 521eb54cbb
commit 0f5f3bad2c
12 changed files with 173 additions and 1 deletions
Generated
+31
View File
@@ -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"
+1
View File
@@ -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"
+1
View File
@@ -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
+25
View File
@@ -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()
}
}
+77
View File
@@ -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,
}
}
+6
View File
@@ -0,0 +1,6 @@
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct AmazonSettings{
pub enabled:bool
}
+8
View File
@@ -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::*;
+3
View File
@@ -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
+1
View File
@@ -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
View File
@@ -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 {
+7
View File
@@ -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()
} }
+11
View File
@@ -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) {