diff --git a/DiscordChatExporter.Gui/DiscordChatExporter.Gui.csproj b/DiscordChatExporter.Gui/DiscordChatExporter.Gui.csproj index e5e27df3..17cbae24 100644 --- a/DiscordChatExporter.Gui/DiscordChatExporter.Gui.csproj +++ b/DiscordChatExporter.Gui/DiscordChatExporter.Gui.csproj @@ -56,7 +56,7 @@ diff --git a/DiscordChatExporter.Gui/Publish-MacOSBundle.csx b/DiscordChatExporter.Gui/Publish-MacOSBundle.csx new file mode 100644 index 00000000..5b39e199 --- /dev/null +++ b/DiscordChatExporter.Gui/Publish-MacOSBundle.csx @@ -0,0 +1,97 @@ +// Publishes the GUI app as a macOS .app bundle. +// Usage: dotnet run Publish-MacOSBundle.csx -- + +if (args.Length < 4) +{ + Console.Error.WriteLine( + "Usage: dotnet run Publish-MacOSBundle.csx -- " + ); + return 1; +} + +var publishDirPath = Path.GetFullPath(args[0]); +var iconsFilePath = args[1]; +var fullVersion = args[2]; +var shortVersion = args[3]; + +// Setup paths +var tempDirPath = Path.GetFullPath(Path.Combine(publishDirPath, "../publish-macos-app-temp")); +var bundleName = "DiscordChatExporter.app"; +var bundleDirPath = Path.Combine(tempDirPath, bundleName); +var contentsDirPath = Path.Combine(bundleDirPath, "Contents"); +var macosDirPath = Path.Combine(contentsDirPath, "MacOS"); +var resourcesDirPath = Path.Combine(contentsDirPath, "Resources"); + +try +{ + // Initialize the bundle's directory structure + Directory.CreateDirectory(bundleDirPath); + Directory.CreateDirectory(contentsDirPath); + Directory.CreateDirectory(macosDirPath); + Directory.CreateDirectory(resourcesDirPath); + + // Copy icons into the .app's Resources folder + File.Copy(iconsFilePath, Path.Combine(resourcesDirPath, "AppIcon.icns"), overwrite: true); + + // Generate the Info.plist metadata file with the app information + var plistContent = $""" + + + + + CFBundleDisplayName + DiscordChatExporter + CFBundleName + DiscordChatExporter + CFBundleExecutable + DiscordChatExporter + NSHumanReadableCopyright + © Oleksii Holub + CFBundleIdentifier + me.Tyrrrz.DiscordChatExporter + CFBundleSpokenName + Discord Chat Exporter + CFBundleIconFile + AppIcon + CFBundleIconName + AppIcon + CFBundleVersion + {fullVersion} + CFBundleShortVersionString + {shortVersion} + NSHighResolutionCapable + + CFBundlePackageType + APPL + + +"""; + + File.WriteAllText(Path.Combine(contentsDirPath, "Info.plist"), plistContent); + + // Delete the previous bundle if it exists + var existingBundlePath = Path.Combine(publishDirPath, bundleName); + if (Directory.Exists(existingBundlePath)) + Directory.Delete(existingBundlePath, recursive: true); + + // Move all files from the publish directory into the MacOS directory + foreach (var entry in Directory.GetFileSystemEntries(publishDirPath)) + { + var destination = Path.Combine(macosDirPath, Path.GetFileName(entry)); + if (Directory.Exists(entry)) + Directory.Move(entry, destination); + else + File.Move(entry, destination); + } + + // Move the final bundle into the publish directory for upload + Directory.Move(bundleDirPath, Path.Combine(publishDirPath, bundleName)); +} +finally +{ + // Clean up the temporary directory + if (Directory.Exists(tempDirPath)) + Directory.Delete(tempDirPath, recursive: true); +} + +return 0; diff --git a/DiscordChatExporter.Gui/Publish-MacOSBundle.ps1 b/DiscordChatExporter.Gui/Publish-MacOSBundle.ps1 deleted file mode 100644 index fd08ea22..00000000 --- a/DiscordChatExporter.Gui/Publish-MacOSBundle.ps1 +++ /dev/null @@ -1,87 +0,0 @@ -param( - [Parameter(Mandatory=$true)] - [string]$PublishDirPath, - - [Parameter(Mandatory=$true)] - [string]$IconsFilePath, - - [Parameter(Mandatory=$true)] - [string]$FullVersion, - - [Parameter(Mandatory=$true)] - [string]$ShortVersion -) - -$ErrorActionPreference = "Stop" - -# Setup paths -$tempDirPath = Join-Path $PublishDirPath "../publish-macos-app-temp" -$bundleName = "DiscordChatExporter.app" -$bundleDirPath = Join-Path $tempDirPath $bundleName -$contentsDirPath = Join-Path $bundleDirPath "Contents" -$macosDirPath = Join-Path $contentsDirPath "MacOS" -$resourcesDirPath = Join-Path $contentsDirPath "Resources" - -try { - # Initialize the bundle's directory structure - New-Item -Path $bundleDirPath -ItemType Directory -Force - New-Item -Path $contentsDirPath -ItemType Directory -Force - New-Item -Path $macosDirPath -ItemType Directory -Force - New-Item -Path $resourcesDirPath -ItemType Directory -Force - - # Copy icons into the .app's Resources folder - Copy-Item -Path $IconsFilePath -Destination (Join-Path $resourcesDirPath "AppIcon.icns") -Force - - # Generate the Info.plist metadata file with the app information - $plistContent = @" - - - - - CFBundleDisplayName - DiscordChatExporter - CFBundleName - DiscordChatExporter - CFBundleExecutable - DiscordChatExporter - NSHumanReadableCopyright - © Oleksii Holub - CFBundleIdentifier - me.Tyrrrz.DiscordChatExporter - CFBundleSpokenName - Discord Chat Exporter - CFBundleIconFile - AppIcon - CFBundleIconName - AppIcon - CFBundleVersion - $FullVersion - CFBundleShortVersionString - $ShortVersion - NSHighResolutionCapable - - CFBundlePackageType - APPL - - -"@ - - Set-Content -Path (Join-Path $contentsDirPath "Info.plist") -Value $plistContent - - # Delete the previous bundle if it exists - if (Test-Path (Join-Path $PublishDirPath $bundleName)) { - Remove-Item -Path (Join-Path $PublishDirPath $bundleName) -Recurse -Force - } - - # Move all files from the publish directory into the MacOS directory - Get-ChildItem -Path $PublishDirPath | ForEach-Object { - Move-Item -Path $_.FullName -Destination $macosDirPath -Force - } - - # Move the final bundle into the publish directory for upload - Move-Item -Path $bundleDirPath -Destination $PublishDirPath -Force -} -finally { - # Clean up the temporary directory - Remove-Item -Path $tempDirPath -Recurse -Force -} \ No newline at end of file