重构配置管理,新增 JSON 支持及图标
更新 `App.config`,移除并重新添加配置项;新增 `AppConfig.json` 文件以支持 JSON 格式配置;在 `AppSetting.cs` 中实现从 JSON 加载配置功能;修改 `ComPortServer.cs` 以适应新的配置项;更新项目文件以引用 `AppConfig.json` 并调整 `nlog.config` 路径;新增应用程序图标 `logo.ico`。
This commit is contained in:
+403
-2
@@ -2,10 +2,12 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using BarrageGrab.Modles.JsonEntity;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using static System.Configuration.ConfigurationManager;
|
||||
|
||||
namespace BarrageGrab
|
||||
@@ -53,6 +55,405 @@ namespace BarrageGrab
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从JSON文件加载配置
|
||||
/// </summary>
|
||||
/// <param name="jsonFilePath">JSON配置文件路径</param>
|
||||
public void LoadFromJson(string jsonFilePath = null)
|
||||
{
|
||||
if(jsonFilePath==null) jsonFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appConfig.json");
|
||||
try
|
||||
{
|
||||
if(!File.Exists(jsonFilePath))
|
||||
{
|
||||
Logger.LogError($"配置文件不存在: {jsonFilePath}");
|
||||
return;
|
||||
}
|
||||
|
||||
// 读取JSON文件内容(保留注释)
|
||||
string jsonContent = File.ReadAllText(jsonFilePath);
|
||||
|
||||
// 解析JSON(Newtonsoft.Json支持JSONC格式,会自动忽略注释)
|
||||
JObject config = JObject.Parse(jsonContent);
|
||||
|
||||
// 从JSON读取应用配置
|
||||
var app = config["app"];
|
||||
|
||||
// 常规配置
|
||||
var general = app["general"];
|
||||
HideConsole = general["hideConsole"]?.Value<bool>() ?? false;
|
||||
ShowWindow = general["showWindow"]?.Value<bool>() ?? false;
|
||||
|
||||
// 网络配置
|
||||
var network = app["network"];
|
||||
var proxy = network["proxy"];
|
||||
ProxyPort = proxy["port"]?.Value<int>() ?? 8827;
|
||||
UsedProxy = proxy["enabled"]?.Value<bool>() ?? true;
|
||||
UpstreamProxy = proxy["upstreamAddress"]?.Value<string>() ?? string.Empty;
|
||||
|
||||
var websocket = network["websocket"];
|
||||
WsProt = websocket["listenPort"]?.Value<int>() ?? 8888;
|
||||
ListenAny = websocket["listenAny"]?.Value<bool>() ?? true;
|
||||
|
||||
// 过滤配置
|
||||
var filtering = app["filtering"];
|
||||
string processFilterStr = filtering["processFilter"]?.Value<string>() ?? "直播伴侣,douyin,chrome,msedge,QQBrowser,360se,firefox,2345explorer,iexplore";
|
||||
ProcessFilter = processFilterStr.Split(',');
|
||||
FilterHostName = filtering["hostNameEnabled"]?.Value<bool>() ?? true;
|
||||
string hostNameFilterStr = filtering["hostNameList"]?.Value<string>() ?? string.Empty;
|
||||
HostNameFilter = !string.IsNullOrWhiteSpace(hostNameFilterStr)
|
||||
? hostNameFilterStr.Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray()
|
||||
: new string[0];
|
||||
string webRoomIdsStr = filtering["webRoomIds"]?.Value<string>() ?? string.Empty;
|
||||
WebRoomIds = !string.IsNullOrWhiteSpace(webRoomIdsStr)
|
||||
? webRoomIdsStr.Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray()
|
||||
: new string[0];
|
||||
|
||||
// 弹幕配置
|
||||
var barrage = app["barrage"];
|
||||
PrintBarrage = barrage["printEnabled"]?.Value<bool>() ?? true;
|
||||
BarrageLog = barrage["barrageFileLog"]?.Value<bool>() ?? false;
|
||||
var polling = app["barrage"]["polling"];
|
||||
ForcePolling = polling["enabled"]?.Value<bool>() ?? false;
|
||||
PollingInterval = polling["interval"]?.Value<int>() ?? 3000;
|
||||
DisableLivePageScriptCache = polling["disableScriptCache"]?.Value<bool>() ?? false;
|
||||
|
||||
// 设置默认过滤器
|
||||
PrintFilter = Enum.GetValues(typeof(PackMsgType)).Cast<int>().Where(w => w > 0).ToArray();
|
||||
PushFilter = Enum.GetValues(typeof(PackMsgType)).Cast<int>().Where(w => w > 0).ToArray();
|
||||
LogFilter = Enum.GetValues(typeof(PackMsgType)).Cast<int>().Where(w => w > 0).ToArray();
|
||||
|
||||
string printFilterStr = barrage["printFilter"]?.Value<string>() ?? string.Empty;
|
||||
string pushFilterStr = barrage["pushFilter"]?.Value<string>() ?? string.Empty;
|
||||
string logFilterStr = barrage["logFilter"]?.Value<string>() ?? "1,2,4,5,6,7,8";
|
||||
|
||||
// 解析过滤器
|
||||
if (!string.IsNullOrWhiteSpace(printFilterStr))
|
||||
{
|
||||
PrintFilter = printFilterStr.Split(',').Select(x => int.Parse(x)).ToArray();
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(pushFilterStr))
|
||||
{
|
||||
PushFilter = pushFilterStr.Split(',').Select(x => int.Parse(x)).ToArray();
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(logFilterStr))
|
||||
{
|
||||
LogFilter = logFilterStr.Split(',').Select(x => int.Parse(x)).ToArray();
|
||||
}
|
||||
|
||||
// 直播伴侣配置
|
||||
var liveCompanion = app["liveCompanion"];
|
||||
LiveCompanPath = liveCompanion["path"]?.Value<string>() ?? string.Empty;
|
||||
LiveCompanHookSwitch = liveCompanion["hookEnabled"]?.Value<bool>() ?? false;
|
||||
AutoPause = liveCompanion["autoPause"]?.Value<bool>() ?? true;
|
||||
|
||||
// COM端口配置
|
||||
var comPort = app["comPort"];
|
||||
string comPortStr = comPort["config"]?.Value<string>() ?? string.Empty;
|
||||
if (!string.IsNullOrWhiteSpace(comPortStr))
|
||||
{
|
||||
try
|
||||
{
|
||||
var spit = comPortStr.Split(':');
|
||||
ComPort = spit[0].Trim();
|
||||
ComBaudRate = int.Parse(spit[1].Trim());
|
||||
ComPortSwitch = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception("串口配置格式错误," + ex.Message, ex);
|
||||
}
|
||||
}
|
||||
|
||||
Logger.PrintColor("已从JSON配置文件加载设置");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.PrintColor($"从JSON加载配置失败: {ex.Message},将尝试从App.config加载");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从启动参数加载配置
|
||||
/// </summary>
|
||||
/// <param name="args">命令行参数数组</param>
|
||||
public void LoadFromCommand(string[] args)
|
||||
{
|
||||
if (args == null || args.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.PrintColor("正在从命令行参数加载配置...");
|
||||
|
||||
try
|
||||
{
|
||||
for (int i = 0; i < args.Length; i++)
|
||||
{
|
||||
string arg = args[i].ToLower().Trim();
|
||||
|
||||
// 如果参数以-或--开头,则为命令行开关
|
||||
if (arg.StartsWith("-") || arg.StartsWith("--"))
|
||||
{
|
||||
string paramName = arg.TrimStart('-');
|
||||
string paramValue = string.Empty;
|
||||
bool switchDef = false;
|
||||
|
||||
// 检查下一个参数是否是值(不是以-开头)
|
||||
if (i + 1 < args.Length && !(args[i + 1].StartsWith("-") || args[i + 1].StartsWith("--")))
|
||||
{
|
||||
paramValue = args[i + 1];
|
||||
i++; // 跳过已处理的值参数
|
||||
}
|
||||
else
|
||||
{
|
||||
// 对于布尔开关,没有值意味着true
|
||||
paramValue = "?";
|
||||
switchDef = true;
|
||||
}
|
||||
|
||||
// 根据参数名称设置相应的配置
|
||||
switch (paramName)
|
||||
{
|
||||
// 网络相关配置
|
||||
case "port":
|
||||
case "wsport":
|
||||
case "ws-port":
|
||||
if (int.TryParse(paramValue, out int wsPort))
|
||||
{
|
||||
WsProt = wsPort;
|
||||
Logger.PrintColor($"WebSocket端口设置为: {wsPort}");
|
||||
}
|
||||
break;
|
||||
|
||||
case "proxy-port":
|
||||
case "proxyport":
|
||||
if (int.TryParse(paramValue, out int proxyPort))
|
||||
{
|
||||
ProxyPort = proxyPort;
|
||||
Logger.PrintColor($"代理端口设置为: {proxyPort}");
|
||||
}
|
||||
break;
|
||||
|
||||
case "upstream":
|
||||
case "upstream-proxy":
|
||||
UpstreamProxy = paramValue;
|
||||
Logger.PrintColor($"上游代理设置为: {paramValue}");
|
||||
break;
|
||||
|
||||
case "listen-any":
|
||||
case "listenany":
|
||||
if (switchDef) break;
|
||||
ListenAny = ParseBool(paramValue);
|
||||
Logger.PrintColor($"监听任意IP设置为: {ListenAny}");
|
||||
break;
|
||||
|
||||
case "sysproxy":
|
||||
case "sys-proxy":
|
||||
if (switchDef) break;
|
||||
UsedProxy = ParseBool(paramValue);
|
||||
Logger.PrintColor($"系统代理设置为: {UsedProxy}");
|
||||
break;
|
||||
|
||||
// 过滤相关配置
|
||||
case "process-filter":
|
||||
case "processfilter":
|
||||
ProcessFilter = paramValue.Split(',');
|
||||
Logger.PrintColor($"进程过滤器设置为: {paramValue}");
|
||||
break;
|
||||
|
||||
case "hostname-filter":
|
||||
case "hostnamefilter":
|
||||
HostNameFilter = paramValue.Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
|
||||
Logger.PrintColor($"域名过滤器设置为: {paramValue}");
|
||||
break;
|
||||
|
||||
case "filter-hostname":
|
||||
case "filterhostname":
|
||||
if (switchDef) break;
|
||||
FilterHostName = ParseBool(paramValue);
|
||||
Logger.PrintColor($"是否启用域名过滤设置为: {FilterHostName}");
|
||||
break;
|
||||
|
||||
case "room-ids":
|
||||
case "roomids":
|
||||
WebRoomIds = paramValue.Split(',').Where(w => !string.IsNullOrWhiteSpace(w)).ToArray();
|
||||
Logger.PrintColor($"房间ID过滤器设置为: {paramValue}");
|
||||
break;
|
||||
|
||||
// 弹幕相关配置
|
||||
case "print":
|
||||
case "print-barrage":
|
||||
if (switchDef) break;
|
||||
PrintBarrage = ParseBool(paramValue);
|
||||
Logger.PrintColor($"控制台打印弹幕设置为: {PrintBarrage}");
|
||||
break;
|
||||
|
||||
case "print-filter":
|
||||
case "printfilter":
|
||||
if (!string.IsNullOrWhiteSpace(paramValue))
|
||||
{
|
||||
PrintFilter = paramValue.Split(',').Select(x => int.Parse(x)).ToArray();
|
||||
Logger.PrintColor($"控制台打印过滤器设置为: {paramValue}");
|
||||
}
|
||||
break;
|
||||
|
||||
case "push-filter":
|
||||
case "pushfilter":
|
||||
if (!string.IsNullOrWhiteSpace(paramValue))
|
||||
{
|
||||
PushFilter = paramValue.Split(',').Select(x => int.Parse(x)).ToArray();
|
||||
Logger.PrintColor($"推送过滤器设置为: {paramValue}");
|
||||
}
|
||||
break;
|
||||
|
||||
case "log-filter":
|
||||
case "logfilter":
|
||||
if (!string.IsNullOrWhiteSpace(paramValue))
|
||||
{
|
||||
LogFilter = paramValue.Split(',').Select(x => int.Parse(x)).ToArray();
|
||||
Logger.PrintColor($"日志过滤器设置为: {paramValue}");
|
||||
}
|
||||
break;
|
||||
|
||||
case "barrage-log":
|
||||
case "barragelog":
|
||||
if (switchDef) break;
|
||||
BarrageLog = ParseBool(paramValue);
|
||||
Logger.PrintColor($"弹幕文件日志设置为: {BarrageLog}");
|
||||
break;
|
||||
|
||||
// 显示和控制台相关
|
||||
case "hide-console":
|
||||
case "hideconsole":
|
||||
if (switchDef) break;
|
||||
HideConsole = ParseBool(paramValue);
|
||||
Logger.PrintColor($"隐藏控制台设置为: {HideConsole}");
|
||||
break;
|
||||
|
||||
case "show-window":
|
||||
case "showwindow":
|
||||
if (switchDef) break;
|
||||
ShowWindow = ParseBool(paramValue);
|
||||
Logger.PrintColor($"显示窗体设置为: {ShowWindow}");
|
||||
break;
|
||||
|
||||
// 轮询相关配置
|
||||
case "force-polling":
|
||||
case "forcepolling":
|
||||
if (switchDef) break;
|
||||
ForcePolling = ParseBool(paramValue);
|
||||
Logger.PrintColor($"强制轮询模式设置为: {ForcePolling}");
|
||||
break;
|
||||
|
||||
case "polling-interval":
|
||||
case "pollinginterval":
|
||||
if (int.TryParse(paramValue, out int interval))
|
||||
{
|
||||
PollingInterval = interval;
|
||||
Logger.PrintColor($"轮询间隔设置为: {interval}ms");
|
||||
}
|
||||
break;
|
||||
|
||||
case "disable-cache":
|
||||
case "disablecache":
|
||||
if (switchDef) break;
|
||||
DisableLivePageScriptCache = ParseBool(paramValue);
|
||||
Logger.PrintColor($"禁用脚本缓存设置为: {DisableLivePageScriptCache}");
|
||||
break;
|
||||
|
||||
// 直播伴侣相关
|
||||
case "auto-pause":
|
||||
case "autopause":
|
||||
if (switchDef) break;
|
||||
AutoPause = ParseBool(paramValue);
|
||||
Logger.PrintColor($"自动暂停设置为: {AutoPause}");
|
||||
break;
|
||||
|
||||
case "livecompan-path":
|
||||
case "livecompanpath":
|
||||
LiveCompanPath = paramValue;
|
||||
Logger.PrintColor($"直播伴侣路径设置为: {paramValue}");
|
||||
break;
|
||||
|
||||
case "livecompan-hook":
|
||||
case "livecompanhook":
|
||||
if (switchDef) break;
|
||||
LiveCompanHookSwitch = ParseBool(paramValue);
|
||||
Logger.PrintColor($"直播伴侣Hook开关设置为: {LiveCompanHookSwitch}");
|
||||
break;
|
||||
|
||||
// COM端口相关
|
||||
case "com":
|
||||
case "comport":
|
||||
if (!string.IsNullOrWhiteSpace(paramValue))
|
||||
{
|
||||
try
|
||||
{
|
||||
var parts = paramValue.Split(':');
|
||||
if (parts.Length == 2)
|
||||
{
|
||||
ComPort = parts[0].Trim();
|
||||
ComBaudRate = int.Parse(parts[1].Trim());
|
||||
ComPortSwitch = true;
|
||||
Logger.PrintColor($"COM端口设置为: {ComPort} 波特率: {ComBaudRate}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError($"COM端口配置格式错误: {ex.Message}");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// 配置文件相关
|
||||
case "config":
|
||||
case "jsonconfig":
|
||||
try
|
||||
{
|
||||
if (File.Exists(paramValue))
|
||||
{
|
||||
LoadFromJson();
|
||||
Logger.PrintColor($"已从JSON配置文件加载配置: {paramValue}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogError($"指定的配置文件不存在: {paramValue}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError($"加载JSON配置文件失败: {ex.Message}");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
Logger.LogWarn($"未知的命令行参数: {arg}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logger.PrintColor("命令行参数配置加载完成");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError($"命令行参数解析错误: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析布尔值字符串
|
||||
/// </summary>
|
||||
private bool ParseBool(string value)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
return false;
|
||||
|
||||
value = value.ToLower().Trim();
|
||||
|
||||
return value == "true" || value == "1" || value == "yes" || value == "y" || value == "on";
|
||||
}
|
||||
|
||||
//com串口设置
|
||||
private void ConfigComPort()
|
||||
@@ -65,7 +466,7 @@ namespace BarrageGrab
|
||||
var spit = comPort.Split(':');
|
||||
ComPort = spit[0].Trim();
|
||||
ComBaudRate = int.Parse(spit[1].Trim());
|
||||
UseComPortFilter = bool.Parse(AppSettings["useComPortFilter"]);
|
||||
ComPortSwitch = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -244,7 +645,7 @@ namespace BarrageGrab
|
||||
/// <summary>
|
||||
/// 是否启用串口过滤器脚本
|
||||
/// </summary>
|
||||
public bool UseComPortFilter { get; set; }
|
||||
public bool ComPortSwitch { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 直播伴侣文件位置
|
||||
|
||||
Reference in New Issue
Block a user