命令的 C# 定时器过滤器
C# Timer-Filter for Command
首先,我对编码还很陌生。我目前正在尝试对我的 Discord-bot 进行编程,我 运行 解决了这个问题:
我想创建一个带有计时器的命令,所以每次有人使用这个命令时,计时器开始计时,在计时器达到一定秒数后,用户可以再次使用这个命令。该命令是 "joke-command",每次您使用它时,机器人都会告诉您一个笑话。
有没有办法实现这个?
我目前有这个:
//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 秒时为 "enabled"。
您需要存储用户最后一次请求命令的时间,然后在每次请求新命令时检查此日期。
在你的 class 里面:
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);
});
您可能需要进一步处理此代码,但这应该为您提供了总体方法。
首先,我对编码还很陌生。我目前正在尝试对我的 Discord-bot 进行编程,我 运行 解决了这个问题:
我想创建一个带有计时器的命令,所以每次有人使用这个命令时,计时器开始计时,在计时器达到一定秒数后,用户可以再次使用这个命令。该命令是 "joke-command",每次您使用它时,机器人都会告诉您一个笑话。
有没有办法实现这个?
我目前有这个:
//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 秒时为 "enabled"。
您需要存储用户最后一次请求命令的时间,然后在每次请求新命令时检查此日期。
在你的 class 里面:
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);
});
您可能需要进一步处理此代码,但这应该为您提供了总体方法。