2018-01-04 19:52:25 +01:00
|
|
|
package jp.juggler.subwaytooter.api.entity
|
|
|
|
|
|
|
|
import jp.juggler.subwaytooter.api.TootParser
|
2018-12-01 00:02:18 +01:00
|
|
|
import jp.juggler.util.LogCategory
|
|
|
|
import jp.juggler.util.toJsonObject
|
2018-07-06 17:22:22 +02:00
|
|
|
import org.json.JSONArray
|
2018-01-04 19:52:25 +01:00
|
|
|
import org.json.JSONObject
|
|
|
|
import java.util.regex.Pattern
|
|
|
|
|
|
|
|
object TootPayload {
|
|
|
|
|
|
|
|
val log = LogCategory("TootPayload")
|
|
|
|
|
|
|
|
private const val PAYLOAD = "payload"
|
|
|
|
|
|
|
|
@Suppress("HasPlatformType")
|
|
|
|
private val reNumber = Pattern.compile("([-]?\\d+)")
|
|
|
|
|
|
|
|
// ストリーミングAPIのペイロード部分をTootStatus,TootNotification,整数IDのどれかに解釈する
|
2018-07-06 17:22:22 +02:00
|
|
|
fun parsePayload(
|
|
|
|
parser : TootParser,
|
|
|
|
event : String,
|
|
|
|
parent : JSONObject,
|
|
|
|
parent_text : String
|
|
|
|
) : Any? {
|
2018-01-04 19:52:25 +01:00
|
|
|
try {
|
|
|
|
if(parent.isNull(PAYLOAD)) {
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
|
|
|
|
val payload = parent.opt(PAYLOAD)
|
|
|
|
|
|
|
|
if(payload is JSONObject) {
|
2018-07-06 17:22:22 +02:00
|
|
|
return when(event) {
|
2019-09-12 15:43:11 +02:00
|
|
|
|
|
|
|
// ここを通るケースはまだ確認できていない
|
2018-07-06 17:22:22 +02:00
|
|
|
"update" -> parser.status(payload)
|
2019-09-12 15:43:11 +02:00
|
|
|
|
|
|
|
// ここを通るケースはまだ確認できていない
|
2018-07-06 17:22:22 +02:00
|
|
|
"notification" -> parser.notification(payload)
|
2019-09-12 15:43:11 +02:00
|
|
|
|
|
|
|
// ここを通るケースはまだ確認できていない
|
2018-01-04 19:52:25 +01:00
|
|
|
else -> {
|
|
|
|
log.e("unknown payload(1). message=%s", parent_text)
|
2018-07-06 17:22:22 +02:00
|
|
|
null
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
}
|
2018-07-06 17:22:22 +02:00
|
|
|
} else if(payload is JSONArray) {
|
|
|
|
log.e("unknown payload(1b). message=%s", parent_text)
|
|
|
|
return null
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if(payload is Number) {
|
|
|
|
// 2017/8/24 18:37 mastodon.juggler.jpでここを通った
|
|
|
|
return payload.toLong()
|
|
|
|
}
|
|
|
|
|
|
|
|
if(payload is String) {
|
|
|
|
|
|
|
|
if(payload[0] == '{') {
|
2018-01-21 13:46:36 +01:00
|
|
|
val src = payload.toJsonObject()
|
2018-01-04 19:52:25 +01:00
|
|
|
return when(event) {
|
2019-09-12 15:43:11 +02:00
|
|
|
// 2017/8/24 18:37 mastodon.juggler.jpでここを通った
|
2018-07-06 17:22:22 +02:00
|
|
|
"update" -> parser.status(src)
|
2019-09-12 15:43:11 +02:00
|
|
|
|
|
|
|
// 2017/8/24 18:37 mastodon.juggler.jpでここを通った
|
2018-07-06 17:22:22 +02:00
|
|
|
"notification" -> parser.notification(src)
|
2018-10-09 01:20:43 +02:00
|
|
|
|
2019-09-12 15:43:11 +02:00
|
|
|
"conversation" -> parseItem(::TootConversationSummary, parser, src)
|
|
|
|
|
|
|
|
// ここを通るケースはまだ確認できていない
|
2018-01-04 19:52:25 +01:00
|
|
|
else -> {
|
|
|
|
log.e("unknown payload(2). message=%s", parent_text)
|
|
|
|
null
|
|
|
|
}
|
|
|
|
}
|
2018-07-06 17:22:22 +02:00
|
|
|
} else if(payload[0] == '[') {
|
|
|
|
log.e("unknown payload(2b). message=%s", parent_text)
|
|
|
|
return null
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
2018-07-06 17:22:22 +02:00
|
|
|
|
2018-01-04 19:52:25 +01:00
|
|
|
// 2017/8/24 18:37 mdx.ggtea.org でここを通った
|
|
|
|
val m = reNumber.matcher(payload)
|
|
|
|
if(m.find()) {
|
2019-09-12 15:43:11 +02:00
|
|
|
return m.group(1) !!.toLong(10)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ここを通るケースはまだ確認できていない
|
|
|
|
log.e("unknown payload(3). message=%s", parent_text)
|
|
|
|
|
|
|
|
} catch(ex : Throwable) {
|
|
|
|
log.trace(ex)
|
|
|
|
}
|
|
|
|
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
}
|