209 lines
7.2 KiB
C#
209 lines
7.2 KiB
C#
using DbusSmsForward.SettingModel;
|
|
using Microsoft.Extensions.Configuration;
|
|
using System.Net;
|
|
using System.Text.Json;
|
|
|
|
namespace DbusSmsForward.Helper;
|
|
|
|
public static class ConfigHelper
|
|
{
|
|
private static readonly JsonSerializerOptions JsonOptions = new(SourceGenerationContext.Default.Options)
|
|
{
|
|
PropertyNameCaseInsensitive = true,
|
|
WriteIndented = true
|
|
};
|
|
|
|
public static string DefaultSettingsFileName => Path.Combine(AppContext.BaseDirectory, "appsettings.json");
|
|
|
|
public static string ResolveConfigPath(IConfiguration? configuration = null)
|
|
{
|
|
string[] candidates =
|
|
[
|
|
configuration?["DBUSSMSFORWARD_CONFIG_PATH"] ?? string.Empty,
|
|
Environment.GetEnvironmentVariable("DBUSSMSFORWARD_CONFIG_PATH") ?? string.Empty,
|
|
"/etc/dbussmsforward/appsettings.json",
|
|
DefaultSettingsFileName
|
|
];
|
|
|
|
foreach (string candidate in candidates)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(candidate) && File.Exists(candidate))
|
|
{
|
|
return candidate;
|
|
}
|
|
}
|
|
|
|
return candidates.Last(static c => !string.IsNullOrWhiteSpace(c));
|
|
}
|
|
|
|
public static DbusSmsForwardOptions LoadOptions(IConfiguration? configuration = null)
|
|
{
|
|
DbusSmsForwardOptions options = new();
|
|
string configPath = ResolveConfigPath(configuration);
|
|
if (File.Exists(configPath))
|
|
{
|
|
string json = File.ReadAllText(configPath);
|
|
options = JsonSerializer.Deserialize(json, SourceGenerationContext.Default.DbusSmsForwardOptions) ?? new DbusSmsForwardOptions();
|
|
}
|
|
|
|
if (configuration is not null)
|
|
{
|
|
configuration.GetSection("DbusSmsForward").Bind(options);
|
|
configuration.GetSection("Daemon").Bind(options.Daemon);
|
|
configuration.GetSection("Modem").Bind(options.Modem);
|
|
configuration.GetSection("Forwarding").Bind(options.Forwarding);
|
|
configuration.GetSection("Notifications").Bind(options.Notifications);
|
|
configuration.GetSection("LegacyCompatibility").Bind(options.LegacyCompatibility);
|
|
}
|
|
|
|
return options;
|
|
}
|
|
|
|
public static void SaveOptions(DbusSmsForwardOptions options, string? path = null)
|
|
{
|
|
string target = path ?? ResolveConfigPath();
|
|
Directory.CreateDirectory(Path.GetDirectoryName(target) ?? AppContext.BaseDirectory);
|
|
string updatedJson = JsonSerializer.Serialize(options, SourceGenerationContext.Default.DbusSmsForwardOptions);
|
|
File.WriteAllText(target, updatedJson);
|
|
}
|
|
|
|
public static void SaveLegacySettings(appsettingsModel result, string? path = null)
|
|
{
|
|
string target = path ?? DefaultSettingsFileName;
|
|
Directory.CreateDirectory(Path.GetDirectoryName(target) ?? AppContext.BaseDirectory);
|
|
string updatedJson = JsonSerializer.Serialize(result, SourceGenerationContext.Default.appsettingsModel);
|
|
File.WriteAllText(target, updatedJson);
|
|
}
|
|
|
|
public static void GetSettings(ref appsettingsModel result)
|
|
{
|
|
string settingsFileName = ResolveConfigPath();
|
|
if (!File.Exists(settingsFileName))
|
|
{
|
|
result ??= new appsettingsModel();
|
|
return;
|
|
}
|
|
|
|
string config = File.ReadAllText(settingsFileName);
|
|
|
|
try
|
|
{
|
|
if (LooksLikeNewConfig(config))
|
|
{
|
|
DbusSmsForwardOptions options = JsonSerializer.Deserialize(config, SourceGenerationContext.Default.DbusSmsForwardOptions) ?? new DbusSmsForwardOptions();
|
|
result = ConvertToLegacy(options);
|
|
return;
|
|
}
|
|
|
|
result = JsonSerializer.Deserialize(config, SourceGenerationContext.Default.appsettingsModel) ?? new appsettingsModel();
|
|
}
|
|
catch
|
|
{
|
|
result ??= new appsettingsModel();
|
|
}
|
|
}
|
|
|
|
public static void UpdateSettings(ref appsettingsModel result)
|
|
{
|
|
SaveLegacySettings(result);
|
|
}
|
|
|
|
public static bool JudgeIsForwardIgnore(uint storage)
|
|
{
|
|
appsettingsModel result = new();
|
|
GetSettings(ref result);
|
|
string forwardStorageType = result.appSettings.ForwardIgnoreStorageType?.Trim().ToLowerInvariant() ?? string.Empty;
|
|
|
|
return (forwardStorageType, storage) switch
|
|
{
|
|
("unknown", 0) => true,
|
|
("sm", 1) => true,
|
|
("me", 2) => true,
|
|
("mt", 3) => true,
|
|
("sr", 4) => true,
|
|
("bm", 5) => true,
|
|
("ta", 6) => true,
|
|
_ => false
|
|
};
|
|
}
|
|
|
|
public static string GetDeviceHostName()
|
|
{
|
|
try
|
|
{
|
|
return Dns.GetHostName();
|
|
}
|
|
catch
|
|
{
|
|
try
|
|
{
|
|
return Environment.MachineName;
|
|
}
|
|
catch
|
|
{
|
|
return string.Empty;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static string ResolveDeviceName(DbusSmsForwardOptions options)
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(options.Forwarding.DeviceName))
|
|
{
|
|
return options.Forwarding.DeviceName;
|
|
}
|
|
|
|
return GetDeviceHostName();
|
|
}
|
|
|
|
public static appsettingsModel ConvertToLegacy(DbusSmsForwardOptions options)
|
|
{
|
|
return new appsettingsModel
|
|
{
|
|
appSettings = new LegacyAppSettings
|
|
{
|
|
EmailConfig = options.Notifications.Email,
|
|
PushPlusConfig = options.Notifications.PushPlus,
|
|
DingTalkConfig = options.Notifications.DingTalk,
|
|
BarkConfig = options.Notifications.Bark,
|
|
WeComApplicationConfig = options.Notifications.WeComApplication,
|
|
TGBotConfig = options.Notifications.TelegramBot,
|
|
ShellConfig = options.Notifications.Shell,
|
|
SmsCodeKey = options.Forwarding.SmsCodeKey,
|
|
ForwardIgnoreStorageType = options.Forwarding.IgnoreStorageType,
|
|
DeviceName = options.Forwarding.DeviceName
|
|
}
|
|
};
|
|
}
|
|
|
|
public static DbusSmsForwardOptions ConvertFromLegacy(appsettingsModel legacy)
|
|
{
|
|
return new DbusSmsForwardOptions
|
|
{
|
|
Forwarding = new ForwardingConfig
|
|
{
|
|
DeviceName = legacy.appSettings.DeviceName,
|
|
SmsCodeKey = legacy.appSettings.SmsCodeKey,
|
|
IgnoreStorageType = legacy.appSettings.ForwardIgnoreStorageType
|
|
},
|
|
Notifications = new NotificationChannels
|
|
{
|
|
Email = legacy.appSettings.EmailConfig,
|
|
PushPlus = legacy.appSettings.PushPlusConfig,
|
|
DingTalk = legacy.appSettings.DingTalkConfig,
|
|
Bark = legacy.appSettings.BarkConfig,
|
|
WeComApplication = legacy.appSettings.WeComApplicationConfig,
|
|
TelegramBot = legacy.appSettings.TGBotConfig,
|
|
Shell = legacy.appSettings.ShellConfig
|
|
}
|
|
};
|
|
}
|
|
|
|
private static bool LooksLikeNewConfig(string json)
|
|
{
|
|
using JsonDocument document = JsonDocument.Parse(json);
|
|
JsonElement root = document.RootElement;
|
|
return root.TryGetProperty("Daemon", out _) || root.TryGetProperty("Notifications", out _) || root.TryGetProperty("Forwarding", out _);
|
|
}
|
|
}
|