Skip to content

Commit

Permalink
Add possibility to uninstall multiple games at once
Browse files Browse the repository at this point in the history
  • Loading branch information
hawkeye116477 committed Aug 28, 2024
1 parent 1861652 commit e011ef0
Show file tree
Hide file tree
Showing 48 changed files with 150 additions and 33 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 @@ -34,7 +34,7 @@
"LOCSettingsAdvancedLabel", "LOCGameInstallDirTitle", "LOCLoadingLabel",
"LOCSaveLabel", "LOCFilters", "LOCGameNameTitle", "LOCInstallSizeLabel",
"LOCAddedLabel", "LOCOpen", "LOCCheckForUpdates", "LOCUpdaterWindowTitle", "LOCUpdateCheckFailMessage", "LOCUpdaterInstallUpdate", "LOCExecutableTitle", "LOCExtensionsUpdates", "LOCOptionOnlyManually",
"LOCImportLabel", "LOCClientNotInstalledError", "LOCDownloadingLabel"]
"LOCImportLabel", "LOCClientNotInstalledError", "LOCDownloadingLabel", "LOCUninstalling"]

if os.path.exists(localization_path):
shutil.rmtree(localization_path)
Expand Down
107 changes: 79 additions & 28 deletions src/LegendaryGameController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,60 +80,111 @@ public static void LaunchInstaller(List<DownloadManagerData.Download> installDat

public class LegendaryUninstallController : UninstallController
{
private IPlayniteAPI playniteAPI = API.Instance;
private static readonly ILogger logger = LogManager.GetLogger();

public LegendaryUninstallController(Game game) : base(game)
{
Name = "Uninstall";
}

public override async void Uninstall(UninstallActionArgs args)
public override void Uninstall(UninstallActionArgs args)
{
Dispose();
var games = new List<Game>
{
Game
};
LaunchUninstaller(games);
Game.IsUninstalling = false;
}

public static void LaunchUninstaller(List<Game> games)
{
if (!LegendaryLauncher.IsInstalled)
{
throw new Exception(ResourceProvider.GetString(LOC.LegendaryLauncherNotInstalled));
}
var result = MessageCheckBoxDialog.ShowMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUninstallGame), ResourceProvider.GetString(LOC.LegendaryUninstallGameConfirm).Format(Game.Name), LOC.LegendaryRemoveGameLaunchSettings, MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result.Result == false)
{
Game.IsUninstalling = false;
}
else
var playniteAPI = API.Instance;
string gamesCombined = string.Join(", ", games.Select(item => item.Name));
var result = MessageCheckBoxDialog.ShowMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteUninstallGame), ResourceProvider.GetString(LOC.LegendaryUninstallGameConfirm).Format(gamesCombined), LOC.LegendaryRemoveGameLaunchSettings, MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result.Result)
{
var canContinue = LegendaryLibrary.Instance.StopDownloadManager(true);
if (!canContinue)
{
Game.IsUninstalling = false;
return;
}
await LegendaryDownloadManager.WaitUntilLegendaryCloses();
var cmd = await Cli.Wrap(LegendaryLauncher.ClientExecPath)
.WithArguments(new[] { "-y", "uninstall", Game.GameId })
.WithEnvironmentVariables(LegendaryLauncher.DefaultEnvironmentVariables)
.AddCommandToLog()
.WithValidation(CommandResultValidation.None)
.ExecuteBufferedAsync();
if (cmd.StandardError.Contains("has been uninstalled"))
var uninstalledGames = new List<Game>();
var notUninstalledGames = new List<Game>();
GlobalProgressOptions globalProgressOptions = new GlobalProgressOptions($"{ResourceProvider.GetString(LOC.Legendary3P_PlayniteUninstalling)}... ", false);
playniteAPI.Dialogs.ActivateGlobalProgress(async (a) =>
{
if (result.CheckboxChecked)
a.IsIndeterminate = false;
a.ProgressMaxValue = games.Count;
using (playniteAPI.Database.BufferedUpdate())
{
var gameSettingsFile = Path.Combine(Path.Combine(LegendaryLibrary.Instance.GetPluginUserDataPath(), "GamesSettings", $"{Game.GameId}.json"));
if (File.Exists(gameSettingsFile))
var counter = 0;
foreach (var game in games)
{
File.Delete(gameSettingsFile);
a.Text = $"{ResourceProvider.GetString(LOC.Legendary3P_PlayniteUninstalling)} {game.Name}... ";
await LegendaryDownloadManager.WaitUntilLegendaryCloses();
var cmd = await Cli.Wrap(LegendaryLauncher.ClientExecPath)
.WithArguments(new[] { "-y", "uninstall", game.GameId })
.WithEnvironmentVariables(LegendaryLauncher.DefaultEnvironmentVariables)
.AddCommandToLog()
.WithValidation(CommandResultValidation.None)
.ExecuteBufferedAsync();
if (cmd.StandardError.Contains("has been uninstalled"))
{
if (result.CheckboxChecked)
{
var gameSettingsFile = Path.Combine(Path.Combine(LegendaryLibrary.Instance.GetPluginUserDataPath(), "GamesSettings", $"{game.GameId}.json"));
if (File.Exists(gameSettingsFile))
{
File.Delete(gameSettingsFile);
}
}
game.IsInstalled = false;
game.InstallDirectory = "";
game.Version = "";
playniteAPI.Database.Games.Update(game);
uninstalledGames.Add(game);
}
else
{
notUninstalledGames.Add(game);
logger.Debug("[Legendary] " + cmd.StandardError);
logger.Error("[Legendary] exit code: " + cmd.ExitCode);
}
counter += 1;
a.CurrentProgressValue = counter;
}
}
playniteAPI.Dialogs.ShowMessage(ResourceProvider.GetString(LOC.LegendaryUninstallSuccess).Format(Game.Name));
InvokeOnUninstalled(new GameUninstalledEventArgs());
}, globalProgressOptions);
if (uninstalledGames.Count > 0)
{
if (uninstalledGames.Count == 1)
{
playniteAPI.Dialogs.ShowMessage(ResourceProvider.GetString(LOC.LegendaryUninstallSuccess).Format(uninstalledGames[0].Name));
}
else
{
string uninstalledGamesCombined = string.Join(", ", uninstalledGames.Select(item => item.Name));
playniteAPI.Dialogs.ShowMessage(ResourceProvider.GetString(LOC.LegendaryUninstallSuccessOther).Format(uninstalledGamesCombined));
}

}
else
if (notUninstalledGames.Count > 0)
{
logger.Debug("[Legendary] " + cmd.StandardError);
logger.Error("[Legendary] exit code: " + cmd.ExitCode);
playniteAPI.Dialogs.ShowErrorMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteGameUninstallError).Format(ResourceProvider.GetString(LOC.LegendaryCheckLog)));
Game.IsUninstalling = false;
if (notUninstalledGames.Count == 1)
{
playniteAPI.Dialogs.ShowErrorMessage(ResourceProvider.GetString(LOC.Legendary3P_PlayniteGameUninstallError).Format(ResourceProvider.GetString(LOC.LegendaryCheckLog)), notUninstalledGames[0].Name);
}
else
{
string notUninstalledGamesCombined = string.Join(", ", notUninstalledGames.Select(item => item.Name));
playniteAPI.Dialogs.ShowMessage($"{ResourceProvider.GetString(LOC.LegendaryUninstallErrorOther).Format(notUninstalledGamesCombined)} {ResourceProvider.GetString(LOC.LegendaryCheckLog)}");
}
}
}
}
Expand Down
13 changes: 11 additions & 2 deletions src/LegendaryLibrary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,7 @@ public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs
}
else
{
var installedLegendaryGames = legendaryGames.Where(i => i.IsInstalled).ToList();
yield return new GameMenuItem
{
Description = ResourceProvider.GetString(LOC.LegendaryRepair),
Expand All @@ -858,7 +859,7 @@ public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs

var installProperties = new DownloadProperties { downloadAction = DownloadAction.Repair };
var installData = new List<DownloadManagerData.Download>();
foreach (var game in args.Games)
foreach (var game in installedLegendaryGames)
{
installData.Add(new DownloadManagerData.Download { gameID = game.GameId, name = game.Name, downloadProperties = installProperties });
}
Expand All @@ -869,7 +870,6 @@ public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs
window.MinWidth = 600;
window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
var title = ResourceProvider.GetString(LOC.LegendaryRepair);
var installedLegendaryGames = legendaryGames.Where(i => i.PluginId == Id && i.IsInstalled).ToList();
if (installedLegendaryGames.Count == 1)
{
title = installedLegendaryGames[0].Name;
Expand All @@ -878,6 +878,15 @@ public override IEnumerable<GameMenuItem> GetGameMenuItems(GetGameMenuItemsArgs
window.ShowDialog();
}
};
yield return new GameMenuItem
{
Description = ResourceProvider.GetString(LOC.Legendary3P_PlayniteUninstallGame),
Icon = "UninstallIcon",
Action = (args) =>
{
LegendaryUninstallController.LaunchUninstaller(installedLegendaryGames);
}
};
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/Localization/en_US.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@
<sys:String x:Key="LOCLegendaryCheckUpdatesEveryPlayniteStartup">On every Playnite startup</sys:String>
<sys:String x:Key="LOCLegendaryLauncherUpdatePolicy">Check for Legendary launcher updates</sys:String>
<sys:String x:Key="LOCLegendaryGamesUpdatesUnderway">Updates for games from Epic Games are being downloaded.</sys:String>
<sys:String x:Key="LOCLegendaryRemoveGameLaunchSettings">Remove game launch settings</sys:String>
<sys:String x:Key="LOCLegendaryRemoveGameLaunchSettings">Remove launch settings</sys:String>
<sys:String x:Key="LOCLegendaryAdditionalServices">Additional services</sys:String>
<sys:String x:Key="LOCLegendaryNoLinkedAccount">No linked {0} account found! Link your account via your browser and try again.</sys:String>
<sys:String x:Key="LOCLegendaryAllActivatedUbisoft">All games have already been activated on your {0} account.</sys:String>
Expand All @@ -168,6 +168,8 @@
<sys:String x:Key="LOCLegendaryNotEnoughSpace">Not enough free disk space.</sys:String>
<sys:String x:Key="LOCLegendaryCheckingForUpdates">Checking for updates...</sys:String>
<sys:String x:Key="LOCLegendaryUninstallSuccess">{0} has been successfully uninstalled.</sys:String>
<sys:String x:Key="LOCLegendaryUninstallSuccessOther">Following games have been successfully uninstalled: {0}.</sys:String>
<sys:String x:Key="LOCLegendaryUninstallErrorOther">Cannot uninstall following games: {0}.</sys:String>
<sys:String x:Key="LOCLegendaryImportThirdPartyLauncherGames">Import games requiring {0}</sys:String>
<sys:String x:Key="LOCLegendaryThirdPartyLauncherImportWarn">These types of games doesn't require Legendary and not all of them can be installed via it. It's recommended to go to Additional services => {0} => Activate games, and then install them directly via {0}.</sys:String>
<sys:String x:Key="LOCLegendaryRequiredInstallViaThirdPartyLauncherError">{1} requires direct installation via {0}.</sys:String>
Expand Down
14 changes: 13 additions & 1 deletion src/LocalizationKeys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,10 @@ public static class LOC
/// </summary>
public const string Legendary3P_PlayniteMetadataDownloadError = "LOCLegendary3P_PlayniteMetadataDownloadError";
/// <summary>
/// Uninstalling
/// </summary>
public const string Legendary3P_PlayniteUninstalling = "LOCLegendary3P_PlayniteUninstalling";
/// <summary>
/// Do nothing
/// </summary>
public const string Legendary3P_PlayniteDoNothing = "LOCLegendary3P_PlayniteDoNothing";
Expand Down Expand Up @@ -822,7 +826,7 @@ public static class LOC
/// </summary>
public const string LegendaryGamesUpdatesUnderway = "LOCLegendaryGamesUpdatesUnderway";
/// <summary>
/// Remove game launch settings
/// Remove launch settings
/// </summary>
public const string LegendaryRemoveGameLaunchSettings = "LOCLegendaryRemoveGameLaunchSettings";
/// <summary>
Expand Down Expand Up @@ -902,6 +906,14 @@ public static class LOC
/// </summary>
public const string LegendaryUninstallSuccess = "LOCLegendaryUninstallSuccess";
/// <summary>
/// Following games have been successfully uninstalled: {0}.
/// </summary>
public const string LegendaryUninstallSuccessOther = "LOCLegendaryUninstallSuccessOther";
/// <summary>
/// Cannot uninstall following games: {0}.
/// </summary>
public const string LegendaryUninstallErrorOther = "LOCLegendaryUninstallErrorOther";
/// <summary>
/// Import games requiring {0}
/// </summary>
public const string LegendaryImportThirdPartyLauncherGames = "LOCLegendaryImportThirdPartyLauncherGames";
Expand Down
1 change: 1 addition & 0 deletions src/Resources/Icons.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@
<TextBlock x:Key="MoveIcon" Text="&#xea5d;" FontFamily="{DynamicResource FontIcoFont}" FontWeight="Light" Foreground="{DynamicResource TextBrush}" />
<TextBlock x:Key="ModifyLaunchSettingsIcon" Text="&#xefe2;" FontFamily="{DynamicResource FontIcoFont}" FontWeight="Light" Foreground="{DynamicResource TextBrush}" />
<TextBlock x:Key="InstallIcon" Text="&#xef08;" FontFamily="{DynamicResource FontIcoFont}" FontWeight="Light" Foreground="{DynamicResource TextBrush}" />
<TextBlock x:Key="UninstallIcon" Text="&#xedec;" FontFamily="{DynamicResource FontIcoFont}" FontWeight="Light" Foreground="{DynamicResource TextBrush}" />
</ResourceDictionary>
1 change: 1 addition & 0 deletions third_party/Localization/af_ZA.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteGameInstallDirTitle" />
<sys:String x:Key="LOCLegendary3P_PlayniteLibraryImportError" />
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError" />
<sys:String x:Key="LOCLegendary3P_PlayniteUninstalling" />
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing" />
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle" />
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate" />
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 @@ -34,6 +34,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteGameInstallDirTitle">دليل التثبيت</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteLibraryImportError">فشل استيراد الألعاب من {0}.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">فشل تحميل بيانات التعريف:{0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUninstalling">جاري إلغاء التثبيت</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>
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 @@ -34,6 +34,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteGameInstallDirTitle">Инсталационна папка</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteLibraryImportError">Неуспешно импортиране на игри от {0}.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">Неуспешно изтегляне на метаданни: {0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUninstalling">Деинсталиране</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>
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 @@ -34,6 +34,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteGameInstallDirTitle">Carpeta d'instal·lació</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteLibraryImportError">No s’han pogut importar els jocs de {0}.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">No s'ha pogut descarregar les metadades: {0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUninstalling">Desinstal·lant</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>
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 @@ -34,6 +34,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteGameInstallDirTitle">Instalační Adresář</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteLibraryImportError">Nepodařilo se importovat hry z {0}.</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError">Selhalo stahování metadat: {0}</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUninstalling">Probíhá odinstalace</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>
Expand Down
1 change: 1 addition & 0 deletions third_party/Localization/da_DK.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<sys:String x:Key="LOCLegendary3P_PlayniteGameInstallDirTitle" />
<sys:String x:Key="LOCLegendary3P_PlayniteLibraryImportError" />
<sys:String x:Key="LOCLegendary3P_PlayniteMetadataDownloadError" />
<sys:String x:Key="LOCLegendary3P_PlayniteUninstalling">Afinstallerer</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteDoNothing">Gør ingenting</sys:String>
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterWindowTitle" />
<sys:String x:Key="LOCLegendary3P_PlayniteUpdaterInstallUpdate" />
Expand Down
Loading

0 comments on commit e011ef0

Please sign in to comment.