From 2fda1c0dbb66f39174a18fafe6368c4a2fa9733f Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Thu, 7 Jul 2016 18:43:29 +0200 Subject: [PATCH] Added optional cooldown for `>gc`, Nadeko can no longer trigger random flower by herself. --- NadekoBot/Classes/ServerSpecificConfig.cs | 6 +-- NadekoBot/Modules/Games/Commands/PlantPick.cs | 44 ++++++++++++------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/NadekoBot/Classes/ServerSpecificConfig.cs b/NadekoBot/Classes/ServerSpecificConfig.cs index bbc4eadd..f99d36dc 100644 --- a/NadekoBot/Classes/ServerSpecificConfig.cs +++ b/NadekoBot/Classes/ServerSpecificConfig.cs @@ -148,8 +148,8 @@ namespace NadekoBot.Classes } [JsonIgnore] - private ObservableCollection generateCurrencyChannels; - public ObservableCollection GenerateCurrencyChannels { + private ObservableConcurrentDictionary generateCurrencyChannels; + public ObservableConcurrentDictionary GenerateCurrencyChannels { get { return generateCurrencyChannels; } set { generateCurrencyChannels = value; @@ -204,7 +204,7 @@ namespace NadekoBot.Classes { ListOfSelfAssignableRoles = new ObservableCollection(); ObservingStreams = new ObservableCollection(); - GenerateCurrencyChannels = new ObservableCollection(); + GenerateCurrencyChannels = new ObservableConcurrentDictionary(); VoiceChannelLog = new ObservableConcurrentDictionary(); } diff --git a/NadekoBot/Modules/Games/Commands/PlantPick.cs b/NadekoBot/Modules/Games/Commands/PlantPick.cs index ccb9aafc..ccb68660 100644 --- a/NadekoBot/Modules/Games/Commands/PlantPick.cs +++ b/NadekoBot/Modules/Games/Commands/PlantPick.cs @@ -28,26 +28,32 @@ namespace NadekoBot.Modules.Games.Commands rng = new Random(); } + private static readonly ConcurrentDictionary plantpickCooldowns = new ConcurrentDictionary(); private async void PotentialFlowerGeneration(object sender, Discord.MessageEventArgs e) { try { - if (e.Server == null || e.Channel.IsPrivate) + if (e.Server == null || e.Channel.IsPrivate || e.Message.IsAuthor) return; var config = Classes.SpecificConfigurations.Default.Of(e.Server.Id); - if (config.GenerateCurrencyChannels.Contains(e.Channel.Id)) - { - var rnd = Math.Abs(GetRandomNumber()); - if ((rnd % 50) == 0) + var now = DateTime.Now; + int cd; + DateTime lastSpawned; + if (config.GenerateCurrencyChannels.TryGetValue(e.Channel.Id, out cd)) + if (!plantpickCooldowns.TryGetValue(e.Channel.Id, out lastSpawned) || (lastSpawned + new TimeSpan(0, cd, 0)) < now) { - var msg = await e.Channel.SendFile(GetRandomCurrencyImagePath()); - var msg2 = await e.Channel.SendMessage($"❗ A random {NadekoBot.Config.CurrencyName} appeared! Pick it up by typing `>pick`"); - plantedFlowerChannels.AddOrUpdate(e.Channel.Id, msg, (u, m) => { m.Delete().GetAwaiter().GetResult(); return msg; }); - await Task.Delay(5000); - await msg2.Delete(); + var rnd = Math.Abs(GetRandomNumber()); + if ((rnd % 2) == 0) + { + var msg = await e.Channel.SendFile(GetRandomCurrencyImagePath()); + var msg2 = await e.Channel.SendMessage($"❗ A random {NadekoBot.Config.CurrencyName} appeared! Pick it up by typing `>pick`"); + plantedFlowerChannels.AddOrUpdate(e.Channel.Id, msg, (u, m) => { m.Delete().GetAwaiter().GetResult(); return msg; }); + plantpickCooldowns.AddOrUpdate(e.Channel.Id, now, (i, d) => now); + await Task.Delay(5000); + await msg2.Delete(); + } } - } } catch { } } @@ -110,19 +116,27 @@ namespace NadekoBot.Modules.Games.Commands cgb.CreateCommand(Prefix + "gencurrency") .Alias(Prefix + "gc") - .Description($"Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a {NadekoBot.Config.CurrencyName}. Requires Manage Messages permission. | `>gc`") + .Description($"Toggles currency generation on this channel. Every posted message will have 2% chance to spawn a {NadekoBot.Config.CurrencyName}. Optional parameter cooldown time in minutes, 5 minutes by default. Requires Manage Messages permission. | `>gc` or `>gc 60`") .AddCheck(SimpleCheckers.ManageMessages()) + .Parameter("cd", ParameterType.Unparsed) .Do(async e => { + var cdStr = e.GetArg("cd"); + int cd = 2; + if (!int.TryParse(cdStr, out cd) || cd < 0) + { + cd = 2; + } var config = SpecificConfigurations.Default.Of(e.Server.Id); - if (config.GenerateCurrencyChannels.Remove(e.Channel.Id)) + int throwaway; + if (config.GenerateCurrencyChannels.TryRemove(e.Channel.Id, out throwaway)) { await e.Channel.SendMessage("`Currency generation disabled on this channel.`"); } else { - config.GenerateCurrencyChannels.Add(e.Channel.Id); - await e.Channel.SendMessage("`Currency generation enabled on this channel.`"); + if (config.GenerateCurrencyChannels.TryAdd(e.Channel.Id, cd)) + await e.Channel.SendMessage($"`Currency generation enabled on this channel. Cooldown is {cd} minutes.`"); } }); }