Skip to content

Commit b3f6fa1

Browse files
authored
Merge pull request #300 from simple-robot/dev/support-template-API
增加模板消息的API实现
2 parents a7ae14c + 3dd845a commit b3f6fa1

File tree

12 files changed

+1393
-0
lines changed

12 files changed

+1393
-0
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ apiValidation {
7979
"love.forte.simbot.annotations.InternalSimbotAPI",
8080
"love.forte.simbot.kook.ExperimentalKookApi",
8181
"love.forte.simbot.kook.InternalKookApi",
82+
"love.forte.simbot.kook.api.template.ExperimentalTemplateApi"
8283
),
8384
)
8485

simbot-component-kook-api/api/simbot-component-kook-api.api

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2103,6 +2103,99 @@ public final class love/forte/simbot/kook/api/role/UserRoleOperated$Companion {
21032103
public final fun serializer ()Lkotlinx/serialization/KSerializer;
21042104
}
21052105

2106+
public final class love/forte/simbot/kook/api/template/CreateTemplateApi$Factory {
2107+
public final fun create (Ljava/lang/String;Ljava/lang/String;I)Llove/forte/simbot/kook/api/template/CreateTemplateApi;
2108+
public final fun create (Ljava/lang/String;Ljava/lang/String;II)Llove/forte/simbot/kook/api/template/CreateTemplateApi;
2109+
public final fun create (Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;)Llove/forte/simbot/kook/api/template/CreateTemplateApi;
2110+
public final fun create (Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;)Llove/forte/simbot/kook/api/template/CreateTemplateApi;
2111+
public static synthetic fun create$default (Llove/forte/simbot/kook/api/template/CreateTemplateApi$Factory;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Llove/forte/simbot/kook/api/template/CreateTemplateApi;
2112+
}
2113+
2114+
public synthetic class love/forte/simbot/kook/api/template/CreateTemplateResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
2115+
public fun <init> (Lkotlinx/serialization/KSerializer;)V
2116+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
2117+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
2118+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Llove/forte/simbot/kook/api/template/CreateTemplateResult;
2119+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
2120+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
2121+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Llove/forte/simbot/kook/api/template/CreateTemplateResult;)V
2122+
public final fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
2123+
}
2124+
2125+
public final class love/forte/simbot/kook/api/template/CreateTemplateResult$Companion {
2126+
public final fun serializer (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;
2127+
}
2128+
2129+
public final class love/forte/simbot/kook/api/template/DeleteTemplateApi$Factory {
2130+
public final fun create (Ljava/lang/String;)Llove/forte/simbot/kook/api/template/DeleteTemplateApi;
2131+
}
2132+
2133+
public abstract interface annotation class love/forte/simbot/kook/api/template/ExperimentalTemplateApi : java/lang/annotation/Annotation {
2134+
}
2135+
2136+
public final class love/forte/simbot/kook/api/template/GetTemplateListApi$Factory {
2137+
public final fun create ()Llove/forte/simbot/kook/api/template/GetTemplateListApi;
2138+
public final fun create (Ljava/lang/Integer;)Llove/forte/simbot/kook/api/template/GetTemplateListApi;
2139+
public final fun create (Ljava/lang/Integer;Ljava/lang/Integer;)Llove/forte/simbot/kook/api/template/GetTemplateListApi;
2140+
public static synthetic fun create$default (Llove/forte/simbot/kook/api/template/GetTemplateListApi$Factory;Ljava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)Llove/forte/simbot/kook/api/template/GetTemplateListApi;
2141+
}
2142+
2143+
public synthetic class love/forte/simbot/kook/api/template/TemplatePageList$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
2144+
public fun <init> (Lkotlinx/serialization/KSerializer;)V
2145+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
2146+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
2147+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Llove/forte/simbot/kook/api/template/TemplatePageList;
2148+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
2149+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
2150+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Llove/forte/simbot/kook/api/template/TemplatePageList;)V
2151+
public final fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
2152+
}
2153+
2154+
public final class love/forte/simbot/kook/api/template/TemplatePageList$Companion {
2155+
public final fun serializer (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;
2156+
}
2157+
2158+
public synthetic class love/forte/simbot/kook/api/template/TemplatePageMeta$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
2159+
public static final field INSTANCE Llove/forte/simbot/kook/api/template/TemplatePageMeta$$serializer;
2160+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
2161+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
2162+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Llove/forte/simbot/kook/api/template/TemplatePageMeta;
2163+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
2164+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
2165+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Llove/forte/simbot/kook/api/template/TemplatePageMeta;)V
2166+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
2167+
}
2168+
2169+
public final class love/forte/simbot/kook/api/template/TemplatePageMeta$Companion {
2170+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
2171+
}
2172+
2173+
public final class love/forte/simbot/kook/api/template/UpdateTemplateApi$Factory {
2174+
public final fun create (Ljava/lang/String;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2175+
public final fun create (Ljava/lang/String;Ljava/lang/String;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2176+
public final fun create (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2177+
public final fun create (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2178+
public final fun create (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2179+
public final fun create (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2180+
public final fun create (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2181+
public static synthetic fun create$default (Llove/forte/simbot/kook/api/template/UpdateTemplateApi$Factory;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Llove/forte/simbot/kook/api/template/UpdateTemplateApi;
2182+
}
2183+
2184+
public synthetic class love/forte/simbot/kook/api/template/UpdateTemplateResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
2185+
public fun <init> (Lkotlinx/serialization/KSerializer;)V
2186+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
2187+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
2188+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Llove/forte/simbot/kook/api/template/UpdateTemplateResult;
2189+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
2190+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
2191+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Llove/forte/simbot/kook/api/template/UpdateTemplateResult;)V
2192+
public final fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
2193+
}
2194+
2195+
public final class love/forte/simbot/kook/api/template/UpdateTemplateResult$Companion {
2196+
public final fun serializer (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;
2197+
}
2198+
21062199
public final class love/forte/simbot/kook/api/thread/Category {
21072200
public static final field Companion Llove/forte/simbot/kook/api/thread/Category$Companion;
21082201
public fun <init> (Ljava/lang/String;Ljava/lang/String;IILjava/util/List;)V
@@ -7258,6 +7351,21 @@ public abstract class love/forte/simbot/kook/objects/kmd/ValueAppenderMarkdownKo
72587351
public fun <init> (Ljava/lang/CharSequence;)V
72597352
}
72607353

7354+
public synthetic class love/forte/simbot/kook/objects/template/SimpleTemplate$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
7355+
public static final field INSTANCE Llove/forte/simbot/kook/objects/template/SimpleTemplate$$serializer;
7356+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
7357+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
7358+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Llove/forte/simbot/kook/objects/template/SimpleTemplate;
7359+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
7360+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
7361+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Llove/forte/simbot/kook/objects/template/SimpleTemplate;)V
7362+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
7363+
}
7364+
7365+
public final class love/forte/simbot/kook/objects/template/SimpleTemplate$Companion {
7366+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
7367+
}
7368+
72617369
public final class love/forte/simbot/kook/util/BooleanToIntSerializer : kotlinx/serialization/KSerializer {
72627370
public static final field INSTANCE Llove/forte/simbot/kook/util/BooleanToIntSerializer;
72637371
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Boolean;
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/*
2+
* Copyright (c) 2023-2025. ForteScarlet.
3+
*
4+
* This file is part of simbot-component-kook.
5+
*
6+
* simbot-component-kook is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Lesser General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* simbot-component-kook is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with simbot-component-kook,
18+
* If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
21+
package love.forte.simbot.kook.api.template
22+
23+
import kotlinx.serialization.DeserializationStrategy
24+
import kotlinx.serialization.SerialName
25+
import kotlinx.serialization.Serializable
26+
import love.forte.simbot.kook.api.ApiResultType
27+
import love.forte.simbot.kook.api.KookPostApi
28+
import love.forte.simbot.kook.objects.template.SimpleTemplate
29+
import love.forte.simbot.kook.objects.template.Template
30+
import kotlin.jvm.JvmOverloads
31+
import kotlin.jvm.JvmStatic
32+
33+
/**
34+
* [创建模板](https://developer.kookapp.cn/doc/http/template)
35+
*
36+
* POST /api/v3/template/create
37+
*
38+
* @author ForteScarlet
39+
* @since 4.3.0
40+
*/
41+
@ExperimentalTemplateApi
42+
public class CreateTemplateApi private constructor(
43+
private val title: String,
44+
private val content: String,
45+
private val msgtype: Int,
46+
private val type: Int = 0,
47+
private val testData: String = "",
48+
private val testChannel: String = "",
49+
) : KookPostApi<CreateTemplateResult<Template>>() {
50+
public companion object Factory {
51+
private val PATH = ApiPath.create("template", "create")
52+
53+
/**
54+
* 构建 [CreateTemplateApi]
55+
*
56+
* @param title 模板标题,最长64
57+
* @param content 模板内容
58+
* @param msgtype 消息类型:1代表kmd消息,2代表通过json发卡片消息,3代表通过yaml发卡片消息
59+
* @param type 模板类型,目前固定为0,代表模板使用twig渲染
60+
* @param testData 测试数据,主要用于界面上的便利测试
61+
* @param testChannel 测试的频道,最长64,主要用于界面上的便利测试
62+
*/
63+
@JvmStatic
64+
@JvmOverloads
65+
public fun create(
66+
title: String,
67+
content: String,
68+
msgtype: Int,
69+
type: Int = 0,
70+
testData: String = "",
71+
testChannel: String = ""
72+
): CreateTemplateApi = CreateTemplateApi(title, content, msgtype, type, testData, testChannel)
73+
}
74+
75+
override val apiPath: ApiPath
76+
get() = PATH
77+
78+
override val resultDeserializationStrategy: DeserializationStrategy<CreateTemplateResult<Template>>
79+
get() = CreateTemplateResult.serializer(SimpleTemplate.serializer())
80+
81+
override fun createBody(): Any = Body(title, content, msgtype, type, testData, testChannel)
82+
83+
@Serializable
84+
private data class Body(
85+
val title: String,
86+
val content: String,
87+
val msgtype: Int,
88+
val type: Int = 0,
89+
@SerialName("test_data")
90+
val testData: String = "",
91+
@SerialName("test_channel")
92+
val testChannel: String = "",
93+
)
94+
}
95+
96+
// 返回值结构:{"code":0,"message":"操作成功","data":{"model":{"id":"85604912","content":"Hello {name}!","type":0,"status":0,"test_data":"","test_channel":"","title":"Test Template","msgtype":1}}}
97+
// {"model":{"id":"85604912","content":"Hello {name}!","type":0,"status":0,"test_data":"","test_channel":"","title":"Test Template","msgtype":1}}}
98+
// 这他妈又是什么粽子
99+
// data 里面套了一层 model,真是醉了
100+
101+
@Serializable
102+
@ConsistentCopyVisibility
103+
@ExperimentalTemplateApi
104+
public data class CreateTemplateResult<out T : Template> @ApiResultType internal constructor(
105+
val model: T
106+
)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (c) 2023-2025. ForteScarlet.
3+
*
4+
* This file is part of simbot-component-kook.
5+
*
6+
* simbot-component-kook is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Lesser General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* simbot-component-kook is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with simbot-component-kook,
18+
* If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
21+
package love.forte.simbot.kook.api.template
22+
23+
import kotlinx.serialization.DeserializationStrategy
24+
import kotlinx.serialization.Serializable
25+
import kotlinx.serialization.builtins.serializer
26+
import love.forte.simbot.kook.api.KookPostApi
27+
import kotlin.jvm.JvmStatic
28+
29+
/**
30+
* [删除模板](https://developer.kookapp.cn/doc/http/template)
31+
*
32+
* POST /api/v3/template/delete
33+
*
34+
* @author ForteScarlet
35+
* @since 4.3.0
36+
*/
37+
@ExperimentalTemplateApi
38+
public class DeleteTemplateApi private constructor(
39+
private val id: String,
40+
) : KookPostApi<Unit>() {
41+
public companion object Factory {
42+
private val PATH = ApiPath.create("template", "delete")
43+
44+
/**
45+
* 构建 [DeleteTemplateApi]
46+
*
47+
* @param id 要删除的模板ID,最长16
48+
*/
49+
@JvmStatic
50+
public fun create(id: String): DeleteTemplateApi = DeleteTemplateApi(id)
51+
}
52+
53+
override val apiPath: ApiPath
54+
get() = PATH
55+
56+
override val resultDeserializationStrategy: DeserializationStrategy<Unit>
57+
get() = Unit.serializer()
58+
59+
override fun createBody(): Any = Body(id)
60+
61+
@Serializable
62+
private data class Body(
63+
val id: String,
64+
)
65+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright (c) 2025. ForteScarlet.
3+
*
4+
* This file is part of simbot-component-kook.
5+
*
6+
* simbot-component-kook is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Lesser General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* simbot-component-kook is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with simbot-component-kook,
18+
* If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
21+
package love.forte.simbot.kook.api.template
22+
23+
@RequiresOptIn(
24+
message = "模板消息相关API是实验性的。" +
25+
"它们尚未公开于官方文档,无法保证稳定性,并且可能会在未来被修改、删除。"
26+
)
27+
@Retention(AnnotationRetention.BINARY)
28+
public annotation class ExperimentalTemplateApi

0 commit comments

Comments
 (0)