Skip to content

Commit c62e09c

Browse files
committed
feat: add some extensions for plugin building
1 parent 7e89522 commit c62e09c

File tree

5 files changed

+81
-18
lines changed

5 files changed

+81
-18
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.ntqqrev.saltify.annotation
2+
3+
/**
4+
* 由这个注解标注的定义会在将来 Context Parameters 稳定后迁移到 extension 软件包下。
5+
*/
6+
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY)
7+
internal annotation class ContextParametersMigrationNeeded

saltify-core/src/commonMain/kotlin/org/ntqqrev/saltify/dsl/SaltifyCommandContext.kt

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package org.ntqqrev.saltify.dsl
22

3+
import kotlinx.coroutines.delay
34
import org.ntqqrev.milky.Event
5+
import org.ntqqrev.milky.IncomingMessage
46
import org.ntqqrev.milky.OutgoingSegment
7+
import org.ntqqrev.saltify.annotation.ContextParametersMigrationNeeded
58
import org.ntqqrev.saltify.annotation.SaltifyDsl
69
import org.ntqqrev.saltify.core.SaltifyApplication
7-
import org.ntqqrev.saltify.entity.CommandError
10+
import org.ntqqrev.saltify.core.recallGroupMessage
11+
import org.ntqqrev.saltify.core.recallPrivateMessage
812
import org.ntqqrev.saltify.extension.respond
13+
import org.ntqqrev.saltify.model.CommandError
14+
import org.ntqqrev.saltify.model.milky.SendMessageOutput
915
import kotlin.reflect.KClass
16+
import kotlin.time.Duration
1017

1118
@SaltifyDsl
1219
public class SaltifyCommandContext internal constructor() {
@@ -74,14 +81,6 @@ public class SaltifyCommandContext internal constructor() {
7481
}
7582
}
7683

77-
/**
78-
* 定义一个命令参数。请搭配 [SaltifyCommandExecutionContext.capture] 使用。
79-
*/
80-
public inline fun <reified T : Any> SaltifyCommandContext.parameter(
81-
name: String,
82-
description: String = ""
83-
): SaltifyCommandParamDef<T> = parameter(T::class, name, description)
84-
8584
public class SaltifyCommandExecutionContext(
8685
public val client: SaltifyApplication,
8786
public val event: Event.MessageReceive,
@@ -100,20 +99,37 @@ public class SaltifyCommandExecutionContext(
10099
/**
101100
* 获取已解析的参数值。这是 [capture] 的简写形式。
102101
*/
102+
@ContextParametersMigrationNeeded
103103
@Suppress("UNCHECKED_CAST")
104104
public val <T : Any> SaltifyCommandParamDef<T>.value: T
105105
get() = capture(this)
106106

107107
/**
108-
* 回复当前命令。
108+
* 响应命令。
109+
*/
110+
public suspend fun respond(
111+
block: MutableList<OutgoingSegment>.() -> Unit
112+
): SendMessageOutput = event.respond(client, block)
113+
114+
/**
115+
* 响应命令,并在指定延迟后撤回消息。
109116
*/
110-
public suspend fun respond(block: MutableList<OutgoingSegment>.() -> Unit) {
111-
event.respond(client, block)
117+
@ContextParametersMigrationNeeded
118+
public suspend fun respondWithRecall(
119+
delay: Duration,
120+
block: MutableList<OutgoingSegment>.() -> Unit
121+
) {
122+
val output = respond(block)
123+
delay(delay)
124+
when (val data = event.data) {
125+
is IncomingMessage.Group -> client.recallGroupMessage(data.peerId, output.messageSeq)
126+
else -> client.recallPrivateMessage(data.peerId, output.messageSeq)
127+
}
112128
}
113129
}
114130

115131
/**
116-
* 命令参数
132+
* 命令参数
117133
*/
118134
public class SaltifyCommandParamDef<T : Any>(
119135
public val type: KClass<T>,

saltify-core/src/commonMain/kotlin/org/ntqqrev/saltify/dsl/SaltifyPluginBuilder.kt renamed to saltify-core/src/commonMain/kotlin/org/ntqqrev/saltify/dsl/SaltifyPluginContext.kt

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@ package org.ntqqrev.saltify.dsl
22

33
import kotlinx.coroutines.CoroutineScope
44
import kotlinx.coroutines.Job
5+
import kotlinx.coroutines.delay
56
import org.ntqqrev.milky.Event
7+
import org.ntqqrev.milky.IncomingMessage
68
import org.ntqqrev.milky.OutgoingSegment
9+
import org.ntqqrev.saltify.annotation.ContextParametersMigrationNeeded
710
import org.ntqqrev.saltify.annotation.SaltifyDsl
811
import org.ntqqrev.saltify.core.SaltifyApplication
12+
import org.ntqqrev.saltify.core.recallGroupMessage
13+
import org.ntqqrev.saltify.core.recallPrivateMessage
914
import org.ntqqrev.saltify.extension.command
1015
import org.ntqqrev.saltify.extension.on
1116
import org.ntqqrev.saltify.extension.respond
17+
import org.ntqqrev.saltify.model.milky.SendMessageOutput
18+
import kotlin.time.Duration
1219

1320
@SaltifyDsl
14-
public class SaltifyPluginBuilder internal constructor(
21+
public class SaltifyPluginContext internal constructor(
1522
public val client: SaltifyApplication,
1623
@PublishedApi internal val pluginScope: CoroutineScope
1724
) : CoroutineScope by pluginScope {
@@ -74,22 +81,39 @@ public class SaltifyPluginBuilder internal constructor(
7481
/**
7582
* 响应事件。
7683
*/
77-
public suspend fun Event.MessageReceive.respond(block: MutableList<OutgoingSegment>.() -> Unit): Any =
78-
respond(client, block)
84+
public suspend fun Event.MessageReceive.respond(
85+
block: MutableList<OutgoingSegment>.() -> Unit
86+
): SendMessageOutput = respond(client, block)
87+
88+
/**
89+
* 响应事件,并在指定延迟后撤回消息。
90+
*/
91+
@ContextParametersMigrationNeeded
92+
public suspend fun Event.MessageReceive.respondWithRecall(
93+
delay: Duration,
94+
block: MutableList<OutgoingSegment>.() -> Unit
95+
) {
96+
val output = respond(block)
97+
delay(delay)
98+
when (data) {
99+
is IncomingMessage.Group -> client.recallGroupMessage(data.peerId, output.messageSeq)
100+
else -> client.recallPrivateMessage(data.peerId, output.messageSeq)
101+
}
102+
}
79103
}
80104

81105
/**
82106
* 一个插件
83107
*/
84108
public class SaltifyPlugin(
85109
public val name: String,
86-
internal val setup: SaltifyPluginBuilder.() -> Unit
110+
internal val setup: SaltifyPluginContext.() -> Unit
87111
)
88112

89113
/**
90114
* 创建一个插件。
91115
*/
92116
public fun createSaltifyPlugin(
93117
name: String = "unspecified",
94-
block: SaltifyPluginBuilder.() -> Unit
118+
block: SaltifyPluginContext.() -> Unit
95119
): SaltifyPlugin = SaltifyPlugin(name, block)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.ntqqrev.saltify.model.milky
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
public data class SendMessageOutput(
7+
/**
8+
* 消息序列号
9+
*/
10+
public val messageSeq: Long,
11+
/**
12+
* 消息发送时间
13+
*/
14+
public val time: Long
15+
)

saltify-core/src/jvmTest/kotlin/org/ntqqrev/saltify/PluginTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.ntqqrev.saltify.core.SaltifyApplication
1010
import org.ntqqrev.saltify.core.getLoginInfo
1111
import org.ntqqrev.saltify.core.text
1212
import org.ntqqrev.saltify.dsl.createSaltifyPlugin
13+
import org.ntqqrev.saltify.extension.parameter
1314
import org.ntqqrev.saltify.model.EventConnectionType
1415
import org.ntqqrev.saltify.model.SaltifyComponentType
1516
import org.ntqqrev.saltify.util.coroutine.saltifyComponent

0 commit comments

Comments
 (0)