Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/api/IApi.kt
Original file line number Diff line number Diff line change
@@ -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<Profile>
val STATUSES: String
get() = "i/statuses"

suspend fun statuses(): MultiMResult<List<Status>>

}

object NotImplIApi : IApi {
override suspend fun profile(): MultiMResult<Profile> {
Logger.debug("I Api", "Not impl i api. profile")
return Err(MultiMError("profile not implements", null, ErrorType.NOT_IMPL))
}

override suspend fun statuses(): MultiMResult<List<Status>> {
Logger.debug("I Api", "Not impl i api. statuses")
return Err(MultiMError("profile not implements", null, ErrorType.NOT_IMPL))
}

}
8 changes: 3 additions & 5 deletions core/src/main/kotlin/dev/usbharu/multim/factory/MultiMApis.kt
Original file line number Diff line number Diff line change
@@ -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
)
12 changes: 5 additions & 7 deletions core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountApi.kt
Original file line number Diff line number Diff line change
@@ -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)
)
}
69 changes: 69 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/multi/MultiAccountIApi.kt
Original file line number Diff line number Diff line change
@@ -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<Profile> {
TODO("Not yet implemented")
}

override suspend fun statuses(): MultiMResult<List<Status>> {
TODO("Not yet implemented")
}

suspend fun profile(hashCode: Int): MultiMResult<Profile> {
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<List<Status>> {
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<Profile> {
Logger.debug("I Api", "Multi account i api iApi with MultiAccountData")
return getImpl2(hashCode) { profile() }.flatMap { it.first }
}

suspend fun statuses(hashCode: MultiAccountData<*>): MultiMResult<List<Status>> {
Logger.debug("I Api", "Multi account i api iApi with MultiAccountData")
return getImpl2(hashCode) { statuses() }.flatMap { it.first }
}

private suspend fun <T, R> getImpl(
apiData: MultiAccountData<T>,
callback: suspend IApi.(T) -> Result<R, MultiMError>
): Result<MultiAccountDataImpl<R>, MultiMError> {
return iApi(apiData)
.flatMap { callback(it, apiData.innerData) }
.map { MultiAccountDataImpl(it, apiData.hashCode) }
}


private suspend fun <T, R> getImpl2(
apiData: T,
callback: suspend IApi.(T) -> R
): Result<Pair<R, Int>, MultiMError> {
val timelineApi = iApi(apiData)
return timelineApi.map {
callback(it, apiData) to (
(apiData as? MultiAccountData<*>)?.hashCode
?: multiAccountApiBase.mainClientHashCode!!)
}
}

private fun <T> iApi(id: T): Result<IApi, MultiMError> {
Logger.debug("I Api", "Multi account timeline api timelineApi with MultiAccountData")
return multiAccountApiBase.getImpl((id as? MultiAccountData<*>)?.hashCode)
.map { it.i }
}
}
Original file line number Diff line number Diff line change
@@ -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.*
Expand All @@ -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()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<IIResponse>{
return misskeyApiClient.post<IIRequest, IIResponse>(iiRequest, "api/i").mapMultiMError()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Original file line number Diff line number Diff line change
@@ -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) {
}
Original file line number Diff line number Diff line change
@@ -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) {
}
Original file line number Diff line number Diff line change
@@ -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<Profile> {
return misskeyApis.i.i().map { it.toProfile() }
}

override suspend fun statuses(): MultiMResult<List<Status>> {
return misskeyApis.i.i().map { it.id }
.flatMap { misskeyApis.users.notes(UsersNotesRequest(it)) }
.map { it.map { it.toStatus() } }
}
}
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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