5 个版本

0.2.2 2022 年 5 月 15 日
0.2.1 2022 年 4 月 7 日
0.1.3 2022 年 3 月 30 日

#twilight 中排名第 27

每月下载量 29

MIT 许可证

11KB
114

docs.rs - read crates.io - view

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