121 lines
4.2 KiB
Kotlin
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
|
|
}
|