package jp.juggler.subwaytooter.api import android.content.Context import jp.juggler.subwaytooter.api.entity.* import jp.juggler.subwaytooter.table.UserRelation import jp.juggler.subwaytooter.util.LinkHelper import jp.juggler.util.JsonArray import jp.juggler.util.JsonObject import jp.juggler.util.WordTrieTree class TootParser( val context: Context, val linkHelper: LinkHelper, var pinned: Boolean = false, // プロフィールカラムからpinned TL を読んだ時だけ真 var highlightTrie: WordTrieTree? = null, var serviceType: ServiceType = when { linkHelper.isMisskey -> ServiceType.MISSKEY else -> ServiceType.MASTODON }, var misskeyDecodeProfilePin: Boolean = false, var fromStream: Boolean = false, var decodeQuote: Boolean = true, ) { val misskeyUserRelationMap = HashMap() // val misskeyAccountDetailMap = HashMap() val apiHost: Host get() = linkHelper.apiHost val apDomain: Host get() = linkHelper.apDomain fun getFullAcct(acct: Acct?) = linkHelper.getFullAcct(acct) fun account(src: JsonObject?) = parseItem(::TootAccount, this, src) fun accountList(array: JsonArray?) = TootAccountRef.wrapList(this, parseList(::TootAccount, this, array)) fun status(src: JsonObject?) = parseItem(::TootStatus, this, src) fun statusList(array: JsonArray?) = parseList(::TootStatus, this, array) fun notification(src: JsonObject?) = parseItem(::TootNotification, this, src) fun notificationList(src: JsonArray?) = parseList(::TootNotification, this, src) fun tag(src: JsonObject?) = src?.let { TootTag.parse(this, it) } fun tagList(array: JsonArray?) = TootTag.parseList(this, array) fun results(src: JsonObject?) = parseItem(::TootResults, this, src) fun instance(src: JsonObject?) = parseItem(::TootInstance, this, src) fun getMisskeyUserRelation(whoId: EntityId) = misskeyUserRelationMap[whoId] fun parseMisskeyApShow(jsonObject: JsonObject?): Any? { // ap/show の戻り値はActivityPubオブジェクトではなく、Misskeyのエンティティです。 return when (jsonObject?.string("type")) { "Note" -> status(jsonObject.jsonObject("object")) "User" -> account(jsonObject.jsonObject("object")) else -> null } } }