1 个不稳定版本
0.15.0 | 2023 年 8 月 11 日 |
---|
#1045 在 异步
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条垃圾消息,为了避免再次这样做,将此设置为该线程的IDGUILD_EMOJI_ID
:位于CHANNEL_ID
频道中的表情符号的ID
CHANNEL_ID
和 FORUM_CHANNEL_ID
所需的权限
查看频道
管理Webhook
发送消息
FORUM_CHANNEL_ID
需要的额外权限
创建帖子
在帖子中发送消息
为了防止竞争条件,使用单个线程进行测试:cargo test --all-features -- --test-threads=1
依赖项
~11–22MB
~345K SLoC