首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#定时器-命令过滤器

问C#定时器-命令过滤器
EN

Stack Overflow用户
提问于 2017-06-11 13:40:06
回答 1查看 346关注 0票数 0

首先,我对编码很陌生。我目前正试图对我的不和-机器人-进行编程,然后我遇到了这个问题:

我想要创建一个带有计时器的命令,所以每次有人使用这个命令时,计时器就会开始滴答作响,在计时器达到一定的秒后,用户可以再次使用这个命令。这个命令是一个“笑话-命令”,每次你使用它时,机器人都会告诉你一个笑话。

有没有办法实现这一点?

我现在有这样的情况:

代码语言:javascript
复制
        //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);
            });

因此,这个(^)只是告诉你一个笑话,从一个列表中,如果你使用的命令“!笑话”,但我希望这个命令只有“启用”,如果计时器通过,例如100秒。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-11 14:39:21

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

在你的班级里:

代码语言:javascript
复制
private static readonly ConcurrentDictionary<long, DateTimeOffset> UsersJokesLastCall = new ConcurrentDictionary<long, DateTimeOffset>();

创建命令时:

代码语言:javascript
复制
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);
    });

您可能需要进一步研究这段代码,但这将为您提供总体方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44484497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档