nise/nise-backend/src/main/kotlin/com/nisemoe/nise/Models.kt

160 lines
4.0 KiB
Kotlin

package com.nisemoe.nise
import kotlinx.serialization.Serializable
import java.time.OffsetDateTime
data class UserQueueDetails(
val isProcessing: Boolean,
val lastCompletedUpdate: OffsetDateTime?,
val canUpdate: Boolean,
val progressCurrent: Int?,
val progressTotal: Int?,
)
data class UserDetails(
val user_id: Long,
val username: String,
val rank: Long?,
val pp_raw: Double?,
val join_date: String?,
val seconds_played: Long?,
val country: String?,
val country_rank: Long?,
val playcount: Long?,
val suspicious_scores: Int = 0,
val stolen_replays: Int = 0
)
@Serializable
@AllowCacheSerialization
data class Statistics(
val total_beatmaps: Int,
val total_users: Int,
val total_scores: Int,
val total_replay_scores: Int,
val total_replay_similarity: Int
)
data class SuspiciousScoreEntry(
val user_id: Long,
val username: String,
val replay_id: Long,
val date: String,
val beatmap_id: Long,
val beatmap_beatmapset_id: Long,
val beatmap_title: String,
val beatmap_star_rating: Double,
val pp: Double,
val frametime: Double,
val ur: Double
)
data class SimilarReplayEntry(
val replay_id_1: Long,
val replay_id_2: Long,
val user_id_1: Long,
val user_id_2: Long,
val username_1: String,
val username_2: String,
val beatmap_beatmapset_id: Long,
val replay_date_1: String,
val replay_date_2: String,
val replay_pp_1: Double,
val replay_pp_2: Double,
val beatmap_id: Long,
val beatmap_title: String,
val beatmap_star_rating: Double,
val similarity: Double
)
data class ReplayPairStatistics(
val similarity: Double,
val correlation: Double,
)
data class ReplayPair(
val replays: List<ReplayData>,
val statistics: ReplayPairStatistics
)
data class ReplayDataChart(
val title: String,
val data: List<Double>
)
data class ReplayData(
val replay_id: Long,
val user_id: Int,
val username: String,
val date: String,
val beatmap_id: Int,
val beatmap_beatmapset_id: Int,
val beatmap_artist: String,
val beatmap_title: String,
val beatmap_star_rating: Double,
val beatmap_creator: String,
val beatmap_version: String,
val score: Int,
val mods: List<String>,
val rank: String,
val ur: Double?,
val adjusted_ur: Double?,
val average_ur: Double?,
val frametime: Int,
val snaps: Int,
val hits: Int,
var mean_error: Double?,
var error_variance: Double?,
var error_standard_deviation: Double?,
var minimum_error: Double?,
var maximum_error: Double?,
var error_range: Double?,
var error_coefficient_of_variation: Double?,
var error_kurtosis: Double?,
var error_skewness: Double?,
var comparable_samples: Int? = null,
var comparable_mean_error: Double? = null,
var comparable_error_variance: Double? = null,
var comparable_error_standard_deviation: Double? = null,
var comparable_minimum_error: Double? = null,
var comparable_maximum_error: Double? = null,
var comparable_error_range: Double? = null,
var comparable_error_coefficient_of_variation: Double? = null,
var comparable_error_kurtosis: Double? = null,
var comparable_error_skewness: Double? = null,
val pp: Double,
val perfect: Boolean,
val max_combo: Int,
val count_300: Int,
val count_100: Int,
val count_50: Int,
val count_miss: Int,
val error_distribution: Map<Int, DistributionEntry>,
val charts: List<ReplayDataChart>
) {
fun calculateAccuracy(): Double {
if (count_300 + count_100 + count_50 + count_miss == 0) {
return 0.0
}
val totalHits = count_300 + count_100 + count_50 + count_miss
val accuracy = (300.0 * count_300 + 100.0 * count_100 + 50.0 * count_50) / (300.0 * totalHits)
return accuracy * 100
}
}
data class DistributionEntry(
val percentageMiss: Double,
val percentage300: Double,
val percentage100: Double,
val percentage50: Double
)