private Task PotentialFlowerGeneration(IUserMessage imsg)
        {
            var msg = imsg as SocketUserMessage;

            if (msg == null || msg.Author.IsBot)
            {
                return(Task.CompletedTask);
            }

            var channel = imsg.Channel as ITextChannel;

            if (channel == null)
            {
                return(Task.CompletedTask);
            }

            if (!GenerationChannels.Contains(channel.Id))
            {
                return(Task.CompletedTask);
            }

            var _ = Task.Run(async() =>
            {
                try
                {
                    var lastGeneration = LastGenerations.GetOrAdd(channel.Id, DateTime.MinValue);
                    var rng            = new NadekoRandom();

                    if (DateTime.UtcNow - TimeSpan.FromSeconds(_bc.BotConfig.CurrencyGenerationCooldown) < lastGeneration) //recently generated in this channel, don't generate again
                    {
                        return;
                    }

                    var num = rng.Next(1, 101) + _bc.BotConfig.CurrencyGenerationChance * 100;
                    if (num > 100 && LastGenerations.TryUpdate(channel.Id, DateTime.UtcNow, lastGeneration))
                    {
                        var dropAmount    = _bc.BotConfig.CurrencyDropAmount;
                        var dropAmountMax = _bc.BotConfig.CurrencyDropAmountMax;

                        if (dropAmountMax != null && dropAmountMax > dropAmount)
                        {
                            dropAmount = new NadekoRandom().Next(dropAmount, dropAmountMax.Value + 1);
                        }

                        if (dropAmount > 0)
                        {
                            var msgs   = new IUserMessage[dropAmount];
                            var prefix = _cmdHandler.GetPrefix(channel.Guild.Id);
                            var toSend = dropAmount == 1
                                ? GetText(channel, "curgen_sn", _bc.BotConfig.CurrencySign)
                                         + " " + GetText(channel, "pick_sn", prefix)
                                : GetText(channel, "curgen_pl", dropAmount, _bc.BotConfig.CurrencySign)
                                         + " " + GetText(channel, "pick_pl", prefix);
                            var file = GetRandomCurrencyImage();
                            using (var fileStream = file.Data.ToStream())
                            {
                                var sent = await channel.SendFileAsync(
                                    fileStream,
                                    file.Name,
                                    toSend).ConfigureAwait(false);

                                msgs[0] = sent;
                            }

                            PlantedFlowers.AddOrUpdate(channel.Id, msgs.ToList(), (id, old) => { old.AddRange(msgs); return(old); });
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogManager.GetCurrentClassLogger().Warn(ex);
                }
            });

            return(Task.CompletedTask);
        }
        private Task PotentialFlowerGeneration(SocketMessage imsg)
        {
            if (!(imsg is SocketUserMessage msg) || msg.Author.IsBot)
            {
                return(Task.CompletedTask);
            }

            if (!(imsg.Channel is ITextChannel channel))
            {
                return(Task.CompletedTask);
            }

            using var uow = _db.UnitOfWork;

            if (!uow.GuildConfigs.For(channel.GuildId, set => set.Include(x => x.GenerateCurrencyChannelIds)).GenerateCurrencyChannelIds.Any(gcc => gcc.ChannelId == channel.Id))
            {
                return(Task.CompletedTask);
            }

            var _ = Task.Run(async() => {
                try {
                    var lastGeneration = LastGenerations.GetOrAdd(channel.Id, DateTime.MinValue);
                    var rng            = new NadekoRandom();

                    if (DateTime.UtcNow - TimeSpan.FromSeconds(_bcp.BotConfig.CurrencyGenerationCooldown) < lastGeneration)                     //recently generated in this channel, don't generate again
                    {
                        return;
                    }

                    var num = rng.Next(1, 101) + _bcp.BotConfig.CurrencyGenerationChance * 100;
                    if (num > 100 && LastGenerations.TryUpdate(channel.Id, DateTime.UtcNow, lastGeneration))
                    {
                        var dropAmount    = _bcp.BotConfig.CurrencyDropAmount;
                        var dropAmountMax = _bcp.BotConfig.CurrencyDropAmountMax;

                        if (dropAmountMax != null && dropAmountMax > dropAmount)
                        {
                            dropAmount = new NadekoRandom().Next(dropAmount, dropAmountMax.Value + 1);
                        }

                        if (dropAmount > 0)
                        {
                            var msgs   = new IUserMessage[dropAmount];
                            var prefix = _cmdHandler.GetPrefix(channel.Guild.Id);
                            var toSend = dropAmount == 1
                                                                ? $"{GetText(channel, "curgen_sn", _bcp.BotConfig.CurrencySign)} {GetText(channel, "pick_sn", prefix)}"
                                                                : $"{GetText(channel, "curgen_pl", dropAmount, _bcp.BotConfig.CurrencySign)} {GetText(channel, "pick_pl", prefix)}";
                            var(Name, Data) = GetRandomCurrencyImage();
                            using (var fileStream = Data.ToStream()) {
                                var sent = await channel.SendFileAsync(fileStream, Name, toSend).ConfigureAwait(false);
                                msgs[0]  = sent;
                            }

                            PlantedFlowers.AddOrUpdate(channel.Id, msgs.ToList(), (id, old) => { old.AddRange(msgs); return(old); });
                        }
                    }
                } catch (Exception ex) {
                    LogManager.GetCurrentClassLogger().Warn(ex);
                }
            });

            return(Task.CompletedTask);
        }