2018-01-04 19:52:25 +01:00
|
|
|
package jp.juggler.subwaytooter.util
|
|
|
|
|
2019-12-22 17:55:24 +01:00
|
|
|
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
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2018-01-21 13:51:10 +01:00
|
|
|
interface LinkHelper {
|
2018-01-10 16:47:35 +01:00
|
|
|
|
|
|
|
// SavedAccountのロード時にhostを供給する必要があった
|
2020-02-01 19:28:16 +01:00
|
|
|
val hostAscii : String? // punycode
|
|
|
|
val hostPretty : String? // unicode
|
2018-01-21 17:47:13 +01:00
|
|
|
|
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
|
|
|
|
2018-12-02 09:02:47 +01:00
|
|
|
// user とか user@host とかを user@host に変換する
|
|
|
|
// nullや空文字列なら ?@? を返す
|
2020-02-01 19:28:16 +01:00
|
|
|
fun getFullAcct(acctAscii : String?) : String = when {
|
|
|
|
acctAscii?.isEmpty() != false -> "?@?"
|
|
|
|
acctAscii.contains('@') -> acctAscii
|
|
|
|
else -> "$acctAscii@$hostAscii"
|
2020-02-01 14:26:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// user とか user@host とかを user@host に変換する
|
|
|
|
// nullや空文字列なら ?@? を返す
|
2020-02-01 19:28:16 +01:00
|
|
|
fun getFullPrettyAcct(acctPretty : String?) : String = when {
|
|
|
|
acctPretty?.isEmpty() != false -> "?@?"
|
|
|
|
acctPretty.contains('@') -> acctPretty
|
|
|
|
else -> "$acctPretty@$hostPretty"
|
2018-01-21 17:47:13 +01:00
|
|
|
}
|
2018-08-20 02:07:55 +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-01 19:28:16 +01:00
|
|
|
fun matchHost(host : String?) : Boolean =
|
|
|
|
host != null && (
|
|
|
|
host.equals(hostAscii, ignoreCase = true) ||
|
|
|
|
host.equals(hostPretty, ignoreCase = true)
|
|
|
|
)
|
|
|
|
|
2018-08-20 02:07:55 +02:00
|
|
|
companion object {
|
|
|
|
|
2020-02-01 14:26:57 +01:00
|
|
|
fun newLinkHelper(hostArg : String?, misskeyVersion : Int = 0) = object : LinkHelper {
|
2019-12-22 17:55:24 +01:00
|
|
|
|
2020-02-01 19:28:16 +01:00
|
|
|
override val hostAscii : String? =
|
2020-02-01 14:26:57 +01:00
|
|
|
hostArg?.let { IDN.toASCII(hostArg, IDN.ALLOW_UNASSIGNED) }
|
2020-02-01 19:28:16 +01:00
|
|
|
override val hostPretty : String? =
|
2020-02-01 14:26:57 +01:00
|
|
|
hostArg?.let { IDN.toUnicode(hostArg, IDN.ALLOW_UNASSIGNED) }
|
2019-12-22 17:55:24 +01:00
|
|
|
|
2019-04-25 04:06:41 +02:00
|
|
|
override val misskeyVersion : Int
|
|
|
|
get() = misskeyVersion
|
2018-12-02 08:03:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
val nullHost = object : LinkHelper {
|
2020-02-01 19:28:16 +01:00
|
|
|
override val hostAscii : String? = null
|
|
|
|
override val hostPretty : String? = null
|
2018-12-02 08:03:54 +01:00
|
|
|
}
|
2018-08-20 02:07:55 +02:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2019-12-22 17:55:24 +01:00
|
|
|
|
|
|
|
// user や user@host から user@host を返す
|
2020-02-01 19:28:16 +01:00
|
|
|
// ただし host部分がpunycodeかunicodeかは分からない
|
2019-12-22 17:55:24 +01:00
|
|
|
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
|
|
|
|
2019-12-22 17:55:24 +01:00
|
|
|
// URLのホスト名部分を補う
|
|
|
|
val m = TootAccount.reUrlHost.matcher(url)
|
|
|
|
if(m.find()) return "${rawAcct}@${m.groupEx(1)}"
|
|
|
|
|
|
|
|
// https://fedibird.com/@noellabo/103350050191159092
|
|
|
|
// に含まれるメンションををリモートから見るとmentions メタデータがない。
|
|
|
|
// この場合アクセス元のホストを補うのは誤りなのだが、他の方法で解決できないなら仕方ない…
|
2020-02-01 19:28:16 +01:00
|
|
|
if(linkHelper?.hostAscii?.endsWith('?') == false)
|
|
|
|
return "$rawAcct@${linkHelper.hostAscii}"
|
2019-12-22 17:55:24 +01:00
|
|
|
|
|
|
|
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())
|
|
|
|
}
|