跳到主要内容

开发者 API

Assiah 提供完整的 API 供其他插件集成邮箱功能。所有 API 通过 AssiahAPI 单例对象调用,返回 CompletableFuture 异步结果。

面向开发者

本页面面向插件开发者。如果你是服主,可以跳过此页。

引入依赖​

// build.gradle.kts
repositories {
// Assiah 发布仓库(或本地 libs 目录)
}

dependencies {
compileOnly(fileTree("libs") { include("Assiah-*.jar") })
}

核心入口​

import kim.hhhhhy.assiah.api.AssiahAPI

AssiahAPI 是所有公开 API 的唯一入口。插件启动后即可调用,无需手动初始化。

发送邮件​

基础方式(构建 Request)​

import kim.hhhhhy.assiah.api.AssiahAPI
import kim.hhhhhy.assiah.api.mail.Recipient
import kim.hhhhhy.assiah.api.mail.SenderSnapshot
import kim.hhhhhy.assiah.api.request.SendMailRequest

val request = SendMailRequest(
sender = SenderSnapshot.player(uuid, "Steve"),
recipient = Recipient(targetUuid, "Alex"),
title = "你好",
body = "这是一封测试邮件"
)

AssiahAPI.sendMail(request).thenAccept { result ->
if (result.success) {
println("邮件发送成功,ID: ${result.mailId}")
} else {
println("发送失败: ${result.failure?.code}")
}
}

DSL 参数展开​

import kim.hhhhhy.assiah.api.dsl.sendMail

AssiahAPI.sendMail(
sender = SenderSnapshot.player(uuid, "Steve"),
recipient = Recipient(targetUuid, "Alex"),
title = "你好",
body = "这是一封测试邮件"
)

DSL 构建器​

import kim.hhhhhy.assiah.api.dsl.sendMail

AssiahAPI.sendMail {
sender = SenderSnapshot.player(uuid, "Steve")
recipient = Recipient(targetUuid, "Alex")
title = "你好"
body = "这是一封测试邮件"
attachment(ItemAttachment(itemStack))
expireAt = System.currentTimeMillis() + 86400000L // 24 小时后过期
}

发送系统邮件​

系统邮件的发送者类型为系统,可能绕过部分用户偏好限制。

DSL 参数展开​

import kim.hhhhhy.assiah.api.dsl.sendSystemMail

// 通过 Recipient 对象
AssiahAPI.sendSystemMail(
recipient = Recipient(targetUuid, "Alex"),
title = "系统通知",
body = "你的背包已满"
)

// 通过 UUID + 玩家名(最简化)
AssiahAPI.sendSystemMail(
recipientUuid = targetUuid,
recipientName = "Alex",
title = "系统通知",
body = "你的背包已满"
)

DSL 构建器​

import kim.hhhhhy.assiah.api.dsl.sendSystemMail

AssiahAPI.sendSystemMail {
recipient = Recipient(targetUuid, "Alex")
title = "系统通知"
body = "你的背包已满"
attachment(ItemAttachment(itemStack))
}

快捷发送单附件邮件​

快捷发送 API 复用 /assiah send 背后的默认邮件构造逻辑。调用方只需要提供发送者、收件人和单个附件;标题、正文、附件显示名留空时,会自动读取 mailbox.yml -> command-send 中对应附件类型的默认文案。

可用方法​

方法适用场景
quickSendMail(request)传入 QuickSendMailRequest,适合你已经构造好 MailAttachment 的场景
quickSendItemMail(sender, recipient, item, ...)快速发送一个 ItemStack 物品附件
quickSendTextMail(sender, recipient, text, ...)快速发送一份文本附件
quickSendKetherMail(sender, recipient, script, ...)快速发送一个 Kether 脚本附件
quickSendCurrencyMail(sender, recipient, currencyKey, amount, ...)快速发送一份货币附件
quickSendSourceItemMail(sender, recipient, sourceId, amount = 1, ...)快速发送一个物品库附件,数量省略时默认为 1

QuickSendMailRequest 字段​

字段类型说明
senderSenderSnapshot发件人快照
recipientRecipient收件人信息
attachmentMailAttachment单个附件内容
titleString?邮件标题覆盖值;为 null 时使用 command-send 默认标题
bodyString?邮件正文覆盖值;为 null 时使用 command-send 默认正文
attachmentDisplayNameString?附件显示名覆盖值;为 null 时使用 command-send 默认附件名
sourceServerString?来源服务器标识
targetServerString?目标服务器标识,默认取 recipient.server
bypassRateLimitBoolean是否跳过发送频率限制

使用示例​

import kim.hhhhhy.assiah.api.AssiahAPI
import kim.hhhhhy.assiah.api.mail.Recipient
import kim.hhhhhy.assiah.api.mail.SenderSnapshot

// 快速发放 Vault 货币附件,默认标题/正文来自 mailbox.yml -> command-send.currency
AssiahAPI.quickSendCurrencyMail(
sender = SenderSnapshot.system(),
recipient = Recipient(targetUuid, "Steve"),
currencyKey = "vault",
amount = 1000.0
)

// 快速发放物品库附件,sourceId 使用“物品源:物品ID”格式
AssiahAPI.quickSendSourceItemMail(
sender = SenderSnapshot.system(),
recipient = Recipient(targetUuid, "Steve"),
sourceId = "emakiitem:starter_box",
amount = 1
)
提示

如果你要统一调整快捷发送邮件的标题、正文或附件名称,修改 配置文件详解 中的 command-send 即可。

群发邮件​

向多个收件人同时发送相同内容的邮件。每个收件人独立执行发送操作,单个失败不影响其他收件人。

基础方式​

import kim.hhhhhy.assiah.api.AssiahAPI
import kim.hhhhhy.assiah.api.request.BroadcastMailRequest

val request = BroadcastMailRequest(
sender = SenderSnapshot.system(),
recipients = listOf(
Recipient(uuid1, "Steve"),
Recipient(uuid2, "Alex")
),
title = "服务器公告",
body = "维护通知:今晚 22:00 停服维护"
)

AssiahAPI.broadcastMail(request).thenAccept { result ->
println("群发完成: 成功 ${result.successCount}, 失败 ${result.failureCount}")
}

DSL 构建器​

import kim.hhhhhy.assiah.api.dsl.broadcastMail

AssiahAPI.broadcastMail {
sender = SenderSnapshot.system()
recipients(onlineRecipients)
title = "服务器公告"
body = "维护通知:今晚 22:00 停服维护"
attachment(TextAttachment("详细说明"))
}

BroadcastResult​

字段类型说明
totalInt收件人总数
successCountInt发送成功数量
failureCountInt发送失败数量
failuresList<BroadcastFailure>失败详情列表

每个 BroadcastFailure 包含 recipientName(收件人名称)和 failure(失败原因)。

查询邮箱​

基础方式​

import kim.hhhhhy.assiah.api.AssiahAPI
import kim.hhhhhy.assiah.api.request.MailboxQuery

val query = MailboxQuery(
ownerId = playerUuid,
page = 1,
pageSize = 21,
filter = MailboxFilter(folder = MailFolder.INBOX)
)

AssiahAPI.queryMailbox(query).thenAccept { page ->
println("共 ${page.total} 封邮件,当前页 ${page.items.size} 封")
}

DSL 构建器​

import kim.hhhhhy.assiah.api.dsl.queryMailbox

AssiahAPI.queryMailbox(playerUuid) {
page = 1
pageSize = 21
folder = MailFolder.INBOX
unreadOnly = true
keywords = "公告"
}

其他 API​

方法说明返回类型
readMail(ownerId, mailId)标记邮件为已读并返回完整内容CompletableFuture<ReadResult>
claimAttachments(ownerId, mailId)领取邮件附件CompletableFuture<ClaimResult>
deleteMail(ownerId, mailId)删除邮件(移入回收站)CompletableFuture<DeleteResult>
moveMail(ownerId, mailId, folder)移动邮件到指定文件夹CompletableFuture<MoveResult>
replyMail(request)回复邮件CompletableFuture<SendResult>
forwardMail(request)转发邮件CompletableFuture<SendResult>
getUnreadCount(ownerId)获取未读邮件数量CompletableFuture<Long>
getMailThread(ownerId, mailId)获取邮件会话线程CompletableFuture<MailThread>
updatePreference(request)更新收件偏好CompletableFuture<PreferenceResult>
blockPlayer(request)添加/移除黑名单CompletableFuture<BlockResult>
batchOperation(request)批量操作(删除/归档/标记已读等)CompletableFuture<BatchOperationResult>

附件类型​

在发送邮件时,可以通过 attachments 参数添加附件:

import kim.hhhhhy.assiah.api.mail.ItemAttachment
import kim.hhhhhy.assiah.api.mail.TextAttachment
import kim.hhhhhy.assiah.api.mail.KetherAttachment
import kim.hhhhhy.assiah.api.mail.CurrencyAttachment

// 物品附件
val item = ItemAttachment(itemStack, displayName = "钻石剑")

// 文本附件
val text = TextAttachment("这是一段说明文字")

// Kether 脚本附件(仅系统邮件/管理员可用)
val kether = KetherAttachment("command \"give {player} diamond 1\" as console")

// 货币附件
val currency = CurrencyAttachment(
currencyKey = "vault", // 对应 currency.yml 中的键名
amount = 1000.0,
displayName = "1000 金币"
)

Kether 自定义动作​

Assiah 注册了 3 个 Kether 动作,可在其他插件的 Kether 脚本中使用:

动作参数说明返回值
mail-send<收件人> <标题> <正文>发送系统邮件Boolean
mail-unread[玩家]获取未读邮件数量Long
mail-has-unread[玩家]是否有未读邮件Boolean

注意事项​

  • 所有 API 返回 CompletableFuture,在异步线程执行。如需在主线程处理结果,请使用 Bukkit 调度器回调
  • 插件未完成初始化时调用 API 会返回 API_NOT_READY 错误
  • 群发邮件默认跳过发送者速率限制,但收件人数量受 maxBatchSendSize 配置限制
  • 货币附件和 Kether 附件在 API 层发送时不会自动扣款/校验,需调用方自行处理