summaryrefslogtreecommitdiff
path: root/src/SMAPI.Internal
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Internal')
-rw-r--r--src/SMAPI.Internal/ConsoleWriting/ColorSchemeConfig.cs15
-rw-r--r--src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs91
-rw-r--r--src/SMAPI.Internal/ConsoleWriting/ConsoleLogLevel.cs (renamed from src/SMAPI.Internal/ConsoleWriting/LogLevel.cs)0
-rw-r--r--src/SMAPI.Internal/EnvironmentUtility.cs112
-rw-r--r--src/SMAPI.Internal/Platform.cs15
-rw-r--r--src/SMAPI.Internal/SMAPI.Internal.projitems5
-rw-r--r--src/SMAPI.Internal/SMAPI.Internal.shproj (renamed from src/SMAPI.Internal/StardewModdingAPI.Internal.shproj)0
7 files changed, 70 insertions, 168 deletions
diff --git a/src/SMAPI.Internal/ConsoleWriting/ColorSchemeConfig.cs b/src/SMAPI.Internal/ConsoleWriting/ColorSchemeConfig.cs
new file mode 100644
index 00000000..001840bf
--- /dev/null
+++ b/src/SMAPI.Internal/ConsoleWriting/ColorSchemeConfig.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace StardewModdingAPI.Internal.ConsoleWriting
+{
+ /// <summary>The console color scheme options.</summary>
+ internal class ColorSchemeConfig
+ {
+ /// <summary>The default color scheme ID to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</summary>
+ public MonitorColorScheme UseScheme { get; set; }
+
+ /// <summary>The available console color schemes.</summary>
+ public IDictionary<MonitorColorScheme, IDictionary<ConsoleLogLevel, ConsoleColor>> Schemes { get; set; }
+ }
+}
diff --git a/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs b/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs
index cdc729e2..aefda9b6 100644
--- a/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs
+++ b/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using StardewModdingAPI.Toolkit.Utilities;
namespace StardewModdingAPI.Internal.ConsoleWriting
{
@@ -21,11 +22,16 @@ namespace StardewModdingAPI.Internal.ConsoleWriting
*********/
/// <summary>Construct an instance.</summary>
/// <param name="platform">The target platform.</param>
- /// <param name="colorScheme">The console color scheme to use.</param>
- public ColorfulConsoleWriter(Platform platform, MonitorColorScheme colorScheme)
+ public ColorfulConsoleWriter(Platform platform)
+ : this(platform, ColorfulConsoleWriter.GetDefaultColorSchemeConfig(MonitorColorScheme.AutoDetect)) { }
+
+ /// <summary>Construct an instance.</summary>
+ /// <param name="platform">The target platform.</param>
+ /// <param name="colorConfig">The colors to use for text written to the SMAPI console.</param>
+ public ColorfulConsoleWriter(Platform platform, ColorSchemeConfig colorConfig)
{
this.SupportsColor = this.TestColorSupport();
- this.Colors = this.GetConsoleColorScheme(platform, colorScheme);
+ this.Colors = this.GetConsoleColorScheme(platform, colorConfig);
}
/// <summary>Write a message line to the log.</summary>
@@ -53,6 +59,40 @@ namespace StardewModdingAPI.Internal.ConsoleWriting
Console.WriteLine(message);
}
+ /// <summary>Get the default color scheme config for cases where it's not configurable (e.g. the installer).</summary>
+ /// <param name="useScheme">The default color scheme ID to use, or <see cref="MonitorColorScheme.AutoDetect"/> to select one automatically.</param>
+ /// <remarks>The colors here should be kept in sync with the SMAPI config file.</remarks>
+ public static ColorSchemeConfig GetDefaultColorSchemeConfig(MonitorColorScheme useScheme)
+ {
+ return new ColorSchemeConfig
+ {
+ UseScheme = useScheme,
+ Schemes = new Dictionary<MonitorColorScheme, IDictionary<ConsoleLogLevel, ConsoleColor>>
+ {
+ [MonitorColorScheme.DarkBackground] = new Dictionary<ConsoleLogLevel, ConsoleColor>
+ {
+ [ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
+ [ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
+ [ConsoleLogLevel.Info] = ConsoleColor.White,
+ [ConsoleLogLevel.Warn] = ConsoleColor.Yellow,
+ [ConsoleLogLevel.Error] = ConsoleColor.Red,
+ [ConsoleLogLevel.Alert] = ConsoleColor.Magenta,
+ [ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
+ },
+ [MonitorColorScheme.LightBackground] = new Dictionary<ConsoleLogLevel, ConsoleColor>
+ {
+ [ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
+ [ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
+ [ConsoleLogLevel.Info] = ConsoleColor.Black,
+ [ConsoleLogLevel.Warn] = ConsoleColor.DarkYellow,
+ [ConsoleLogLevel.Error] = ConsoleColor.Red,
+ [ConsoleLogLevel.Alert] = ConsoleColor.DarkMagenta,
+ [ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
+ }
+ }
+ };
+ }
+
/*********
** Private methods
@@ -73,47 +113,22 @@ namespace StardewModdingAPI.Internal.ConsoleWriting
/// <summary>Get the color scheme to use for the current console.</summary>
/// <param name="platform">The target platform.</param>
- /// <param name="colorScheme">The console color scheme to use.</param>
- private IDictionary<ConsoleLogLevel, ConsoleColor> GetConsoleColorScheme(Platform platform, MonitorColorScheme colorScheme)
+ /// <param name="colorConfig">The colors to use for text written to the SMAPI console.</param>
+ private IDictionary<ConsoleLogLevel, ConsoleColor> GetConsoleColorScheme(Platform platform, ColorSchemeConfig colorConfig)
{
- // auto detect color scheme
- if (colorScheme == MonitorColorScheme.AutoDetect)
+ // get color scheme ID
+ MonitorColorScheme schemeID = colorConfig.UseScheme;
+ if (schemeID == MonitorColorScheme.AutoDetect)
{
- colorScheme = platform == Platform.Mac
+ schemeID = platform == Platform.Mac
? MonitorColorScheme.LightBackground // MacOS doesn't provide console background color info, but it's usually white.
: ColorfulConsoleWriter.IsDark(Console.BackgroundColor) ? MonitorColorScheme.DarkBackground : MonitorColorScheme.LightBackground;
}
// get colors for scheme
- switch (colorScheme)
- {
- case MonitorColorScheme.DarkBackground:
- return new Dictionary<ConsoleLogLevel, ConsoleColor>
- {
- [ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
- [ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
- [ConsoleLogLevel.Info] = ConsoleColor.White,
- [ConsoleLogLevel.Warn] = ConsoleColor.Yellow,
- [ConsoleLogLevel.Error] = ConsoleColor.Red,
- [ConsoleLogLevel.Alert] = ConsoleColor.Magenta,
- [ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
- };
-
- case MonitorColorScheme.LightBackground:
- return new Dictionary<ConsoleLogLevel, ConsoleColor>
- {
- [ConsoleLogLevel.Trace] = ConsoleColor.DarkGray,
- [ConsoleLogLevel.Debug] = ConsoleColor.DarkGray,
- [ConsoleLogLevel.Info] = ConsoleColor.Black,
- [ConsoleLogLevel.Warn] = ConsoleColor.DarkYellow,
- [ConsoleLogLevel.Error] = ConsoleColor.Red,
- [ConsoleLogLevel.Alert] = ConsoleColor.DarkMagenta,
- [ConsoleLogLevel.Success] = ConsoleColor.DarkGreen
- };
-
- default:
- throw new NotSupportedException($"Unknown color scheme '{colorScheme}'.");
- }
+ return colorConfig.Schemes.TryGetValue(schemeID, out IDictionary<ConsoleLogLevel, ConsoleColor> scheme)
+ ? scheme
+ : throw new NotSupportedException($"Unknown color scheme '{schemeID}'.");
}
/// <summary>Get whether a console color should be considered dark, which is subjectively defined as 'white looks better than black on this text'.</summary>
@@ -125,7 +140,7 @@ namespace StardewModdingAPI.Internal.ConsoleWriting
case ConsoleColor.Black:
case ConsoleColor.Blue:
case ConsoleColor.DarkBlue:
- case ConsoleColor.DarkMagenta: // Powershell
+ case ConsoleColor.DarkMagenta: // PowerShell
case ConsoleColor.DarkRed:
case ConsoleColor.Red:
return true;
diff --git a/src/SMAPI.Internal/ConsoleWriting/LogLevel.cs b/src/SMAPI.Internal/ConsoleWriting/ConsoleLogLevel.cs
index 54564111..54564111 100644
--- a/src/SMAPI.Internal/ConsoleWriting/LogLevel.cs
+++ b/src/SMAPI.Internal/ConsoleWriting/ConsoleLogLevel.cs
diff --git a/src/SMAPI.Internal/EnvironmentUtility.cs b/src/SMAPI.Internal/EnvironmentUtility.cs
deleted file mode 100644
index c4e4678a..00000000
--- a/src/SMAPI.Internal/EnvironmentUtility.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-using System;
-using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-#if SMAPI_FOR_WINDOWS
-using System.Management;
-#endif
-using System.Runtime.InteropServices;
-
-namespace StardewModdingAPI.Internal
-{
- /// <summary>Provides methods for fetching environment information.</summary>
- internal static class EnvironmentUtility
- {
- /*********
- ** Fields
- *********/
- /// <summary>Get the OS name from the system uname command.</summary>
- /// <param name="buffer">The buffer to fill with the resulting string.</param>
- [DllImport("libc")]
- static extern int uname(IntPtr buffer);
-
-
- /*********
- ** Public methods
- *********/
- /// <summary>Detect the current OS.</summary>
- public static Platform DetectPlatform()
- {
- switch (Environment.OSVersion.Platform)
- {
- case PlatformID.MacOSX:
- return Platform.Mac;
-
- case PlatformID.Unix:
- return EnvironmentUtility.IsRunningMac()
- ? Platform.Mac
- : Platform.Linux;
-
- default:
- return Platform.Windows;
- }
- }
-
-
- /// <summary>Get the human-readable OS name and version.</summary>
- /// <param name="platform">The current platform.</param>
- [SuppressMessage("ReSharper", "EmptyGeneralCatchClause", Justification = "Error suppressed deliberately to fallback to default behaviour.")]
- public static string GetFriendlyPlatformName(Platform platform)
- {
-#if SMAPI_FOR_WINDOWS
- try
- {
- return new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")
- .Get()
- .Cast<ManagementObject>()
- .Select(entry => entry.GetPropertyValue("Caption").ToString())
- .FirstOrDefault();
- }
- catch { }
-#endif
- return (platform == Platform.Mac ? "MacOS " : "") + Environment.OSVersion;
- }
-
- /// <summary>Get the name of the Stardew Valley executable.</summary>
- /// <param name="platform">The current platform.</param>
- public static string GetExecutableName(Platform platform)
- {
- return platform == Platform.Windows
- ? "Stardew Valley.exe"
- : "StardewValley.exe";
- }
-
- /// <summary>Get whether the platform uses Mono.</summary>
- /// <param name="platform">The current platform.</param>
- public static bool IsMono(this Platform platform)
- {
- return platform == Platform.Linux || platform == Platform.Mac;
- }
-
- /*********
- ** Private methods
- *********/
- /// <summary>Detect whether the code is running on Mac.</summary>
- /// <remarks>
- /// This code is derived from the Mono project (see System.Windows.Forms/System.Windows.Forms/XplatUI.cs). It detects Mac by calling the
- /// <c>uname</c> system command and checking the response, which is always 'Darwin' for MacOS.
- /// </remarks>
- private static bool IsRunningMac()
- {
- IntPtr buffer = IntPtr.Zero;
- try
- {
- buffer = Marshal.AllocHGlobal(8192);
- if (EnvironmentUtility.uname(buffer) == 0)
- {
- string os = Marshal.PtrToStringAnsi(buffer);
- return os == "Darwin";
- }
- return false;
- }
- catch
- {
- return false; // default to Linux
- }
- finally
- {
- if (buffer != IntPtr.Zero)
- Marshal.FreeHGlobal(buffer);
- }
- }
- }
-}
diff --git a/src/SMAPI.Internal/Platform.cs b/src/SMAPI.Internal/Platform.cs
deleted file mode 100644
index 81ca5c1f..00000000
--- a/src/SMAPI.Internal/Platform.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace StardewModdingAPI.Internal
-{
- /// <summary>The game's platform version.</summary>
- internal enum Platform
- {
- /// <summary>The Linux version of the game.</summary>
- Linux,
-
- /// <summary>The Mac version of the game.</summary>
- Mac,
-
- /// <summary>The Windows version of the game.</summary>
- Windows
- }
-}
diff --git a/src/SMAPI.Internal/SMAPI.Internal.projitems b/src/SMAPI.Internal/SMAPI.Internal.projitems
index 54b12003..7fcebc94 100644
--- a/src/SMAPI.Internal/SMAPI.Internal.projitems
+++ b/src/SMAPI.Internal/SMAPI.Internal.projitems
@@ -10,9 +10,8 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\ColorfulConsoleWriter.cs" />
- <Compile Include="$(MSBuildThisFileDirectory)EnvironmentUtility.cs" />
- <Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\LogLevel.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\ColorSchemeConfig.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\ConsoleLogLevel.cs" />
<Compile Include="$(MSBuildThisFileDirectory)ConsoleWriting\MonitorColorScheme.cs" />
- <Compile Include="$(MSBuildThisFileDirectory)Platform.cs" />
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/src/SMAPI.Internal/StardewModdingAPI.Internal.shproj b/src/SMAPI.Internal/SMAPI.Internal.shproj
index a098828a..a098828a 100644
--- a/src/SMAPI.Internal/StardewModdingAPI.Internal.shproj
+++ b/src/SMAPI.Internal/SMAPI.Internal.shproj