From bb6cd9a023683e565d46b591d2e7dc80a9ce9f8a Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 4 Dec 2019 18:01:32 +0800 Subject: [PATCH] XML Message basics --- .../kotlin/net.mamoe.mirai/message/XML.kt | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/XML.kt diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/XML.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/XML.kt new file mode 100644 index 000000000..4f2da3107 --- /dev/null +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/XML.kt @@ -0,0 +1,83 @@ +package net.mamoe.mirai.message + +/** + * XML 消息, 如分享, 卡片等. + * + * @see buildXMLMessage + */ +inline class XMLMessage(override val stringValue: String) : Message, SingleOnly { + override fun followedBy(tail: Message): Nothing = error("XMLMessage Message cannot be followed") +} + +/** + * 构造一条 XML 消息 + */ +@XMLDsl +inline fun buildXMLMessage(block: @XMLDsl XMLMessageBuilder.() -> Unit): XMLMessage = XMLMessage(XMLMessageBuilder().apply(block).text) + +@Suppress("NOTHING_TO_INLINE") +@XMLDsl +class ItemBuilder( + var bg: Int = 0, + var layout: Int = 4 +) { + @PublishedApi + internal val builder: StringBuilder = StringBuilder() + val text: String get() = "$builder" + + inline fun summary(text: String, color: String = "#FFFFFF") { + this.builder.append("$text") + } + + inline fun title(text: String, size: Int = 18, color: String = "#FFFFFF") { + this.builder.append("$text") + } + + inline fun picture(coverUrl: String) { + this.builder.append("") + } +} + +@XMLDsl +@Suppress("NOTHING_TO_INLINE") +class XMLMessageBuilder( + var templateId: Int = 1, + var serviceId: Int = 1, + var action: String = "plugin", + /** + * 一般为点击这条消息后跳转的链接 + */ + var actionData: String = "", + /** + * 摘要 + */ + var brief: String = "", + var flag: Int = 3, + var url: String = "", // TODO: 2019/12/3 unknown + var sourceName: String = "", + var sourceIconURL: String = "" +) { + @PublishedApi + internal val builder: StringBuilder = StringBuilder() + + val text: String + get() = "" + + "" + + builder.toString() + + "" + + "" + + @XMLDsl + inline fun item(block: @XMLDsl ItemBuilder.() -> Unit) { + builder.append(ItemBuilder().apply(block).text) + } + + inline fun source(name: String, iconURL: String = "") { + sourceName = name + sourceIconURL = iconURL + } +} + +@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE) +@DslMarker +internal annotation class XMLDsl \ No newline at end of file