Skip to content

Commit

Permalink
Add possibility to update games
Browse files Browse the repository at this point in the history
This fixes #19
  • Loading branch information
hawkeye116477 committed Dec 20, 2023
1 parent a923f1f commit fff118b
Show file tree
Hide file tree
Showing 55 changed files with 207 additions and 7 deletions.
2 changes: 1 addition & 1 deletion make_scripts/update_3p_localization.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"LOCSettingsGeneralLabel", "LOCSelectDirectoryTooltip", "LOCSelectFileTooltip", "LOCCancelLabel",
"LOCSettingsAdvancedLabel", "LOCGameInstallDirTitle", "LOCLoadingLabel",
"LOCSaveLabel", "LOCFilters", "LOCGameNameTitle", "LOCInstallSizeLabel",
"LOCAddedLabel", "LOCOpen", "LOCCheckForUpdates", "LOCUpdaterWindowTitle", "LOCUpdateCheckFailMessage"]
"LOCAddedLabel", "LOCOpen", "LOCCheckForUpdates", "LOCUpdaterWindowTitle", "LOCUpdateCheckFailMessage", "LOCUpdaterInstallUpdate"]

if os.path.exists(localization_path):
shutil.rmtree(localization_path)
Expand Down
3 changes: 2 additions & 1 deletion src/Enums/DownloadAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace LegendaryLibraryNS.Enums
public enum DownloadAction
{
Install,
Repair
Repair,
Update
}
}
4 changes: 4 additions & 0 deletions src/LegendaryDownloadManager.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,10 @@ public async Task Install(string gameID, string gameTitle, string downloadSize,
{
installCommand.Add("--repair");
}
if (downloadProperties.downloadAction == (int)DownloadAction.Update)
{
installCommand.Add("--update-only");
}
if (downloadProperties.extraContent != null)
{
if (downloadProperties.extraContent.Count > 0)
Expand Down
3 changes: 2 additions & 1 deletion src/LegendaryDownloadProperties.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ private void LegendaryDownloadPropertiesUC_Loaded(object sender, RoutedEventArgs
var downloadActionOptions = new Dictionary<int, string>
{
{ (int)DownloadAction.Install, ResourceProvider.GetString(LOC.Legendary3P_PlayniteInstallGame) },
{ (int)DownloadAction.Repair, ResourceProvider.GetString(LOC.LegendaryRepair) }
{ (int)DownloadAction.Repair, ResourceProvider.GetString(LOC.LegendaryRepair) },
{ (int)DownloadAction.Update, ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdaterInstallUpdate) }
};
TaskCBo.ItemsSource = downloadActionOptions;

Expand Down
80 changes: 78 additions & 2 deletions src/LegendaryGameController.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using CliWrap;
using CliWrap.Buffered;
using CliWrap.EventStream;
using LegendaryLibraryNS.Enums;
using LegendaryLibraryNS.Models;
using Playnite;
using Playnite.Common;
Expand All @@ -13,6 +14,7 @@
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
Expand Down Expand Up @@ -182,10 +184,15 @@ public override async void Play(PlayActionArgs args)
break;
}
}
if (LegendaryLibrary.GetSettings().LaunchOffline && canRunOffline)
var pluginSettings = LegendaryLibrary.GetSettings();
if (pluginSettings.LaunchOffline && canRunOffline)
{
playArgs.Add("--offline");
}
else if (pluginSettings.DisableGameVersionCheck)
{
playArgs.Add("--skip-version-check");
}
}
procMon = new ProcessMonitor();
procMon.TreeStarted += (_, treeArgs) =>
Expand Down Expand Up @@ -219,10 +226,15 @@ await foreach (var cmdEvent in cmd.ListenAsync())
var errorMessage = stdOutBuffer.ToString();
logger.Debug("[Legendary] " + errorMessage);
logger.Error("[Legendary] exit code: " + exited.ExitCode);
if (errorMessage.Contains("login failed"))
if (errorMessage.Contains("login failed") || errorMessage.Contains("No saved credentials"))
{
playniteAPI.Dialogs.ShowErrorMessage(string.Format(ResourceProvider.GetString(LOC.Legendary3P_PlayniteGameStartError), ResourceProvider.GetString(LOC.Legendary3P_PlayniteLoginRequired)));
}
else if (errorMessage.Contains("Game is out of date"))
{
LegendaryUpdateController legendaryUpdateController = new LegendaryUpdateController();
await legendaryUpdateController.UpdateGame(Game.Name, Game.GameId);
}
else
{
playniteAPI.Dialogs.ShowErrorMessage(string.Format(ResourceProvider.GetString(LOC.Legendary3P_PlayniteGameStartError), errorMessage));
Expand All @@ -240,5 +252,69 @@ await foreach (var cmdEvent in cmd.ListenAsync())
InvokeOnStopped(new GameStoppedEventArgs());
}
}

public class LegendaryUpdateController
{
private IPlayniteAPI playniteAPI = API.Instance;
private static ILogger logger = LogManager.GetLogger();
public async Task UpdateGame(string gameTitle, string gameId)
{

var cmd = await Cli.Wrap(LegendaryLauncher.ClientExecPath).WithArguments(new[] { "list-installed", "--check-updates" }).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync();
if (cmd.StandardError.Contains("login failed") || cmd.StandardError.Contains("No saved credentials"))
{
playniteAPI.Dialogs.ShowErrorMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdateCheckFailMessage), ResourceProvider.GetString(LOC.Legendary3P_PlayniteLoginRequired));
}
else if (cmd.StandardError.Contains("Error"))
{
playniteAPI.Dialogs.ShowErrorMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdateCheckFailMessage), gameTitle);
logger.Error($"[Legendary] {cmd.StandardError}");
}
else
{
var options = new List<MessageBoxOption>
{
new MessageBoxOption(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdaterInstallUpdate)),
new MessageBoxOption(ResourceProvider.GetString(LOC.Legendary3P_PlayniteCancelLabel)),
};
var newVersion = Regex.Match(cmd.StandardOutput, @$"\* {Regex.Escape(gameTitle)}.*\s+\-> Update available! Installed:.*, Latest: (\S+.)", RegexOptions.Multiline).Groups[1].Value.Trim();
if (!newVersion.IsNullOrEmpty())
{
var result = playniteAPI.Dialogs.ShowMessage(string.Format(ResourceProvider.GetString(LOC.LegendaryNewVersionAvailable), gameTitle, newVersion), ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdaterWindowTitle), MessageBoxImage.Information, options);
if (result == options[0])
{
var downloadProperties = new DownloadProperties() { downloadAction = (int)DownloadAction.Update };
var downloadData = new DownloadManagerData.Download { gameID = gameId, downloadProperties = downloadProperties };
LegendaryDownloadManager downloadManager = LegendaryLibrary.GetLegendaryDownloadManager();
var wantedItem = downloadManager.downloadManagerData.downloads.FirstOrDefault(item => item.gameID == gameId);
if (wantedItem != null)
{
playniteAPI.Dialogs.ShowMessage(string.Format(ResourceProvider.GetString(LOC.LegendaryDownloadAlreadyExists), wantedItem.name), "", MessageBoxButton.OK, MessageBoxImage.Error);
}
else
{
var messagesSettings = LegendaryMessagesSettings.LoadSettings();
if (!messagesSettings.DontShowDownloadManagerWhatsUpMsg)
{
var okResponse = new MessageBoxOption("LOCOKLabel", true, true);
var dontShowResponse = new MessageBoxOption("LOCDontShowAgainTitle");
var response = playniteAPI.Dialogs.ShowMessage(LOC.LegendaryDownloadManagerWhatsUp, "", MessageBoxImage.Information, new List<MessageBoxOption> { okResponse, dontShowResponse });
if (response == dontShowResponse)
{
messagesSettings.DontShowDownloadManagerWhatsUpMsg = true;
LegendaryMessagesSettings.SaveSettings(messagesSettings);
}
}
await downloadManager.EnqueueJob(gameId, gameTitle, "", "", downloadProperties);
}
}
}
else
{
playniteAPI.Dialogs.ShowMessage(ResourceProvider.GetString(LOC.LegendaryNoUpdatesAvailable), gameTitle);
}
}
}
}
}
}
17 changes: 17 additions & 0 deletions src/LegendaryLibrary.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using CliWrap;
using CliWrap.Buffered;
using CliWrap.EventStream;
using LegendaryLibraryNS.Enums;
using LegendaryLibraryNS.Models;
Expand All @@ -15,10 +16,12 @@
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using static LegendaryLibraryNS.LegendaryPlayController;

namespace LegendaryLibraryNS
{
Expand Down Expand Up @@ -569,6 +572,20 @@ public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs
window.ShowDialog();
}
};
yield return new GameMenuItem
{
Description = ResourceProvider.GetString(LOC.Legendary3P_PlayniteCheckForUpdates),
Action = async (args) =>
{
if (!LegendaryLauncher.IsInstalled)
{
throw new Exception(ResourceProvider.GetString(LOC.LegendaryLauncherNotInstalled));
}
LegendaryUpdateController legendaryUpdateController = new LegendaryUpdateController();
await legendaryUpdateController.UpdateGame(game.Name, game.GameId);
}
};
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/LegendaryLibrary.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@
<Compile Include="..\third_party\PlayniteExtensions\PlayniteRepo\source\playnite\WindowsNotifyIconManager.cs">
<Link>Shared\Playnite\WindowsNotifyIconManager.cs</Link>
</Compile>
<Compile Include="..\third_party\PlayniteExtensions\PlayniteRepo\source\playnite\Converters\InvertedBoolenConverter.cs">
<Link>Shared\Playnite\Converters\InvertedBoolenConverter.cs</Link>
</Compile>
<Compile Include="..\third_party\PlayniteExtensions\PlayniteRepo\source\playnite\native\Fileapi.cs">
<Link>Shared\Playnite\Native\Fileapi.cs</Link>
</Compile>
Expand Down
6 changes: 6 additions & 0 deletions src/LegendaryLibrarySettingsView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
xmlns:local="clr-namespace:LegendaryLibraryNS"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:pcmd="clr-namespace:Playnite.Commands"
xmlns:pcon="clr-namespace:Playnite.Converters"
mc:Ignorable="d" d:DesignHeight="550" d:DesignWidth="600" Name="LegendarySettingsUC"
Loaded="LegendarySettingsUC_Loaded">

Expand Down Expand Up @@ -104,6 +105,11 @@
Name="ExcludeOnlineGamesBtn" Click="ExcludeOnlineGamesBtn_Click" />
</StackPanel>
</StackPanel>
<CheckBox DockPanel.Dock="Top"
Margin="0,10,0,0"
IsChecked="{Binding Settings.DisableGameVersionCheck}"
IsEnabled="{Binding Settings.LaunchOffline, Converter={pcon:InvertedBoolenConverter}}"
Content="{DynamicResource LOCLegendaryDisableGameVersionCheck}" />
<CheckBox DockPanel.Dock="Top"
Margin="0,10,0,0"
IsChecked="{Binding Settings.SyncGameSaves}"
Expand Down
14 changes: 12 additions & 2 deletions src/LegendaryLibrarySettingsView.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@ private void OpenLauncherBinaryBtn_Click(object sender, RoutedEventArgs e)

private async void CheckForUpdatesBtn_Click(object sender, RoutedEventArgs e)
{
if (!LegendaryLauncher.IsInstalled)
{
throw new Exception(ResourceProvider.GetString(LOC.LegendaryLauncherNotInstalled));
}

var cmd = await Cli.Wrap(LegendaryLauncher.ClientExecPath).WithArguments(new[] { "list-installed", "--check-updates" }).WithValidation(CommandResultValidation.None).ExecuteBufferedAsync();
if (cmd.StandardOutput.Contains("Legendary update available"))
{
Expand All @@ -363,9 +368,14 @@ private async void CheckForUpdatesBtn_Click(object sender, RoutedEventArgs e)
Playnite.Commands.GlobalCommands.NavigateUrl(changelogURL);
}
}
else if (cmd.StandardError.Contains("login failed"))
else if (cmd.StandardError.Contains("login failed") || cmd.StandardError.Contains("No saved credentials"))
{
playniteAPI.Dialogs.ShowErrorMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdateCheckFailMessage), ResourceProvider.GetString(LOC.Legendary3P_PlayniteLoginRequired));
}
else if (cmd.StandardError.Contains("Error"))
{
playniteAPI.Dialogs.ShowErrorMessage(string.Format(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdateCheckFailMessage), ResourceProvider.GetString(LOC.Legendary3P_PlayniteLoginRequired)));
playniteAPI.Dialogs.ShowErrorMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUpdateCheckFailMessage), "Legendary Launcher");
logger.Error($"[Legendary] {cmd.StandardError}");
}
else
{
Expand Down
1 change: 1 addition & 0 deletions src/LegendaryLibrarySettingsViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class LegendaryLibrarySettings
public int MaxSharedMemory { get; set; } = LegendaryLauncher.DefaultMaxSharedMemory;
public bool EnableReordering { get; set; } = false;
public int AutoClearCache { get; set; } = (int)ClearCacheTime.Never;
public bool DisableGameVersionCheck { get; set; } = false;
}

public class LegendaryLibrarySettingsViewModel : PluginSettingsViewModel<LegendaryLibrarySettings, LegendaryLibrary>
Expand Down
1 change: 1 addition & 0 deletions src/Localization/en_US.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,5 @@
<sys:String x:Key="LOCLegendaryNewVersionAvailable">A new version is available: {0} {1}.</sys:String>
<sys:String x:Key="LOCLegendaryNoUpdatesAvailable">No updates available.</sys:String>
<sys:String x:Key="LOCLegendaryViewChangelog">View changelog</sys:String>
<sys:String x:Key="LOCLegendaryDisableGameVersionCheck">Don't check version when launching games</sys:String>
</ResourceDictionary>
8 changes: 8 additions & 0 deletions src/LocalizationKeys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ public static class LOC
/// </summary>
public const string Legendary3P_PlayniteUpdaterWindowTitle = "LOCLegendary3P_PlayniteUpdaterWindowTitle";
/// <summary>
/// Download and Install Update
/// </summary>
public const string Legendary3P_PlayniteUpdaterInstallUpdate = "LOCLegendary3P_PlayniteUpdaterInstallUpdate";
/// <summary>
/// Check for Updates
/// </summary>
public const string Legendary3P_PlayniteCheckForUpdates = "LOCLegendary3P_PlayniteCheckForUpdates";
Expand Down Expand Up @@ -545,5 +549,9 @@ public static class LOC
/// View changelog
/// </summary>
public const string LegendaryViewChangelog = "LOCLegendaryViewChangelog";
/// <summary>
/// Don't check version when launching games
/// </summary>
public const string LegendaryDisableGameVersionCheck = "LOCLegendaryDisableGameVersionCheck";
}
}
1 change: 1 addition & 0 deletions third_party/Localization/af_ZA.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError" />
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing" />
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle" />
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate" />
<sys:String x:Key="LOCLegendary3P_PlayniteCheckForUpdates" />
<sys:String x:Key="LOCLegendary3P_PlayniteUpdateCheckFailMessage" />
<sys:String x:Key="LOCLegendary3P_PlayniteInstallGame" />
Expand Down
1 change: 1 addition & 0 deletions third_party/Localization/ar_SA.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">فشل تحميل بيانات التعريف:{0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing">‮لا تفعل شيئا</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle">التحديث متوفر</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate">تحميل و تثبيت التحديثات</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteCheckForUpdates">تحقق من التحديثات</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdateCheckFailMessage">فشل التحقق من الإصدار الجديد.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteInstallGame">تثبيت</sys:String>
Expand Down
1 change: 1 addition & 0 deletions third_party/Localization/bg_BG.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">Неуспешно изтегляне на метаданни: {0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing">Не правете нищо</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle">Налична актуализация</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate">Изтеглете и инсталирайте актуализация</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteCheckForUpdates">Проверка за актуализации</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdateCheckFailMessage">Неуспешна проверка за нова версия.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteInstallGame">Инсталиране</sys:String>
Expand Down
1 change: 1 addition & 0 deletions third_party/Localization/ca_ES.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">No s'ha pogut descarregar les metadades: {0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing">No fer res</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle">Actualització disponible</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate">Descarregar i instal·lar l'actualització</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteCheckForUpdates">Buscar actualitzacions</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdateCheckFailMessage">No s'ha pogut comprovar si hi ha una versió nova.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteInstallGame">Instal·lar</sys:String>
Expand Down
1 change: 1 addition & 0 deletions third_party/Localization/cs_CZ.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">Selhalo stahování metadat: {0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing">Nedělat nic</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle">Dostupná Aktualizace</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate">Stáhnout a Nainstalovat Aktualizaci</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteCheckForUpdates">Zkontrolovat Aktualizace</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdateCheckFailMessage">Nepodařilo se zkontrolovat aktualizace.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteInstallGame">Instalovat</sys:String>
Expand Down
Loading

0 comments on commit fff118b

Please sign in to comment.