【问题标题】:C# Timer-Filter for CommandC# Timer-Filter 命令
【发布时间】:2017-11-13 01:09:03
【问题描述】:

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

我想创建一个带有计时器的命令,因此每次有人使用此命令时,计时器都会开始计时,并且在计时器达到一定的秒数后,用户可以再次使用此命令。该命令是一个“笑话命令”,每次你使用它时,机器人都会告诉你一个笑话。

有没有办法实现这个?

我目前有这个:

        //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 秒时才“启用”。

【问题讨论】:

    标签: c# timer bots discord discord.net


    【解决方案1】:

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

    在你的课堂上:

    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);
        });
    

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

    【讨论】:

    • 表示当前上下文中不存在“nowUtc”。
    • 我确实忘记添加var nowUtc = DateTimeOffset.UtcNow;。现已修复。
    • 现在在UsersJokesLastCall.AddOrUpdate(id, nowUtc, (key, oldValue) =&gt; 行中说“id”“无法从'ulong' 转换为'string',在“nowUtc”上说“无法从'System.DateTimeOffset' 转换为' Sytem.Func' "
    • 正如我所说,您必须处理代码。如果 id 很长而不是字符串,则使用 long 作为 ConcurrentDictionary 的键类型
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多