forked from SteamWar/SteamWar
- add Clikt-based `sw` entrypoint and subcommands - include database, user, dev, and profiler commands - wire CLI build and CI install/release steps
66 lines
2.6 KiB
Kotlin
66 lines
2.6 KiB
Kotlin
package de.steamwar.commands.user
|
|
|
|
import com.github.ajalt.clikt.core.CliktCommand
|
|
import com.github.ajalt.clikt.core.CliktError
|
|
import com.github.ajalt.clikt.parameters.arguments.argument
|
|
import com.github.ajalt.clikt.parameters.arguments.help
|
|
import com.github.ajalt.mordant.table.table
|
|
import de.steamwar.db.findUser
|
|
import de.steamwar.db.useDb
|
|
import de.steamwar.sql.Punishment
|
|
import de.steamwar.sql.SessionTable
|
|
import de.steamwar.sql.SteamwarUser
|
|
import de.steamwar.sql.Team
|
|
import org.jetbrains.exposed.v1.core.eq
|
|
import org.jetbrains.exposed.v1.jdbc.selectAll
|
|
import java.time.Duration
|
|
|
|
class UserInfoCommand : CliktCommand("info") {
|
|
val userId by argument().help("Id, Name, UUID or DiscordId")
|
|
val user by lazy { findUser(userId) ?: throw CliktError("User not found") }
|
|
|
|
override val printHelpOnEmptyArgs = true
|
|
|
|
override fun run() = useDb {
|
|
val sessions =
|
|
SessionTable.selectAll().where { SessionTable.userId eq user.id.value }
|
|
.map { it[SessionTable.startTime] to it[SessionTable.endTime] }
|
|
|
|
val totalPlayed = sessions.sumOf { Duration.between(it.first, it.second).toMinutes() } / 60.0
|
|
val firstJoin = sessions.minByOrNull { it.first }?.first
|
|
val lastJoin = sessions.maxByOrNull { it.second }?.second
|
|
|
|
val punishments = Punishment.getAllPunishmentsOfPlayer(user.id.value)
|
|
|
|
echo(
|
|
table {
|
|
body {
|
|
row("Name", user.userName)
|
|
row("UUID", user.uuid)
|
|
row("Team", Team.byId(user.team).teamName)
|
|
row("Leader", user.leader)
|
|
row("Locale", user.locale)
|
|
row("Beigetreten am", firstJoin)
|
|
row("Zuletzt gesehen am", lastJoin)
|
|
row("Spielzeit", totalPlayed.toString() + "h")
|
|
row("Punishments", if (punishments.isEmpty()) "Keine" else table {
|
|
header { row("Typ", "Ersteller", "Von", "Bis", "Grund") }
|
|
body {
|
|
punishments.map {
|
|
row(
|
|
it.type,
|
|
SteamwarUser.byId(it.punisher)?.userName ?: it.punisher,
|
|
it.startTime.toString(),
|
|
if (it.perma) "Perma" else it.endTime.toString(),
|
|
it.reason
|
|
)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
)
|
|
|
|
}
|
|
}
|