diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/Utils.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/Utils.kt new file mode 100644 index 0000000..79e8bb1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/Utils.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.SauceNaoAPI.additional + +typealias AccountType = Int +const val defaultAccountType: AccountType = 1 // "basic" + +typealias UserId = Int + +const val SHORT_TIME_RECALCULATING_MILLIS = 30 * 1000 +const val LONG_TIME_RECALCULATING_MILLIS = 24 * 60 * 60 * 1000 diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/AccountInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/AccountInfo.kt new file mode 100644 index 0000000..710c286 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/AccountInfo.kt @@ -0,0 +1,43 @@ +package com.github.insanusmokrassar.SauceNaoAPI.additional.header + +import com.github.insanusmokrassar.SauceNaoAPI.additional.* +import com.github.insanusmokrassar.SauceNaoAPI.models.Header + +val Header.shortLimitStatus: LimitStatus + get() = LimitStatus( + shortRemaining ?: Int.MAX_VALUE, + shortLimit ?: Int.MAX_VALUE + ) + +val Header.longLimitStatus: LimitStatus + get() = LimitStatus( + longRemaining ?: Int.MAX_VALUE, + longLimit ?: Int.MAX_VALUE + ) + +val Header.limits + get() = Limits(shortLimitStatus, longLimitStatus) + +val Header.accountInfo + get() = AccountInfo( + accountType ?: defaultAccountType, + userId, + limits + ) + + +data class LimitStatus( + val remain: Int = Int.MAX_VALUE, + val limit: Int = Int.MAX_VALUE +) + +data class Limits( + val short: LimitStatus = LimitStatus(), + val long: LimitStatus = LimitStatus() +) + +data class AccountInfo( + val accountType: AccountType = defaultAccountType, + val userId: UserId? = null, + val limits: Limits = Limits() +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/IndexInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/IndexInfo.kt new file mode 100644 index 0000000..109939f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/IndexInfo.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.SauceNaoAPI.additional.header + +import com.github.insanusmokrassar.SauceNaoAPI.models.Header + +data class IndexInfo( + val id: Int, + val status: Int = 500, + val results: Int = 0, + val parent_id: Int? = null +) + +val Header.adaptedIndexes: List + get() = indexes.mapNotNull { + it ?.let { _ -> + it.id ?.let { id -> + IndexInfo( + id, + it.status ?: 500, // Serverside error if not set + it.results ?: 0, + it.parent_id + ) + } + } + } diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/QueryResultsMetainfo.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/QueryResultsMetainfo.kt new file mode 100644 index 0000000..69e3c8f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/QueryResultsMetainfo.kt @@ -0,0 +1,37 @@ +package com.github.insanusmokrassar.SauceNaoAPI.additional.header + +import com.github.insanusmokrassar.SauceNaoAPI.models.Header + +val Header.queryPreview + get() = QueryResultPreview( + queryImageDisplay, + queryImage + ) + +val Header.queryResults + get() = QueryResultsMetainfo( + status ?: 500, // server_side error if status field was not set up + resultsCount ?: 0, + minSimilarity ?: 0F, + searchDepth ?: 128, + queryPreview, + adaptedIndexes + ) + +data class QueryResultPreview( + val imageDisplay: String? = null, // something like "userdata/uuid.png", + val image: String? = null // something like "uuid.jpg" +) + +data class QueryResultsMetainfo( + val status: Int = 0, + val count: Int = 0, + val minSimilarity: Float = 0F, + val searchDepth: Int = 128, + val preview: QueryResultPreview = QueryResultPreview(), + val indexesInfo: List = emptyList() +) { + val isOk: Boolean = status == 0 + val isClientSideError = status < 0 + val isServerSideError = status > 0 +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/ResultMetainfo.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/ResultMetainfo.kt new file mode 100644 index 0000000..61721fc --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/additional/header/ResultMetainfo.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.SauceNaoAPI.additional.header + +import com.github.insanusmokrassar.SauceNaoAPI.models.Header + +data class ResultMetainfo( + val accountInfo: AccountInfo = AccountInfo(), + val resultsInfo: QueryResultsMetainfo = QueryResultsMetainfo() +) + +val Header.adapted + get() = ResultMetainfo( + accountInfo, + queryResults + ) diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/Header.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/Header.kt index b3a87a5..8406825 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/Header.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/Header.kt @@ -8,22 +8,22 @@ import kotlinx.serialization.json.Json @Serializable data class Header( @SerialName("status") - val status: Int, + val status: Int? = null, @SerialName("results_requested") - val resultsRequested: Int, + val resultsRequested: Int? = null, @Serializable(IndexesSerializer::class) @SerialName("index") - val indexes: List, + val indexes: List = emptyList(), @SerialName("search_depth") - val searchDepth: Int, + val searchDepth: Int? = null, @SerialName("minimum_similarity") - val minSimilarity: Float, - @SerialName("query_image_display") - val queryImageDisplay: String, // something like "userdata/uuid.png", - @SerialName("query_image") - val queryImage: String, // something like "uuid.jpg" + val minSimilarity: Float? = null, @SerialName("results_returned") - val resultsCount: Int, + val resultsCount: Int? = null, + @SerialName("query_image_display") + val queryImageDisplay: String? = null, // something like "userdata/uuid.png", + @SerialName("query_image") + val queryImage: String? = null, // something like "uuid.jpg" @SerialName("short_remaining") val shortRemaining: Int? = null, @SerialName("long_remaining") @@ -33,7 +33,7 @@ data class Header( @SerialName("long_limit") val longLimit: Int? = null, @SerialName("account_type") - val accountType: String? = null, + val accountType: Int? = null, @SerialName("user_id") val userId: Int? = null ) diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/HeaderIndex.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/HeaderIndex.kt index dfc37ba..c34b0b7 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/HeaderIndex.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/HeaderIndex.kt @@ -4,8 +4,8 @@ import kotlinx.serialization.Serializable @Serializable data class HeaderIndex( - val status: Int, - val id: Int, - val results: Int = 0, + val status: Int? = null, + val id: Int? = null, + val results: Int? = null, val parent_id: Int? = null )