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
20 changes: 20 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/MultiM.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import dev.usbharu.multim.api.NodeinfoApi
import dev.usbharu.multim.error.MultiMError
import dev.usbharu.multim.factory.MultiMApis
import dev.usbharu.multim.factory.PlatformApiFactory
import dev.usbharu.multim.model.Auth
import dev.usbharu.multim.multi.MultiAccountApiBase
import io.ktor.client.*
import io.ktor.client.engine.cio.*
Expand Down Expand Up @@ -57,6 +58,25 @@ object MultiM {
return result
}

suspend fun createClient(
url:String,
auth: Auth,
factory: PlatformApiFactory,
httpClient: HttpClient = httpClientWithJson
) : Result<MultiMApis,MultiMError> {
dev.usbharu.multim.Logger.info("Create Client","START Create cient with url:$url.")
dev.usbharu.multim.Logger.debug("Create Client","Create client with url:$url auth:${auth::class.simpleName}")
val result = NodeinfoApi(httpClient).nodeinfo(url)
.map { nodeInfo -> factory.factory(nodeInfo, httpClient, auth, url) }
result.onSuccess {
dev.usbharu.multim.Logger.info("Create Client","SUCCESS Create Client with url:$url")
}
result.onFailure {
dev.usbharu.multim.Logger.error("Create Client","FAILURE Create Client with url:$url auth:${auth::class.simpleName}",it)
}
return result
}

fun createMultiAccountClients(serviceInfoList: List<ServiceInfo> = listOf()): MultiAccountApiBase {
dev.usbharu.multim.Logger.info("Create Client","START Create multi account client with ${serviceInfoList.size} services.")
val multiAccountApiBase = MultiAccountApiBase(serviceInfoList)
Expand Down
3 changes: 2 additions & 1 deletion core/src/main/kotlin/dev/usbharu/multim/ServiceInfo.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package dev.usbharu.multim
import dev.usbharu.multim.api.ApiClient
import dev.usbharu.multim.api.PlatformApis
import dev.usbharu.multim.factory.MultiMApis
import dev.usbharu.multim.model.Auth
import io.ktor.client.*

/**
Expand All @@ -16,7 +17,7 @@ import io.ktor.client.*
abstract class ServiceInfo(
val serviceNameMatchRegex: Regex,
val versionMatchRegex: Regex,
val apiClient:(String,String,HttpClient)->ApiClient,
val apiClient:(Auth,String,HttpClient)->ApiClient,
val platFormApis:(ApiClient)->PlatformApis,
val multiMApis: (PlatformApis)->MultiMApis
)
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
package dev.usbharu.multim.factory

import dev.usbharu.multim.api.PlatformApis
import dev.usbharu.multim.model.Auth
import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo
import io.ktor.client.*

interface PlatformApiFactory {
@Deprecated("トークンが一つの場合にしか対応できないので廃止。")
fun factory(
nodeInfo: NodeInfo,
httpClient: HttpClient,
token: String,
baseUrl: String,
build: MultiMApis.(PlatformApis) -> Unit = {}
): MultiMApis

fun factory(
nodeInfo: NodeInfo,
httpClient: HttpClient,
auth: Auth,
baseUrl: String,
build:MultiMApis.(PlatformApis) -> Unit = {}
):MultiMApis
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package dev.usbharu.multim.factory
import dev.usbharu.multim.Logger
import dev.usbharu.multim.ServiceInfo
import dev.usbharu.multim.api.PlatformApis
import dev.usbharu.multim.model.Auth
import dev.usbharu.multim.model.SingleTokenAuth
import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo
import io.ktor.client.*

Expand All @@ -13,6 +15,16 @@ class ServiceInfoFactory(private val services: List<ServiceInfo>) : PlatformApiF
token: String,
baseUrl: String,
build: MultiMApis.(PlatformApis) -> Unit
): MultiMApis {
return this.factory(nodeInfo, httpClient, SingleTokenAuth(token), baseUrl, build)
}

override fun factory(
nodeInfo: NodeInfo,
httpClient: HttpClient,
auth: Auth,
baseUrl: String,
build: MultiMApis.(PlatformApis) -> Unit
): MultiMApis {
for (service in services) {

Expand All @@ -22,7 +34,7 @@ class ServiceInfoFactory(private val services: List<ServiceInfo>) : PlatformApiF
) {
val platFormApis = service.platFormApis(
service.apiClient(
token,
auth,
baseUrl,
httpClient
)
Expand Down
5 changes: 5 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/model/Auth.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package dev.usbharu.multim.model

abstract class Auth

class SingleTokenAuth(val token:String): Auth()
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ 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.*
import dev.usbharu.multim.model.SingleTokenAuth

object MisskeyV12Info : ServiceInfo(
Regex("misskey"),
Regex("^12\\.[\\d.]+"),
::MisskeyApiClient,
{ auth, baseUrl, client -> MisskeyApiClient(auth as SingleTokenAuth, baseUrl, client) },

{ apiClient -> MisskeyApis(apiClient as MisskeyApiClient) },
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class Drive(val client: MisskeyApiClient) {
return client.client.submitFormWithBinaryData(
client.baseUrl + "api/drive/files/create",
formData = formData {
append("\"i\"", client.token)
append("\"i\"", client.auth.token)
append("\"file\"", createRequest.file, Headers.build {
append(HttpHeaders.ContentDisposition, "filename=${createRequest.name}")
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@ package dev.usbharu.multim.misskey.v12.common.api
import dev.usbharu.multim.MultiM.json
import dev.usbharu.multim.api.ApiClient
import dev.usbharu.multim.misskey.v12.model.components.MisskeyNeedAuth
import dev.usbharu.multim.model.Auth
import dev.usbharu.multim.model.SingleTokenAuth
import io.ktor.client.*
import io.ktor.client.plugins.api.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.plugins.logging.*
import io.ktor.client.plugins.websocket.*
import io.ktor.http.*
import io.ktor.serialization.kotlinx.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.websocket.*
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.consumeEach
Expand All @@ -21,7 +20,7 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.serialization.encodeToString

class MisskeyApiClient(var token: String, baseUrl: String, client: HttpClient) :
class MisskeyApiClient(var auth: SingleTokenAuth, baseUrl: String, client: HttpClient) :
ApiClient(baseUrl, client.config {
install(WebSockets) {
pingInterval = 20_000
Expand All @@ -32,7 +31,7 @@ class MisskeyApiClient(var token: String, baseUrl: String, client: HttpClient) :
println("request type is :${content::class}")
if (content is MisskeyNeedAuth) {
println("injection token")
content.i = token
content.i = auth.token
}
request.headers.append(
"Content-Type", ContentType.Application.Json
Expand All @@ -53,7 +52,7 @@ class MisskeyApiClient(var token: String, baseUrl: String, client: HttpClient) :
var commands = MutableStateFlow("a")
fun connect() {
val launch = coroutineScope.launch {
client.wss("ws" + baseUrl.replaceFirst("http", "") + "streaming?i=$token") {
client.wss("ws" + baseUrl.replaceFirst("http", "") + "streaming?i=${auth.token}") {
awaitAll(
coroutineScope.async {
commands.onEach { println("Sending :$it");outgoing.send(Frame.Text(it)) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ 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 dev.usbharu.multim.model.SingleTokenAuth
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Assertions.*
Expand All @@ -15,7 +16,7 @@ class MetaTest
class MetaTestE2E{

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import dev.usbharu.multim.misskey.v12.model.StreamRequest.ConnectRequest.Body.Ch
import dev.usbharu.multim.misskey.v12.model.StreamRequest.DisconnectRequest
import dev.usbharu.multim.misskey.v12.model.StreamResponse.ChannelResponse.ChannelBody.NoteBody
import dev.usbharu.multim.misskey.v12.model.components.Note
import dev.usbharu.multim.model.SingleTokenAuth
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
Expand All @@ -23,7 +24,7 @@ class TimelineTestE2E {


val client = MisskeyApiClient(
System.getProperty("multim_misskey_token"),
SingleTokenAuth(System.getProperty("multim_misskey_token")),
System.getProperty("multim_misskey_instance"),
createHttpClient()
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import dev.usbharu.multim.misskey.v12.api.Ap
import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient
import dev.usbharu.multim.misskey.v12.model.ApShowRequest
import dev.usbharu.multim.misskey.v12.model.ApShowResponse
import dev.usbharu.multim.model.SingleTokenAuth
import io.github.artsok.RepeatedIfExceptionsTest
import io.ktor.client.*
import io.ktor.client.engine.mock.*
Expand All @@ -29,7 +30,7 @@ import org.junit.jupiter.api.Test
class ApTest {

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

Expand All @@ -49,7 +50,7 @@ class ApTest {
}"""

val misskeyApiClient = MisskeyApiClient(
"aaaaaaaa", "https://localhost", createMockHttpClient(typeUser)
SingleTokenAuth("aaaaaaaa"), "https://localhost", createMockHttpClient(typeUser)
)
val show = Ap(misskeyApiClient).show(ApShowRequest("https://localhost/test/IN7OFhht")).get()
assertEquals(json.decodeFromString<ApShowResponse.TypeUser>(typeUser), show)
Expand All @@ -66,7 +67,7 @@ class ApTest {
""".trimIndent()

val misskeyApiClient = MisskeyApiClient(
"W7Xw8F", "https://localhost", createMockHttpClient(typeNote)
SingleTokenAuth("W7Xw8F"), "https://localhost", createMockHttpClient(typeNote)
)
val show = Ap(misskeyApiClient).show(ApShowRequest("https://localhost/test/C56WI")).get()
assertEquals(json.decodeFromString<ApShowResponse.TypeNote>(typeNote), show)
Expand All @@ -76,7 +77,7 @@ class ApTest {
class ApTestE2E {

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import dev.usbharu.multim.misskey.v12.api.Drive
import dev.usbharu.multim.misskey.v12.api.Notes
import dev.usbharu.multim.misskey.v12.common.api.MisskeyApiClient
import dev.usbharu.multim.misskey.v12.model.*
import dev.usbharu.multim.model.SingleTokenAuth
import io.github.artsok.RepeatedIfExceptionsTest
import io.ktor.client.*
import io.ktor.client.engine.mock.*
Expand All @@ -33,7 +34,7 @@ class NotesTest {
fun globalTimelineTest() = runTest {
val notes = Notes(
MisskeyApiClient(
"aaaa",
SingleTokenAuth("aaaa"),
"",
createMockHttpClient(
checkAuth = false,
Expand All @@ -50,7 +51,7 @@ class NotesTest {
fun hybridTimelineTest() = runTest {
val notes = Notes(
MisskeyApiClient(
"aaaa",
SingleTokenAuth("aaaa"),
"",
createMockHttpClient(content = json.encodeToString(expectNoteArray))
)
Expand All @@ -63,7 +64,7 @@ class NotesTest {
fun localTimelineTest() = runTest {
val notes = Notes(
MisskeyApiClient(
"aaa",
SingleTokenAuth("aaa"),
"",
createMockHttpClient(
checkAuth = false,
Expand All @@ -80,7 +81,7 @@ class NotesTest {
val expectedNote = createFakeNote("mLyakn", "7j1VB0L", "Ymhq", "8V7QrxD6")
val notes = Notes(
MisskeyApiClient(
"aaa",
SingleTokenAuth("aaa"),
"",
createMockHttpClient(
checkAuth = false,
Expand All @@ -97,7 +98,7 @@ class NotesTest {
val note = createFakeNote("aT9o", "o00672o", "W2kwto", "gold")
val notes = Notes(
MisskeyApiClient(
"aaa",
SingleTokenAuth("aaa"),
"",
createMockHttpClient(content = json.encodeToString(NotesCreateResponse(note)))
)
Expand All @@ -108,7 +109,7 @@ class NotesTest {

@Test
fun deleteTest() = runTest {
val notes = Notes(MisskeyApiClient("aaa", "", createMockHttpClient(content = "")))
val notes = Notes(MisskeyApiClient(SingleTokenAuth("aaa"), "", createMockHttpClient(content = "")))
notes.delete(NotesDeleteRequest("Rw4g2CH"))
}

Expand Down Expand Up @@ -186,7 +187,7 @@ class NotesTest {
class NotesTestE2E {

val client = MisskeyApiClient(
System.getProperty("multim_misskey_token"),
SingleTokenAuth(System.getProperty("multim_misskey_token")),
System.getProperty("multim_misskey_instance"),
createHttpClient()
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,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 dev.usbharu.multim.model.SingleTokenAuth
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import kotlinx.serialization.Serializable
Expand All @@ -19,7 +20,7 @@ class MisskeyStatusApiTest {
val misskeyStatusApi = MisskeyStatusApi(
MisskeyApis(
MisskeyApiClient(
"",
SingleTokenAuth(""),
"http://localhost/",
MisskeyTestUtil.createMockHttpClient(
checkAuth = false, content =
Expand Down