-
-
Notifications
You must be signed in to change notification settings - Fork 655
/
player.kt
131 lines (115 loc) · 3.79 KB
/
player.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package dev.arbjerg.lavalink.protocol.v4
import kotlinx.serialization.*
import kotlinx.serialization.json.JsonNames
import kotlinx.serialization.json.JsonObject
import kotlin.jvm.JvmInline
inline fun <reified T> JsonObject.deserialize(): T =
deserialize(json.serializersModule.serializer<T>())
fun <T> JsonObject.deserialize(deserializer: DeserializationStrategy<T>): T =
json.decodeFromJsonElement(deserializer, this)
@Serializable
@JvmInline
value class Players(val players: List<Player>)
@Serializable
data class Player(
val guildId: String,
val track: Track?,
val volume: Int,
val paused: Boolean,
val state: PlayerState,
val voice: VoiceState,
val filters: Filters
)
@Serializable
data class Track(
val encoded: String,
val info: TrackInfo,
@EncodeDefault
val pluginInfo: JsonObject = JsonObject(emptyMap()),
@EncodeDefault
val userData: JsonObject = JsonObject(emptyMap())
) : LoadResult.Data {
/**
* Deserialize the plugin info into a specific type.
* This method is a convenience method meant to be used in Java,
* since Kotlin extension methods are painful to use in Java.
*
* @param deserializer The deserializer to use. (e.g. `T.Companion.serializer()`)
*
* @return the deserialized plugin info as type T
*/
fun <T> deserializePluginInfo(deserializer: DeserializationStrategy<T>): T = pluginInfo.deserialize(deserializer)
/**
* Deserialize the user data into a specific type.
* This method is a convenience method meant to be used in Java,
* since Kotlin extension methods are painful to use in Java.
*
* @param deserializer The deserializer to use. (e.g. `T.Companion.serializer()`)
*
* @return the deserialized user data as type T
*/
fun <T> deserializeUserData(deserializer: DeserializationStrategy<T>): T = userData.deserialize(deserializer)
/**
* Copy this track with a new user data json.
*
* @param userData The new user data json.
*
* @return A copy of this track with the new user data json.
*/
fun copyWithUserData(userData: JsonObject): Track {
return copy(userData = userData)
}
}
@Serializable
@JvmInline
value class Tracks(val tracks: List<Track>)
@Serializable
@JvmInline
value class EncodedTracks(val tracks: ArrayList<String>)
@Serializable
data class TrackInfo(
val identifier: String,
val isSeekable: Boolean,
val author: String,
val length: Long,
val isStream: Boolean,
val position: Long,
val title: String,
val uri: String?,
val sourceName: String,
val artworkUrl: String?,
val isrc: String?
)
@Serializable
data class VoiceState(
val token: String,
val endpoint: String,
val sessionId: String
)
@Serializable
data class PlayerState(
val time: Long,
val position: Long,
val connected: Boolean,
val ping: Long
)
@Serializable
data class PlayerUpdateTrack(
val encoded: Omissible<String?> = Omissible.Omitted(),
val identifier: Omissible<String> = Omissible.Omitted(),
val userData: Omissible<JsonObject> = Omissible.Omitted()
)
@Serializable
data class PlayerUpdate(
@Deprecated("Use PlayerUpdateTrack#encoded instead", ReplaceWith("encoded"))
val encodedTrack: Omissible<String?> = Omissible.Omitted(),
@Deprecated("Use PlayerUpdateTrack#identifier instead")
val identifier: Omissible<String> = Omissible.Omitted(),
val track: Omissible<PlayerUpdateTrack> = Omissible.Omitted(),
val position: Omissible<Long> = Omissible.Omitted(),
val endTime: Omissible<Long?> = Omissible.Omitted(),
val volume: Omissible<Int> = Omissible.Omitted(),
val paused: Omissible<Boolean> = Omissible.Omitted(),
val filters: Omissible<Filters> = Omissible.Omitted(),
val voice: Omissible<VoiceState> = Omissible.Omitted()
)