This library is a Bluesky/ATProtocol client library compatible with Kotlin Multiplatform. It depends on khttpclient and uses Ktor Client internally. Therefore, this library can be used on any platform supported by Kotlin Multiplatform and Ktor Client. The behavior on each platform depends on khttpclient.
Below is how to use it with Kotlin on the supported platforms using Gradle.
If you are using it on an Apple platform, please refer
to kbsky-cocoapods.
Additionally, please check the test code as well.
repositories {
mavenCentral()
}
dependencies {
+ implementation("work.socialhub.kbsky:core:0.2.0")
+ implementation("work.socialhub.kbsky:auth:0.2.0")
+ implementation("work.socialhub.kbsky:stream:0.2.0")
}
repositories {
+ maven { url = uri("https://repo.repsy.io/mvn/uakihir0/public") }
}
dependencies {
+ implementation("work.socialhub.kbsky:core:0.3.0-SNAPSHOT")
+ implementation("work.socialhub.kbsky:auth:0.3.0-SNAPSHOT")
+ implementation("work.socialhub.kbsky:stream:0.3.0-SNAPSHOT")
}
All of the above can be added to and used in regular Java projects, too. All you have to do is to use the suffix -jvm
when listing the dependency.
Here is a sample Maven configuration:
<dependency>
<groupId>work.socialhub.kbsky</groupId>
<artifactId>core-jvm</artifactId>
<version>[VERSION]</version>
</dependency>
To start a session by specifying a handle and password, do as follows:
val response = BlueskyFactory
.instance(BSKY_SOCIAL.uri)
.server()
.createSession(
ServerCreateSessionRequest().also {
it.identifier = HANDLE
it.password = PASSWORD
}
)
println(response.data.accessJwt)
To access various resources with the obtained access token, execute the following:
val auth = BearerTokenAuthProvider(accessJwt)
BlueskyFactory
.instance(BSKY_SOCIAL.uri)
.feed()
.post(
FeedPostRequest(auth).also {
it.text = "Hello World!"
}
)
Authentication using a password is gradually being replaced with OAuth. For more details on OAuth authentication, please refer to Authentication via OAuth.
val response = PLCDirectoryFactory
.instance()
.DIDDetails(did)
println(checkNotNull(response.data.alsoKnownAs)[0])
val stream = ATProtocolStreamFactory
.instance(
apiUri = BSKY_SOCIAL.uri,
streamUri = BSKY_NETWORK.uri
)
.sync()
.subscribeRepos(
SyncSubscribeReposRequest().also {
it.filter = listOf(
"app.bsky.feed.post"
)
}
)
stream.eventCallback(
object : EventCallback {
override fun onEvent(
cid: String?,
uri: String?,
record: RecordUnion
) {
print(record)
}
})
MIT License