From 117ae4bad7730d931f76ec106a664d0062f68dad Mon Sep 17 00:00:00 2001 From: TheSaminator Date: Tue, 8 Feb 2022 17:59:36 -0500 Subject: [PATCH] Add avatars and attempt to fix user session saving --- plan/oauth-logo.png | Bin 2920 -> 28716 bytes plan/oauth-logo.svg | 117 ++++++++++++++++++ .../kotlin/starshipfights/auth/providers.kt | 12 +- .../starshipfights/data/auth/user_sessions.kt | 6 + .../kotlin/starshipfights/info/views_user.kt | 29 ++--- 5 files changed, 143 insertions(+), 21 deletions(-) create mode 100644 plan/oauth-logo.svg diff --git a/plan/oauth-logo.png b/plan/oauth-logo.png index f0940b424ec1cfa3960fbd404963c45863e1c935..0a6186c5d41ac0e52ad733f921de63c90e2ad1b6 100644 GIT binary patch literal 28716 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 delta 2891 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 JhRa@<{{f~Fe|i7_ diff --git a/plan/oauth-logo.svg b/plan/oauth-logo.svg new file mode 100644 index 0000000..f364dc7 --- /dev/null +++ b/plan/oauth-logo.svg @@ -0,0 +1,117 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/src/jvmMain/kotlin/starshipfights/auth/providers.kt b/src/jvmMain/kotlin/starshipfights/auth/providers.kt index a37944f..e050fb8 100644 --- a/src/jvmMain/kotlin/starshipfights/auth/providers.kt +++ b/src/jvmMain/kotlin/starshipfights/auth/providers.kt @@ -234,6 +234,7 @@ object TestAuthProvider : AuthProvider { discordId = credentials.name, discordName = "", discordDiscriminator = "0000", + discordAvatar = null, profileName = "Test User" ).also { User.put(it) @@ -387,14 +388,17 @@ class ProductionAuthProvider(val discordLogin: DiscordLogin) : AuthProvider { val discordId = (userInfo["id"] as? JsonPrimitive)?.content ?: redirect("/login") val discordUsername = (userInfo["username"] as? JsonPrimitive)?.content ?: redirect("/login") val discordDiscriminator = (userInfo["discriminator"] as? JsonPrimitive)?.content ?: redirect("/login") + val discordAvatar = (userInfo["avatar"] as? JsonPrimitive)?.content val user = User.locate(User::discordId eq discordId)?.copy( discordName = discordUsername, - discordDiscriminator = discordDiscriminator + discordDiscriminator = discordDiscriminator, + discordAvatar = discordAvatar ) ?: User( discordId = discordId, discordName = discordUsername, discordDiscriminator = discordDiscriminator, + discordAvatar = discordAvatar, profileName = discordUsername ) @@ -405,10 +409,8 @@ class ProductionAuthProvider(val discordLogin: DiscordLogin) : AuthProvider { expirationMillis = System.currentTimeMillis() + 86_400_000 ) - launch { - User.put(user) - UserSession.put(userSession) - } + launch { User.put(user) } + launch { UserSession.put(userSession) } call.sessions.set(userSession.id) redirect("/me") diff --git a/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt b/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt index b5b9b19..019e1e3 100644 --- a/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt +++ b/src/jvmMain/kotlin/starshipfights/data/auth/user_sessions.kt @@ -15,9 +15,15 @@ data class User( val discordId: String, val discordName: String, val discordDiscriminator: String, + val discordAvatar: String?, val profileName: String, val status: UserStatus = UserStatus.AVAILABLE, ) : DataDocument { + val discordAvatarUrl: String + get() = discordAvatar?.let { + "https://cdn.discordapp.com/avatars/$discordId/$it." + (if (it.startsWith("a_")) "gif" else "png") + "?size=256" + } ?: "https://cdn.discordapp.com/embed/avatars/${discordDiscriminator.last().digitToInt() % 5}.png" + companion object Table : DocumentTable by DocumentTable.create({ unique(User::discordId) }) diff --git a/src/jvmMain/kotlin/starshipfights/info/views_user.kt b/src/jvmMain/kotlin/starshipfights/info/views_user.kt index 6c6df5a..02716bf 100644 --- a/src/jvmMain/kotlin/starshipfights/info/views_user.kt +++ b/src/jvmMain/kotlin/starshipfights/info/views_user.kt @@ -31,31 +31,28 @@ suspend fun ApplicationCall.userPage(): HTML.() -> Unit { val admirals = Admiral.select(Admiral::owningUser eq user.id).toList() return page( - user.profileName, standardNavBar(), if (isCurrentUser) - PageNavSidebar( - listOf( - NavLink("/admiral/new", "New Admiral"), - ) - ) - else null - ) { - section { - h1 { +user.profileName } + user.profileName, standardNavBar(), CustomSidebar { + img(src = user.discordAvatarUrl) p { + style = "text-align:center" +user.discordName +"#" +user.discordDiscriminator } - - if (isCurrentUser) + if (user.discordId == CurrentConfiguration.discordClient?.ownerId) p { - +"This user is you!" + style = "text-align:center" + +"Site Owner" } - - if (user.discordId == CurrentConfiguration.discordClient?.ownerId) + if (isCurrentUser) p { - +"This user is the owner of the site!" + style = "text-align:center" + a(href = "/admiral/new") { +"Create New Admiral" } } + } + ) { + section { + h1 { +user.profileName } if (admirals.isNotEmpty()) { p { -- 2.25.1