Basic agent implementation
This commit is contained in:
parent
8b88277a9d
commit
95650c5ca6
@ -0,0 +1,96 @@
|
||||
package com.nisemoe.nise.scheduler
|
||||
|
||||
import com.nisemoe.generated.tables.records.ScoresRecord
|
||||
import com.nisemoe.generated.tables.references.SCORES
|
||||
import com.nisemoe.generated.tables.references.USERS
|
||||
import org.jooq.DSLContext
|
||||
import org.springframework.context.annotation.Profile
|
||||
import org.springframework.scheduling.annotation.Scheduled
|
||||
import org.springframework.stereotype.Service
|
||||
|
||||
data class UserReport(
|
||||
val username: String,
|
||||
val susScore: Double,
|
||||
val userId: Long,
|
||||
val userScores: List<ScoresRecord>
|
||||
)
|
||||
|
||||
@Service
|
||||
@Profile("agent")
|
||||
class Agent(
|
||||
private val dslContext: DSLContext
|
||||
) {
|
||||
|
||||
// 20 minutes to ms = 1200000
|
||||
@Scheduled(fixedDelay = 1200000, initialDelay = 0)
|
||||
fun buildReports() {
|
||||
|
||||
// Select sus scores
|
||||
val susUsers = dslContext.select(
|
||||
SCORES.USER_ID,
|
||||
SCORES.ADJUSTED_UR,
|
||||
SCORES.SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED,
|
||||
SCORES.PP,
|
||||
SCORES.EDGE_HITS,
|
||||
SCORES.SNAPS,
|
||||
SCORES.KEYPRESSES_MEDIAN_ADJUSTED,
|
||||
SCORES.ERROR_KURTOSIS
|
||||
)
|
||||
.from(SCORES)
|
||||
.where(SCORES.ADJUSTED_UR.lessOrEqual(10.0))
|
||||
.and(SCORES.SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED.lessOrEqual(8.0))
|
||||
.and(SCORES.IS_BANNED.isFalse)
|
||||
.and(SCORES.VERSION.greaterOrEqual(4))
|
||||
.fetchInto(ScoresRecord::class.java)
|
||||
|
||||
val reports = mutableListOf<UserReport>()
|
||||
|
||||
for(user in susUsers.groupBy { it.userId }) {
|
||||
val userId = user.key!!
|
||||
val username = dslContext.select(USERS.USERNAME)
|
||||
.from(USERS)
|
||||
.where(USERS.USER_ID.eq(userId))
|
||||
.fetchOne(USERS.USERNAME) ?: continue
|
||||
|
||||
val userScores = user.value
|
||||
val susScore = calculateSuspiciousnessScore(userScores)
|
||||
|
||||
reports.add(UserReport(userId = userId, username = username, userScores = userScores, susScore = susScore))
|
||||
}
|
||||
|
||||
reports.sortByDescending { it.susScore }
|
||||
|
||||
println(reports)
|
||||
}
|
||||
|
||||
fun calculateSuspiciousnessScore(scores: List<ScoresRecord>): Double {
|
||||
if (scores.isEmpty()) return 0.0
|
||||
|
||||
return scores.sumOf { score ->
|
||||
var suspiciousnessScore = 0.0
|
||||
|
||||
suspiciousnessScore += score.pp!! * 1.0
|
||||
|
||||
suspiciousnessScore += if (score.adjustedUr!! < 6.0) 5.0 else 0.0
|
||||
|
||||
suspiciousnessScore += if (score.sliderendReleaseStandardDeviationAdjusted!! < 6) 5.0 else 0.0
|
||||
|
||||
suspiciousnessScore += when {
|
||||
score.edgeHits!! > 4 -> (score.edgeHits!! - 4) * 2.0
|
||||
else -> 0.0
|
||||
}
|
||||
|
||||
suspiciousnessScore += when {
|
||||
score.snaps!! > 4 -> (score.snaps!! - 4) * 2.0
|
||||
else -> 0.0
|
||||
}
|
||||
|
||||
suspiciousnessScore += if (score.keypressesMedianAdjusted!! < 6) 5.0 else 0.0
|
||||
|
||||
suspiciousnessScore += if (score.errorKurtosis!! < 6) 5.0 else 0.0
|
||||
|
||||
suspiciousnessScore
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user