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