使用Discord4j(Kotlin)实现Discord嵌入消息自动crosspost
Discord4j 嵌入消息自动crosspost实现方案
首先明确前置规则:Discord的crosspost(跨频道发布)功能仅支持公告类频道(NewsChannel),普通文字频道调用发布接口会返回频道类型错误,代码里需要先做类型校验避免异常。
你现有代码中channel.createMessage(embed)执行完成后会返回已发送的Message实例,直接调用该实例的crosspost()方法即可触发发布,修改后的完整代码如下:
import discord4j.core.`object`.entity.channel.NewsChannel import reactor.core.publisher.Mono fun sendEmbedMessage(gateway: GatewayDiscordClient, embed: EmbedCreateSpec, channelId: String) { gateway.getChannelById(Snowflake.of(channelId)) .ofType(GuildMessageChannel::class.java) .flatMap { channel -> channel.createMessage(embed) .flatMap { sentMsg -> // 仅公告频道执行发布操作 if (channel is NewsChannel) { sentMsg.crosspost() } else { Mono.just(sentMsg) } } } // 增加错误兜底,避免权限不足、频道类型错误导致流程中断 .onErrorResume { error -> println("消息处理失败: ${error.message}") Mono.empty() } .subscribe() }
注意事项
- 权限要求:机器人需要在目标公告频道拥有
发送消息、发布消息(对应权限位PUBLISH_MESSAGES)两个权限,否则接口会返回403无权限错误。 - 版本适配:上述代码适配Discord4j 3.2.x及以上稳定版本,低版本中crosspost方法可能归属在频道操作类中,升级依赖即可正常调用。
- 如果你的业务场景中传入的
channelId100%对应公告频道,可以省略NewsChannel类型判断逻辑,直接在拿到sentMsg后调用crosspost()即可,但不建议省略校验,避免线上异常。
内容的提问来源于stack exchange,提问作者N0m4n904
相关产品推荐
相关产品推荐

