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) =>
行中说“id”“无法从'ulong' 转换为'string',在“nowUtc”上说“无法从'System.DateTimeOffset' 转换为' Sytem.Func以上是关于C# Timer-Filter 命令的主要内容,如果未能解决你的问题,请参考以下文章