5 个版本
0.2.2 | 2022 年 5 月 15 日 |
---|---|
0.2.1 | 2022 年 4 月 7 日 |
0.1.3 | 2022 年 3 月 30 日 |
在 #twilight 中排名第 27
每月下载量 29 次
11KB
114 行
Twilight Bucket
一个限制用户使用的工具包,Twilight 生态系统的一个第三方工具包
请参阅文档以获取更多信息
此工具包可以与任何库一起使用,但它与 Twilight 的非目标相同,例如试图更详尽且更少偏见,并且 Serenity 已经实现了桶的实现
贡献
贡献或甚至打开问题都非常受欢迎
许可证
许可 MIT,这是一个与 Twilight 组织无关的第三方工具包
lib.rs
:
Twilight Bucket
一个限制用户使用的工具包,Twilight 生态系统的一个第三方工具包
此工具包的所有功能都在 Bucket
下,请参阅其文档以获取使用信息
此工具包可以与任何库一起使用,但它与 Twilight 的非目标相同,例如试图更详尽且更少偏见,并且 Serenity 已经实现了桶的实现
示例
use std::{num::NonZeroU64, time::Duration};
use twilight_bucket::{Bucket, Limit};
#[tokio::main]
async fn main() {
// A user can use it once every 10 seconds
let my_command_user_bucket = Bucket::new(Limit::new(Duration::from_secs(10), 1));
// It can be used up to 5 times every 30 seconds in one channel
let my_command_channel_bucket = Bucket::new(Limit::new(Duration::from_secs(30), 5));
run_my_command(
my_command_user_bucket,
my_command_channel_bucket,
12345,
123,
)
.await;
}
async fn run_my_command(
user_bucket: Bucket,
channel_bucket: Bucket,
user_id: u64,
channel_id: u64,
) -> String {
if let Some(channel_limit_duration) = channel_bucket.limit_duration(channel_id) {
return format!(
"This was used too much in this channel, please wait {} seconds",
channel_limit_duration.as_secs()
);
}
if let Some(user_limit_duration) = user_bucket.limit_duration(user_id) {
if Duration::from_secs(5) > user_limit_duration {
tokio::time::sleep(user_limit_duration).await;
} else {
return format!(
"You've been using this too much, please wait {} seconds",
user_limit_duration.as_secs()
);
}
}
user_bucket.register(user_id);
channel_bucket.register(channel_id);
"Ran your command".to_owned()
}
依赖关系
~1–6MB
~20K SLoC