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

197 lines
6.4 KiB
Kotlin

package jp.juggler.subwaytooter.action
import androidx.appcompat.app.AlertDialog
import jp.juggler.subwaytooter.ActMain
import jp.juggler.subwaytooter.R
import jp.juggler.subwaytooter.actmain.addColumn
import jp.juggler.subwaytooter.actmain.defaultInsertPosition
import jp.juggler.subwaytooter.actmain.nextPosition
import jp.juggler.subwaytooter.api.entity.*
import jp.juggler.subwaytooter.api.runApiTask
import jp.juggler.subwaytooter.column.Column
import jp.juggler.subwaytooter.column.ColumnType
import jp.juggler.subwaytooter.column.onDomainBlockChanged
import jp.juggler.subwaytooter.dialog.pickAccount
import jp.juggler.subwaytooter.table.SavedAccount
import jp.juggler.subwaytooter.util.matchHost
import jp.juggler.subwaytooter.util.openBrowser
import jp.juggler.util.coroutine.launchMain
import jp.juggler.util.data.encodePercent
import jp.juggler.util.log.showToast
import jp.juggler.util.network.toFormRequestBody
import jp.juggler.util.network.toRequest
// profile directory を開く
private fun ActMain.serverProfileDirectory(
accessInfo: SavedAccount,
host: Host,
instance: TootInstance? = null,
pos: Int = defaultInsertPosition,
) {
when {
// インスタンスのバージョン情報がなければ取得してやり直し
instance == null -> launchMain {
var targetInstance: TootInstance? = null
runApiTask(host) { client ->
val (ti, ri) = TootInstance.getEx(client, host, allowPixelfed = true)
targetInstance = ti
ri
}?.let { result ->
when (val ti = targetInstance) {
null -> showToast(true, result.error)
else -> serverProfileDirectory(accessInfo, host, ti, pos)
}
}
}
// Misskey非対応
instance.instanceType == InstanceType.Misskey ->
showToast(false, R.string.profile_directory_not_supported_on_misskey)
// バージョンが足りないならWebページを開く
!instance.versionGE(TootInstance.VERSION_3_0_0_rc1) ->
openBrowser("https://${host.ascii}/explore")
// ホスト名部分が一致するならそのアカウントで開く
accessInfo.matchHost(host) ->
addColumn(
false,
pos,
accessInfo,
ColumnType.PROFILE_DIRECTORY,
params = arrayOf(host)
)
// 疑似アカウントで開く
else -> launchMain {
addPseudoAccount(host, instance)?.let { ai ->
addColumn(
false,
pos,
ai,
ColumnType.PROFILE_DIRECTORY,
params = arrayOf(host)
)
}
}
}
}
// サイドメニューからprofile directory を開く
fun ActMain.serverProfileDirectoryFromSideMenu() {
launchMain {
pickAccount(
bAllowPseudo = true,
bAllowMisskey = false,
bAllowMastodon = true,
bAuto = true,
message = getString(
R.string.account_picker_add_timeline_of,
ColumnType.PROFILE_DIRECTORY.name1(applicationContext)
)
)?.let { ai ->
serverProfileDirectory(ai, ai.apiHost)
}
}
}
// インスタンス情報カラムやコンテキストメニューからprofile directoryを開く
fun ActMain.serverProfileDirectoryFromInstanceInformation(
currentColumn: Column,
host: Host,
instance: TootInstance? = null,
) = serverProfileDirectory(
currentColumn.accessInfo,
host,
instance = instance,
pos = nextPosition(currentColumn)
)
// インスタンス情報カラムを開く
fun ActMain.serverInformation(
pos: Int,
host: Host,
) = addColumn(
false,
pos,
SavedAccount.na,
ColumnType.INSTANCE_INFORMATION,
params = arrayOf(host),
)
// ドメインブロック一覧から解除
fun ActMain.clickDomainBlock(accessInfo: SavedAccount, item: TootDomainBlock) {
AlertDialog.Builder(this)
.setMessage(getString(R.string.confirm_unblock_domain, item.domain.pretty))
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok) { _, _ ->
domainBlock(accessInfo, item.domain, bBlock = false)
}
.show()
}
// ContextMenuからドメインブロックを追加
fun ActMain.clickDomainBlock(
accessInfo: SavedAccount,
who: TootAccount,
) {
// 疑似アカウントではドメインブロックできない
if (accessInfo.isPseudo) {
showToast(false, R.string.domain_block_from_pseudo)
return
}
val whoApDomain = who.apDomain
// 自分のドメインではブロックできない
if (accessInfo.matchHost(whoApDomain)) {
showToast(false, R.string.domain_block_from_local)
return
}
AlertDialog.Builder(this)
.setMessage(getString(R.string.confirm_block_domain, whoApDomain))
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok) { _, _ ->
domainBlock(accessInfo, whoApDomain, true)
}
.show()
}
// ドメインブロック
fun ActMain.domainBlock(
accessInfo: SavedAccount,
domain: Host,
bBlock: Boolean,
) {
if (accessInfo.matchHost(domain)) {
showToast(false, R.string.it_is_you)
return
}
launchMain {
runApiTask(accessInfo) { client ->
client.request(
"/api/v1/domain_blocks",
"domain=${domain.ascii.encodePercent()}"
.toFormRequestBody()
.toRequest(if (bBlock) "POST" else "DELETE")
)
}?.let { result ->
when (result.jsonObject) {
null -> showToast(false, result.error)
else -> {
for (column in appState.columnList) {
column.onDomainBlockChanged(accessInfo, domain, bBlock)
}
showToast(
false,
if (bBlock) R.string.block_succeeded else R.string.unblock_succeeded
)
}
}
}
}
}