From a487fc2f4cc90896c55cde1df952b9844c795de0 Mon Sep 17 00:00:00 2001 From: "Jill \"oatmealine\" Monoids" Date: Mon, 20 Nov 2023 00:11:55 +0300 Subject: [PATCH] show login thing on homepage --- package.json | 1 + pnpm-lock.yaml | 186 ++++++++++++++++++++- src/web.ts | 41 ++++- static/assets/avatar.png | Bin 0 -> 13274 bytes static/style.css | 37 +++- static/index.html => views/home.handlebars | 9 + 6 files changed, 260 insertions(+), 14 deletions(-) create mode 100644 static/assets/avatar.png rename static/index.html => views/home.handlebars (74%) diff --git a/package.json b/package.json index 28a612e..2645282 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "d3-array": "^2.12.1", "discord.js": "^14.14.1", "express": "^4.18.2", + "express-handlebars": "^7.1.2", "got": "^11.8.6", "knex": "^3.0.1", "outdent": "^0.8.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 665d2ed..4087693 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: express: specifier: ^4.18.2 version: 4.18.2 + express-handlebars: + specifier: ^7.1.2 + version: 7.1.2 got: specifier: ^11.8.6 version: 11.8.6 @@ -241,6 +244,18 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + /@mapbox/node-pre-gyp@1.0.11: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true @@ -300,6 +315,13 @@ packages: dev: false optional: true + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + /@sapphire/async-queue@1.5.0: resolution: {integrity: sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -671,12 +693,22 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: false @@ -741,6 +773,12 @@ packages: balanced-match: 1.0.2 concat-map: 0.0.1 + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -899,7 +937,6 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: true /d3-array@2.12.1: resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} @@ -1018,6 +1055,10 @@ packages: esutils: 2.0.3 dev: true + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false @@ -1027,6 +1068,10 @@ packages: requiresBuild: true dev: false + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -1176,6 +1221,15 @@ packages: engines: {node: '>= 0.6'} dev: false + /express-handlebars@7.1.2: + resolution: {integrity: sha512-ss9d3mBChOLTEtyfzXCsxlItUxpgS3i4cb/F70G6Q5ohQzmD12XB4x/Y9U6YboeeYBJZt7WQ5yUNu7ZSQ/EGyQ==} + engines: {node: '>=v16'} + dependencies: + glob: 10.3.10 + graceful-fs: 4.2.11 + handlebars: 4.7.8 + dev: false + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -1293,6 +1347,14 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -1388,6 +1450,18 @@ packages: is-glob: 4.0.3 dev: true + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 5.0.0 + path-scurry: 1.10.1 + dev: false + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} requiresBuild: true @@ -1445,12 +1519,24 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} requiresBuild: true dev: false - optional: true /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: false + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1657,6 +1743,15 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} requiresBuild: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1763,6 +1858,11 @@ packages: engines: {node: '>=8'} dev: false + /lru-cache@10.0.3: + resolution: {integrity: sha512-B7gr+F6MkqB3uzINHXNctGieGsRTMwIBgxkp0yq/5BwcuDzD4A8wQpHQW6vDAm1uKSLQghmRdD9sKqf2vJ1cEg==} + engines: {node: 14 || >=16.14} + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1868,6 +1968,17 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} @@ -1965,6 +2076,10 @@ packages: requiresBuild: true dev: false + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: false + /node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} dev: false @@ -2133,12 +2248,19 @@ packages: /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - dev: true /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.0.3 + minipass: 5.0.0 + dev: false + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false @@ -2409,12 +2531,10 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - dev: true /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - dev: true /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -2428,6 +2548,11 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2463,6 +2588,11 @@ packages: dev: false optional: true + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + /sqlite3@5.1.6: resolution: {integrity: sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==} requiresBuild: true @@ -2504,6 +2634,15 @@ packages: strip-ansi: 6.0.1 dev: false + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} requiresBuild: true @@ -2517,6 +2656,13 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2628,6 +2774,14 @@ packages: hasBin: true dev: true + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: false + optional: true + /uid-safe@2.1.5: resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} engines: {node: '>= 0.8'} @@ -2723,6 +2877,28 @@ packages: string-width: 4.2.3 dev: false + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} requiresBuild: true diff --git a/src/web.ts b/src/web.ts index 23fd148..7ae4a6b 100644 --- a/src/web.ts +++ b/src/web.ts @@ -1,8 +1,9 @@ import express from 'express'; +import { engine } from 'express-handlebars'; import * as log from './lib/log'; import { CustomItem, Session, db } from './lib/db'; import { defaultItems } from './lib/rpg/items'; -import { Client, RESTPostOAuth2AccessTokenResult, RESTPostOAuth2AccessTokenURLEncodedData, RESTPostOAuth2RefreshTokenURLEncodedData, Routes } from 'discord.js'; +import { APIUser, CDN, Client, RESTPostOAuth2AccessTokenResult, RESTPostOAuth2AccessTokenURLEncodedData, RESTPostOAuth2RefreshTokenURLEncodedData, Routes } from 'discord.js'; import got from 'got'; import uid from 'uid-safe'; import { Cookie, parse } from 'tough-cookie'; @@ -66,8 +67,27 @@ async function getSession(bot: Client, headers: IncomingHttpHeaders) { .returning('*'))[0]; } +export async function getUser(session: Session | undefined) { + if (!session) return null; + try { + return await got('https://discord.com/api/users/@me', { + headers: { + authorization: `${session.tokenType} ${session.accessToken}` + } + }).json() as APIUser; + } catch(err) { + log.error(err); + return null; + } +} + export async function startServer(bot: Client, port: number) { const app = express(); + const cdn = new CDN(); + + app.engine('handlebars', engine()); + app.set('view engine', 'handlebars'); + app.set('views', './views'); app.get('/api/items', async (req, res) => { const guildID = req.query.guild; @@ -128,7 +148,8 @@ export async function startServer(bot: Client, port: number) { .update(sessionData); } else { await db('sessions') - .insert({id: sessionId, ...sessionData} satisfies Session); + .insert({id: sessionId, ...sessionData} satisfies Session) + .returning('*'); } const cookie = new Cookie({ @@ -146,18 +167,22 @@ export async function startServer(bot: Client, port: number) { } } - res.sendFile('index.html', { root: 'static/' }); + const session = await getSession(bot, req.headers); + const user = await getUser(session); + + res.render('home', { + signedIn: session !== undefined, + username: user?.global_name, + avatar: user?.avatar ? cdn.avatar(user.id, user.avatar, { size: 128 }) : null, + layout: false, + }); }); app.get('/profile', async (req, res) => { const session = await getSession(bot, req.headers); if (!session) return res.redirect(`https://discord.com/api/oauth2/authorize?client_id=${bot.config.clientId}&redirect_uri=${encodeURIComponent(bot.config.siteURL)}&response_type=code&scope=identify%20guilds`); - const user = await got('https://discord.com/api/users/@me', { - headers: { - authorization: `${session.tokenType} ${session.accessToken}` - } - }).json(); + const user = await getUser(session); //res.sendFile('profile/index.html', { root: 'static/' }); res.json(user); diff --git a/static/assets/avatar.png b/static/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..4a04f818a28024fc75fca9049b225242095153eb GIT binary patch literal 13274 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 Y7e?12o~RdIj{pDw07*qoM6N<$g4l1^FaQ7m literal 0 HcmV?d00001 diff --git a/static/style.css b/static/style.css index 4ca85c8..4eb5244 100644 --- a/static/style.css +++ b/static/style.css @@ -11,6 +11,7 @@ body { font-family: 'Balsamiq Sans', sans-serif; font-weight: 300; width: 100%; + min-height: 100vh; text-underline-offset: 3px; font-size: 16px; color-scheme: light dark; @@ -18,6 +19,8 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-text-size-adjust: 100%; + display: flex; + flex-direction: column; } :root { @@ -52,7 +55,8 @@ a:hover { flex-direction: column; align-items: center; justify-content: center; - min-height: 100vh; + min-height: 100%; + flex: 1 0 auto; } #main img { display: block; @@ -95,6 +99,37 @@ a:hover { 100% { transform: scale(1) rotate(0deg) } } +#login { + display: flex; + flex-direction: row; + width: fit-content; + height: 2rem; + border: 1px solid var(--text-color-light); + border-radius: 2rem; + align-items: center; + padding: 0.25em 0.5em; + margin: 0.5rem; + gap: 0.5em; + cursor: pointer; + transition: 0.1s color, 0.1s background-color; + font-size: 1.2rem; + align-self: flex-end; +} +#login:hover { + border-color: var(--accent-color); + background-color: var(--accent-color); +} +#login .avatar { + display: block; + aspect-ratio: 1 / 1; + border-radius: 2rem; + width: auto; + height: 100%; +} +#login:not(:hover) .username.logged-out { + color: var(--text-color-light); +} + #content { max-width: 1000px; width: 100%; diff --git a/static/index.html b/views/home.handlebars similarity index 74% rename from static/index.html rename to views/home.handlebars index 5283dc7..04f9b07 100644 --- a/static/index.html +++ b/views/home.handlebars @@ -16,6 +16,15 @@ +
+ {{#if signedIn}} +
{{username}}
+ + {{else}} +
log in
+ + {{/if}} +

jillo!