SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/action/ActionUtils.kt

121 lines
4.2 KiB
Kotlin

package jp.juggler.subwaytooter.action
import androidx.appcompat.app.AppCompatActivity
import jp.juggler.subwaytooter.api.entity.Acct
import jp.juggler.subwaytooter.api.entity.Host
import jp.juggler.subwaytooter.api.entity.TootInstance
import jp.juggler.subwaytooter.api.runApiTask2
import jp.juggler.subwaytooter.api.showApiError
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.subwaytooter.table.daoSavedAccount
import jp.juggler.subwaytooter.util.matchHost
import jp.juggler.util.data.JsonObject
import jp.juggler.util.data.buildJsonObject
import jp.juggler.util.log.LogCategory
import jp.juggler.util.log.showToast
private val log = LogCategory("ActionUtils")
// 疑似アカウントを作成する
// 既に存在する場合は再利用する
// 実アカウントを返すことはない
internal suspend fun AppCompatActivity.addPseudoAccount(
host: Host,
instanceInfoArg: TootInstance? = null,
): SavedAccount? {
try {
suspend fun AppCompatActivity.getInstanceInfo(): TootInstance? {
return try {
runApiTask2(host) { TootInstance.getOrThrow(it) }
} catch (ex: Throwable) {
showApiError(ex)
null
}
}
val acct = Acct.parse("?", host)
var account = daoSavedAccount.loadAccountByAcct(acct)
if (account != null) return account
val instanceInfo = instanceInfoArg
?: getInstanceInfo()
?: return null
val accountInfo = buildJsonObject {
put("username", acct.username)
put("acct", acct.username) // ローカルから参照した場合なのでshort acct
}
val rowId = daoSavedAccount.saveNew(
acct = acct.ascii,
host = host.ascii,
domain = instanceInfo.apDomain.ascii,
account = accountInfo,
token = JsonObject(),
misskeyVersion = instanceInfo.misskeyVersionMajor
)
account = daoSavedAccount.loadAccount(rowId)
?: error("loadAccount returns null.")
account.notification_follow = false
account.notification_follow_request = false
account.notification_favourite = false
account.notification_boost = false
account.notification_mention = false
account.notification_reaction = false
account.notification_vote = false
account.notification_post = false
account.notification_update = false
daoSavedAccount.saveSetting(account)
return account
} catch (ex: Throwable) {
log.e(ex, "addPseudoAccount failed.")
showToast(ex, "addPseudoAccount failed.")
return null
}
}
//// relationshipを取得
//internal fun loadRelation1Mastodon(
// client : TootApiClient,
// access_info : SavedAccount,
// who : TootAccount
//) : RelationResult {
// val rr = RelationResult()
// rr.result = client.request("/api/v1/accounts/relationships?id=${who.id}")
// val r2 = rr.result
// val jsonArray = r2?.jsonArray
// if(jsonArray != null) {
// val list = parseList(::TootRelationShip, TootParser(client.context, access_info), jsonArray)
// if(list.isNotEmpty()) {
// rr.relation = saveUserRelation(access_info, list[0])
// }
// }
// return rr
//}
// 別アカ操作と別タンスの関係
enum class CrossAccountMode {
SameAccount, // same account, id and relation can be reused. NOT_CROSS_ACCOUNT
SameInstance, // same instance. id can be reused, but relation is not. CROSS_ACCOUNT_SAME_INSTANCE = 2
RemoteInstance, // remote instance. it and relation can't be reused. CROSS_ACCOUNT_REMOTE_INSTANCE = 3
;
val isRemote: Boolean
get() = this == RemoteInstance
val isNotRemote: Boolean
get() = this != RemoteInstance
}
internal fun calcCrossAccountMode(
timelineAccount: SavedAccount,
actionAccount: SavedAccount,
): CrossAccountMode = when {
timelineAccount == actionAccount -> CrossAccountMode.SameAccount
timelineAccount.matchHost(actionAccount) -> CrossAccountMode.SameInstance
else -> CrossAccountMode.RemoteInstance
}