feat: Auto check music

This commit is contained in:
Lucàs
2025-01-10 18:23:53 +01:00
parent 4c4e06b64b
commit 2413ce55c9
3 changed files with 137 additions and 35 deletions
@@ -9,7 +9,7 @@ data class Track(
data class Input(
val value: String,
val answer: Answer = Answer.UNKNOWN
var answer: Answer = Answer.UNKNOWN
)
enum class Answer {
@@ -2,17 +2,87 @@ package fr.univpau.queezer.manager
import android.media.MediaPlayer
import android.util.Log
import fr.univpau.queezer.data.Answer
import fr.univpau.queezer.data.GameMode
import fr.univpau.queezer.data.Settings
import fr.univpau.queezer.data.Track
import java.util.Locale
class GameManager(var settings: Settings, val tracks: List<Track>) {
class GameManager() {
private var mediaPlayer: MediaPlayer = MediaPlayer()
val countDownManager = CountdownManager(30000L, onFinish = ::nextTrack)
var settings: Settings = Settings()
var tracks: List<Track> = emptyList()
var currentTrackIndex: Int = 0;
var score = 0
constructor(settings: Settings, tracks: List<Track>) : this() {
this.settings = settings
this.tracks = tracks
for (track in tracks) {
if (settings.gameMode == GameMode.TITLE) {
track.title.answer = Answer.INCORRECT
}
if (settings.gameMode == GameMode.ARTIST) {
track.artist.answer = Answer.INCORRECT
}
if (settings.gameMode == GameMode.ALL) {
track.title.answer = Answer.INCORRECT
track.artist.answer = Answer.INCORRECT
}
}
}
fun checkTitleAnswer(currentTrack: Track?, answerTitle: String) {
if (currentTrack == null) return;
Log.i("GameManager", "Current track: ${currentTrack.title.value}")
Log.i("GameManager", "Answer: $answerTitle")
var simpleTitleAnswer = formatString(answerTitle)
var simpleTitle = formatString(currentTrack.title.value)
if (simpleTitle.equals(simpleTitleAnswer, ignoreCase = true)) {
currentTrack.title.answer = Answer.CORRECT
score++
} else {
currentTrack.title.answer = Answer.INCORRECT
}
}
fun checkArtistAnswer(currentTrack: Track?, answerArtist: String) {
if (currentTrack == null) return;
Log.i("GameManager", "Current track: ${currentTrack.artist.value}")
Log.i("GameManager", "Answer: $answerArtist")
var simpleArtistAnswer = formatString(answerArtist)
var simpleArtist = formatString(currentTrack.artist.value)
if (simpleArtist.equals(simpleArtistAnswer, ignoreCase = true)) {
currentTrack.artist.answer = Answer.CORRECT
score++
} else {
currentTrack.artist.answer = Answer.INCORRECT
}
}
fun formatString(input: String): String {
return input
.trim()
.toLowerCase(Locale.ROOT)
.removeSurrounding("(", ")")
.removeSurrounding("[", "]")
.removeSurrounding("{", "}")
.removeSurrounding("\"", "\"")
.replace("[^a-zA-Z0-9]".toRegex(), "")
.trim()
}
fun getCurrentTrack(): Track? {
if (tracks.isEmpty()) return null;
return tracks[currentTrackIndex]
@@ -23,6 +23,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.blur
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.input.KeyboardType
@@ -33,6 +34,7 @@ import fr.univpau.queezer.R
import fr.univpau.queezer.data.Settings
import fr.univpau.queezer.manager.loadSettings
import coil.compose.AsyncImage
import fr.univpau.queezer.data.Answer
import fr.univpau.queezer.manager.GameManager
import fr.univpau.queezer.manager.fetchAndFormatPlaylist
@@ -54,7 +56,8 @@ fun GameScreen(navController: NavHostController) {
}
// État de l'utilisateur et des éléments du jeu
val userInput = remember { mutableStateOf("") }
val titleInput = remember { mutableStateOf("") }
val artistInput = remember { mutableStateOf("") }
// Affichage de l'interface
Column(
@@ -74,38 +77,67 @@ fun GameScreen(navController: NavHostController) {
Text("Score : ${gameManager.score}", fontSize = 24.sp)
Text("Temps restant : ${gameManager.countDownManager.timeLeft}sec", fontSize = 20.sp)
if (currentTrack!!.title.answer == Answer.CORRECT && currentTrack!!.artist.answer == Answer.UNKNOWN
|| currentTrack!!.title.answer == Answer.UNKNOWN && currentTrack!!.artist.answer == Answer.CORRECT
|| currentTrack!!.title.answer == Answer.CORRECT && currentTrack!!.artist.answer == Answer.CORRECT) {
AsyncImage(
model = currentTrack!!.album,
contentDescription = "Image from URL",
modifier = Modifier
.width(200.dp)
.height(200.dp),
.height(200.dp)
,
contentScale = ContentScale.Crop
)
} else {
AsyncImage(
model = currentTrack!!.album,
contentDescription = "Image from URL",
modifier = Modifier
.width(200.dp)
.height(200.dp)
.blur(50.dp)
,
contentScale = ContentScale.Crop
)
}
Row {
if (currentTrack!!.title.answer == Answer.CORRECT || currentTrack!!.title.answer == Answer.UNKNOWN) {
Text("Titre : ${currentTrack!!.title.value}", fontSize = 20.sp)
Text("Artiste : ${currentTrack!!.artist.value}", fontSize = 20.sp)
// Champ de texte pour entrer la proposition
} else {
TextField(
value = userInput.value,
onValueChange = { userInput.value = it },
label = { Text("Titre / Artiste") },
value = titleInput.value,
onValueChange = {
titleInput.value = it;
gameManager.checkTitleAnswer(currentTrack, titleInput.value)
},
label = { Text("Titre") },
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text),
modifier = Modifier.fillMaxWidth()
)
// Bouton Valider la réponse
Button(
onClick = {
userInput.value = "" // Réinitialiser le champ de texte
}
) { Text(context.resources.getString(R.string.submit)) }
}
Row {
if (currentTrack!!.artist.answer == Answer.CORRECT || currentTrack!!.artist.answer == Answer.UNKNOWN) {
Text("Artiste : ${currentTrack!!.artist.value}", fontSize = 20.sp)
} else {
TextField(
value = artistInput.value,
onValueChange = { artistInput.value = it; gameManager.checkArtistAnswer(currentTrack, artistInput.value) },
label = { Text("Artiste") },
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Text),
modifier = Modifier.fillMaxWidth()
)
}
}
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
Button(
onClick = {
userInput.value = "" // Réinitialiser le champ de texte
titleInput.value = ""
artistInput.value = ""
gameManager.nextTrack()
currentTrack = gameManager.getCurrentTrack()
},