SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/api/entity/TootInstance.kt

108 lines
2.9 KiB
Kotlin

package jp.juggler.subwaytooter.api.entity
import jp.juggler.subwaytooter.api.TootParser
import jp.juggler.subwaytooter.util.*
import org.json.JSONObject
import java.util.regex.Pattern
class TootInstance(parser:TootParser,src : JSONObject) {
companion object {
val rePleroma = Pattern.compile("\\bpleroma\\b",Pattern.CASE_INSENSITIVE)
val VERSION_2_4 = VersionString("2.4")
}
// いつ取得したか(内部利用)
var time_parse : Long = System.currentTimeMillis()
// URI of the current instance
val uri : String?
// The instance's title
val title : String?
// A description for the instance
val description : String?
// An email address which can be used to contact the instance administrator
val email : String?
val version : String?
// バージョンの内部表現
private val decoded_version : VersionString
// インスタンスのサムネイル。推奨サイズ1200x630px。マストドン1.6.1以降。
val thumbnail : String?
// ユーザ数等の数字。マストドン1.6以降。
val stats : Stats?
// 言語のリスト。マストドン2.3.0以降
val languages : ArrayList<String>?
val contact_account : TootAccount?
// (Pleroma only) トゥートの最大文字数
val max_toot_chars : Int?
// インスタンスの種別
enum class InstanceType{
Mastodon,
Pleroma
}
val instanceType : InstanceType
// XXX: urls をパースしてない。使ってないから…
init {
this.uri = src.parseString("uri")
this.title = src.parseString("title")
this.description = src.parseString("description")
this.email = src.parseString("email")
this.version = src.parseString("version")
this.decoded_version = VersionString(version)
this.stats = parseItem(::Stats, src.optJSONObject("stats"))
this.thumbnail = src.parseString("thumbnail")
this.max_toot_chars = src.parseInt("max_toot_chars")
this.instanceType = when{
rePleroma.matcher(version ?:"").find() -> InstanceType.Pleroma
else->InstanceType.Mastodon
}
languages = src.optJSONArray("languages")?.toStringArrayList()
val parser2 = TootParser(
parser.context,
object:LinkHelper {
override val host :String
get()= uri ?: "?"
}
)
contact_account = parseItem(::TootAccount,parser2,src.optJSONObject("contact_account"))
}
class Stats(src : JSONObject) {
val user_count : Long
val status_count : Long
val domain_count : Long
init {
this.user_count = src.parseLong("user_count") ?: - 1L
this.status_count = src.parseLong("status_count") ?: - 1L
this.domain_count = src.parseLong("domain_count") ?: - 1L
}
}
fun isEnoughVersion(check : VersionString) : Boolean {
if(decoded_version.isEmpty || check.isEmpty) return false
val i = VersionString.compare(decoded_version, check)
return i >= 0
}
}