X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=KancolleSniffer%2FConfig.cs;h=7f09eb1abcb74f7ca4c23ca6eec7fcf8d449c9e2;hb=HEAD;hp=45fe25e376e22871c0866b087b1ac7d251ade3f3;hpb=50bda7686430c968f2e090471fbe9acb83def4f6;p=kancollesniffer%2FKancolleSniffer.git diff --git a/KancolleSniffer/Config.cs b/KancolleSniffer/Config.cs index 45fe25e..7f09eb1 100644 --- a/KancolleSniffer/Config.cs +++ b/KancolleSniffer/Config.cs @@ -18,12 +18,17 @@ using System.Drawing; using System.IO; using System.Linq; using System.Xml.Serialization; +using KancolleSniffer.Forms; + +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable AutoPropertyCanBeMadeGetOnly.Global +// ReSharper disable FieldCanBeMadeReadOnly.Global namespace KancolleSniffer { public class ProxyConfig { - public const int DefaultListenPort = 8080; + private const int DefaultListenPort = 8080; public bool Auto { get; set; } public int Listen { get; set; } public bool UseUpstream { get; set; } @@ -38,14 +43,35 @@ namespace KancolleSniffer } } + [Flags] + public enum ShipCategory + { + // ReSharper disable UnusedMember.Global + None = 0, + BattleShip = 1, + AircraftCarrier = 1 << 1, + HeavyCruiser = 1 << 2, + LightCruiser = 1 << 3, + Destroyer = 1 << 4, + Escort = 1 << 5, + Submarine = 1 << 6, + Assistant = 1 << 7, + // ReSharper restore UnusedMember.Global + All = (1 << 8) - 1 + } + public class ShipListConfig { + public bool Visible { get; set; } public Point Location { get; set; } public Size Size { get; set; } + public string Mode { get; set; } + public ShipCategory ShipCategories { get; set; } = ShipCategory.All; public bool ShipType { get; set; } public bool ShowHpInPercent { get; set; } public ListForm.SortOrder SortOrder { get; set; } = ListForm.SortOrder.ExpToNext; public List> ShipGroup { get; set; } + public bool AutoBattleResult { get; set; } = true; public ShipListConfig() { @@ -68,23 +94,24 @@ namespace KancolleSniffer } } - public class KancolleDbConfig + public class PushbulletConfig { public bool On { get; set; } public string Token { get; set; } = ""; } - public class PushbulletConfig + public class PushoverConfig { public bool On { get; set; } - public string Token { get; set; } = ""; + public string ApiKey { get; set; } = ""; + public string UserKey { get; set; } = ""; } public class SoundConfig { public int Volume { get; set; } = 100; - public string[] Files { get; set; } = + public string[] Files = { "ensei.mp3", "nyuukyo.mp3", @@ -95,7 +122,8 @@ namespace KancolleSniffer "20min.mp3", "syuuri.mp3", "syuuri2.mp3", - "hirou.mp3" + "hirou.mp3", + "ninmu.mp3" }; public string this[string name] @@ -109,10 +137,22 @@ namespace KancolleSniffer public enum NotificationType { FlashWindow = 1, + // ReSharper disable once IdentifierTypo ShowBaloonTip = 1 << 1, PlaySound = 1 << 2, - Pushbullet = 1 << 3, - All = (1 << 3) - 1 // Pushbullet以外 + All = (1 << 3) - 1, + Push = 1 << 4, + Repeat = 1 << 5, + Cont = 1 << 6, + Preliminary = 1 << 7 + } + + public class NotificationSpec + { + public string Name { get; set; } + public NotificationType Flags { get; set; } + public int RepeatInterval { get; set; } + public int PreliminaryPeriod { get; set; } } public class NotificationConfig @@ -120,10 +160,27 @@ namespace KancolleSniffer public NotificationType[] Settings = Config.NotificationNames.Select(x => NotificationType.All).ToArray(); - public NotificationType this[string name] + public int[] RepeatIntervals = + Config.NotificationNames.Select(x => 0).ToArray(); + + public int[] PreliminaryPeriods = + Config.NotificationNames.Select(x => 0).ToArray(); + + public NotificationSpec this[string name] { - get => Settings[Config.NotificationIndex[name]]; - set => Settings[Config.NotificationIndex[name]] = value; + get => new NotificationSpec + { + Name = name, + Flags = Settings[Config.NotificationIndex[name]], + RepeatInterval = RepeatIntervals[Config.NotificationIndex[name]], + PreliminaryPeriod = PreliminaryPeriods[Config.NotificationIndex[name]] + }; + set + { + Settings[Config.NotificationIndex[name]] = value.Flags; + RepeatIntervals[Config.NotificationIndex[name]] = value.RepeatInterval; + PreliminaryPeriods[Config.NotificationIndex[name]] = value.PreliminaryPeriod; + } } } @@ -134,56 +191,80 @@ namespace KancolleSniffer public int Zoom { get; set; } = 100; public Point ListLocation { get; set; } public Size ListSize { get; set; } + public List ListFromGroup { get; set; } } - public class Config + [Flags] + public enum Spoiler { - private readonly string _baseDir = AppDomain.CurrentDomain.BaseDirectory; - private readonly string _configFileName; + ResultRank = 1, + AirBattleResult = 1 << 1, + BattleResult = 1 << 2, + NextCell = 1 << 3, + // ReSharper disable once UnusedMember.Global + All = (1 << 4) - 1 + } + + [Flags] + public enum TimerKind + { + Mission = 1, + NDock = 1 << 1 + } + + public class Config + { public Point Location { get; set; } = new Point(int.MinValue, int.MinValue); public bool TopMost { get; set; } public bool HideOnMinimized { get; set; } public bool ExitSilently { get; set; } public int Zoom { get; set; } = 100; + public string Shape { get; set; } = "縦長"; + public int QuestLines { get; set; } = 6; public bool SaveLocationPerMachine { get; set; } public List LocationList { get; set; } = new List(); public bool ShowHpInPercent { get; set; } - public bool FlashWindow { get; set; } = true; - public bool ShowBaloonTip { get; set; } - public bool PlaySound { get; set; } = true; + public TimerKind ShowEndTime { get; set; } + public NotificationType NotificationFlags { get; set; } = NotificationType.All; public NotificationConfig Notifications { get; set; } = new NotificationConfig(); - public int MarginShips { get; set; } = 4; - public int MarginEquips { get; set; } = 10; + public int MarginShips { get; set; } = 5; + public int MarginEquips { get; set; } = 5; public List NotifyConditions { get; set; } public List ResetHours { get; set; } - public bool AlwaysShowResultRank { get; set; } + public Spoiler Spoilers { get; set; } public bool UsePresetAkashi { get; set; } + public bool WarnBadDamageWithDameCon { get; set; } public SoundConfig Sounds { get; set; } = new SoundConfig(); public bool DebugLogging { get; set; } public string DebugLogFile { get; set; } = "log.txt"; public ProxyConfig Proxy { get; set; } = new ProxyConfig(); public ShipListConfig ShipList { get; set; } = new ShipListConfig(); + public List ListFormGroup { get; set; } = new List(); public LogConfig Log { get; set; } = new LogConfig(); - public KancolleDbConfig KancolleDb { get; set; } = new KancolleDbConfig(); public PushbulletConfig Pushbullet { get; set; } = new PushbulletConfig(); + public PushoverConfig Pushover { get; set; } = new PushoverConfig(); public static readonly string[] NotificationNames = { "遠征終了", "入渠終了", "建造完了", "艦娘数超過", "装備数超過", - "大破警告", "泊地修理20分経過", "泊地修理進行", "泊地修理完了", "疲労回復" + "大破警告", "泊地修理20分経過", "泊地修理進行", "泊地修理完了", "疲労回復", "任務達成" }; public static readonly Dictionary NotificationIndex = NotificationNames.Select((name, i) => new {name, i}).ToDictionary(entry => entry.name, entry => entry.i); + + private const string FileName = "config.xml"; + public static readonly string BaseDir = AppDomain.CurrentDomain.BaseDirectory; + private static readonly string ConfigFile = Path.Combine(BaseDir, FileName); + public Config() { - _configFileName = Path.Combine(_baseDir, "config.xml"); ConvertPath(PrependBaseDir); } - public void InitializeValues() + private void InitializeValues() { NotifyConditions = new List(new[] {40, 49}); ResetHours = new List(new[] {2}); @@ -195,7 +276,7 @@ namespace KancolleSniffer { var serializer = new XmlSerializer(typeof(Config)); Config config; - using (var file = File.OpenText(_configFileName)) + using (var file = File.OpenText(ConfigFile)) config = (Config)serializer.Deserialize(file); foreach (var property in GetType().GetProperties()) property.SetValue(this, property.GetValue(config, null), null); @@ -209,15 +290,20 @@ namespace KancolleSniffer Zoom = l.Zoom; ShipList.Location = l.ListLocation; ShipList.Size = l.ListSize; + ListFormGroup = l.ListFromGroup; } } } catch (FileNotFoundException) { InitializeValues(); - ReadOldConfig(); Save(); } + catch (InvalidOperationException ex) + { + File.Delete(ConfigFile); + throw new Exception(FileName + "が壊れています。", ex); + } ConvertPath(PrependBaseDir); } @@ -232,7 +318,8 @@ namespace KancolleSniffer Location = Location, Zoom = Zoom, ListLocation = ShipList.Location, - ListSize = ShipList.Size + ListSize = ShipList.Size, + ListFromGroup = ListFormGroup }); } else @@ -241,8 +328,11 @@ namespace KancolleSniffer } ConvertPath(StripBaseDir); var serializer = new XmlSerializer(typeof(Config)); - using (var file = File.CreateText(_configFileName)) + using (var file = File.CreateText(ConfigFile + ".tmp")) serializer.Serialize(file, this); + File.Copy(ConfigFile + ".tmp", ConfigFile, true); + File.Delete(ConfigFile + ".tmp"); + ConvertPath(PrependBaseDir); } private void ConvertPath(Func func) @@ -255,66 +345,12 @@ namespace KancolleSniffer private string StripBaseDir(string path) { - if (!path.StartsWith(_baseDir)) + if (!path.StartsWith(BaseDir)) return path; - path = path.Substring(_baseDir.Length); - return path.StartsWith(Path.DirectorySeparatorChar.ToString()) ? path.Substring(1) : path; + path = path.Substring(BaseDir.Length); + return path.TrimStart(Path.DirectorySeparatorChar); } - private string PrependBaseDir(string path) => Path.IsPathRooted(path) ? path : Path.Combine(_baseDir, path); - - private void ReadOldConfig() - { - var old = Path.Combine(_baseDir, "config.json"); - dynamic json; - try - { - json = JsonParser.Parse(File.ReadAllText(old)); - } - catch (FileNotFoundException) - { - return; - } - Location = new Point((int)json.Location.X, (int)json.Location.Y); - foreach (var property in (from prop in GetType().GetProperties() - let type = prop.PropertyType - where type == typeof(bool) || type == typeof(int) || type == typeof(string) - select prop)) - { - if (!json.IsDefined(property.Name)) - continue; - var v = json[property.Name]; - property.SetValue(this, property.PropertyType == typeof(int) ? (int)v : v); - } - NotifyConditions = new List((int[])json.NotifyConditions); - ResetHours = new List((int[])json.ResetHours); - Sounds.Volume = (int)json.SoundVolume; - var idx = 0; - foreach (var name in new[] - { - "Mission", "NDock", "KDock", "MaxShips", "MaxEquips", - "DamagedShip", "Akashi20Min", "AkashiProgress", "AkashiComplete", "Condition" - }) - { - if (json.IsDefined(name + "SoundFile")) - Sounds.Files[idx] = json[name + "SoundFile"]; - idx++; - } - Proxy.Auto = json.Proxy.Auto; - Proxy.Listen = (int)json.Proxy.Listen; - Proxy.UseUpstream = json.Proxy.UseUpstream; - Proxy.UpstreamPort = (int)json.Proxy.UpstreamPort; - var sl = json.ShipList; - ShipList.Location = new Point((int)sl.Location.X, (int)sl.Location.Y); - ShipList.Size = new Size((int)sl.Size.Width, (int)sl.Size.Height); - ShipList.ShipType = sl.ShipType; - var sg = (int[][])sl.ShipGroup; - ShipList.ShipGroup = new List>(); - foreach (var g in sg) - ShipList.ShipGroup.Add(new List(g)); - Log.On = json.Log.On; - Log.OutputDir = json.Log.OutputDir; - Log.MaterialLogInterval = (int)json.Log.MaterialLogInterval; - } + private string PrependBaseDir(string path) => Path.IsPathRooted(path) ? path : Path.Combine(BaseDir, path); } } \ No newline at end of file