SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/util/LinkHelper.kt

104 lines
3.1 KiB
Kotlin
Raw Normal View History

package jp.juggler.subwaytooter.util
import jp.juggler.subwaytooter.api.entity.TootAccount
import jp.juggler.util.groupEx
import jp.juggler.util.notEmpty
2020-02-01 14:26:57 +01:00
import java.net.IDN
interface LinkHelper {
// SavedAccountのロード時にhostを供給する必要があった
2020-02-01 14:26:57 +01:00
val host : String? // punycode
val prettyHost : String? // unicode
// fun findAcct(url : String?) : String? = null
// fun colorFromAcct(acct : String?) : AcctColor? = null
2018-12-02 09:02:47 +01:00
// user とか user@host とかを user@host に変換する
// nullや空文字列なら ?@? を返す
2020-02-01 14:26:57 +01:00
fun getFullAcct(acct : String?) : String = when {
acct?.isEmpty() != false -> "?@?"
acct.contains('@') -> acct
else -> "$acct@$host"
}
// user とか user@host とかを user@host に変換する
// nullや空文字列なら ?@? を返す
fun getFullPrettyAcct(prettyAcct : String?) : String = when {
prettyAcct?.isEmpty() != false -> "?@?"
prettyAcct.contains('@') -> prettyAcct
else -> "$prettyAcct@$prettyHost"
}
val misskeyVersion : Int
get() = 0
val isMisskey : Boolean
get() = misskeyVersion > 0
2019-12-09 09:05:13 +01:00
// FIXME もし将来別のサービスにも対応するなら、ここは書き直す必要がある
val isMastodon : Boolean
get() = misskeyVersion <= 0
2019-12-09 09:05:13 +01:00
companion object {
2020-02-01 14:26:57 +01:00
fun newLinkHelper(hostArg : String?, misskeyVersion : Int = 0) = object : LinkHelper {
2020-02-01 14:26:57 +01:00
override val host : String? =
hostArg?.let { IDN.toASCII(hostArg, IDN.ALLOW_UNASSIGNED) }
override val prettyHost : String? =
hostArg?.let { IDN.toUnicode(hostArg, IDN.ALLOW_UNASSIGNED) }
override val misskeyVersion : Int
get() = misskeyVersion
}
val nullHost = object : LinkHelper {
2020-02-01 14:26:57 +01:00
override val host : String? = null
override val prettyHost : String? = null
}
}
}
// user や user@host から user@host を返す
fun getFullAcctOrNull(
linkHelper : LinkHelper?,
rawAcct : String,
url : String
) : String? {
// 既にFull Acctだった
if(rawAcct.contains('@')) return rawAcct
// URLが既知のパターンだった
val fullAcct = TootAccount.getAcctFromUrl(url)
if(fullAcct != null) return fullAcct
2020-02-01 14:26:57 +01:00
// URLのホスト名部分を補う
val m = TootAccount.reUrlHost.matcher(url)
if(m.find()) return "${rawAcct}@${m.groupEx(1)}"
// https://fedibird.com/@noellabo/103350050191159092
// に含まれるメンションををリモートから見るとmentions メタデータがない。
// この場合アクセス元のホストを補うのは誤りなのだが、他の方法で解決できないなら仕方ない…
if(linkHelper?.host?.endsWith('?') == false)
return "$rawAcct@${linkHelper.host}"
return null
}
// @user や @user@host から user@host を返す
fun getFullAcctFromMention(
linkHelper : LinkHelper?,
text : String,
url : String
) = when {
text.startsWith('@') -> getFullAcctOrNull(linkHelper, text.substring(1), url)
else -> null
}
fun String.splitFullAcct() : Pair<String, String?> = when(val delimiter = indexOf('@')) {
- 1 -> Pair(this, null)
else -> Pair(substring(0, delimiter), substring(delimiter + 1).notEmpty())
}