跳到主要内容

查询 API

Assiah 提供丰富的邮箱查询与操作方法,涵盖邮件查询、操作、偏好设置、黑名单、管理员功能和模板管理。所有方法返回 CompletableFuture

邮箱查询

方法返回值说明
queryMailbox(query: MailboxQuery)CompletableFuture<MailboxPage<MailSummary>>分页查询邮箱
getMail(ownerId: UUID, mailId: String)CompletableFuture<Mail?>获取邮件详情
getMailThread(ownerId: UUID, mailId: String)CompletableFuture<MailThread>获取邮件会话链
getUnreadCount(ownerId: UUID)CompletableFuture<Long>获取未读邮件数量

分页查询

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

// 构造器方式
val query = MailboxQuery(
ownerId = playerUUID,
page = 1,
pageSize = 21
)
AssiahAPI.queryMailbox(query).thenAccept { page ->
page.items.forEach { println("${it.title} - ${it.sender}") }
}

DSL 方式

import kim.hhhhhy.assiah.api.dsl.*

AssiahAPI.queryMailbox(playerUUID) {
page = 1
pageSize = 21
folder = MailFolder.INBOX
unreadOnly = true
keywords = "公告"
}.thenAccept { page ->
// 处理分页结果
}

获取邮件详情与会话

// 获取单封邮件
AssiahAPI.getMail(playerUUID, mailId).thenAccept { mail ->
if (mail != null) {
println("标题: ${mail.title}")
println("正文: ${mail.payload.body}")
println("附件数: ${mail.payload.attachments.size}")
}
}

// 获取邮件会话链
AssiahAPI.getMailThread(playerUUID, mailId).thenAccept { thread ->
println("根邮件: ${thread.rootMailId}")
thread.mails.forEach { println("[${it.createdAt}] ${it.title}") }
}

// 获取未读数
AssiahAPI.getUnreadCount(playerUUID).thenAccept { count ->
println("未读邮件: $count")
}

邮件操作

方法返回值说明
claimMail(ownerId: UUID, mailId: String)CompletableFuture<ClaimResult>领取邮件附件
deleteMail(ownerId: UUID, mailId: String)CompletableFuture<DeleteResult>删除邮件(移入回收站)
restoreTrashMail(ownerId: UUID, mailId: String)CompletableFuture<DeleteResult>从回收站恢复邮件
archiveMail(ownerId: UUID, mailId: String)CompletableFuture<DeleteResult>归档邮件
markAsRead(ownerId: UUID, mailId: String)CompletableFuture<ReadResult>标记为已读
markAsUnread(ownerId: UUID, mailId: String)CompletableFuture<ReadResult>标记为未读
replyMail(request: ReplyMailRequest)CompletableFuture<SendResult>回复邮件
forwardMail(request: ForwardMailRequest)CompletableFuture<SendResult>转发邮件
batchOperate(request: BatchOperationRequest)CompletableFuture<BatchOperationResult>批量操作

基础操作

val ownerId = player.uniqueId

// 领取附件
AssiahAPI.claimMail(ownerId, mailId).thenAccept { result ->
if (result.success) player.sendMessage("附件已领取")
}

// 删除邮件(移入回收站)
AssiahAPI.deleteMail(ownerId, mailId).thenAccept { result ->
if (result.success) println("已移入回收站,当前文件夹: ${result.folder}")
}

// 从回收站恢复
AssiahAPI.restoreTrashMail(ownerId, mailId)

// 归档
AssiahAPI.archiveMail(ownerId, mailId)

// 标记已读/未读
AssiahAPI.markAsRead(ownerId, mailId)
AssiahAPI.markAsUnread(ownerId, mailId)

回复与转发

import kim.hhhhhy.assiah.api.request.ReplyMailRequest
import kim.hhhhhy.assiah.api.request.ForwardMailRequest

// 回复邮件
val reply = ReplyMailRequest(
ownerId = playerUUID,
originalMailId = originalMailId,
sender = SenderSnapshot.player(playerUUID, "Steve"),
body = "收到,谢谢!"
)
AssiahAPI.replyMail(reply)

// 转发邮件给其他玩家
val forward = ForwardMailRequest(
ownerId = playerUUID,
originalMailId = mailId,
sender = SenderSnapshot.player(playerUUID, "Steve"),
recipient = Recipient(targetUUID, "Alex"),
includeItemAttachments = true
)
AssiahAPI.forwardMail(forward)

批量操作

import kim.hhhhhy.assiah.api.request.BatchOperationRequest
import kim.hhhhhy.assiah.api.request.BatchOperationType

// 批量标记已读
val request = BatchOperationRequest(
ownerId = playerUUID,
mailIds = listOf("mail_1", "mail_2", "mail_3"),
operation = BatchOperationType.MARK_READ
)
AssiahAPI.batchOperate(request).thenAccept { result ->
println("成功: ${result.successCount}, 失败: ${result.failureCount}")
}

// 支持的操作类型: MARK_READ, MARK_UNREAD, DELETE, ARCHIVE, RESTORE, CLAIM

偏好设置与黑名单

方法返回值说明
getPreference(ownerId: UUID)CompletableFuture<MailPreference>获取用户偏好设置
updatePreference(request: UpdatePreferenceRequest)CompletableFuture<PreferenceResult>更新偏好设置
listBlockedPlayers(ownerId: UUID)CompletableFuture<List<MailBlockEntry>>获取黑名单列表
blockPlayer(request: BlockPlayerRequest)CompletableFuture<BlockListResult>拉黑玩家
unblockPlayer(ownerId: UUID, blockedId: UUID)CompletableFuture<BlockListResult>取消拉黑
import kim.hhhhhy.assiah.api.request.UpdatePreferenceRequest
import kim.hhhhhy.assiah.api.request.BlockPlayerRequest

// 获取偏好设置
AssiahAPI.getPreference(playerUUID).thenAccept { pref ->
println("允许玩家邮件: ${pref.allowPlayerMail}")
}

// 更新偏好设置(部分更新,仅非 null 字段生效)
val updateRequest = UpdatePreferenceRequest(
ownerId = playerUUID,
allowPlayerMail = true,
enableBlacklist = false
)
AssiahAPI.updatePreference(updateRequest)

// 黑名单管理
AssiahAPI.blockPlayer(BlockPlayerRequest(
ownerId = playerUUID,
blockedId = targetUUID,
blockedName = "Alex"
))
AssiahAPI.unblockPlayer(playerUUID, targetUUID)

AssiahAPI.listBlockedPlayers(playerUUID).thenAccept { entries ->
entries.forEach { println("已拉黑: ${it.blockedName}") }
}

管理员方法

方法返回值说明
inspectMailbox(request: MailAdminInspectRequest)CompletableFuture<AdminInspectResult>管理员审查用户邮箱
resendMail(request: MailAdminResendRequest)CompletableFuture<SendResult>重新发送邮件
moveMailFolder(request: MailAdminFolderRequest)CompletableFuture<DeleteResult>移动邮件到指定文件夹
import kim.hhhhhy.assiah.api.request.MailAdminInspectRequest
import kim.hhhhhy.assiah.api.request.MailAdminResendRequest
import kim.hhhhhy.assiah.api.request.MailAdminFolderRequest

// 管理员审查用户邮箱
val inspectRequest = MailAdminInspectRequest(
actorId = adminUUID,
targetOwnerId = targetUUID,
includeRecentCount = 10
)
AssiahAPI.inspectMailbox(inspectRequest).thenAccept { result ->
if (result.success) {
println("邮箱快照: ${result.snapshot}")
}
}

// 重新发送邮件(可更换收件人)
val resendRequest = MailAdminResendRequest(
actorId = adminUUID,
targetMailId = mailId,
newRecipient = Recipient(newTargetUUID, "NewPlayer")
)
AssiahAPI.resendMail(resendRequest)

// 移动邮件到指定文件夹
val folderRequest = MailAdminFolderRequest(
actorId = adminUUID,
targetMailId = mailId,
targetFolder = MailFolder.ARCHIVE
)
AssiahAPI.moveMailFolder(folderRequest)

模板方法

方法返回值说明
saveTemplate(request: SaveTemplateRequest)CompletableFuture<TemplateResult>从草稿保存为模板
getTemplate(templateId: String)CompletableFuture<MailTemplate?>获取模板详情
queryTemplates(ownerId: UUID, page: Int, pageSize: Int)CompletableFuture<MailboxPage<MailTemplate>>分页查询模板列表
applyTemplate(request: ApplyTemplateRequest)CompletableFuture<TemplateResult>将模板应用到草稿
deleteTemplate(ownerId: UUID, templateId: String)CompletableFuture<TemplateResult>删除模板
renameTemplate(ownerId: UUID, templateId: String, newName: String)CompletableFuture<TemplateResult>重命名模板
import kim.hhhhhy.assiah.api.request.SaveTemplateRequest
import kim.hhhhhy.assiah.api.request.ApplyTemplateRequest

// 从草稿保存为模板
val saveRequest = SaveTemplateRequest(
ownerId = playerUUID,
name = "常用通知模板",
sourceDraftId = draftId,
includeAttachments = false
)
AssiahAPI.saveTemplate(saveRequest).thenAccept { result ->
if (result.success) {
println("模板已保存: ${result.template?.templateId}")
}
}

// 分页查询模板列表(个人 + 全局)
AssiahAPI.queryTemplates(playerUUID, page = 1, pageSize = 10).thenAccept { page ->
page.items.forEach { println("模板: ${it.name}") }
}

// 将模板应用到草稿
val applyRequest = ApplyTemplateRequest(
ownerId = playerUUID,
templateId = templateId,
targetDraftId = draftId
)
AssiahAPI.applyTemplate(applyRequest)

// 删除模板
AssiahAPI.deleteTemplate(playerUUID, templateId)

// 重命名模板
AssiahAPI.renameTemplate(playerUUID, templateId, "新模板名称")

枚举类型

MailFolder

说明
INBOX收件箱
SENT已发送
DRAFT草稿箱
ARCHIVE归档
TRASH回收站

AttachmentType

说明
TEXT文本附件
ITEM物品附件
KETHERKether 脚本附件
CURRENCY货币附件
SOURCE_ITEM物品库物品附件

SourceType

说明
PLAYER玩家发送
SYSTEM系统发送
ADMIN管理员发送

RelationType

说明
NONE无关联(独立邮件)
REPLY回复
FORWARD转发

ClaimStatus

说明
NOT_CLAIMABLE不可领取(无附件)
PENDING待领取
CLAIMING领取中
CLAIMED已领取
FAILED_RETRYABLE领取失败(可重试)

ReadStatus

说明
UNREAD未读
READ已读