From e4ca1be6d1f40e8fbff22dd0cbd4670cd2fe4d9b Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:00:47 +0900 Subject: [PATCH 1/8] =?UTF-8?q?chore:=20=E8=AD=A6=E5=91=8A=E3=82=92?= =?UTF-8?q?=E6=8A=91=E6=AD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/kotlin/dev/usbharu/multim/api/ApiClient.kt | 1 - .../src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt | 2 +- .../src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt | 2 ++ .../dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt | 3 +++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/ApiClient.kt b/core/src/main/kotlin/dev/usbharu/multim/api/ApiClient.kt index 85e668c..515ddd2 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/api/ApiClient.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/api/ApiClient.kt @@ -19,7 +19,6 @@ abstract class ApiClient(var baseUrl: String, val client: HttpClient) { return post.body() } - @OptIn(InternalAPI::class) suspend inline fun post( content: T, path: String, diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt index c1064fa..4f8e56b 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/ApTest.kt @@ -1,4 +1,4 @@ -@file:OptIn(ExperimentalCoroutinesApi::class) +@file:OptIn(ExperimentalCoroutinesApi::class, ExperimentalCoroutinesApi::class) package dev.usbharu.multim.v12.api diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt index e426b81..8253452 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/api/NotesTest.kt @@ -1,3 +1,5 @@ +@file:OptIn(ExperimentalCoroutinesApi::class) + package dev.usbharu.multim.v12.api import MisskeyTestUtil.createFakeNote diff --git a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt index cf1d69b..c2585b5 100644 --- a/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt +++ b/impl/misskey/src/test/kotlin/dev/usbharu/multim/v12/common/api/MisskeyStatusApiTest.kt @@ -5,6 +5,7 @@ import dev.usbharu.multim.misskey.v12.api.MisskeyApis import dev.usbharu.multim.misskey.v12.common.MisskeyStatusId import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.common.api.MisskeyStatusApi +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString @@ -27,6 +28,7 @@ class MisskeyStatusApiTest { ) ) + @Suppress("JSON_FORMAT_REDUNDANT") @Test fun serializationTest() { @@ -39,6 +41,7 @@ class MisskeyStatusApiTest { }.decodeFromString("""{"a": "aaaa","b": "bbbb"}""") } + @OptIn(ExperimentalCoroutinesApi::class) @Test fun findByIdTest() = runTest { val findById = misskeyStatusApi.findById(MisskeyStatusId("9a65528e5z", "https://lcalhost")) From 1778bfacd7f68c97fd8cb31d6b7bd19ab0ae3291 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:25:38 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20nodeinfo=E7=94=A8=E3=81=AEAPI?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/usbharu/multim/api/NodeinfoApi.kt | 23 ++++++++++++++++++ .../multim/factory/PlatformApiFactory.kt | 2 +- .../model/nodeinfo/{ => v2_0}/NodeInfo.kt | 24 ++++++++++--------- .../model/nodeinfo/wellknown/NodeinfoList.kt | 10 ++++++++ .../factory/DefaultPlatformApiFactory.kt | 2 +- 5 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt rename core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/{ => v2_0}/NodeInfo.kt (90%) create mode 100644 core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt new file mode 100644 index 0000000..e874b73 --- /dev/null +++ b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt @@ -0,0 +1,23 @@ +package dev.usbharu.multim.api + +import dev.usbharu.multim.model.nodeinfo.v2_0.NodeInfo +import dev.usbharu.multim.model.nodeinfo.wellknown.NodeinfoList +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.request.* +import javax.swing.plaf.nimbus.NimbusLookAndFeel + +// todo well-knwonだけでパッケージ作ったほうがいいかも +class NodeinfoApi(val httpClient: HttpClient) { + suspend fun wellKnownNodeinfo(url:String):NodeinfoList{ + return httpClient.get("$url/.well-known/nodeinfo").body() + } + + fun nodeinfoLink(nodeinfoList: NodeinfoList):NodeinfoList.NodeinfoLink { + return nodeinfoList.links.sortedBy { it.rel.substringAfterLast("/", "0").toFloat() }.first() + } + + suspend fun nodeinfo(nodeinfoLink: NodeinfoList.NodeinfoLink):NodeInfo{ + return httpClient.get(nodeinfoLink.href).body() + } +} diff --git a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt index aa1e99a..580d416 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt @@ -1,7 +1,7 @@ package dev.usbharu.multim.factory import dev.usbharu.multim.api.PlatformApis -import dev.usbharu.multim.model.nodeinfo.NodeInfo +import dev.usbharu.multim.model.nodeinfo.v2_0.NodeInfo import io.ktor.client.* interface PlatformApiFactory { diff --git a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/NodeInfo.kt b/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/v2_0/NodeInfo.kt similarity index 90% rename from core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/NodeInfo.kt rename to core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/v2_0/NodeInfo.kt index 1a692e0..eed196d 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/NodeInfo.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/v2_0/NodeInfo.kt @@ -1,9 +1,11 @@ -package dev.usbharu.multim.model.nodeinfo +package dev.usbharu.multim.model.nodeinfo.v2_0 import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -@kotlinx.serialization.Serializable - +@Serializable +//todo seald classにして基底クラス同じにする。 +// あとついでにversion分ける data class NodeInfo( val version: String, val software: Software, @@ -12,13 +14,13 @@ data class NodeInfo( val openRegistrations: Boolean, val usage: Usage ) { - @kotlinx.serialization.Serializable + @Serializable data class Software( val name: String, val version: String ) - @kotlinx.serialization.Serializable + @Serializable enum class Protocol { @SerialName("activitypub") ACTIVITYPUB, @@ -51,12 +53,12 @@ data class NodeInfo( ZOT } - @kotlinx.serialization.Serializable + @Serializable data class Services( val inbound: List, val outBound: List ) { - @kotlinx.serialization.Serializable + @Serializable enum class Inbound { @SerialName("atom1.0") ATOM1, @@ -83,7 +85,7 @@ data class NodeInfo( TWITTER, } - @kotlinx.serialization.Serializable + @Serializable enum class Outbound { @SerialName("atom1.0") ATOM1, @@ -171,17 +173,17 @@ data class NodeInfo( } } - @kotlinx.serialization.Serializable + @Serializable data class Usage( val users: Users, val localPosts: Int, val localComments: Int ) { - @kotlinx.serialization.Serializable + @Serializable data class Users( val total: Int, val activeHalfyear: Int? = null, val activeMonth: Int? = null ) } -} \ No newline at end of file +} diff --git a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt b/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt new file mode 100644 index 0000000..473a4c5 --- /dev/null +++ b/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt @@ -0,0 +1,10 @@ +package dev.usbharu.multim.model.nodeinfo.wellknown + +import kotlinx.serialization.Serializable + +@Serializable +data class NodeinfoList(val links: List) { + + @Serializable + data class NodeinfoLink(val href: String, val rel: String) +} diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt index 5c4819c..7fd504e 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt @@ -7,7 +7,7 @@ import dev.usbharu.multim.misskey.v12.api.MisskeyApis import dev.usbharu.multim.misskey.v12.common.api.MisskeyAccountApi import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.common.api.MisskeyStatusApi -import dev.usbharu.multim.model.nodeinfo.NodeInfo +import dev.usbharu.multim.model.nodeinfo.v2_0.NodeInfo import io.ktor.client.* From 27498fda82650e17d10e9003fec51dedfba66668 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:27:11 +0900 Subject: [PATCH 3/8] =?UTF-8?q?style:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=80=81=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt index e874b73..5ced273 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt @@ -5,7 +5,6 @@ import dev.usbharu.multim.model.nodeinfo.wellknown.NodeinfoList import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.request.* -import javax.swing.plaf.nimbus.NimbusLookAndFeel // todo well-knwonだけでパッケージ作ったほうがいいかも class NodeinfoApi(val httpClient: HttpClient) { @@ -17,6 +16,8 @@ class NodeinfoApi(val httpClient: HttpClient) { return nodeinfoList.links.sortedBy { it.rel.substringAfterLast("/", "0").toFloat() }.first() } + + // todo 強制で2.0のが返ってくるのでバージョンを識別する suspend fun nodeinfo(nodeinfoLink: NodeinfoList.NodeinfoLink):NodeInfo{ return httpClient.get(nodeinfoLink.href).body() } From 487c4d0e7cbc64f8c8ae65ac8f66ac5f049ab453 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 14:13:20 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20nodeinfo=E3=82=92=E5=88=86=E9=9B=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/dev/usbharu/multim/api/NodeinfoApi.kt | 10 +++++----- .../usbharu/multim/factory/PlatformApiFactory.kt | 2 +- .../{nodeinfo => }/wellknown/NodeinfoList.kt | 2 +- .../v2_0 => wellknown/nodeinfo}/NodeInfo.kt | 16 +++++++++++----- .../misskey/factory/DefaultPlatformApiFactory.kt | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) rename core/src/main/kotlin/dev/usbharu/multim/model/{nodeinfo => }/wellknown/NodeinfoList.kt (79%) rename core/src/main/kotlin/dev/usbharu/multim/model/{nodeinfo/v2_0 => wellknown/nodeinfo}/NodeInfo.kt (93%) diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt index 5ced273..bbc0c53 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt @@ -1,24 +1,24 @@ package dev.usbharu.multim.api -import dev.usbharu.multim.model.nodeinfo.v2_0.NodeInfo -import dev.usbharu.multim.model.nodeinfo.wellknown.NodeinfoList +import dev.usbharu.multim.model.wellknown.NodeinfoList +import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.request.* // todo well-knwonだけでパッケージ作ったほうがいいかも class NodeinfoApi(val httpClient: HttpClient) { - suspend fun wellKnownNodeinfo(url:String):NodeinfoList{ + suspend fun wellKnownNodeinfo(url:String): NodeinfoList { return httpClient.get("$url/.well-known/nodeinfo").body() } - fun nodeinfoLink(nodeinfoList: NodeinfoList):NodeinfoList.NodeinfoLink { + fun nodeinfoLink(nodeinfoList: NodeinfoList): NodeinfoList.NodeinfoLink { return nodeinfoList.links.sortedBy { it.rel.substringAfterLast("/", "0").toFloat() }.first() } // todo 強制で2.0のが返ってくるのでバージョンを識別する - suspend fun nodeinfo(nodeinfoLink: NodeinfoList.NodeinfoLink):NodeInfo{ + suspend fun nodeinfo(nodeinfoLink: NodeinfoList.NodeinfoLink): NodeInfo { return httpClient.get(nodeinfoLink.href).body() } } diff --git a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt index 580d416..023a177 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt @@ -1,7 +1,7 @@ package dev.usbharu.multim.factory import dev.usbharu.multim.api.PlatformApis -import dev.usbharu.multim.model.nodeinfo.v2_0.NodeInfo +import dev.usbharu.multim.model.wellknown.nodeinfo.v2_0.NodeInfo import io.ktor.client.* interface PlatformApiFactory { diff --git a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt b/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/NodeinfoList.kt similarity index 79% rename from core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt rename to core/src/main/kotlin/dev/usbharu/multim/model/wellknown/NodeinfoList.kt index 473a4c5..1a23046 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/wellknown/NodeinfoList.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/NodeinfoList.kt @@ -1,4 +1,4 @@ -package dev.usbharu.multim.model.nodeinfo.wellknown +package dev.usbharu.multim.model.wellknown import kotlinx.serialization.Serializable diff --git a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/v2_0/NodeInfo.kt b/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt similarity index 93% rename from core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/v2_0/NodeInfo.kt rename to core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt index eed196d..40c71d1 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/v2_0/NodeInfo.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt @@ -1,19 +1,25 @@ -package dev.usbharu.multim.model.nodeinfo.v2_0 +package dev.usbharu.multim.model.wellknown.nodeinfo import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -//todo seald classにして基底クラス同じにする。 -// あとついでにversion分ける -data class NodeInfo( +sealed class NodeInfo(val internalVersion: String){ + +} + + +@Serializable +// todo seald classにして基底クラス同じにする。 +// あとついでにversion分ける +data class V2_0( val version: String, val software: Software, val protocols: List, val services: Services, val openRegistrations: Boolean, val usage: Usage -) { +) : NodeInfo("2.0") { @Serializable data class Software( val name: String, diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt index 7fd504e..f2a7cb8 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt @@ -7,7 +7,7 @@ import dev.usbharu.multim.misskey.v12.api.MisskeyApis import dev.usbharu.multim.misskey.v12.common.api.MisskeyAccountApi import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient import dev.usbharu.multim.misskey.v12.common.api.MisskeyStatusApi -import dev.usbharu.multim.model.nodeinfo.v2_0.NodeInfo +import dev.usbharu.multim.model.wellknown.nodeinfo.v2_0.NodeInfo import io.ktor.client.* From de3d1418ad063ad00802a0c2b89677ea5027664c Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 15:26:13 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=E5=88=86=E9=9B=A2=E3=81=97?= =?UTF-8?q?=E3=81=9Fnodeinfo=E3=81=AE=E3=82=B7=E3=83=AA=E3=82=A2=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=82=B6=E3=83=BC=E3=82=92=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/usbharu/multim/api/NodeinfoApi.kt | 1 + .../model/wellknown/nodeinfo/NodeInfo.kt | 209 +++++++++++++++++- 2 files changed, 205 insertions(+), 5 deletions(-) diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt index bbc0c53..d75a44b 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt @@ -19,6 +19,7 @@ class NodeinfoApi(val httpClient: HttpClient) { // todo 強制で2.0のが返ってくるのでバージョンを識別する suspend fun nodeinfo(nodeinfoLink: NodeinfoList.NodeinfoLink): NodeInfo { + return httpClient.get(nodeinfoLink.href).body() } } diff --git a/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt b/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt index 40c71d1..8c0ac4c 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/model/wellknown/nodeinfo/NodeInfo.kt @@ -1,11 +1,25 @@ package dev.usbharu.multim.model.wellknown.nodeinfo +import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable - -@Serializable -sealed class NodeInfo(val internalVersion: String){ - +import kotlinx.serialization.Serializer +import kotlinx.serialization.json.JsonContentPolymorphicSerializer +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive + +@Serializable(with = NodeinfoSerializer::class) +sealed class NodeInfo + +@Serializer(forClass = NodeInfo::class) +object NodeinfoSerializer : JsonContentPolymorphicSerializer(NodeInfo::class){ + override fun selectDeserializer(element: JsonElement): DeserializationStrategy = + when (element.jsonObject["version"]?.jsonPrimitive?.content) { + "2.0" -> V2_0.serializer() + "2.1" -> V2_1.serializer() + else -> TODO() + } } @@ -19,7 +33,7 @@ data class V2_0( val services: Services, val openRegistrations: Boolean, val usage: Usage -) : NodeInfo("2.0") { +) : NodeInfo() { @Serializable data class Software( val name: String, @@ -193,3 +207,188 @@ data class V2_0( ) } } + +@Serializable +data class V2_1( + val version: String, + val software: Software, + val protocols: List, + val service: Service, + val openRegistrations: Boolean, + val usage: Usage +) : NodeInfo() { + + @Serializable + data class Software( + val name: String, + val version: String, + val repository: String? = null, + val homepage: String? = null + ) + + @Serializable + enum class Protocol { + @SerialName("activitypub") + ACTIVITYPUB, + + @SerialName("buddycloud") + BUDDYCLOUD, + + @SerialName("dfrn") + DFRN, + + @SerialName("diaspora") + DIASPORA, + + @SerialName("libertree") + LIBERTREE, + + @SerialName("ostatus") + OSTATUS, + + @SerialName("pumpio") + PUMPIO, + + @SerialName("tent") + TENT, + + @SerialName("xmpp") + XMPP, + + @SerialName("zot") + ZOT + } + + @Serializable + data class Service( + val inbound: List, + val outbound: List + ) { + enum class Inbound { + @SerialName("atom1.0") + ATOM1, + + @SerialName("gnusocial") + GNUSOCIAL, + + @SerialName("imap") + IMAP, + + @SerialName("pnut") + PNUT, + + @SerialName("pop3") + POP3, + + @SerialName("pumpio") + PUMPIO, + + @SerialName("rss2.0") + RSS2, + + @SerialName("twitter") + TWITTER + } + + enum class Outbound { + @SerialName("atom1.0") + ATOM1, + + @SerialName("blogger") + BLOGGER, + + @SerialName("buddycloud") + BUDDYCLOUD, + + @SerialName("diaspora") + DIASPORA, + + @SerialName("dreamwidth") + DREAMWIDTH, + + @SerialName("drupal") + DRUPAL, + + @SerialName("facebook") + FACEBOOK, + + @SerialName("friendica") + FRIENDICA, + + @SerialName("gnusocial") + GNUSOCIAL, + + @SerialName("google") + GOOGLE, + + @SerialName("insanejournal") + INSANEJOURNAL, + + @SerialName("libertree") + LIBERTREE, + + @SerialName("linkedin") + LINKEDIN, + + @SerialName("livejournal") + LIVEJOURNAL, + + @SerialName("mediagoblin") + MEDIAGOBLIN, + + @SerialName("myspace") + MYSPACE, + + @SerialName("pinterest") + PINTEREST, + + @SerialName("pnut") + PNUT, + + @SerialName("posterous") + POSTEROUS, + + @SerialName("pumpio") + PUMPIO, + + @SerialName("redmatrix") + REDMATRIX, + + @SerialName("rss2.0") + RSS2, + + @SerialName("smtp") + SMTP, + + @SerialName("tent") + TENT, + + @SerialName("tumblr") + TUMBLR, + + @SerialName("twitter") + TWITTER, + + @SerialName("wordpress") + WORDPRESS, + + @SerialName("xmpp") + XMPP + } + } + + @Serializable + data class Usage( + val users: Users, + val localPosts: Int? = null, + val localComments: Int? = null + ) { + @Serializable + data class Users( + val total: Int? = null, + val activeHalfyear: Int? = null, + val activeMonth: Int? = null + ) + } + +} From e94e8c871063ba2162152c7f501a64f4889bcfa7 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 15:31:42 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=E5=8F=A4=E3=81=84factory=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multim/factory/PlatformApiFactory.kt | 2 +- .../factory/DefaultPlatformApiFactory.kt | 45 ------------------- .../misskey/factory/MisskeyMultiMApis.kt | 8 ---- 3 files changed, 1 insertion(+), 54 deletions(-) delete mode 100644 impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt delete mode 100644 impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/MisskeyMultiMApis.kt diff --git a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt index 023a177..1d05bf6 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/factory/PlatformApiFactory.kt @@ -1,7 +1,7 @@ package dev.usbharu.multim.factory import dev.usbharu.multim.api.PlatformApis -import dev.usbharu.multim.model.wellknown.nodeinfo.v2_0.NodeInfo +import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo import io.ktor.client.* interface PlatformApiFactory { diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt deleted file mode 100644 index f2a7cb8..0000000 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/DefaultPlatformApiFactory.kt +++ /dev/null @@ -1,45 +0,0 @@ -package dev.usbharu.multim.misskey.factory - -import dev.usbharu.multim.api.PlatformApis -import dev.usbharu.multim.factory.MultiMApis -import dev.usbharu.multim.factory.PlatformApiFactory -import dev.usbharu.multim.misskey.v12.api.MisskeyApis -import dev.usbharu.multim.misskey.v12.common.api.MisskeyAccountApi -import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient -import dev.usbharu.multim.misskey.v12.common.api.MisskeyStatusApi -import dev.usbharu.multim.model.wellknown.nodeinfo.v2_0.NodeInfo -import io.ktor.client.* - - -//todo factoryはbuilderを返すだけにする。 -// ↑認証方式が違うAPIに対応できないため -open class DefaultPlatformApiFactory : PlatformApiFactory { - override fun factory( - nodeInfo: NodeInfo, - httpClient: HttpClient, - token: String, - baseUrl: String, - build: MultiMApis.(PlatformApis) -> Unit - ): MultiMApis { - if (nodeInfo.software.name == "misskey") { - return misskey(nodeInfo, httpClient, token, baseUrl, build) - } - TODO() - } - - protected fun misskey( - nodeInfo: NodeInfo, - httpClient: HttpClient, - token: String, - baseUrl: String, - build: (MultiMApis.(PlatformApis) -> Unit)? - ): MisskeyMultiMApis { - if (nodeInfo.software.version.startsWith("12.")) { - val misskeyApis = MisskeyApis(MisskeyApiClient(token, baseUrl, httpClient)) - val misskeyMultiMApis = - MisskeyMultiMApis(MisskeyStatusApi(misskeyApis), MisskeyAccountApi(misskeyApis)) - return misskeyMultiMApis.apply { build?.invoke(this, misskeyApis) } - } - TODO() - } -} diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/MisskeyMultiMApis.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/MisskeyMultiMApis.kt deleted file mode 100644 index c3b4abd..0000000 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/factory/MisskeyMultiMApis.kt +++ /dev/null @@ -1,8 +0,0 @@ -package dev.usbharu.multim.misskey.factory - -import dev.usbharu.multim.factory.MultiMApis -import dev.usbharu.multim.misskey.v12.common.api.MisskeyAccountApi -import dev.usbharu.multim.misskey.v12.common.api.MisskeyStatusApi - -class MisskeyMultiMApis(statusApi: MisskeyStatusApi, accountApi: MisskeyAccountApi) : - MultiMApis(statusApi, accountApi) From 20d0b1401b3bec1d5bd6ac2322e14db84ba235d0 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 16:23:55 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20URL=E3=81=8B=E3=82=89=E8=87=AA?= =?UTF-8?q?=E5=8B=95=E3=81=A7=E6=8E=A8=E6=B8=AC=E3=81=99=E3=82=8B=E3=82=84?= =?UTF-8?q?=E3=81=A4=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/kotlin/dev/usbharu/multim/MultiM.kt | 28 +++++++++++++++++++ .../dev/usbharu/multim/api/NodeinfoApi.kt | 6 +++- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 core/src/main/kotlin/dev/usbharu/multim/MultiM.kt diff --git a/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt b/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt new file mode 100644 index 0000000..90480b7 --- /dev/null +++ b/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt @@ -0,0 +1,28 @@ +package dev.usbharu.multim + +import dev.usbharu.multim.api.NodeinfoApi +import dev.usbharu.multim.api.PlatformApis +import dev.usbharu.multim.factory.MultiMApis +import dev.usbharu.multim.factory.PlatformApiFactory +import io.ktor.client.* +import io.ktor.client.engine.cio.* + +object MultiM { + + + + // todo 認証等を何とかするために、返却するのはAPIをクライアントではなくAPIクライアントのビルダーにする。 + /** + * URLにアクセスして実装を推測し、自動でAPIクライアントを作成します。. + * URLからの推測にはwell-known/nodeinfoを使用しています。 + * + * @param url 使用するURLの末尾にスラッシュを付けてください。 + * @param factory 使用するファクトリークラスのインスタンス。 + * @return 作成されたAPIクライアント + */ + suspend fun createClient(url:String, factory: PlatformApiFactory):MultiMApis{ + val httpClient = HttpClient(CIO) + val nodeinfo = NodeinfoApi(httpClient).nodeinfo(url) + return factory.factory(nodeInfo = nodeinfo, httpClient, "", url) + } +} diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt index d75a44b..eab4fbe 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt @@ -9,7 +9,7 @@ import io.ktor.client.request.* // todo well-knwonだけでパッケージ作ったほうがいいかも class NodeinfoApi(val httpClient: HttpClient) { suspend fun wellKnownNodeinfo(url:String): NodeinfoList { - return httpClient.get("$url/.well-known/nodeinfo").body() + return httpClient.get("$url.well-known/nodeinfo").body() } fun nodeinfoLink(nodeinfoList: NodeinfoList): NodeinfoList.NodeinfoLink { @@ -22,4 +22,8 @@ class NodeinfoApi(val httpClient: HttpClient) { return httpClient.get(nodeinfoLink.href).body() } + + suspend fun nodeinfo(url:String):NodeInfo{ + return nodeinfo(nodeinfoLink(wellKnownNodeinfo(url))) + } } From 9b06f143a66b75d20b6cb2d250b2d1e3d4fffba3 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 25 Jan 2023 21:16:19 +0900 Subject: [PATCH 8/8] =?UTF-8?q?style:=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/kotlin/dev/usbharu/multim/MultiM.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt b/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt index 90480b7..824be05 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/MultiM.kt @@ -1,7 +1,6 @@ package dev.usbharu.multim import dev.usbharu.multim.api.NodeinfoApi -import dev.usbharu.multim.api.PlatformApis import dev.usbharu.multim.factory.MultiMApis import dev.usbharu.multim.factory.PlatformApiFactory import io.ktor.client.*