using System; using System.Linq; using Windows.Win32; using Windows.Win32.Foundation; namespace AMNet.Server; internal static class Config { internal const string IOSection = "aimeio"; private const string ConfigFileName = @".\segatools.ini"; /// /// Valid physical card identification methods. /// IDm - uses the idm of the card to generate a 20-digit identifier (also known as the 0008 number) /// Access - prefer the real access code of the card. if not available (i.e. Suica card), fallback to the IDm. /// private static readonly string[] ValidPhysicalCardIdentifiers = ["idm", "access"]; static Config() { GameId = ReadKey(IOSection, "gameId", 4); ServerName = ReadKey(IOSection, "serverName", 26, Environment.MachineName); var physicalCardIdentifierPreference = ReadKey(IOSection, "physicalCardIdentifier", 10); PhysicalCardIdentifierPreference = ValidPhysicalCardIdentifiers.Contains(physicalCardIdentifierPreference) ? physicalCardIdentifierPreference : ValidPhysicalCardIdentifiers[^1]; EnableAimeTxt = PInvoke.GetPrivateProfileInt(IOSection, "enableKeyboardMode", 1, ConfigFileName) > 0; AimeTxtPath = ReadKey("aime", "aimePath", PInvoke.MAX_PATH, @"DEVICE\aime.txt"); } public static string GameId { get; } public static string ServerName { get; } public static string PhysicalCardIdentifierPreference { get; } public static bool EnableAimeTxt { get; } public static string AimeTxtPath { get; } internal static unsafe string ReadKey(string section, string key, uint maxLength, string @default = null) { // +1 for null terminator var buffer = stackalloc char[(int)maxLength + 1]; var bufferStr = new PWSTR(buffer); PInvoke.GetPrivateProfileString(section, key, @default ?? string.Empty, bufferStr, maxLength + 1, ConfigFileName); return bufferStr.ToString(); } }