discordDiscriminator = "",
discordAvatar = null,
profileName = credentials.name,
- profileBio = "BEEP BOOP I EXIST ONLY FOR TESTING BLOP BLARP."
+ profileBio = "BEEP BOOP I EXIST ONLY FOR TESTING BLOP BLARP.",
+ registeredAt = Instant.now(),
+ lastActivity = Instant.now(),
).also {
User.put(it)
}
discordDiscriminator = discordDiscriminator,
discordAvatar = discordAvatar,
profileName = discordUsername,
- profileBio = "Hi, I'm new here!"
+ profileBio = "Hi, I'm new here!",
+ registeredAt = Instant.now(),
+ lastActivity = Instant.now(),
)
val userSession = UserSession(
clientAddresses = if (clientAddresses.last() != clientAddress) clientAddresses + clientAddress else clientAddresses
).also { UserSession.put(it) }
+suspend fun User.updated() = copy(
+ lastActivity = Instant.now()
+).also { User.put(it) }
+
suspend fun ApplicationCall.getUserSession() = request.userAgent()?.let { sessions.get<Id<UserSession>>()?.resolve(it) }?.renewed(request.origin.remoteHost)
-suspend fun ApplicationCall.getUser() = getUserSession()?.user?.let { User.get(it) }
+suspend fun ApplicationCall.getUser() = getUserSession()?.user?.let { User.get(it) }?.updated()
object UserSessionIdSerializer : SessionSerializer<Id<UserSession>> {
override fun serialize(session: Id<UserSession>): String {
data class User(
@SerialName("_id")
override val id: Id<User> = Id(),
+
val discordId: String,
val discordName: String,
val discordDiscriminator: String,
val discordAvatar: String?,
+
val profileName: String,
val profileBio: String,
+
+ val registeredAt: @Contextual Instant,
+ val lastActivity: @Contextual Instant,
+
val status: UserStatus = UserStatus.AVAILABLE,
) : DataDocument<User> {
val discordAvatarUrl: String
style = "text-align:center;border:2px solid #a82;padding:3px;background-color:#fc3;color:#a82;font-variant:small-caps;font-family:'Orbitron',sans-serif"
+"Site Owner"
}
+ hr { style = "border-color:#036" }
+ p {
+ style = "text-align:center"
+ +"Registered at "
+ span(classes = "moment") {
+ style = "display:none"
+ +user.registeredAt.toEpochMilli().toString()
+ }
+ br
+ +"Last active at "
+ span(classes = "moment") {
+ style = "display:none"
+ +user.lastActivity.toEpochMilli().toString()
+ }
+ }
if (isCurrentUser) {
hr { style = "border-color:#036" }
div(classes = "list") {