1 个不稳定版本
0.0.1 | 2022 年 10 月 27 日 |
---|
#43 在 #cloudflare-workers
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