Skip to content

Commit 23d2e6e

Browse files
authored
Merge pull request #301 from simple-robot/dev/channel-editable
feat(api): implement KookChannel updater and extend channel properties
2 parents b3f6fa1 + dcd157d commit 23d2e6e

File tree

10 files changed

+373
-38
lines changed

10 files changed

+373
-38
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,32 +35,19 @@ simbot-common-suspend = { group = "love.forte.simbot.common", name = "simbot-com
3535
simbot-common-annotations = { group = "love.forte.simbot.common", name = "simbot-common-annotations", version.ref = "simbot" }
3636
simbot-common-loop = { group = "love.forte.simbot.common", name = "simbot-common-stage-loop", version.ref = "simbot" }
3737
simbot-gradle = { group = "love.forte.simbot.gradle", name = "simbot-gradle-suspendtransforms", version.ref = "simbot" }
38+
simbot-processor-classBuilder = { module = "love.forte.simbot.processor:simbot-processor-class-builder", version.ref = "simbot" }
3839

3940
# jetbrains-annotation
4041
jetbrains-annotations = "org.jetbrains:annotations:26.0.2"
4142

4243
# kotlinx-coroutines
4344
kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
44-
kotlinx-coroutines-core-jvm = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-jvm", version.ref = "kotlinx-coroutines" }
45-
kotlinx-coroutines-core-js = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core-js", version.ref = "kotlinx-coroutines" }
46-
kotlinx-coroutines-jdk8 = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-jdk8", version.ref = "kotlinx-coroutines" }
47-
kotlinx-coroutines-reactive = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-reactive", version.ref = "kotlinx-coroutines" }
48-
kotlinx-coroutines-reactor = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-reactor", version.ref = "kotlinx-coroutines" }
49-
kotlinx-coroutines-rx2 = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-rx2", version.ref = "kotlinx-coroutines" }
50-
kotlinx-coroutines-rx3 = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-rx3", version.ref = "kotlinx-coroutines" }
51-
kotlinx-coroutines-guava = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-guava", version.ref = "kotlinx-coroutines" }
52-
kotlinx-coroutines-slf4j = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-slf4j", version.ref = "kotlinx-coroutines" }
53-
kotlinx-coroutines-play-services = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-play-services", version.ref = "kotlinx-coroutines" }
5445
kotlinx-coroutines-debug = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-debug", version.ref = "kotlinx-coroutines" }
5546
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" }
5647

5748
# kotlinx-serialization
5849
kotlinx-serialization-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-core", version.ref = "kotlinx-serialization" }
5950
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
60-
kotlinx-serialization-hocon = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-hocon", version.ref = "kotlinx-serialization" }
61-
kotlinx-serialization-protobuf = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-protobuf", version.ref = "kotlinx-serialization" }
62-
kotlinx-serialization-cbor = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-cbor", version.ref = "kotlinx-serialization" }
63-
kotlinx-serialization-properties = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-properties", version.ref = "kotlinx-serialization" }
6451

6552
# ktor
6653
## serialization

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

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -585,23 +585,36 @@ public final class love/forte/simbot/kook/api/category/GetCategoryListApi$Factor
585585

586586
public final class love/forte/simbot/kook/api/channel/ChannelInfo {
587587
public static final field Companion Llove/forte/simbot/kook/api/channel/ChannelInfo$Companion;
588-
public fun <init> (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;III)V
588+
public fun <init> (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/lang/String;ILjava/util/List;IZ)V
589+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/lang/String;ILjava/util/List;IZILkotlin/jvm/internal/DefaultConstructorMarker;)V
589590
public final fun component1 ()Ljava/lang/String;
591+
public final fun component10 ()Ljava/lang/String;
592+
public final fun component11 ()I
593+
public final fun component12 ()Ljava/util/List;
594+
public final fun component13 ()I
595+
public final fun component14 ()Z
590596
public final fun component2 ()Ljava/lang/String;
591597
public final fun component3 ()Z
592598
public final fun component4 ()Ljava/lang/String;
593599
public final fun component5 ()Ljava/lang/String;
594600
public final fun component6 ()I
595601
public final fun component7 ()I
596602
public final fun component8 ()I
597-
public final fun copy (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;III)Llove/forte/simbot/kook/api/channel/ChannelInfo;
598-
public static synthetic fun copy$default (Llove/forte/simbot/kook/api/channel/ChannelInfo;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIIILjava/lang/Object;)Llove/forte/simbot/kook/api/channel/ChannelInfo;
603+
public final fun component9 ()Ljava/lang/String;
604+
public final fun copy (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/lang/String;ILjava/util/List;IZ)Llove/forte/simbot/kook/api/channel/ChannelInfo;
605+
public static synthetic fun copy$default (Llove/forte/simbot/kook/api/channel/ChannelInfo;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IIILjava/lang/String;Ljava/lang/String;ILjava/util/List;IZILjava/lang/Object;)Llove/forte/simbot/kook/api/channel/ChannelInfo;
599606
public fun equals (Ljava/lang/Object;)Z
607+
public final fun getGuildId ()Ljava/lang/String;
608+
public final fun getHasPassword ()Z
600609
public final fun getId ()Ljava/lang/String;
601610
public final fun getLevel ()I
602611
public final fun getLimitAmount ()I
603612
public final fun getName ()Ljava/lang/String;
604613
public final fun getParentId ()Ljava/lang/String;
614+
public final fun getPermissionOverwrites ()Ljava/util/List;
615+
public final fun getPermissionSync ()I
616+
public final fun getSlowMode ()I
617+
public final fun getTopic ()Ljava/lang/String;
605618
public final fun getType ()I
606619
public final fun getUserId ()Ljava/lang/String;
607620
public fun hashCode ()I
@@ -652,16 +665,17 @@ public final class love/forte/simbot/kook/api/channel/ChannelMoveUserApi$Factory
652665

653666
public final class love/forte/simbot/kook/api/channel/ChannelView {
654667
public static final field Companion Llove/forte/simbot/kook/api/channel/ChannelView$Companion;
655-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;ILjava/util/List;)V
656-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;ILjava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
668+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/util/List;)V
669+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
657670
public final fun component1 ()Ljava/lang/String;
658671
public final fun component10 ()Z
659672
public final fun component11 ()I
660673
public final fun component12 ()Z
661674
public final fun component13 ()Ljava/lang/String;
662675
public final fun component14 ()Ljava/util/List;
663-
public final fun component15 ()I
664-
public final fun component16 ()Ljava/util/List;
676+
public final fun component15 ()Ljava/util/List;
677+
public final fun component16 ()I
678+
public final fun component17 ()Ljava/util/List;
665679
public final fun component2 ()Ljava/lang/String;
666680
public final fun component3 ()Ljava/lang/String;
667681
public final fun component4 ()Ljava/lang/String;
@@ -670,8 +684,8 @@ public final class love/forte/simbot/kook/api/channel/ChannelView {
670684
public final fun component7 ()I
671685
public final fun component8 ()I
672686
public final fun component9 ()I
673-
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;ILjava/util/List;)Llove/forte/simbot/kook/api/channel/ChannelView;
674-
public static synthetic fun copy$default (Llove/forte/simbot/kook/api/channel/ChannelView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;ILjava/util/List;ILjava/lang/Object;)Llove/forte/simbot/kook/api/channel/ChannelView;
687+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/util/List;)Llove/forte/simbot/kook/api/channel/ChannelView;
688+
public static synthetic fun copy$default (Llove/forte/simbot/kook/api/channel/ChannelView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZIZLjava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/util/List;ILjava/lang/Object;)Llove/forte/simbot/kook/api/channel/ChannelView;
675689
public fun equals (Ljava/lang/Object;)Z
676690
public final fun getChildren ()Ljava/util/List;
677691
public final fun getGuildId ()Ljava/lang/String;
@@ -681,6 +695,7 @@ public final class love/forte/simbot/kook/api/channel/ChannelView {
681695
public final fun getMaximumMember ()I
682696
public final fun getName ()Ljava/lang/String;
683697
public final fun getParentId ()Ljava/lang/String;
698+
public final fun getPermissionOverwrites ()Ljava/util/List;
684699
public final fun getPermissionSync ()I
685700
public final fun getPermissionUsers ()Ljava/util/List;
686701
public final fun getServerUrl ()Ljava/lang/String;

simbot-component-kook-api/src/commonMain/kotlin/love/forte/simbot/kook/api/channel/GetChannelListApi.kt

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,20 +123,57 @@ public data class ChannelInfo @ApiResultType constructor(
123123
*/
124124
@SerialName("limit_amount")
125125
public val limitAmount: Int,
126+
127+
/**
128+
* @since 4.3.0
129+
*/
130+
@SerialName("guild_id")
131+
public val guildId: String = "",
132+
133+
/**
134+
* 主题
135+
* @since 4.3.0
136+
*/
137+
public val topic: String = "",
138+
139+
/**
140+
* 慢速模式。单位为秒。
141+
* @since 4.3.0
142+
*/
143+
@SerialName("slow_mode")
144+
public val slowMode: Int = 0,
145+
146+
/**
147+
* @since 4.3.0
148+
*/
149+
@SerialName("permission_overwrites")
150+
public val permissionOverwrites: List<PermissionOverwrite> = emptyList(),
151+
152+
/**
153+
* @since 4.3.0
154+
*/
155+
@SerialName("permission_sync")
156+
public val permissionSync: Int = 0,
157+
158+
/**
159+
* @since 4.3.0
160+
*/
161+
@SerialName("has_password")
162+
public val hasPassword: Boolean = false,
126163
)
127164

128165
/**
129166
* 将 [ChannelInfo] 转化为 [Channel] 类型,
130167
* 并可选的提供一些缺失字段的默认值。
131168
*/
132169
public fun ChannelInfo.toChannel(
133-
guildId: String,
134-
topic: String = "",
135-
slowMode: Int = 0,
136-
permissionOverwrites: List<PermissionOverwrite> = emptyList(),
170+
guildId: String = this.guildId,
171+
topic: String = this.topic,
172+
slowMode: Int = this.slowMode,
173+
permissionOverwrites: List<PermissionOverwrite> = this.permissionOverwrites,
137174
permissionUsers: List<PermissionUser> = emptyList(),
138-
permissionSync: Int = 0,
139-
hasPassword: Boolean = false,
175+
permissionSync: Int = this.permissionSync,
176+
hasPassword: Boolean = this.hasPassword,
140177
): Channel = ChannelInfoChannel(
141178
this,
142179
guildId = guildId,

simbot-component-kook-api/src/commonMain/kotlin/love/forte/simbot/kook/api/channel/GetChannelViewApi.kt

Lines changed: 81 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,13 @@ import io.ktor.http.*
2121
import kotlinx.serialization.DeserializationStrategy
2222
import kotlinx.serialization.SerialName
2323
import kotlinx.serialization.Serializable
24+
import love.forte.simbot.kook.InternalKookApi
2425
import love.forte.simbot.kook.api.ApiResultType
2526
import love.forte.simbot.kook.api.KookGetApi
27+
import love.forte.simbot.kook.objects.Channel
28+
import love.forte.simbot.kook.objects.PermissionOverwrite
29+
import love.forte.simbot.kook.objects.PermissionUser
30+
import love.forte.simbot.kook.util.BooleanToIntSerializer
2631
import love.forte.simbot.kook.util.parameters
2732
import kotlin.jvm.JvmOverloads
2833
import kotlin.jvm.JvmStatic
@@ -110,20 +115,18 @@ public data class ChannelView @ApiResultType constructor(
110115

111116
/** 是否为分组类型 */
112117
@SerialName("is_category")
113-
public val isCategory: Boolean = type == 0,
118+
@Serializable(BooleanToIntSerializer::class)
119+
public val isCategory: Boolean = false,
114120

115121
/** 语音服务器地址,HOST:PORT的格式 */
116122
@SerialName("server_url")
117123
val serverUrl: String,
118124

119-
// maybe miss
120-
121-
// /**
122-
// * 针对角色的频道权限覆盖
123-
// */
124-
// @SerialName("permission_overwrites")
125-
// public val permissionOverwrites: List<ChannelPermissionOverwrites> = emptyList(),
126-
// TODO permissionOverwrites
125+
/**
126+
* 针对角色的频道权限覆盖
127+
*/
128+
@SerialName("permission_overwrites")
129+
public val permissionOverwrites: List<PermissionOverwrite> = emptyList(),
127130

128131
/**
129132
* 针对用户的频道权限覆盖
@@ -145,3 +148,72 @@ public data class ChannelView @ApiResultType constructor(
145148
*/
146149
public val children: List<String>? = null
147150
)
151+
152+
/**
153+
* 将 [ChannelView] 转化为 [Channel] 类型,
154+
* 并可选的提供一些缺失字段的默认值。
155+
*
156+
* @since 4.3.0
157+
*/
158+
@InternalKookApi
159+
public fun ChannelView.toChannel(
160+
permissionUsers: List<PermissionUser> = emptyList(),
161+
): Channel = ChannelViewChannel(
162+
this,
163+
permissionUsers = permissionUsers,
164+
)
165+
166+
private class ChannelViewChannel(
167+
private val channelView: ChannelView,
168+
override val permissionUsers: List<PermissionUser>,
169+
) : Channel {
170+
override val id: String
171+
get() = channelView.id
172+
override val name: String
173+
get() = channelView.name
174+
override val userId: String
175+
get() = channelView.userId
176+
override val guildId: String
177+
get() = channelView.guildId
178+
override val topic: String
179+
get() = channelView.topic
180+
override val isCategory: Boolean
181+
get() = channelView.isCategory
182+
override val parentId: String
183+
get() = channelView.parentId
184+
override val level: Int
185+
get() = channelView.level
186+
override val slowMode: Int
187+
get() = channelView.slowMode
188+
override val type: Int
189+
get() = channelView.type
190+
override val permissionSync: Int
191+
get() = channelView.permissionSync
192+
override val hasPassword: Boolean
193+
get() = channelView.hasPassword
194+
override val permissionOverwrites: List<PermissionOverwrite>
195+
get() = channelView.permissionOverwrites
196+
197+
override fun toString(): String {
198+
return "ChannelViewChannel(channelView=$channelView, permissionOverwrites=$permissionOverwrites, permissionUsers=$permissionUsers)"
199+
}
200+
201+
override fun equals(other: Any?): Boolean {
202+
if (this === other) return true
203+
if (other !is ChannelViewChannel) return false
204+
205+
if (channelView != other.channelView) return false
206+
if (permissionOverwrites != other.permissionOverwrites) return false
207+
if (permissionUsers != other.permissionUsers) return false
208+
209+
return true
210+
}
211+
212+
override fun hashCode(): Int {
213+
var result = channelView.hashCode()
214+
result = 31 * result + permissionOverwrites.hashCode()
215+
result = 31 * result + permissionUsers.hashCode()
216+
return result
217+
}
218+
}
219+

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,34 @@ public abstract interface class love/forte/simbot/component/kook/KookChannel : l
3434
public abstract fun getBot ()Llove/forte/simbot/component/kook/bot/KookBot;
3535
public abstract fun getCategory ()Llove/forte/simbot/component/kook/KookCategory;
3636
public abstract fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;
37+
public fun getGuildId ()Llove/forte/simbot/common/id/ID;
38+
public fun getHasPassword ()Z
3739
public fun getId ()Llove/forte/simbot/common/id/ID;
40+
public fun getLevel ()I
3841
public fun getName ()Ljava/lang/String;
42+
public fun getParentId ()Llove/forte/simbot/common/id/ID;
43+
public fun getPermissionSync ()I
44+
public fun getSlowMode ()I
3945
public abstract fun getSource ()Llove/forte/simbot/kook/objects/Channel;
46+
public fun getTopic ()Ljava/lang/String;
47+
public fun getUserId ()Llove/forte/simbot/common/id/ID;
48+
public abstract fun updater ()Llove/forte/simbot/component/kook/KookChannelUpdater;
49+
}
50+
51+
public final class love/forte/simbot/component/kook/KookChannelKt {
52+
public static final fun getSlowModeDuration (Llove/forte/simbot/component/kook/KookChannel;)J
53+
public static final fun update (Llove/forte/simbot/component/kook/KookChannel;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
54+
}
55+
56+
public abstract interface class love/forte/simbot/component/kook/KookChannelUpdater {
57+
public fun applyBuilder (Lkotlin/jvm/functions/Function1;)Llove/forte/simbot/component/kook/KookChannelUpdater;
58+
public abstract synthetic fun execute (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
59+
public fun executeAsync ()Ljava/util/concurrent/CompletableFuture;
60+
public fun executeBlocking ()Llove/forte/simbot/component/kook/KookChannel;
61+
public fun executeReserve ()Llove/forte/simbot/suspendrunner/reserve/SuspendReserve;
62+
public abstract fun getBuilder ()Llove/forte/simbot/kook/api/channel/UpdateChannelApi$Builder;
63+
public abstract fun getChannel ()Llove/forte/simbot/component/kook/KookChannel;
64+
public abstract fun setBuilder (Llove/forte/simbot/kook/api/channel/UpdateChannelApi$Builder;)V
4065
}
4166

4267
public abstract interface class love/forte/simbot/component/kook/KookChatCapableChannel : kotlinx/coroutines/CoroutineScope, love/forte/simbot/component/kook/KookChannel, love/forte/simbot/definition/ChatChannel {

0 commit comments

Comments
 (0)