diff --git a/core/src/main/kotlin/dev/usbharu/multim/api/IApi.kt b/core/src/main/kotlin/dev/usbharu/multim/api/IApi.kt new file mode 100644 index 0000000..abddf29 --- /dev/null +++ b/core/src/main/kotlin/dev/usbharu/multim/api/IApi.kt @@ -0,0 +1,34 @@ +package dev.usbharu.multim.api + +import com.github.michaelbull.result.Err +import dev.usbharu.multim.Logger +import dev.usbharu.multim.error.ErrorType +import dev.usbharu.multim.error.MultiMError +import dev.usbharu.multim.error.MultiMResult +import dev.usbharu.multim.model.Profile +import dev.usbharu.multim.model.Status + +interface IApi { + val PROFILE: String + get() = "i/profile" + + suspend fun profile(): MultiMResult + val STATUSES: String + get() = "i/statuses" + + suspend fun statuses(): MultiMResult> + +} + +object NotImplIApi : IApi { + override suspend fun profile(): MultiMResult { + Logger.debug("I Api", "Not impl i api. profile") + return Err(MultiMError("profile not implements", null, ErrorType.NOT_IMPL)) + } + + override suspend fun statuses(): MultiMResult> { + Logger.debug("I Api", "Not impl i api. statuses") + return Err(MultiMError("profile not implements", null, ErrorType.NOT_IMPL)) + } + +} diff --git a/core/src/main/kotlin/dev/usbharu/multim/factory/MultiMApis.kt b/core/src/main/kotlin/dev/usbharu/multim/factory/MultiMApis.kt index 169a6f9..93a56d9 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/factory/MultiMApis.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/factory/MultiMApis.kt @@ -1,13 +1,11 @@ package dev.usbharu.multim.factory -import dev.usbharu.multim.api.AccountApi -import dev.usbharu.multim.api.EmojiApi -import dev.usbharu.multim.api.StatusApi -import dev.usbharu.multim.api.TimelineApi +import dev.usbharu.multim.api.* abstract class MultiMApis( var statusApi: StatusApi, var accountApi: AccountApi, var timelineApi: TimelineApi, - var emojiApi: EmojiApi + var emojiApi: EmojiApi, + var i: IApi ) diff --git a/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountApi.kt b/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountApi.kt index 702eca9..9cae8d9 100644 --- a/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountApi.kt +++ b/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountApi.kt @@ -1,17 +1,15 @@ package dev.usbharu.multim.multi -import dev.usbharu.multim.api.AccountApi -import dev.usbharu.multim.api.EmojiApi -import dev.usbharu.multim.api.StatusApi -import dev.usbharu.multim.api.TimelineApi +import dev.usbharu.multim.api.* import dev.usbharu.multim.factory.MultiMApis -class MultiAccountApi(statusApi: StatusApi, accountApi: AccountApi, timelineApi: TimelineApi,emojiApi: EmojiApi) : - MultiMApis(statusApi, accountApi, timelineApi,emojiApi) { +class MultiAccountApi(statusApi: StatusApi, accountApi: AccountApi, timelineApi: TimelineApi,emojiApi: EmojiApi,i:IApi) : + MultiMApis(statusApi, accountApi, timelineApi,emojiApi,i) { constructor(apiBase: MultiAccountApiBase) : this( MultiAccountStatusApi(apiBase), MultiAccountAccountApi(apiBase), MultiAccountTimelineApi(apiBase), - MultiAccountEmojiApi(apiBase) + MultiAccountEmojiApi(apiBase), + MultiAccountIApi(apiBase) ) } diff --git a/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountIApi.kt b/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountIApi.kt new file mode 100644 index 0000000..9ddb102 --- /dev/null +++ b/core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountIApi.kt @@ -0,0 +1,69 @@ +package dev.usbharu.multim.multi + +import com.github.michaelbull.result.Result +import com.github.michaelbull.result.flatMap +import com.github.michaelbull.result.map +import dev.usbharu.multim.Logger +import dev.usbharu.multim.api.IApi +import dev.usbharu.multim.error.MultiMError +import dev.usbharu.multim.error.MultiMResult +import dev.usbharu.multim.model.Profile +import dev.usbharu.multim.model.Status + +class MultiAccountIApi(val multiAccountApiBase: MultiAccountApiBase) : IApi { + override suspend fun profile(): MultiMResult { + TODO("Not yet implemented") + } + + override suspend fun statuses(): MultiMResult> { + TODO("Not yet implemented") + } + + suspend fun profile(hashCode: Int): MultiMResult { + Logger.debug("I Api", "Multi account i api iApi with MultiAccountData") + return multiAccountApiBase.getImpl(hashCode).flatMap { it.i.profile() } + } + + suspend fun statuses(hashCode: Int): MultiMResult> { + Logger.debug("I Api", "Multi account i api iApi with MultiAccountData") + return multiAccountApiBase.getImpl(hashCode).flatMap { it.i.statuses() } + } + + suspend fun profile(hashCode: MultiAccountData<*>): MultiMResult { + Logger.debug("I Api", "Multi account i api iApi with MultiAccountData") + return getImpl2(hashCode) { profile() }.flatMap { it.first } + } + + suspend fun statuses(hashCode: MultiAccountData<*>): MultiMResult> { + Logger.debug("I Api", "Multi account i api iApi with MultiAccountData") + return getImpl2(hashCode) { statuses() }.flatMap { it.first } + } + + private suspend fun getImpl( + apiData: MultiAccountData, + callback: suspend IApi.(T) -> Result + ): Result, MultiMError> { + return iApi(apiData) + .flatMap { callback(it, apiData.innerData) } + .map { MultiAccountDataImpl(it, apiData.hashCode) } + } + + + private suspend fun getImpl2( + apiData: T, + callback: suspend IApi.(T) -> R + ): Result, MultiMError> { + val timelineApi = iApi(apiData) + return timelineApi.map { + callback(it, apiData) to ( + (apiData as? MultiAccountData<*>)?.hashCode + ?: multiAccountApiBase.mainClientHashCode!!) + } + } + + private fun iApi(id: T): Result { + Logger.debug("I Api", "Multi account timeline api timelineApi with MultiAccountData") + return multiAccountApiBase.getImpl((id as? MultiAccountData<*>)?.hashCode) + .map { it.i } + } +} diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt index badac9d..a52201e 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/MisskeyV12Info.kt @@ -1,6 +1,7 @@ package dev.usbharu.multim.misskey.v12 import dev.usbharu.multim.ServiceInfo +import dev.usbharu.multim.api.NotImplIApi import dev.usbharu.multim.misskey.v12.api.MisskeyApis import dev.usbharu.multim.misskey.v12.api.MisskeyMultiMApis import dev.usbharu.multim.misskey.v12.common.api.* @@ -14,7 +15,7 @@ object MisskeyV12Info : ServiceInfo( { apiClient -> MisskeyApis(apiClient as MisskeyApiClient) }, { if (it is MisskeyApis) { - MisskeyMultiMApis(MisskeyStatusApi(it),MisskeyAccountApi(it),MisskeyTimelineApi(it),MisskeyEmojiApi(it)) + MisskeyMultiMApis(MisskeyStatusApi(it),MisskeyAccountApi(it),MisskeyTimelineApi(it),MisskeyEmojiApi(it),MisskeyIApi(it)) }else { TODO() } diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/I.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/I.kt new file mode 100644 index 0000000..a306ad7 --- /dev/null +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/I.kt @@ -0,0 +1,13 @@ +package dev.usbharu.multim.misskey.v12.api + +import dev.usbharu.multim.error.MultiMResult +import dev.usbharu.multim.error.mapMultiMError +import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient +import dev.usbharu.multim.misskey.v12.model.IIRequest +import dev.usbharu.multim.misskey.v12.model.IIResponse + +class I(val misskeyApiClient: MisskeyApiClient) { + suspend fun i(iiRequest: IIRequest = IIRequest()):MultiMResult{ + return misskeyApiClient.post(iiRequest, "api/i").mapMultiMError() + } +} diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyApis.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyApis.kt index 79b5b5e..2b05d51 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyApis.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyApis.kt @@ -11,4 +11,5 @@ class MisskeyApis(misskeyApiClient: MisskeyApiClient) : PlatformApis(misskeyApiC val following = Following(misskeyApiClient) val users = Users(misskeyApiClient) val meta = Meta(misskeyApiClient) + val i = I(misskeyApiClient) } diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyMultiMApis.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyMultiMApis.kt index 44895e7..6edbb4b 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyMultiMApis.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/api/MisskeyMultiMApis.kt @@ -1,11 +1,8 @@ package dev.usbharu.multim.misskey.v12.api -import dev.usbharu.multim.api.AccountApi -import dev.usbharu.multim.api.EmojiApi -import dev.usbharu.multim.api.StatusApi -import dev.usbharu.multim.api.TimelineApi +import dev.usbharu.multim.api.* import dev.usbharu.multim.factory.MultiMApis -class MisskeyMultiMApis(statusApi: StatusApi, accountApi: AccountApi,timelineApi: TimelineApi,emojiApi: EmojiApi) : - MultiMApis(statusApi, accountApi,timelineApi,emojiApi) { +class MisskeyMultiMApis(statusApi: StatusApi, accountApi: AccountApi,timelineApi: TimelineApi,emojiApi: EmojiApi,iApi: IApi) : + MultiMApis(statusApi, accountApi,timelineApi,emojiApi,iApi) { } diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/MisskeyField.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/MisskeyField.kt new file mode 100644 index 0000000..fb24efe --- /dev/null +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/MisskeyField.kt @@ -0,0 +1,7 @@ +package dev.usbharu.multim.misskey.v12.common + +import dev.usbharu.multim.model.Field + +class MisskeyField(name: String = "", value: String = "") : + Field(name, value,false) { +} diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyIApi.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyIApi.kt new file mode 100644 index 0000000..4bf8270 --- /dev/null +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/common/api/MisskeyIApi.kt @@ -0,0 +1,24 @@ +package dev.usbharu.multim.misskey.v12.common.api + +import com.github.michaelbull.result.flatMap +import com.github.michaelbull.result.map +import dev.usbharu.multim.api.IApi +import dev.usbharu.multim.error.MultiMResult +import dev.usbharu.multim.misskey.v12.api.MisskeyApis +import dev.usbharu.multim.misskey.v12.converter.misskey.v12.NoteConverter.toStatus +import dev.usbharu.multim.misskey.v12.converter.misskey.v12.UsersConverter.toProfile +import dev.usbharu.multim.misskey.v12.model.UsersNotesRequest +import dev.usbharu.multim.model.Profile +import dev.usbharu.multim.model.Status + +class MisskeyIApi(val misskeyApis: MisskeyApis) : IApi { + override suspend fun profile(): MultiMResult { + return misskeyApis.i.i().map { it.toProfile() } + } + + override suspend fun statuses(): MultiMResult> { + return misskeyApis.i.i().map { it.id } + .flatMap { misskeyApis.users.notes(UsersNotesRequest(it)) } + .map { it.map { it.toStatus() } } + } +} diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/converter/misskey/v12/UsersConverter.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/converter/misskey/v12/UsersConverter.kt index 03d4a46..7cfcd8d 100644 --- a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/converter/misskey/v12/UsersConverter.kt +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/converter/misskey/v12/UsersConverter.kt @@ -1,8 +1,8 @@ package dev.usbharu.multim.misskey.v12.converter.misskey.v12 -import dev.usbharu.multim.misskey.v12.common.MisskeyAccount -import dev.usbharu.multim.misskey.v12.common.MisskeyRelation +import dev.usbharu.multim.misskey.v12.common.* import dev.usbharu.multim.misskey.v12.model.UsersRelationResponse +import dev.usbharu.multim.misskey.v12.model.components.* object UsersConverter { fun UsersRelationResponse.toRelation( @@ -12,4 +12,58 @@ object UsersConverter { return MisskeyRelation(myself, other, isFollowing, isFollowed, isMuted, isBlocked) } + + fun User.toProfile(): MisskeyProfile { + return when (this) { + is MeDetailed -> { + MisskeyProfile( + MisskeyAccount( + this.id, + this.name ?: "null", + this.username, + this.isBot, + MisskeyAvatar(this.avatarUrl ?: "null") + ), + this.isBot, + MisskeyContent(this.description ?: "null"), + this.followingCount, + this.followersCount, + this.fields.map { it.toField() } + ) + } + + is UserDetailedNotMe -> { + MisskeyProfile( + MisskeyAccount( + this.id, + this.name ?: "null", + this.username, + this.isBot, + MisskeyAvatar(this.avatarUrl ?: "null") + ), + this.isBot, + MisskeyContent(this.description ?: "null"), + this.followingCount, + this.followersCount, + this.fields.map { it.toField() } + ) + } + + is UserLite -> { + MisskeyProfile( + MisskeyAccount( + this.id, + this.name ?: "null", + this.username, + this.isBot, + MisskeyAvatar(this.avatarUrl ?: "null") + ), this.isBot ?: false, MisskeyContent("ERROR NO INFO") + ) + } + } + } + + fun Field.toField(): MisskeyField { + return MisskeyField(this.name, this.value) + } } diff --git a/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/model/II.kt b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/model/II.kt new file mode 100644 index 0000000..27c1af4 --- /dev/null +++ b/impl/misskey/src/main/kotlin/dev/usbharu/multim/misskey/v12/model/II.kt @@ -0,0 +1,10 @@ +package dev.usbharu.multim.misskey.v12.model + +import dev.usbharu.multim.misskey.v12.model.components.MeDetailed +import dev.usbharu.multim.misskey.v12.model.components.MisskeyNeedAuth +import kotlinx.serialization.Serializable + +@Serializable +class IIRequest() : MisskeyNeedAuth() + +typealias IIResponse = MeDetailed