diff --git a/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs b/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs index b3a59feb..6576ce3d 100644 --- a/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs +++ b/NadekoBot/Modules/ClashOfClans/ClashOfClans.cs @@ -14,10 +14,14 @@ namespace NadekoBot.Classes.ClashOfClans { One, Two, Three } + public enum WarState + { + Started, Ended, Created + } [System.Serializable] internal class Caller { - public string CallUser { get; } + public string CallUser { get; set; } public DateTime TimeAdded { get; set; } @@ -25,6 +29,7 @@ namespace NadekoBot.Classes.ClashOfClans public int Stars { get; set; } = 3; + public Caller() { } public Caller(string callUser, DateTime timeAdded, bool baseDestroyed) { @@ -48,17 +53,18 @@ namespace NadekoBot.Classes.ClashOfClans { private static TimeSpan callExpire => new TimeSpan(2, 0, 0); - public string EnemyClan { get; } - public int Size { get; } + public string EnemyClan { get; set; } + public int Size { get; set; } - public Caller[] Bases { get; } - public bool Started { get; set; } = false; + public Caller[] Bases { get; set; } + public WarState WarState { get; set; } = WarState.Created; + //public bool Started { get; set; } = false; public DateTime StartedAt { get; private set; } - public bool Ended { get; private set; } = false; + //public bool Ended { get; private set; } = false; public ulong ServerId { get; set; } public ulong ChannelId { get; set; } - + [JsonIgnore] public Discord.Channel Channel { get; internal set; } @@ -74,12 +80,13 @@ namespace NadekoBot.Classes.ClashOfClans this.Bases = new Caller[size]; this.ServerId = serverId; this.ChannelId = channelId; - this.Channel = NadekoBot.Client.Servers.FirstOrDefault(s => s.Id == serverId)?.TextChannels.FirstOrDefault(c => c.Id == channelId); + this.Channel = NadekoBot.Client.Servers.FirstOrDefault(s=>s.Id == serverId)?.TextChannels.FirstOrDefault(c => c.Id == channelId); } internal void End() { - Ended = true; + //Ended = true; + WarState = WarState.Ended; } internal void Call(string u, int baseNumber) @@ -99,9 +106,12 @@ namespace NadekoBot.Classes.ClashOfClans internal void Start() { - if (Started) - throw new InvalidOperationException(); - Started = true; + if (WarState == WarState.Started) + throw new InvalidOperationException("War already started"); + //if (Started) + // throw new InvalidOperationException(); + //Started = true; + WarState = WarState.Started; StartedAt = DateTime.Now; foreach (var b in Bases.Where(b => b != null)) { @@ -129,7 +139,7 @@ namespace NadekoBot.Classes.ClashOfClans var sb = new StringBuilder(); sb.AppendLine($"🔰**WAR AGAINST `{EnemyClan}` ({Size} v {Size}) INFO:**"); - if (!Started) + if (WarState == WarState.Created) sb.AppendLine("`not started`"); for (var i = 0; i < Bases.Length; i++) { @@ -145,7 +155,7 @@ namespace NadekoBot.Classes.ClashOfClans } else { - var left = Started ? callExpire - (DateTime.Now - Bases[i].TimeAdded) : callExpire; + var left =(WarState == WarState.Started) ? callExpire - (DateTime.Now - Bases[i].TimeAdded) : callExpire; sb.AppendLine($"`{i + 1}.` ✅ `{Bases[i].CallUser}` {left.Hours}h {left.Minutes}m {left.Seconds}s left"); } } diff --git a/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs b/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs index ef9defd1..69ed1163 100644 --- a/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs +++ b/NadekoBot/Modules/ClashOfClans/ClashOfClansModule.cs @@ -58,6 +58,7 @@ namespace NadekoBot.Modules.ClashOfClans //Can't this be disabled if the modules is disabled too :) var callExpire = new TimeSpan(2, 0, 0); var warExpire = new TimeSpan(23, 0, 0); + bool changed = false; while (true) { try @@ -72,21 +73,29 @@ namespace NadekoBot.Modules.ClashOfClans List newVal = new List(); foreach (var w in cw.Value) { - if (!w.Ended && (DateTime.Now - w.StartedAt <= warExpire)) + //We add when A: the war is not ended + if (w.WarState != WarState.Ended) { + //and B: the war has not expired + if ((w.WarState == WarState.Started && DateTime.Now - w.StartedAt <= warExpire) || w.WarState == WarState.Created) + { newVal.Add(w); + } } } //var newVal = cw.Value.Where(w => !(w.Ended || DateTime.Now - w.StartedAt >= warExpire)).ToList(); foreach (var exWar in cw.Value.Except(newVal)) { - await exWar.Channel.SendMessage($"War against {exWar.EnemyClan} ({exWar.Size}v{exWar.Size})has ended."); + await exWar.Channel.SendMessage($"War against {exWar.EnemyClan} has ended"); } - ClashWars.AddOrUpdate(cw.Key, newVal, (x, s) => newVal); - if (cw.Value.Count == 0) + + if (newVal.Count == 0) { List obj; ClashWars.TryRemove(cw.Key, out obj); + } else + { + ClashWars.AddOrUpdate(cw.Key, newVal, (x, s) => newVal); } } if (hash != ClashWars.GetHashCode()) //something changed @@ -182,7 +191,7 @@ namespace NadekoBot.Modules.ClashOfClans cgb.CreateCommand(Prefix + "startwar") .Alias(Prefix + "sw") - .Description($"Starts a war with a given number. | `{Prefix}sw 1`") + .Description("Starts a war with a given number.") .Parameter("number", ParameterType.Required) .Do(async e => { @@ -202,6 +211,7 @@ namespace NadekoBot.Modules.ClashOfClans { await e.Channel.SendMessage($"🔰**WAR AGAINST {war.ShortPrint()} HAS ALREADY STARTED**").ConfigureAwait(false); } + Save(); }); cgb.CreateCommand(Prefix + "listwar") @@ -233,6 +243,7 @@ namespace NadekoBot.Modules.ClashOfClans } await e.Channel.SendMessage(sb.ToString()).ConfigureAwait(false); return; + } //if number is not null, print the war needed var warsInfo = GetInfo(e); @@ -274,6 +285,7 @@ namespace NadekoBot.Modules.ClashOfClans var war = warsInfo.Item1[warsInfo.Item2]; war.Call(usr, baseNum - 1); await e.Channel.SendMessage($"🔰**{usr}** claimed a base #{baseNum} for a war against {war.ShortPrint()}").ConfigureAwait(false); + Save(); } catch (Exception ex) { @@ -327,6 +339,7 @@ namespace NadekoBot.Modules.ClashOfClans var war = warsInfo.Item1[warsInfo.Item2]; var baseNumber = war.Uncall(usr); await e.Channel.SendMessage($"🔰 @{usr} has **UNCLAIMED** a base #{baseNumber + 1} from a war against {war.ShortPrint()}").ConfigureAwait(false); + Save(); } catch (Exception ex) { @@ -351,6 +364,7 @@ namespace NadekoBot.Modules.ClashOfClans var size = warsInfo.Item1[warsInfo.Item2].Size; warsInfo.Item1.RemoveAt(warsInfo.Item2); + Save(); }); }); @@ -376,6 +390,7 @@ namespace NadekoBot.Modules.ClashOfClans { var baseNum = war.FinishClaim(usr, stars); await e.Channel.SendMessage($"❗🔰{e.User.Mention} **DESTROYED** a base #{baseNum + 1} in a war against {war.ShortPrint()}").ConfigureAwait(false); + Save(); } catch (Exception ex) {