#discord #twilight #discord-api #third-party #sticker #reaction

sparkle-impostor

Twilight 的第三方 crate,用于执行 Discord Webhook 来克隆现有消息

1 个不稳定版本

0.15.0 2023 年 8 月 11 日

#1045异步

ISC 许可证

64KB
1K SLoC

✨🥸 Sparkle Impostor

Twilight 的第三方 crate,用于执行 Discord Webhook 来克隆现有消息

✨ 功能

这个项目比预期的要复杂(并且痛苦)得多,所以让我列出它能做什么

可选功能用于边缘情况

  • 通过链接或重新上传来克隆附件或贴纸
  • 克隆 URL 组件
  • 克隆原始消息之后发送的消息,甚至将它们组合起来以减少 Webhook 执行
  • 克隆反应
  • 通过嵌入来克隆引用
  • 克隆线程/论坛帖子中的消息或用于启动线程/论坛帖子的消息
  • 清理无效的用户名
  • 删除原始消息和之后发送的消息

通用功能

  • 复制作者的 avatar、embed 等
  • 更改新消息的任何信息,例如克隆到另一个频道
  • 处理速率限制重试
  • Builder 模式以保持代码整洁
  • 避免克隆和不必要的反序列化
  • 广泛使用集成测试 (源代码和测试代码的 LOC 约为 1:1)

😋 Sparkle Impostor 的一瞥

这同时也作为示例,因为它包括了大部分的 API 面积

let mut source = MessageSource::from_message(&message, &http)
    .expect("message really can't be cloned (voice message etc)");

// example error handling
if let Err(_) = source.check_component() {
    panic!("invalid components scare me");
}

let later_messages = source.later_messages_batched().await?;

// a lot of edge cases
source
    .webhook_name("custom modified exclusive webhook name".to_owned())
    .handle_attachment_link()?
    .handle_sticker_link()?
    .handle_reaction()
    .await?
    .handle_reference()?
    .handle_thread()
    .await?
    .sanitize_username("?", "????")
    .create()
    .await?
    .handle_thread_created()
    .await?;

for later_message in later_messages {
    // create every message sent later
    later_message?.create().await?;
}

📦 Cargo 特性

  • upload: 启用重新上传附件的方法

🙏 反馈

尽管经过广泛测试,但仍可能存在错误,或者您可能有功能建议,请为这些创建问题!

🧪 测试

该 crate 使用集成测试而不是单元测试来测试实际使用情况。它创建一条消息并克隆它,然后测试人员检查消息是否按预期克隆

开始之前,设置以下环境变量,您也可以将它们放入一个 .env 文件中

  • BOT_TOKEN: 用于测试的机器人的令牌
  • CHANNEL_ID: 消息和 Webhook 将在其中创建的频道
  • FORUM_CHANNEL_ID:测试在论坛频道中克隆消息/线程的论坛频道
  • NOT_LAST_SOURCE_THREAD_ID:当测试第一次运行时,机器人会创建一个线程并在其中发200条垃圾消息,为了避免再次这样做,将此设置为该线程的ID
  • GUILD_EMOJI_ID:位于 CHANNEL_ID 频道中的表情符号的ID

CHANNEL_IDFORUM_CHANNEL_ID 所需的权限

  • 查看频道
  • 管理Webhook
  • 发送消息

FORUM_CHANNEL_ID 需要的额外权限

  • 创建帖子
  • 在帖子中发送消息

为了防止竞争条件,使用单个线程进行测试:cargo test --all-features -- --test-threads=1

依赖项

~11–22MB
~345K SLoC