From 79fa5448a07d786fe01cbaa493b6b41c8359dd27 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sun, 12 Jan 2025 04:22:07 -0500 Subject: [PATCH] [+] Recommender integration --- src/main/java/ext/Ext.kt | 3 +++ .../aqua/net/games/GameApiController.kt | 27 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index 5cbe6ba1..f9240cfd 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -185,6 +185,7 @@ val Any?.truthy get() = when (this) { is Map<*, *> -> isNotEmpty() else -> true } +val Any?.str get() = toString() // Collections fun ls(vararg args: T) = args.toList() @@ -251,3 +252,5 @@ val Pair<*, S>.r get() = component2() // Database val Query.exec get() = resultList.map { (it as Array<*>).toList() } +fun List>.numCsv(vararg head: Str) = head.joinToString(",") + "\n" + + joinToString("\n") { it.joinToString(",") } diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt index 373f1ef1..59e3f5fb 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt @@ -1,11 +1,13 @@ package icu.samnyan.aqua.net.games import ext.* +import icu.samnyan.aqua.net.BotProps import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.utils.SUCCESS import icu.samnyan.aqua.sega.general.model.Card import jakarta.annotation.PostConstruct import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired import org.springframework.scheduling.annotation.Scheduled import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock @@ -70,9 +72,9 @@ abstract class GameApiController(val name: String, userDataClass: @Scheduled(fixedRate = 20, timeUnit = TimeUnit.MINUTES) fun rankingCacheRun() = rankingCacheLock.maybeLock { rankingCacheCompute() } + private val tableName = when (name) { "mai2" -> "maimai2"; "chu3" -> "chusan"; else -> name } fun rankingCacheCompute() { val time = millis() - val tableName = when (name) { "mai2" -> "maimai2"; "chu3" -> "chusan"; else -> name } rankingCache = us.em.createNativeQuery( """ SELECT @@ -193,4 +195,27 @@ abstract class GameApiController(val name: String, userDataClass: rival = rival ) } + + // Recommender System Integration + @Autowired lateinit var botProps: BotProps + // Map> + var recommendedMusic: Map> = emptyMap() + + @API("recommender-fetch") + fun recommenderFetchPlays(@RP botSecret: String) = run { + if (botSecret != botProps.secret) 403 - "Invalid Secret" + + us.em.createNativeQuery(""" + SELECT user_id, music_id, count(*) as count + FROM ${tableName}_user_playlog_view + GROUP BY user_id, music_id; + """.trimIndent()).exec.numCsv("user_id", "music_id", "count") + } + + @API("recommender-update") + fun recommenderUpdate(@RP botSecret: String, @RB data: Map>) { + if (botSecret != botProps.secret) 403 - "Invalid Secret" + + recommendedMusic = data + } }