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
10 changes: 10 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/api/EmojiApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package dev.usbharu.multim.api

import dev.usbharu.multim.error.MultiMResult
import dev.usbharu.multim.model.Emoji

interface EmojiApi {
suspend fun get(name:String):MultiMResult<Emoji>

suspend fun findByName(name:String):MultiMResult<List<Emoji>>
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
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

abstract class MultiMApis(
var statusApi: StatusApi,
var accountApi: AccountApi,
var timelineApi: TimelineApi
var timelineApi: TimelineApi,
var emojiApi: EmojiApi
)
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
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.factory.MultiMApis

class MultiAccountApi(statusApi: StatusApi, accountApi: AccountApi, timelineApi: TimelineApi) :
MultiMApis(statusApi, accountApi, timelineApi) {
class MultiAccountApi(statusApi: StatusApi, accountApi: AccountApi, timelineApi: TimelineApi,emojiApi: EmojiApi) :
MultiMApis(statusApi, accountApi, timelineApi,emojiApi) {
constructor(apiBase: MultiAccountApiBase) : this(
MultiAccountStatusApi(apiBase),
MultiAccountAccountApi(apiBase),
MultiAccountTimelineApi(apiBase)
MultiAccountTimelineApi(apiBase),
MultiAccountEmojiApi(apiBase)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
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.api.EmojiApi
import dev.usbharu.multim.error.MultiMError
import dev.usbharu.multim.error.MultiMResult
import dev.usbharu.multim.model.Emoji

class MultiAccountEmojiApi(val multiAccountApiBase: MultiAccountApiBase) : EmojiApi {
override suspend fun get(name: String): MultiMResult<Emoji> {
return getImpl2(name) { get(it) }.flatMap { it.first }
}

override suspend fun findByName(name: String): MultiMResult<List<Emoji>> {
return getImpl2(name) { findByName(it) }.flatMap { it.first }
}

suspend fun get(name: MultiAccountData<String>): MultiMResult<MultiAccountData<Emoji>> {
return getImpl(name) { get(it) }
}

suspend fun findByName(name: MultiAccountData<String>): MultiMResult<MultiAccountData<List<Emoji>>> {
return getImpl(name) { findByName(it) }
}

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

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

private fun <T> emojiApi(id: T): Result<EmojiApi, MultiMError> {
return multiAccountApiBase.getImpl((id as? MultiAccountData<*>)?.hashCode)
.map { it.emojiApi }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ package dev.usbharu.multim.misskey.v12
import dev.usbharu.multim.ServiceInfo
import dev.usbharu.multim.misskey.v12.api.MisskeyApis
import dev.usbharu.multim.misskey.v12.api.MisskeyMultiMApis
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.misskey.v12.common.api.MisskeyTimelineApi
import dev.usbharu.multim.misskey.v12.common.api.*

object MisskeyV12Info : ServiceInfo(
Regex("misskey"),
Expand All @@ -16,7 +13,7 @@ object MisskeyV12Info : ServiceInfo(
{ apiClient -> MisskeyApis(apiClient as MisskeyApiClient) },
{
if (it is MisskeyApis) {
MisskeyMultiMApis(MisskeyStatusApi(it),MisskeyAccountApi(it),MisskeyTimelineApi(it))
MisskeyMultiMApis(MisskeyStatusApi(it),MisskeyAccountApi(it),MisskeyTimelineApi(it),MisskeyEmojiApi(it))
}else {
TODO()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
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.MetaRequest
import dev.usbharu.multim.misskey.v12.model.MetaResponse

class Meta(val client: MisskeyApiClient) {
suspend fun meta(metaRequest: MetaRequest): MultiMResult<MetaResponse> {
return client.post<MetaRequest, MetaResponse>(metaRequest, "api/meta")
.mapMultiMError()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ class MisskeyApis(misskeyApiClient: MisskeyApiClient) : PlatformApis(misskeyApiC
val timeline = Timeline(misskeyApiClient)
val following = Following(misskeyApiClient)
val users = Users(misskeyApiClient)
val meta = Meta(misskeyApiClient)
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
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.factory.MultiMApis

class MisskeyMultiMApis(statusApi: StatusApi, accountApi: AccountApi,timelineApi: TimelineApi) :
MultiMApis(statusApi, accountApi,timelineApi) {
class MisskeyMultiMApis(statusApi: StatusApi, accountApi: AccountApi,timelineApi: TimelineApi,emojiApi: EmojiApi) :
MultiMApis(statusApi, accountApi,timelineApi,emojiApi) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.usbharu.multim.misskey.v12.common

import dev.usbharu.multim.model.Emoji

class MisskeyEmoji(name: String, url: String) : Emoji(name, url) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package dev.usbharu.multim.misskey.v12.common.api

import com.github.michaelbull.result.flatMap
import com.github.michaelbull.result.map
import com.github.michaelbull.result.toResultOr
import dev.usbharu.multim.api.EmojiApi
import dev.usbharu.multim.error.ErrorType
import dev.usbharu.multim.error.MultiMError
import dev.usbharu.multim.error.MultiMResult
import dev.usbharu.multim.misskey.v12.api.MisskeyApis
import dev.usbharu.multim.misskey.v12.common.MisskeyEmoji
import dev.usbharu.multim.misskey.v12.model.MetaRequest
import dev.usbharu.multim.model.Emoji
import dev.usbharu.multim.misskey.v12.model.components.Emoji as MisskeyModelEmoji

class MisskeyEmojiApi(val misskeyApis: MisskeyApis) : EmojiApi {
override suspend fun get(name: String): MultiMResult<MisskeyEmoji> {
return misskeyApis.meta.meta(MetaRequest())
.flatMap {
it.emojis.find { emoji: MisskeyModelEmoji -> emoji.name.equals(name, true) }
.toResultOr {
MultiMError(
"Emoji $name not Found",
null,
ErrorType.ILLEGAL_ARGUMENT
)
}
}.map { MisskeyEmoji(it.name, it.url) }

}

override suspend fun findByName(name: String): MultiMResult<List<Emoji>> {
return misskeyApis.meta.meta(MetaRequest())
.map {
it.emojis.filter { emoji: MisskeyModelEmoji ->
emoji.name.startsWith(name, true).or(emoji.name.endsWith(name, true))
}
}.map {
it.map { MisskeyEmoji(it.name, it.url) }
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package dev.usbharu.multim.misskey.v12.model

import dev.usbharu.multim.misskey.v12.model.components.Emoji
import kotlinx.serialization.Serializable

@Serializable
data class MetaRequest(val detail: Boolean = true)

@Serializable
data class MetaResponse(
val maintainerName: String? = null,
val maintainerEmail: String? = null,
val version: String,
val name: String? = null,
val uri: String,
val description: String? = null,
val langs: List<String> = listOf(),
val tosUrl: String? = null,
val repositoryUrl: String = "https://github.com/misskey-dev/misskey",
val feedbackUrl: String = "https://github.com/misskey-dev/misskey/issues/new",
val defaultDarkTheme: String? = null,
val defaultLightTheme: String? = null,
val disableRegistration: Boolean,
val disableLocalTimeline: Boolean,
val disableGlobalTimeline: Boolean,
val driveCapacityPerLocalUserMb: Long, //めちゃくちゃでかい値をセットしている人を観測しているのでLong
val cacheRemoteFiles: Boolean,
val emailRequiredForSignup: Boolean,
val enableHcaptcha: Boolean,
val hcaptchaSiteKey: String? = null,
val enableRecaptcha: Boolean,
val recaptchaSiteKey: String? = null,
val swPublickey: String? = null,
val mascotImageUrl: String = "/assets/ai.png",
val bannerUrl: String? = null,
val errorImageUrl: String = "https://xn--p31a.moe/aiart/yubitun.png",
val iconUrl: String? = null,
val maxNoteTextLength: Long,
val emojis: List<Emoji>,
val ads: List<Ad> = listOf(),
val requireSetup: Boolean,
val enableEmail: Boolean,
val enableTwitterIntegration: Boolean,
val enableGithubIntegration: Boolean,
val enableDiscordIntegration: Boolean,
val enableServiceWorker: Boolean,
val translatorAvailable: Boolean,
val proxyAccountName: String? = null,
val features: Features? = null
) {
@Serializable
data class Ad(val place: String, val url: String, val imageUrl: String)

@Serializable
data class Features(
val registration: Boolean,
val localTimeLine: Boolean,
val globalTimeLine: Boolean,
val elasticsearch: Boolean,
val hcaptcha: Boolean,
val recaptcha: Boolean,
val objectStorage: Boolean,
val twitter: Boolean,
val github: Boolean,
val discord: Boolean,
val serviceWorker: Boolean,
val miauth: Boolean = true
)
}
14 changes: 14 additions & 0 deletions impl/misskey/src/test/kotlin/MisskeyTestUtil.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import com.github.michaelbull.result.Err
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.getError
import dev.usbharu.multim.misskey.v12.model.components.Note
import dev.usbharu.multim.misskey.v12.model.components.UserLite
import io.ktor.client.*
Expand All @@ -11,6 +15,7 @@ import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonObject
import org.assertj.core.api.Fail
import org.junit.jupiter.api.Assertions

object MisskeyTestUtil {

Expand Down Expand Up @@ -74,4 +79,13 @@ object MisskeyTestUtil {
fun createFakeNoteToString(id: String, userId: String, username: String, text: String?): String {
return json.encodeToString(createFakeNote(id, userId, username, text))
}

fun assertIsOk(result: Result<*, *>){
Assertions.assertInstanceOf(Ok::class.java, result, "resultの型がOkではない")
}

inline fun <T, reified R : T> assertIsErr(result: Result<*, T>){
Assertions.assertInstanceOf(Err::class.java, result, "resultの型がErrではない")
Assertions.assertInstanceOf(R::class.java, result.getError(), "Errorの型が違う")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package dev.usbharu.multim.misskey.v12.api

import MisskeyTestUtil.assertIsOk
import dev.usbharu.multim.api.createHttpClient
import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient
import dev.usbharu.multim.misskey.v12.model.MetaRequest
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test

class MetaTest

@OptIn(ExperimentalCoroutinesApi::class)
class MetaTestE2E{

val misskeyApiClient = MisskeyApiClient(
System.getProperty("multim_misskey_token"),System.getProperty("multim_misskey_instance"),
createHttpClient()
)

@Test
fun meta() = runTest {
val meta = Meta(misskeyApiClient).meta(MetaRequest())
println(meta)
assertIsOk(meta)
}
}