2018-01-04 19:52:25 +01:00
|
|
|
package jp.juggler.subwaytooter.action
|
|
|
|
|
|
|
|
import android.content.Context
|
2018-01-21 17:47:13 +01:00
|
|
|
import jp.juggler.subwaytooter.api.*
|
2020-02-02 15:19:57 +01:00
|
|
|
import jp.juggler.subwaytooter.api.entity.*
|
2018-01-04 19:52:25 +01:00
|
|
|
import jp.juggler.subwaytooter.table.SavedAccount
|
|
|
|
import jp.juggler.subwaytooter.table.UserRelation
|
2020-09-08 01:55:15 +02:00
|
|
|
import jp.juggler.subwaytooter.util.matchHost
|
2020-01-07 09:03:32 +01:00
|
|
|
import jp.juggler.util.JsonObject
|
2018-12-01 00:02:18 +01:00
|
|
|
import jp.juggler.util.LogCategory
|
2020-01-07 09:03:32 +01:00
|
|
|
import jp.juggler.util.jsonObject
|
2018-12-01 00:02:18 +01:00
|
|
|
import jp.juggler.util.showToast
|
|
|
|
import java.util.*
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
// 疑似アカウントを作成する
|
|
|
|
// 既に存在する場合は再利用する
|
|
|
|
// 実アカウントを返すことはない
|
|
|
|
internal fun addPseudoAccount(
|
2018-08-16 21:58:30 +02:00
|
|
|
context : Context,
|
2020-02-02 15:19:57 +01:00
|
|
|
host : Host,
|
2019-10-02 11:37:41 +02:00
|
|
|
instanceInfo : TootInstance? = null,
|
2018-11-27 18:42:55 +01:00
|
|
|
callback : (SavedAccount) -> Unit
|
|
|
|
) {
|
2018-01-10 16:47:35 +01:00
|
|
|
try {
|
2020-09-29 19:44:56 +02:00
|
|
|
val acct = Acct.parse("?", host)
|
2018-01-10 16:47:35 +01:00
|
|
|
|
2020-02-02 15:19:57 +01:00
|
|
|
var account = SavedAccount.loadAccountByAcct(context, acct.ascii)
|
2018-01-10 16:47:35 +01:00
|
|
|
if(account != null) {
|
2018-11-27 18:42:55 +01:00
|
|
|
callback(account)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-10-02 11:37:41 +02:00
|
|
|
if(instanceInfo == null) {
|
2019-10-06 13:23:33 +02:00
|
|
|
TootTaskRunner(context).run(host, object : TootTask {
|
2018-11-27 18:42:55 +01:00
|
|
|
|
2019-10-06 13:23:33 +02:00
|
|
|
var targetInstance : TootInstance? = null
|
2018-11-27 18:42:55 +01:00
|
|
|
|
|
|
|
override fun background(client : TootApiClient) : TootApiResult? {
|
2019-10-06 13:23:33 +02:00
|
|
|
val (instance, instanceResult) = TootInstance.get(client)
|
|
|
|
targetInstance = instance
|
2019-10-02 11:37:41 +02:00
|
|
|
return instanceResult
|
2018-11-27 18:42:55 +01:00
|
|
|
}
|
|
|
|
|
2019-10-06 13:23:33 +02:00
|
|
|
override fun handleResult(result : TootApiResult?) = when {
|
|
|
|
result == null -> {
|
|
|
|
}
|
|
|
|
|
2020-09-29 19:44:56 +02:00
|
|
|
targetInstance == null -> context.showToast(false, result.error)
|
2019-10-02 11:37:41 +02:00
|
|
|
else -> addPseudoAccount(context, host, targetInstance, callback)
|
2018-11-27 18:42:55 +01:00
|
|
|
}
|
|
|
|
})
|
|
|
|
return
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
2020-01-07 09:03:32 +01:00
|
|
|
val account_info = jsonObject {
|
2020-02-02 15:19:57 +01:00
|
|
|
put("username", acct.username)
|
|
|
|
put("acct", acct.username) // ローカルから参照した場合なのでshort acct
|
2020-01-07 09:03:32 +01:00
|
|
|
}
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2019-10-02 11:37:41 +02:00
|
|
|
val row_id = SavedAccount.insert(
|
2020-09-29 19:44:56 +02:00
|
|
|
acct = acct.ascii,
|
2020-09-07 14:20:11 +02:00
|
|
|
host = host.ascii,
|
|
|
|
domain = instanceInfo.uri,
|
|
|
|
account = account_info,
|
|
|
|
token = JsonObject(),
|
2019-10-02 11:37:41 +02:00
|
|
|
misskeyVersion = instanceInfo.misskeyVersion
|
|
|
|
)
|
2019-10-06 13:23:33 +02:00
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
account = SavedAccount.loadAccount(context, row_id)
|
|
|
|
if(account == null) {
|
|
|
|
throw RuntimeException("loadAccount returns null.")
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-01-10 16:47:35 +01:00
|
|
|
account.notification_follow = false
|
2019-12-16 16:56:27 +01:00
|
|
|
account.notification_follow_request = false
|
2018-01-10 16:47:35 +01:00
|
|
|
account.notification_favourite = false
|
|
|
|
account.notification_boost = false
|
|
|
|
account.notification_mention = false
|
2018-08-30 08:51:32 +02:00
|
|
|
account.notification_reaction = false
|
|
|
|
account.notification_vote = false
|
2020-09-20 04:51:15 +02:00
|
|
|
account.notification_post = false
|
2018-01-10 16:47:35 +01:00
|
|
|
account.saveSetting()
|
2018-11-27 18:42:55 +01:00
|
|
|
callback(account)
|
|
|
|
return
|
2018-01-10 16:47:35 +01:00
|
|
|
} catch(ex : Throwable) {
|
|
|
|
val log = LogCategory("addPseudoAccount")
|
|
|
|
log.trace(ex)
|
|
|
|
log.e(ex, "failed.")
|
2020-09-29 19:44:56 +02:00
|
|
|
context.showToast(ex, "addPseudoAccount failed.")
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-11-27 18:42:55 +01:00
|
|
|
return
|
2018-01-10 16:47:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// 疑似アカ以外のアカウントのリスト
|
|
|
|
fun makeAccountListNonPseudo(
|
2020-02-02 15:19:57 +01:00
|
|
|
context : Context, pickup_host : Host?
|
2018-01-10 16:47:35 +01:00
|
|
|
) : ArrayList<SavedAccount> {
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2018-01-10 16:47:35 +01:00
|
|
|
val list_same_host = ArrayList<SavedAccount>()
|
|
|
|
val list_other_host = ArrayList<SavedAccount>()
|
|
|
|
for(a in SavedAccount.loadAccountList(context)) {
|
|
|
|
if(a.isPseudo) continue
|
2020-02-02 15:19:57 +01:00
|
|
|
when(pickup_host) {
|
2020-09-29 19:44:56 +02:00
|
|
|
null, a.apDomain, a.apiHost -> list_same_host
|
2020-02-02 15:19:57 +01:00
|
|
|
else -> list_other_host
|
|
|
|
}.add(a)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-01-10 16:47:35 +01:00
|
|
|
SavedAccount.sort(list_same_host)
|
|
|
|
SavedAccount.sort(list_other_host)
|
|
|
|
list_same_host.addAll(list_other_host)
|
|
|
|
return list_same_host
|
|
|
|
}
|
|
|
|
|
2018-10-30 20:29:00 +01:00
|
|
|
internal fun saveUserRelation(access_info : SavedAccount, src : TootRelationShip?) : UserRelation? {
|
2018-08-20 02:07:55 +02:00
|
|
|
src ?: return null
|
2018-01-10 16:47:35 +01:00
|
|
|
val now = System.currentTimeMillis()
|
2019-01-28 19:02:09 +01:00
|
|
|
return UserRelation.save1Mastodon(now, access_info.db_id, src)
|
2018-01-10 16:47:35 +01:00
|
|
|
}
|
2018-10-30 20:29:00 +01:00
|
|
|
|
|
|
|
internal fun saveUserRelationMisskey(
|
|
|
|
access_info : SavedAccount,
|
|
|
|
whoId : EntityId,
|
|
|
|
parser : TootParser
|
|
|
|
) : UserRelation? {
|
2018-08-20 02:07:55 +02:00
|
|
|
val now = System.currentTimeMillis()
|
|
|
|
val relation = parser.getMisskeyUserRelation(whoId)
|
2019-01-28 19:02:09 +01:00
|
|
|
UserRelation.save1Misskey(now, access_info.db_id, whoId.toString(), relation)
|
2018-08-20 02:07:55 +02:00
|
|
|
return relation
|
|
|
|
}
|
2018-01-10 16:47:35 +01:00
|
|
|
|
2019-10-06 13:23:33 +02:00
|
|
|
//// 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
|
|
|
|
//}
|
2018-01-10 16:47:35 +01:00
|
|
|
|
|
|
|
// 別アカ操作と別タンスの関係
|
|
|
|
const val NOT_CROSS_ACCOUNT = 1
|
|
|
|
const val CROSS_ACCOUNT_SAME_INSTANCE = 2
|
|
|
|
const val CROSS_ACCOUNT_REMOTE_INSTANCE = 3
|
|
|
|
|
2018-01-21 13:46:36 +01:00
|
|
|
internal fun calcCrossAccountMode(
|
|
|
|
timeline_account : SavedAccount,
|
|
|
|
action_account : SavedAccount
|
2020-02-02 15:19:57 +01:00
|
|
|
) : Int = when {
|
2020-02-01 19:28:16 +01:00
|
|
|
timeline_account == action_account -> NOT_CROSS_ACCOUNT
|
2020-09-08 01:55:15 +02:00
|
|
|
timeline_account.matchHost(action_account) -> CROSS_ACCOUNT_SAME_INSTANCE
|
2020-02-01 19:28:16 +01:00
|
|
|
else -> CROSS_ACCOUNT_REMOTE_INSTANCE
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|