now >pick has 60 seconds cooldown
This commit is contained in:
		@@ -35,6 +35,8 @@ namespace NadekoBot.Modules.Games
 | 
				
			|||||||
            //channelId/last generation
 | 
					            //channelId/last generation
 | 
				
			||||||
            private static ConcurrentDictionary<ulong, DateTime> lastGenerations { get; } = new ConcurrentDictionary<ulong, DateTime>();
 | 
					            private static ConcurrentDictionary<ulong, DateTime> lastGenerations { get; } = new ConcurrentDictionary<ulong, DateTime>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            private static ConcurrentHashSet<ulong> usersRecentlyPicked { get; } = new ConcurrentHashSet<ulong>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            private static float chance { get; }
 | 
					            private static float chance { get; }
 | 
				
			||||||
            private static int cooldown { get; }
 | 
					            private static int cooldown { get; }
 | 
				
			||||||
            private static Logger _log { get; }
 | 
					            private static Logger _log { get; }
 | 
				
			||||||
@@ -101,23 +103,29 @@ namespace NadekoBot.Modules.Games
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                var channel = (ITextChannel)imsg.Channel;
 | 
					                var channel = (ITextChannel)imsg.Channel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (!channel.Guild.GetCurrentUser().GetPermissions(channel).ManageMessages)
 | 
					                if (!channel.Guild.GetCurrentUser().GetPermissions(channel).ManageMessages || !usersRecentlyPicked.Add(imsg.Author.Id))
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                try
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    await channel.SendErrorAsync("I need manage channel permissions in order to process this command.").ConfigureAwait(false);
 | 
					
 | 
				
			||||||
                    return;
 | 
					                    List<IUserMessage> msgs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    try { await imsg.DeleteAsync().ConfigureAwait(false); } catch { }
 | 
				
			||||||
 | 
					                    if (!plantedFlowers.TryRemove(channel.Id, out msgs))
 | 
				
			||||||
 | 
					                        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    await Task.WhenAll(msgs.Select(toDelete => toDelete.DeleteAsync())).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    await CurrencyHandler.AddCurrencyAsync((IGuildUser)imsg.Author, "Picked flower(s).", msgs.Count, false).ConfigureAwait(false);
 | 
				
			||||||
 | 
					                    var msg = await channel.SendConfirmAsync($"**{imsg.Author}** picked {msgs.Count}{Gambling.Gambling.CurrencySign}!").ConfigureAwait(false);
 | 
				
			||||||
 | 
					                    msg.DeleteAfter(10);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                finally
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    await Task.Delay(60000);
 | 
				
			||||||
 | 
					                    usersRecentlyPicked.TryRemove(imsg.Author.Id);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                List<IUserMessage> msgs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                try { await imsg.DeleteAsync().ConfigureAwait(false); } catch { }
 | 
					 | 
				
			||||||
                if (!plantedFlowers.TryRemove(channel.Id, out msgs))
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                await Task.WhenAll(msgs.Select(toDelete => toDelete.DeleteAsync())).ConfigureAwait(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                await CurrencyHandler.AddCurrencyAsync((IGuildUser)imsg.Author, "Picked flower(s).", msgs.Count, false).ConfigureAwait(false);
 | 
					 | 
				
			||||||
                var msg = await channel.SendConfirmAsync($"**{imsg.Author}** picked {msgs.Count}{Gambling.Gambling.CurrencySign}!").ConfigureAwait(false);
 | 
					 | 
				
			||||||
                msg.DeleteAfter(10);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            [NadekoCommand, Usage, Description, Aliases]
 | 
					            [NadekoCommand, Usage, Description, Aliases]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4767,7 +4767,7 @@ namespace NadekoBot.Resources {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        ///    Looks up a localized string similar to Picks the currency planted in this channel..
 | 
					        ///    Looks up a localized string similar to Picks the currency planted in this channel. 60 seconds cooldown..
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public static string pick_desc {
 | 
					        public static string pick_desc {
 | 
				
			||||||
            get {
 | 
					            get {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1363,7 +1363,7 @@
 | 
				
			|||||||
    <value>pick</value>
 | 
					    <value>pick</value>
 | 
				
			||||||
  </data>
 | 
					  </data>
 | 
				
			||||||
  <data name="pick_desc" xml:space="preserve">
 | 
					  <data name="pick_desc" xml:space="preserve">
 | 
				
			||||||
    <value>Picks the currency planted in this channel.</value>
 | 
					    <value>Picks the currency planted in this channel. 60 seconds cooldown.</value>
 | 
				
			||||||
  </data>
 | 
					  </data>
 | 
				
			||||||
  <data name="pick_usage" xml:space="preserve">
 | 
					  <data name="pick_usage" xml:space="preserve">
 | 
				
			||||||
    <value>`{0}pick`</value>
 | 
					    <value>`{0}pick`</value>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,80 +64,14 @@ namespace NadekoBot.Services
 | 
				
			|||||||
            _client.MessageReceived += MessageReceivedHandler;
 | 
					            _client.MessageReceived += MessageReceivedHandler;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async Task MessageReceivedHandler(IMessage msg)
 | 
					        private Task MessageReceivedHandler(IMessage msg)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var usrMsg = msg as IUserMessage;
 | 
					            var usrMsg = msg as IUserMessage;
 | 
				
			||||||
            if (usrMsg == null)
 | 
					            if (usrMsg == null)
 | 
				
			||||||
                return;
 | 
					                return Task.CompletedTask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (usrMsg.Author.IsBot || !NadekoBot.Ready) //no bots
 | 
					            if (usrMsg.Author.IsBot || !NadekoBot.Ready) //no bots
 | 
				
			||||||
                return;
 | 
					                return Task.CompletedTask;
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var guild = (msg.Channel as ITextChannel)?.Guild;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (guild != null && guild.OwnerId != usrMsg.Author.Id)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                if (Permissions.FilterCommands.InviteFilteringChannels.Contains(usrMsg.Channel.Id) ||
 | 
					 | 
				
			||||||
                    Permissions.FilterCommands.InviteFilteringServers.Contains(guild.Id))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    if (usrMsg.Content.IsDiscordInvite())
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        try
 | 
					 | 
				
			||||||
                        {
 | 
					 | 
				
			||||||
                            await usrMsg.DeleteAsync().ConfigureAwait(false);
 | 
					 | 
				
			||||||
                            return;
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                        catch (HttpException ex)
 | 
					 | 
				
			||||||
                        {
 | 
					 | 
				
			||||||
                            _log.Warn("I do not have permission to filter invites in channel with id " + usrMsg.Channel.Id, ex);
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                var filteredWords = Permissions.FilterCommands.FilteredWordsForChannel(usrMsg.Channel.Id, guild.Id).Concat(Permissions.FilterCommands.FilteredWordsForServer(guild.Id));
 | 
					 | 
				
			||||||
                var wordsInMessage = usrMsg.Content.ToLowerInvariant().Split(' ');
 | 
					 | 
				
			||||||
                if (filteredWords.Any(w => wordsInMessage.Contains(w)))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    try
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        await usrMsg.DeleteAsync().ConfigureAwait(false);
 | 
					 | 
				
			||||||
                        return;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    catch (HttpException ex)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        _log.Warn("I do not have permission to filter words in channel with id " + usrMsg.Channel.Id, ex);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            BlacklistItem blacklistedItem;
 | 
					 | 
				
			||||||
            if ((blacklistedItem = Permissions.BlacklistCommands.BlacklistedItems.FirstOrDefault(bi =>
 | 
					 | 
				
			||||||
                 (bi.Type == BlacklistItem.BlacklistType.Server && bi.ItemId == guild?.Id) ||
 | 
					 | 
				
			||||||
                 (bi.Type == BlacklistItem.BlacklistType.Channel && bi.ItemId == msg.Channel.Id) ||
 | 
					 | 
				
			||||||
                 (bi.Type == BlacklistItem.BlacklistType.User && bi.ItemId == usrMsg.Author.Id))) != null)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            try
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                var cleverbotExecuted = await Games.CleverBotCommands.TryAsk(usrMsg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (cleverbotExecuted)
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch (Exception ex) { _log.Warn(ex, "Error in cleverbot"); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            try
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // maybe this message is a custom reaction
 | 
					 | 
				
			||||||
                var crExecuted = await CustomReactions.TryExecuteCustomReaction(usrMsg).ConfigureAwait(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                //if it was, don't execute the command
 | 
					 | 
				
			||||||
                if (crExecuted)
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch { }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var throwaway = Task.Run(async () =>
 | 
					            var throwaway = Task.Run(async () =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@@ -146,6 +80,72 @@ namespace NadekoBot.Services
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                try
 | 
					                try
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
					                    var guild = (msg.Channel as ITextChannel)?.Guild;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (guild != null && guild.OwnerId != usrMsg.Author.Id)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if (Permissions.FilterCommands.InviteFilteringChannels.Contains(usrMsg.Channel.Id) ||
 | 
				
			||||||
 | 
					                            Permissions.FilterCommands.InviteFilteringServers.Contains(guild.Id))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            if (usrMsg.Content.IsDiscordInvite())
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                try
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    await usrMsg.DeleteAsync().ConfigureAwait(false);
 | 
				
			||||||
 | 
					                                    return;
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                catch (HttpException ex)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    _log.Warn("I do not have permission to filter invites in channel with id " + usrMsg.Channel.Id, ex);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        var filteredWords = Permissions.FilterCommands.FilteredWordsForChannel(usrMsg.Channel.Id, guild.Id).Concat(Permissions.FilterCommands.FilteredWordsForServer(guild.Id));
 | 
				
			||||||
 | 
					                        var wordsInMessage = usrMsg.Content.ToLowerInvariant().Split(' ');
 | 
				
			||||||
 | 
					                        if (filteredWords.Any(w => wordsInMessage.Contains(w)))
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            try
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                await usrMsg.DeleteAsync().ConfigureAwait(false);
 | 
				
			||||||
 | 
					                                return;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            catch (HttpException ex)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                _log.Warn("I do not have permission to filter words in channel with id " + usrMsg.Channel.Id, ex);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    BlacklistItem blacklistedItem;
 | 
				
			||||||
 | 
					                    if ((blacklistedItem = Permissions.BlacklistCommands.BlacklistedItems.FirstOrDefault(bi =>
 | 
				
			||||||
 | 
					                         (bi.Type == BlacklistItem.BlacklistType.Server && bi.ItemId == guild?.Id) ||
 | 
				
			||||||
 | 
					                         (bi.Type == BlacklistItem.BlacklistType.Channel && bi.ItemId == msg.Channel.Id) ||
 | 
				
			||||||
 | 
					                         (bi.Type == BlacklistItem.BlacklistType.User && bi.ItemId == usrMsg.Author.Id))) != null)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        return;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        var cleverbotExecuted = await Games.CleverBotCommands.TryAsk(usrMsg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (cleverbotExecuted)
 | 
				
			||||||
 | 
					                            return;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    catch (Exception ex) { _log.Warn(ex, "Error in cleverbot"); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        // maybe this message is a custom reaction
 | 
				
			||||||
 | 
					                        var crExecuted = await CustomReactions.TryExecuteCustomReaction(usrMsg).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        //if it was, don't execute the command
 | 
				
			||||||
 | 
					                        if (crExecuted)
 | 
				
			||||||
 | 
					                            return;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    catch { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, MultiMatchHandling.Best);
 | 
					                    var t = await ExecuteCommand(usrMsg, usrMsg.Content, guild, usrMsg.Author, MultiMatchHandling.Best);
 | 
				
			||||||
                    var command = t.Item1;
 | 
					                    var command = t.Item1;
 | 
				
			||||||
                    var permCache = t.Item2;
 | 
					                    var permCache = t.Item2;
 | 
				
			||||||
@@ -209,7 +209,8 @@ namespace NadekoBot.Services
 | 
				
			|||||||
                        _log.Warn(ex.InnerException, "Inner Exception of the error in CommandHandler");
 | 
					                        _log.Warn(ex.InnerException, "Inner Exception of the error in CommandHandler");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            return;
 | 
					
 | 
				
			||||||
 | 
					            return Task.CompletedTask;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public async Task<Tuple<Command, PermissionCache, IResult>> ExecuteCommand(IUserMessage message, string input, IGuild guild, IUser user, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Best) {
 | 
					        public async Task<Tuple<Command, PermissionCache, IResult>> ExecuteCommand(IUserMessage message, string input, IGuild guild, IUser user, MultiMatchHandling multiMatchHandling = MultiMatchHandling.Best) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user