2018-01-04 19:52:25 +01:00
|
|
|
package jp.juggler.subwaytooter.util
|
|
|
|
|
2020-02-02 15:19:57 +01:00
|
|
|
import jp.juggler.subwaytooter.api.entity.Acct
|
|
|
|
import jp.juggler.subwaytooter.api.entity.Host
|
2020-09-20 15:10:49 +02:00
|
|
|
import jp.juggler.subwaytooter.api.entity.HostAndDomain
|
2019-12-22 17:55:24 +01:00
|
|
|
import jp.juggler.subwaytooter.api.entity.TootAccount
|
2020-09-20 15:10:49 +02:00
|
|
|
import jp.juggler.util.findOrNull
|
2019-12-22 17:55:24 +01:00
|
|
|
import jp.juggler.util.groupEx
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2020-09-20 15:10:49 +02:00
|
|
|
interface LinkHelper : HostAndDomain {
|
2018-01-10 16:47:35 +01:00
|
|
|
|
|
|
|
// SavedAccountのロード時にhostを供給する必要があった
|
2020-09-20 15:10:49 +02:00
|
|
|
override val apiHost : Host
|
2019-12-22 17:55:24 +01:00
|
|
|
// fun findAcct(url : String?) : String? = null
|
|
|
|
// fun colorFromAcct(acct : String?) : AcctColor? = null
|
2018-01-21 17:47:13 +01:00
|
|
|
|
2020-09-20 15:10:49 +02:00
|
|
|
override val apDomain : Host
|
2020-09-07 14:20:11 +02:00
|
|
|
|
2019-04-25 04:06:41 +02:00
|
|
|
val misskeyVersion : Int
|
|
|
|
get() = 0
|
|
|
|
|
2019-12-22 17:55:24 +01:00
|
|
|
val isMisskey : Boolean
|
2019-04-25 04:06:41 +02:00
|
|
|
get() = misskeyVersion > 0
|
2018-08-20 02:07:55 +02:00
|
|
|
|
2019-12-09 09:05:13 +01:00
|
|
|
// FIXME もし将来別のサービスにも対応するなら、ここは書き直す必要がある
|
2019-12-22 17:55:24 +01:00
|
|
|
val isMastodon : Boolean
|
|
|
|
get() = misskeyVersion <= 0
|
2019-12-09 09:05:13 +01:00
|
|
|
|
2020-02-02 15:19:57 +01:00
|
|
|
// user とか user@host とかを user@host に変換する
|
|
|
|
// nullや空文字列なら ?@? を返す
|
2020-09-07 14:20:11 +02:00
|
|
|
fun getFullAcct(src : Acct?) : Acct = when {
|
2020-02-02 15:19:57 +01:00
|
|
|
src?.username?.isEmpty() != false -> Acct.UNKNOWN
|
2020-09-07 14:20:11 +02:00
|
|
|
src.host?.isValid == true -> src
|
|
|
|
else -> src.followHost(apDomain.valid() ?: apiHost.valid() ?: Host.UNKNOWN)
|
2020-02-02 15:19:57 +01:00
|
|
|
}
|
2020-02-01 19:28:16 +01:00
|
|
|
|
2020-09-23 03:32:18 +02:00
|
|
|
companion object {
|
|
|
|
|
2020-09-21 00:00:04 +02:00
|
|
|
val unknown = object : LinkHelper {
|
|
|
|
override val apiHost : Host = Host.UNKNOWN
|
|
|
|
override val apDomain : Host = Host.UNKNOWN
|
|
|
|
}
|
2018-08-20 02:07:55 +02:00
|
|
|
|
2020-09-21 00:00:04 +02:00
|
|
|
fun create(apiHostArg : Host, apDomainArg : Host? = null, misskeyVersion : Int = 0) =
|
2020-09-07 14:20:11 +02:00
|
|
|
object : LinkHelper {
|
|
|
|
|
|
|
|
override val apiHost : Host = apiHostArg
|
|
|
|
// fun findAcct(url : String?) : String? = null
|
|
|
|
// fun colorFromAcct(acct : String?) : AcctColor? = null
|
|
|
|
|
|
|
|
override val apDomain : Host = apDomainArg ?: apiHostArg
|
|
|
|
|
|
|
|
override val misskeyVersion : Int
|
|
|
|
get() = misskeyVersion
|
|
|
|
}
|
2018-08-20 02:07:55 +02:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2019-12-22 17:55:24 +01:00
|
|
|
|
2020-09-08 01:55:15 +02:00
|
|
|
fun LinkHelper.matchHost(src : String?) = apiHost.match(src) || apDomain.match(src)
|
|
|
|
fun LinkHelper.matchHost(src : Host?) = apiHost == src || apDomain == src
|
|
|
|
fun LinkHelper.matchHost(src : LinkHelper) =
|
|
|
|
apiHost == src.apiHost || apDomain == src.apDomain ||
|
|
|
|
apDomain == src.apiHost || apiHost == src.apDomain
|
|
|
|
|
2020-09-20 15:10:49 +02:00
|
|
|
fun LinkHelper.matchHost(src : TootAccount) =
|
2020-09-08 01:55:15 +02:00
|
|
|
apiHost == src.apiHost || apDomain == src.apDomain ||
|
|
|
|
apDomain == src.apiHost || apiHost == src.apDomain
|
2020-02-02 15:19:57 +01:00
|
|
|
|
|
|
|
// user や user@host から user@host を返す
|
|
|
|
fun getFullAcctOrNull(
|
2020-09-20 15:10:49 +02:00
|
|
|
rawAcct : Acct,
|
2020-09-20 13:28:14 +02:00
|
|
|
url : String,
|
2020-09-23 03:32:18 +02:00
|
|
|
hostDomain1 : HostAndDomain? = null,
|
|
|
|
hostDomain2 : HostAndDomain? = null
|
|
|
|
) =
|
|
|
|
if(rawAcct.isValidFull) {
|
2020-09-23 03:36:17 +02:00
|
|
|
// 最初から有効なfull acctがあればそれを使う
|
2020-09-23 03:32:18 +02:00
|
|
|
rawAcct
|
|
|
|
} else {
|
|
|
|
// URL中のホスト名を使うが、引数でホストとドメインの対応が提供されていればドメインへの変換を試みる
|
2020-09-23 03:36:17 +02:00
|
|
|
val host = TootAccount.reHostInUrl.matcher(url)
|
|
|
|
.findOrNull()?.groupEx(1)?.let { Host.parse(it) }
|
|
|
|
if(host == null) {
|
|
|
|
null
|
|
|
|
} else {
|
|
|
|
Acct.parse(
|
|
|
|
rawAcct.username,
|
|
|
|
when(host) {
|
|
|
|
hostDomain1?.apiHost -> hostDomain1.apDomain
|
|
|
|
hostDomain2?.apiHost -> hostDomain2.apDomain
|
|
|
|
else -> host
|
|
|
|
}
|
|
|
|
).validFull() // apDomainが ? だった場合など
|
|
|
|
}
|
2020-09-23 03:32:18 +02:00
|
|
|
}
|