用于命令的 C# 计时器筛选器



首先,我对编码很陌生。我目前正在尝试对我的 Discord 机器人进行编程,但我遇到了这个问题:

我想创建一个带有计时器的命令,

因此每次有人使用此命令时,计时器都会开始滴答作响,并且在计时器达到一定秒数后,用户可以再次使用此命令。该命令是一个"笑话命令",每次使用它时,机器人都会告诉你一个笑话。

有没有办法实现这一点?

我目前有这个:

        //joke-integer
        int jokeNumber;
        jokeNumber = 0;
        //joke-list
        joke = new string[]
        {
            "aaa",
            "bbb",
            "ccc",
        };
        //joke-command
        commands.CreateCommand("joke")
            .Do(async e =>
            {
                jokeNumber = jokeNumber + 1;
                if (jokeNumber.Equals(3))
                {
                    jokeNumber = 0;
                }
                else
                {
                    jokeNumber = jokeNumber + 0;
                }
                string jokePost = joke[jokeNumber];
                await e.Channel.SendMessage(jokePost);
            });

所以这个 (^( 只是告诉你一个笑话,如果你使用命令"!joke",但我希望这个命令只有在计时器通过例如 100 秒时才"启用"。

您需要存储用户上次请求命令的时间,然后在每次请求新命令时检查此日期。

在课堂内:

private static readonly ConcurrentDictionary<long, DateTimeOffset> UsersJokesLastCall = new ConcurrentDictionary<long, DateTimeOffset>();

创建命令时:

commands.CreateCommand("joke")
    .Do(async e =>
    {
        var id = e.ChannelId; // example using channel id as unique key
        var nowUtc = DateTimeOffset.UtcNow;
        var canReturnJoke = true;
        UsersJokesLastCall.AddOrUpdate(id, nowUtc, (key, oldValue) =>
        {
            var elapsed = nowUtc - oldValue; // check elapsed time
            if(elapsed.TotalSeconds < 100)
            {
                canReturnJoke = false; // min time has not passed
                return oldValue; // do not change the last joke time
            }
            return nowUtc; // update to current time
        });
        if(!canReturnJoke)
        {
            // return something to the user
            await e.Channel.SendMessage("Try later");
            return;
        }
        jokeNumber = jokeNumber + 1;
        if (jokeNumber.Equals(3))
        {
            jokeNumber = 0;
        }
        else
        {
            jokeNumber = jokeNumber + 0;
        }
        string jokePost = joke[jokeNumber];
        await e.Channel.SendMessage(jokePost);
    });

您可能需要进一步处理此代码,但这应该为您提供整体方法。

相关内容

  • 没有找到相关文章

最新更新