#cloudflare-workers #async #http #wasm #async-api #discord-bot #api-bindings

worker-wasm-interactions-rs

一个基于 Cloudflare Workers 编写的交互式 Discord 机器人库

1 个不稳定版本

0.0.1 2022 年 10 月 27 日

#43#cloudflare-workers

Apache-2.0 协议

19KB
342

Cloudflare Worker WASM 交互式 Rust

使用 Rust 在 Cloudflare Workers 上简单构建交互式 Discord 机器人。

示例代码

请注意,您不应该在 customId 字段中使用 roleId 来创建反应角色,因为这可以被轻松操纵。为了简化本示例,我们在这里忽略这个漏洞。

use std::str::FromStr;
use twilight_model::id::Id;
use worker::*;
use crate::{CustomIdPattern, Interactions, util};
use crate::RouterExt;

#[event(fetch)]
pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
    let mut interactions = Interactions::new(env.secret("DISCORD_PUBLIC_KEY")?.to_string(),
                                             env.secret("DISCORD_TOKEN")?.to_string());

    interactions.register_application_command_handler("ping", |context| async move {
        context.followup(true, |builder| {
            builder.content("Pong");
        })
    });

    let pattern = CustomIdPattern::starts_with("rr-".to_string());
    interactions.register_message_component_handler(pattern, |context| async move {
        let role_id = context.data.custom_id.as_str()[3..].to_string();
        context.rest.add_guild_member_role(
            context.guild_id().unwrap(),
            context.user_id().unwrap(),
            Id::from_str(role_id.as_str()).unwrap(),
        ).exec().await.map_err(util::map_error)?;

        context.followup(true, |builder| {
            builder.content("Done!");
        })
    });

    let router = Router::with_data(interactions);

    router
        .get("/", |_, _| Response::ok("Hello from Workers!"))
        .interactions("/interaction")
        .run(req, env)
        .await
}

依赖关系

~17–31MB
~509K SLoC