chore: improve rdm command

This commit is contained in:
2024-09-28 16:31:55 +08:00
parent 9aab28334e
commit 32c822c3a1
19 files changed
+82 -82

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
[versions] [versions]
kotlinVersion = "2.0.10" kotlinVersion = "2.0.10"
ronebotVersion = "1.11.4" ronebotVersion = "1.11.5"
shadowVersion = "8.3.0" shadowVersion = "8.3.0"
okhttpVersion = "5.0.0-alpha.14" okhttpVersion = "5.0.0-alpha.14"
exposedVersion = "0.53.0" exposedVersion = "0.53.0"
+2 -2
View File
@@ -76,8 +76,8 @@ val niuziBankManager = NiuziBankManager()
val START_UP_TIME = Instant.now().epochSecond val START_UP_TIME = Instant.now().epochSecond
val items = listOf( val items = listOf(
HeisiItem(), BaisiItem(), SetuItem(), HeisiItem(), BaisiItem(),
NiuziItem() SetuItem(), NiuziItem()
) )
val commands = listOf( val commands = listOf(
@@ -39,13 +39,17 @@ class FancyBot : OneBotListener {
val messageId = message.messageId val messageId = message.messageId
println("$sender($senderId: $groupId >>> $messageId): $msg") println("$sender($senderId: $groupId >>> $messageId): $msg")
ReverseGIFCommand.callback(message) if (message.message.any { it.type == ArrayMessageType.face && it.data.id.toString() == "419" }) {
AsciiArtCommand.callback(message) message.reply("你发牛魔的火车呢, 我直接就是打断")
}
if (message.rawMessage.contains("原神")) { if (message.rawMessage.contains("原神")) {
message.reply("你原神牛魔呢") message.reply("你原神牛魔呢")
} }
ReverseGIFCommand.callback(message)
AsciiArtCommand.callback(message)
if (message.rawMessage.toList().any { it in arrayListOf('*', '-', '/', '+', '=') }) { if (message.rawMessage.toList().any { it in arrayListOf('*', '-', '/', '+', '=') }) {
val calculateResult = CalculateCommand.parse(message.rawMessage) val calculateResult = CalculateCommand.parse(message.rawMessage)
calculateResult?.let { message.reply(calculateResult) } calculateResult?.let { message.reply(calculateResult) }
@@ -9,6 +9,7 @@ package cn.rtast.fancybot.commands
import cn.rtast.fancybot.annotations.CommandDescription import cn.rtast.fancybot.annotations.CommandDescription
import cn.rtast.fancybot.commands import cn.rtast.fancybot.commands
import cn.rtast.fancybot.configManager
import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.util.BaseCommand import cn.rtast.rob.util.BaseCommand
import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.MessageChain
@@ -34,7 +35,7 @@ class HelpCommand : BaseCommand() {
.addNewLine() .addNewLine()
} }
msg.addText("共计${commands.size}条命令") msg.addText("共计${commands.size}条命令")
node.addMessageChain(msg.build(), message.sender.userId) node.addMessageChain(msg.build(), configManager.selfId)
message.reply(node.build()) message.reply(node.build())
} else { } else {
val commandName = args.first().replace("/", "") val commandName = args.first().replace("/", "")
@@ -66,7 +66,7 @@ class AICommand : BaseCommand() {
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addText(response.choices.first().message.content) .addText(response.choices.first().message.content)
.build() .build()
nodeMsg.addMessageChain(msg, message.sender.userId) nodeMsg.addMessageChain(msg, configManager.selfId)
listener.sendGroupForwardMsg(message.groupId, nodeMsg.build()) listener.sendGroupForwardMsg(message.groupId, nodeMsg.build())
} }
} }
@@ -92,7 +92,7 @@ class LlamaCommand : BaseCommand() {
.addNewLine() .addNewLine()
.addText(response.message.content) .addText(response.message.content)
.build() .build()
nodeMsg.addMessageChain(msg, message.sender.userId) nodeMsg.addMessageChain(msg, configManager.selfId)
listener.sendGroupForwardMsg(message.groupId, nodeMsg.build()) listener.sendGroupForwardMsg(message.groupId, nodeMsg.build())
} }
} }
@@ -8,6 +8,7 @@
package cn.rtast.fancybot.commands.lookup package cn.rtast.fancybot.commands.lookup
import cn.rtast.fancybot.annotations.CommandDescription import cn.rtast.fancybot.annotations.CommandDescription
import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.cigarette.Cigarette import cn.rtast.fancybot.entity.cigarette.Cigarette
import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.fancybot.util.str.encodeToBase64
@@ -53,12 +54,12 @@ class CigaretteCommand : BaseCommand() {
.addText("参考价: 单盒: ${it.packPrice}元 | 整条: ${it.barPrice}") .addText("参考价: 单盒: ${it.packPrice}元 | 整条: ${it.barPrice}")
.addNewLine() .addNewLine()
.build() .build()
nodeMsg.addMessageChain(tempMsg, message.sender.userId) nodeMsg.addMessageChain(tempMsg, configManager.selfId)
} }
val footerMsg = MessageChain.Builder() val footerMsg = MessageChain.Builder()
.addText("吸烟有害健康, 尽早戒烟有益健康。") .addText("吸烟有害健康, 尽早戒烟有益健康。")
.build() .build()
nodeMsg.addMessageChain(footerMsg, message.sender.userId) nodeMsg.addMessageChain(footerMsg, configManager.selfId)
message.reply(nodeMsg.build()) message.reply(nodeMsg.build())
message.sender.groupPoke() message.sender.groupPoke()
} }
@@ -8,6 +8,7 @@
package cn.rtast.fancybot.commands.lookup package cn.rtast.fancybot.commands.lookup
import cn.rtast.fancybot.annotations.CommandDescription import cn.rtast.fancybot.annotations.CommandDescription
import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.bgm.BGMSearch import cn.rtast.fancybot.entity.bgm.BGMSearch
import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.fancybot.util.str.encodeToBase64
@@ -53,10 +54,10 @@ class DMSearchCommand : BaseCommand() {
.addNewLine() .addNewLine()
.addText(it.url) .addText(it.url)
.build() .build()
nodeMsg.addMessageChain(tempMsg, message.sender.userId) nodeMsg.addMessageChain(tempMsg, configManager.selfId)
} }
val footerNode = MessageChain.Builder().addText("数据来源: Bangumi").build() val footerNode = MessageChain.Builder().addText("数据来源: Bangumi").build()
nodeMsg.addMessageChain(footerNode, message.sender.userId) nodeMsg.addMessageChain(footerNode, configManager.selfId)
listener.sendGroupForwardMsg(message.groupId, nodeMsg.build()) listener.sendGroupForwardMsg(message.groupId, nodeMsg.build())
} catch (_: Exception) { } catch (_: Exception) {
message.reply("没有搜索到结果呢~") message.reply("没有搜索到结果呢~")
@@ -45,11 +45,7 @@ class MusicCommand : BaseCommand() {
private suspend fun legacyMusicCommand(listener: OneBotListener, message: GroupMessage, args: List<String>) { private suspend fun legacyMusicCommand(listener: OneBotListener, message: GroupMessage, args: List<String>) {
if (args.isEmpty()) { if (args.isEmpty()) {
val msg = MessageChain.Builder() message.reply("发送`/点歌` <关键词> 来搜索音乐~")
.addAt(message.sender.userId)
.addText("发送`/点歌`或者`/music` <关键词> 来搜索音乐~")
.build()
listener.sendGroupMessage(message.groupId, msg)
return return
} }
searchedResult.forEach { (key, results) -> searchedResult.forEach { (key, results) ->
@@ -72,13 +68,9 @@ class MusicCommand : BaseCommand() {
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addMusicShare(MusicShareType.Netease, finalResult.id.toString()) .addMusicShare(MusicShareType.Netease, finalResult.id.toString())
.build() .build()
listener.sendGroupMessage(message.groupId, msg) message.reply(msg)
} catch (_: Exception) { } catch (_: Exception) {
val msg = MessageChain.Builder() message.reply("输入有误请重新搜索本次搜索结果已清除")
.addAt(message.sender.userId)
.addText("输入有误请重新搜索本次搜索结果已清除")
.build()
listener.sendGroupMessage(message.groupId, msg)
} }
searchedResult.remove(message.sender.userId) searchedResult.remove(message.sender.userId)
} }
@@ -86,11 +78,7 @@ class MusicCommand : BaseCommand() {
else -> { else -> {
if (searchedResult.containsKey(message.sender.userId)) { if (searchedResult.containsKey(message.sender.userId)) {
searchedResult.remove(message.sender.userId) searchedResult.remove(message.sender.userId)
val msg = MessageChain.Builder() message.reply("你上次的搜索结果还没用呢, 已经帮你把上次的搜索结果清除掉啦~")
.addAt(message.sender.userId)
.addText("你上次的搜索结果还没用呢, 已经帮你把上次的搜索结果清除掉啦~")
.build()
listener.sendGroupMessage(message.groupId, msg)
} }
val keyword = args.joinToString(" ") val keyword = args.joinToString(" ")
val result = searchSong(keyword) val result = searchSong(keyword)
@@ -105,11 +93,7 @@ class MusicCommand : BaseCommand() {
stringResult.append("| $index | 《${searchedResult.name}》-- ${searchedResult.artists}\n") stringResult.append("| $index | 《${searchedResult.name}》-- ${searchedResult.artists}\n")
} }
stringResult.append("输入/music p <序号> 播放\n你有30秒的时间进行操作") stringResult.append("输入/music p <序号> 播放\n你有30秒的时间进行操作")
val msg = MessageChain.Builder() message.reply(stringResult.toString())
.addAt(message.sender.userId)
.addText(stringResult.toString())
.build()
listener.sendGroupMessage(message.groupId, msg)
} }
} }
} }
@@ -121,7 +105,7 @@ class MusicCommand : BaseCommand() {
} }
if (args.isEmpty()) { if (args.isEmpty()) {
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addAt(message.sender.userId) .addReply(message.messageId)
.addText("发送`点歌 <歌名>`即可点第一首搜索到的歌曲~") .addText("发送`点歌 <歌名>`即可点第一首搜索到的歌曲~")
.addNewLine() .addNewLine()
.addText("发送`点歌 <歌名> [l|legacy]`即可使用旧版点歌系统") .addText("发送`点歌 <歌名> [l|legacy]`即可使用旧版点歌系统")
@@ -243,7 +227,7 @@ class QQMusicCommand : BaseCommand() {
.addNewLine() .addNewLine()
.addText("时长: ${it.interval.formatToMinutes()}") .addText("时长: ${it.interval.formatToMinutes()}")
.build() .build()
nodeMsg.addMessageChain(msg, message.sender.userId) nodeMsg.addMessageChain(msg, configManager.selfId)
} catch (_: FileNotFoundException) { } catch (_: FileNotFoundException) {
} }
} }
@@ -8,6 +8,7 @@
package cn.rtast.fancybot.commands.lookup package cn.rtast.fancybot.commands.lookup
import cn.rtast.fancybot.annotations.CommandDescription import cn.rtast.fancybot.annotations.CommandDescription
import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.pixiv.Ranking import cn.rtast.fancybot.entity.pixiv.Ranking
import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.fancybot.util.str.encodeToBase64
@@ -51,11 +52,13 @@ class PixivCommand : BaseCommand() {
.addText("用户: ${it.userName}(${it.userId}) | 作品ID: ${it.illustId}") .addText("用户: ${it.userName}(${it.userId}) | 作品ID: ${it.illustId}")
.addNewLine() .addNewLine()
.addText("日期: ${it.date}") .addText("日期: ${it.date}")
node.addMessageChain(msg.build(), message.sender.userId) node.addMessageChain(msg.build(), configManager.selfId)
} catch (_: Exception) { } catch (_: Exception) {
} }
} }
node.addMessageChain(MessageChain.Builder().addText("图片来源: Pixiv").build(), message.sender.userId) node.addMessageChain(MessageChain.Builder()
.addText("图片来源: Pixiv")
.build(), configManager.selfId)
message.reply(node.build()) message.reply(node.build())
return return
} }
@@ -40,7 +40,7 @@ class ShotOtherCommand : BaseCommand() {
override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) { override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) {
if (args.isEmpty()) { if (args.isEmpty()) {
message.reply("发送`骂 @某人`可以骂他~") listener.sendGroupForwardMsg(message.groupId, generateNodeMessage(message.sender.userId.toString(), 20))
return return
} }
var times = if (args.size == 1) 10 else if (args.last() == "") 10 else args.last().toInt() var times = if (args.size == 1) 10 else if (args.last() == "") 10 else args.last().toInt()
@@ -7,6 +7,7 @@
package cn.rtast.fancybot.commands.misc package cn.rtast.fancybot.commands.misc
import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.bullshit.BullShit import cn.rtast.fancybot.entity.bullshit.BullShit
import cn.rtast.fancybot.util.Resources import cn.rtast.fancybot.util.Resources
import cn.rtast.fancybot.util.str.fromJson import cn.rtast.fancybot.util.str.fromJson
@@ -61,7 +62,7 @@ class BullShitGenerateCommand : BaseCommand() {
} }
val finalText = output.toString().replace("x", topic) val finalText = output.toString().replace("x", topic)
val node = NodeMessageChain.Builder() val node = NodeMessageChain.Builder()
.addMessageChain(MessageChain.Builder().addText(finalText).build(), message.sender.userId) .addMessageChain(MessageChain.Builder().addText(finalText).build(), configManager.selfId)
.build() .build()
message.reply(node) message.reply(node)
message.sender.groupPoke() message.sender.groupPoke()
@@ -44,11 +44,7 @@ class SendMailCommand : BaseCommand() {
override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) { override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List<String>) {
if (args.isEmpty()) { if (args.isEmpty()) {
val msg = MessageChain.Builder() message.reply("发送`/mail <收件人地址>`即可发送测试邮件~")
.addAt(message.sender.userId)
.addText("发送`/mail <收件人地址>`即可发送测试邮件~")
.build()
listener.sendGroupMessage(message.groupId, msg)
return return
} }
if (message.sender.userId !in configManager.admins) { if (message.sender.userId !in configManager.admins) {
@@ -61,10 +57,6 @@ class SendMailCommand : BaseCommand() {
} }
val target = args.first() val target = args.first()
this.sendMail(target) this.sendMail(target)
val msg = MessageChain.Builder() message.reply("正在发送邮件, 请查收~(可能会出现在垃圾桶中~)")
.addAt(message.sender.userId)
.addText("正在发送邮件, 请查收~(可能会出现在垃圾桶中~)")
.build()
listener.sendGroupMessage(message.groupId, msg)
} }
} }
@@ -8,6 +8,7 @@
package cn.rtast.fancybot.commands.misc package cn.rtast.fancybot.commands.misc
import cn.rtast.fancybot.annotations.CommandDescription import cn.rtast.fancybot.annotations.CommandDescription
import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.Setu import cn.rtast.fancybot.entity.Setu
import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.fancybot.util.str.encodeToBase64
@@ -30,7 +31,7 @@ class TenSetuCommand : BaseCommand() {
try { try {
val imageBase64 = URI(it).toURL().readBytes().encodeToBase64() val imageBase64 = URI(it).toURL().readBytes().encodeToBase64()
val tempMsg = MessageChain.Builder().addImage(imageBase64, true).build() val tempMsg = MessageChain.Builder().addImage(imageBase64, true).build()
nodeMsg.addMessageChain(tempMsg, message.sender.userId) nodeMsg.addMessageChain(tempMsg, configManager.selfId)
} catch (_: Exception) { } catch (_: Exception) {
} }
} }
@@ -39,7 +40,7 @@ class TenSetuCommand : BaseCommand() {
.addNewLine() .addNewLine()
.addText("因为过滤了R18的图片~") .addText("因为过滤了R18的图片~")
.build() .build()
nodeMsg.addMessageChain(footerMsg, message.sender.userId) nodeMsg.addMessageChain(footerMsg, configManager.selfId)
listener.sendGroupForwardMsg(message.groupId, nodeMsg.build()) listener.sendGroupForwardMsg(message.groupId, nodeMsg.build())
} }
} }
@@ -34,17 +34,12 @@ class NiuziRedeemCommand : BaseCommand() {
} }
val status = niuziManager.getUser(message.sender.userId) val status = niuziManager.getUser(message.sender.userId)
if (status == null) { if (status == null) {
val msg = MessageChain.Builder() message.reply("你还没有签到过呢要签到一次才能兑换哦~")
.addReply(message.messageId)
.addText("你还没有签到过呢要签到一次才能兑换哦~")
.build()
listener.sendGroupMessage(message.groupId, msg)
return return
} }
val item = args.first() val item = args.first()
if (item == "list" || item == "列表") { if (item == "list" || item == "列表") {
val priceTable = val priceTable = itemManager.items.joinToString("\n")
itemManager.items.joinToString("\n")
{ "[${it.itemNames.joinToString("|")}]:${it.itemPrice}cm" } { "[${it.itemNames.joinToString("|")}]:${it.itemPrice}cm" }
message.reply(priceTable) message.reply(priceTable)
return return
@@ -72,13 +67,15 @@ class NiuziRedeemCommand : BaseCommand() {
return return
} }
val afterStatus = niuziManager.redeemItem(message.sender.userId, selectedItemPrice)?.length!! val afterStatus = niuziManager.redeemItem(message.sender.userId, selectedItemPrice)?.length!!
val action = selectedItem.redeemInGroup(listener, message, afterStatus)
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addReply(message.messageId) .addReply(message.messageId)
.addText("兑换成功正在发送奖品中~") .addText("兑换成功! 你花费了${selectedItemPrice}cm来兑换奖品, 还剩${afterStatus}cm")
.addNewLine() .addNewLine()
.addText("你花费了${selectedItemPrice}cm来兑换奖品, 还剩${afterStatus}cm") .addText("-------------------")
.addNewLine()
.addMessageChain(action)
.build() .build()
listener.sendGroupMessage(message.groupId, msg) message.reply(msg)
selectedItem.redeemGroup(listener, message, afterStatus)
} }
} }
@@ -18,9 +18,13 @@ class BaisiItem : Item() {
override val itemNames = listOf("baisi", "白丝", "bs") override val itemNames = listOf("baisi", "白丝", "bs")
override val itemPrice = 5.0 override val itemPrice = 5.0
override suspend fun redeemInGroup(listener: OneBotListener, message: GroupMessage, after: Double) { override suspend fun redeemInGroup(
listener: OneBotListener,
message: GroupMessage,
after: Double
): MessageChain.Builder {
val url = Http.get<Baisi>("https://v2.api-m.com/api/baisi").data val url = Http.get<Baisi>("https://v2.api-m.com/api/baisi").data
val msg = MessageChain.Builder().addImage(url).build() val msg = MessageChain.Builder().addImage(url)
message.reply(msg) return msg
} }
} }
@@ -18,9 +18,13 @@ class HeisiItem : Item() {
override val itemNames = listOf("heisi", "黑丝", "hs") override val itemNames = listOf("heisi", "黑丝", "hs")
override val itemPrice = 5.0 override val itemPrice = 5.0
override suspend fun redeemInGroup(listener: OneBotListener, message: GroupMessage, after: Double) { override suspend fun redeemInGroup(
listener: OneBotListener,
message: GroupMessage,
after: Double
): MessageChain.Builder {
val url = Http.get<Baisi>("https://v2.api-m.com/api/heisi").data val url = Http.get<Baisi>("https://v2.api-m.com/api/heisi").data
val msg = MessageChain.Builder().addImage(url).build() val msg = MessageChain.Builder().addImage(url)
message.reply(msg) return msg
} }
} }
@@ -17,14 +17,17 @@ class NiuziItem : Item() {
override val itemNames = listOf("牛子", "nz", "niuzi") override val itemNames = listOf("牛子", "nz", "niuzi")
override val itemPrice = 10.0 override val itemPrice = 10.0
override suspend fun redeemInGroup(listener: OneBotListener, message: GroupMessage, after: Double) { override suspend fun redeemInGroup(
listener: OneBotListener,
message: GroupMessage,
after: Double
): MessageChain.Builder {
val before = niuziManager.getUser(message.sender.userId)!! val before = niuziManager.getUser(message.sender.userId)!!
val afterNiuzi = niuziManager.updateLength(message.sender.userId, -2.0)!! val afterNiuzi = niuziManager.updateLength(message.sender.userId, -2.0)!!
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addText("你的牛子到账啦, 你的牛子现在有${afterNiuzi.length}cm长呢!") .addText("你的牛子到账啦, 你的牛子现在有${afterNiuzi.length}cm长呢!")
.addNewLine() .addNewLine()
.addText("(之前的长度是${before.length}cm!)") .addText("(之前的长度是${before.length}cm!)")
.build() return msg
message.reply(msg)
} }
} }
@@ -22,16 +22,19 @@ class SetuItem : Item() {
override val itemNames = listOf("setu", "色图", "st") override val itemNames = listOf("setu", "色图", "st")
override val itemPrice = 10.0 override val itemPrice = 10.0
override suspend fun redeemInGroup(listener: OneBotListener, message: GroupMessage, after: Double) { override suspend fun redeemInGroup(
listener: OneBotListener,
message: GroupMessage,
after: Double
): MessageChain.Builder {
val response = Http.get("https://api.rtast.cn/api/setu") val response = Http.get("https://api.rtast.cn/api/setu")
.fromArrayJson<List<Setu>>().first() .fromArrayJson<List<Setu>>().first()
if (response.r18) { if (response.r18) {
niuziManager.updateLength(message.sender.userId, itemPrice) niuziManager.updateLength(message.sender.userId, itemPrice)
message.reply("不好意思这张图片是R18所以不能发~, 牛子长度已经退还~") return MessageChain.Builder().addText("不好意思这张图片是R18所以不能发~, 牛子长度已经退还~")
return
} }
val imageBase64 = URI(response.urls.large).toURL().readBytes().encodeToBase64() val imageBase64 = URI(response.urls.large).toURL().readBytes().encodeToBase64()
val msg = MessageChain.Builder().addImage(imageBase64, true).build() val msg = MessageChain.Builder().addImage(imageBase64, true)
message.reply(msg) return msg
} }
} }
@@ -8,15 +8,16 @@
package cn.rtast.fancybot.util.item package cn.rtast.fancybot.util.item
import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.util.ob.MessageChain
import cn.rtast.rob.util.ob.OneBotListener import cn.rtast.rob.util.ob.OneBotListener
abstract class Item { abstract class Item {
abstract val itemNames: List<String> abstract val itemNames: List<String>
abstract val itemPrice: Double abstract val itemPrice: Double
protected open suspend fun redeemInGroup(listener: OneBotListener, message: GroupMessage, after: Double) {} abstract suspend fun redeemInGroup(
listener: OneBotListener,
suspend fun redeemGroup(listener: OneBotListener, message: GroupMessage, after: Double) { message: GroupMessage,
this.redeemInGroup(listener, message, after) after: Double
} ): MessageChain.Builder
} }