C# Timer-Filter 命令

Posted

技术标签:

【中文标题】C# Timer-Filter 命令【英文标题】:C# Timer-Filter for Command 【发布时间】: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 秒时才“启用”。

【问题讨论】:

【参考方案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 的键类型

以上是关于C# Timer-Filter 命令的主要内容,如果未能解决你的问题,请参考以下文章

[C#] C#代码执行cmd命令

C# 调用cmd命令

c#中有啥类似的fread命令

使用c#代码执行CutyCapt命令[重复]

如何解析 C# 的命令行输出?

通过 C# 代码执行 Powershell 命令