feat: stuff

This commit is contained in:
TheClashFruit 2023-09-15 23:04:00 +02:00
parent 773a52e859
commit f879003a9f
Signed by: TheClashFruit
GPG key ID: CF4A319B9A73290C
16 changed files with 271 additions and 26 deletions

View file

@ -1,4 +1,9 @@
DISCORD_CLIENT=
DISCORD_SECRET=
DISCORD_REDIRECT=
DISCORD_OAUTH=
DISCORD_OAUTH=
MYSQL_HOST=
MYSQL_DB=
MYSQL_USER=
MYSQL_PASS=

View file

@ -4,6 +4,7 @@
error_reporting(E_ALL);
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/util/Database.php';
require __DIR__ . '/util/Discord.php';
use Twig\Loader\FilesystemLoader;
@ -20,4 +21,11 @@
$_ENV['DISCORD_CLIENT'],
$_ENV['DISCORD_SECRET'],
$_ENV['DISCORD_REDIRECT']
);
$mysql = new Database(
$_ENV['MYSQL_HOST'],
$_ENV['MYSQL_USER'],
$_ENV['MYSQL_PASS'],
$_ENV['MYSQL_DB']
);

View file

@ -1,5 +1,5 @@
<?php
global $discord;
global $discord, $mysql;
require_once "_config.php";
@ -29,6 +29,8 @@
} else {
$_SESSION['user'] = $discord->getUser($res['access_token']);
$mysql->createUserRecord($_SESSION['user']);
header('Location: /');
}
} else {

View file

@ -105,4 +105,27 @@ ul, ol {
display: flex;
flex-direction: column;
}
> .right {
list-style: none;
display: flex;
> li {
padding: 8px;
> a {
display: block;
width: 24px;
height: 24px;
color: rgba(0, 0, 0, 0.7);
&:hover {
color: rgba(0, 0, 0, 1);
}
}
}
}
}

View file

@ -90,5 +90,21 @@ ul, ol {
display: flex;
flex-direction: column;
}
.pageFooter > .right {
list-style: none;
display: flex;
}
.pageFooter > .right > li {
padding: 8px;
}
.pageFooter > .right > li > a {
display: block;
width: 24px;
height: 24px;
color: rgba(0, 0, 0, 0.7);
}
.pageFooter > .right > li > a:hover {
color: rgb(0, 0, 0);
}
/*# sourceMappingURL=style.css.map */

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["src/_fonts.scss","src/_reset.scss","src/style.scss"],"names":[],"mappings":"AAAQ;ACAR;EACE;EACA;;;ADAF;EACE;;;AAGF;EACE;EAEA;;;AENF;EACE;;;AAGF;EACE;EAEA;EAEA;;;AAGF;EACE;;;AAGF;EACE;EAEA;EAEA;EAEA;;AAEA;EACE;EAEA;EAEA;;AAEA;EACE;EAEA;EACA;EAEA;EACA;;;AAKN;EACE;EAEA;;AAEA;EACE;EAEA;EACA;EAEA;EACA;;AAEA;EACE;EAEA;EAEA;;AAGE;EACE;EAEA;EAEA;EAEA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAQZ;EACE;;;AAGF;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA","file":"style.css"}
{"version":3,"sourceRoot":"","sources":["src/_fonts.scss","src/_reset.scss","src/style.scss"],"names":[],"mappings":"AAAQ;ACAR;EACE;EACA;;;ADAF;EACE;;;AAGF;EACE;EAEA;;;AENF;EACE;;;AAGF;EACE;EAEA;EAEA;;;AAGF;EACE;;;AAGF;EACE;EAEA;EAEA;EAEA;;AAEA;EACE;EAEA;EAEA;;AAEA;EACE;EAEA;EACA;EAEA;EACA;;;AAKN;EACE;EAEA;;AAEA;EACE;EAEA;EACA;EAEA;EACA;;AAEA;EACE;EAEA;EAEA;;AAGE;EACE;EAEA;EAEA;EAEA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAQZ;EACE;;;AAGF;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EAEA;;AAEA;EACE;;AAEA;EACE;EAEA;EACA;EAEA;;AAEA;EACE","file":"style.css"}

2
css/style.min.css vendored
View file

@ -1 +1 @@
@import"https://fonts.googleapis.com/css2?family=Noto+Color+Emoji&family=Noto+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap";*{padding:0;margin:0}*{font-family:"Noto Sans","Noto Color Emoji",sans-serif}h1,h2,h3,h4,h5,h6{font-family:"Outfit","Noto Color Emoji",sans-serif;margin-bottom:6px}body{background:#f8fafc}.container{max-width:1100px;width:100%;margin:0 auto}ul,ol{list-style-position:inside}.pageHero{background-image:url("/img/spawn/2023-09-15_17.51.17.png");background-position:center;color:#fff;height:240px}.pageHero>.blurFiler{backdrop-filter:blur(2px);padding:8px 0;height:calc(100% - 16px)}.pageHero>.blurFiler>.container{height:100%;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.pageNav{width:100svw;background:#f1f5f9}.pageNav>.container{padding:16px 0;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.pageNav>.container>ul{list-style:none;display:flex;gap:8px}.pageNav>.container>ul>li>a{color:#0f172a;text-decoration:none;padding:8px 16px;border-radius:32px}.pageNav>.container>ul>li>a:hover,.pageNav>.container>ul>li>a.active{background:rgba(15,23,42,.1)}.pageNav>.container>ul>li>a.buttonPrimary{background:#6366f1;color:#fff}.pageContent{margin:16px 0}.pageFooter{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.pageFooter>.left{display:flex;flex-direction:column}/*# sourceMappingURL=style.min.css.map */
@import"https://fonts.googleapis.com/css2?family=Noto+Color+Emoji&family=Noto+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&family=Outfit:wght@100;200;300;400;500;600;700;800;900&display=swap";*{padding:0;margin:0}*{font-family:"Noto Sans","Noto Color Emoji",sans-serif}h1,h2,h3,h4,h5,h6{font-family:"Outfit","Noto Color Emoji",sans-serif;margin-bottom:6px}body{background:#f8fafc}.container{max-width:1100px;width:100%;margin:0 auto}ul,ol{list-style-position:inside}.pageHero{background-image:url("/img/spawn/2023-09-15_17.51.17.png");background-position:center;color:#fff;height:240px}.pageHero>.blurFiler{backdrop-filter:blur(2px);padding:8px 0;height:calc(100% - 16px)}.pageHero>.blurFiler>.container{height:100%;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.pageNav{width:100svw;background:#f1f5f9}.pageNav>.container{padding:16px 0;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.pageNav>.container>ul{list-style:none;display:flex;gap:8px}.pageNav>.container>ul>li>a{color:#0f172a;text-decoration:none;padding:8px 16px;border-radius:32px}.pageNav>.container>ul>li>a:hover,.pageNav>.container>ul>li>a.active{background:rgba(15,23,42,.1)}.pageNav>.container>ul>li>a.buttonPrimary{background:#6366f1;color:#fff}.pageContent{margin:16px 0}.pageFooter{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.pageFooter>.left{display:flex;flex-direction:column}.pageFooter>.right{list-style:none;display:flex}.pageFooter>.right>li{padding:8px}.pageFooter>.right>li>a{display:block;width:24px;height:24px;color:rgba(0,0,0,.7)}.pageFooter>.right>li>a:hover{color:#000}/*# sourceMappingURL=style.min.css.map */

View file

@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["src/_fonts.scss","src/_reset.scss","src/style.scss"],"names":[],"mappings":"AAAQ,gRCCN,UACA,WDCA,sDAGF,kBACE,mDAEA,kBENF,KACE,mBAGF,WACE,iBAEA,WAEA,cAGF,MACE,2BAGF,UACE,2DAEA,2BAEA,WAEA,aAEA,qBACE,0BAEA,cAEA,yBAEA,gCACE,YAEA,aACA,mBAEA,mBACA,8BAKN,SACE,aAEA,mBAEA,oBACE,eAEA,aACA,mBAEA,mBACA,8BAEA,uBACE,gBAEA,aAEA,QAGE,4BACE,cAEA,qBAEA,iBAEA,mBAEA,qEACE,6BAGF,0CACE,mBACA,WAQZ,aACE,cAGF,YACE,aACA,mBAEA,mBACA,8BAEA,kBACE,aACA","file":"style.min.css"}
{"version":3,"sourceRoot":"","sources":["src/_fonts.scss","src/_reset.scss","src/style.scss"],"names":[],"mappings":"AAAQ,gRCCN,UACA,WDCA,sDAGF,kBACE,mDAEA,kBENF,KACE,mBAGF,WACE,iBAEA,WAEA,cAGF,MACE,2BAGF,UACE,2DAEA,2BAEA,WAEA,aAEA,qBACE,0BAEA,cAEA,yBAEA,gCACE,YAEA,aACA,mBAEA,mBACA,8BAKN,SACE,aAEA,mBAEA,oBACE,eAEA,aACA,mBAEA,mBACA,8BAEA,uBACE,gBAEA,aAEA,QAGE,4BACE,cAEA,qBAEA,iBAEA,mBAEA,qEACE,6BAGF,0CACE,mBACA,WAQZ,aACE,cAGF,YACE,aACA,mBAEA,mBACA,8BAEA,kBACE,aACA,sBAGF,mBACE,gBAEA,aAEA,sBACE,YAEA,wBACE,cAEA,WACA,YAEA,qBAEA,8BACE","file":"style.min.css"}

View file

@ -8,14 +8,18 @@
$router = new Router();
session_start();
$nations = array(
'rop' => array(
'name' => 'Republic of Panorama',
'flag' => 'https://git.theclashfruit.me/CRSS/CRSS/raw/branch/main/Nations/Republic%20of%20Panorama/Flag.svg',
'short' => 'rop',
)
);
if(isset($_SESSION['user']))
$twig->addGlobal('user', $_SESSION['user']);
$router->get('/u/([a-z0-9_\.]+)', function($name) {
echo 'Hello ' . htmlentities($name);
});
$router->get('/', function() {
global $twig;
@ -40,6 +44,34 @@
echo $twig->render('map.twig');
});
$router->get('/profile', function() {
global $twig, $mysql;
$user = $mysql->getUserRecordFromId($_SESSION['user']['id']);
if($user == null) {
http_response_code(404);
echo $twig->render('404.twig');
} else {
echo $twig->render('profile.twig', array('db_data' => $user));
}
});
$router->get('/u/([a-z0-9_\.]+)', function($name) {
global $twig, $mysql, $discord;
$user = $mysql->getUserRecordFromUsername($name);
if($user == null) {
http_response_code(404);
echo $twig->render('404.twig');
} else {
echo $twig->render('user.twig', array('db_user' => $user));
}
});
$router->set404(function() {
global $twig;

View file

@ -7,7 +7,27 @@
Brought to by PrideCraft, TheClashFruit's Real Hosting Company.
</p>
</div>
<div class="left">
</div>
<ul class="right">
<li>
<a href="https://tech.lgbt/@blurryface" target="_blank" rel="me">
<svg style="width: 24px; height: 24px;" viewBox="0 0 24 24">
<path fill="currentColor" d="M20.94,14C20.66,15.41 18.5,16.96 15.97,17.26C14.66,17.41 13.37,17.56 12,17.5C9.75,17.39 8,16.96 8,16.96V17.58C8.32,19.8 10.22,19.93 12.03,20C13.85,20.05 15.47,19.54 15.47,19.54L15.55,21.19C15.55,21.19 14.27,21.87 12,22C10.75,22.07 9.19,21.97 7.38,21.5C3.46,20.45 2.78,16.26 2.68,12L2.67,8.57C2.67,4.23 5.5,2.96 5.5,2.96C6.95,2.3 9.41,2 11.97,2H12.03C14.59,2 17.05,2.3 18.5,2.96C18.5,2.96 21.33,4.23 21.33,8.57C21.33,8.57 21.37,11.78 20.94,14M18,8.91C18,7.83 17.7,7 17.15,6.35C16.59,5.72 15.85,5.39 14.92,5.39C13.86,5.39 13.05,5.8 12.5,6.62L12,7.5L11.5,6.62C10.94,5.8 10.14,5.39 9.07,5.39C8.15,5.39 7.41,5.72 6.84,6.35C6.29,7 6,7.83 6,8.91V14.17H8.1V9.06C8.1,8 8.55,7.44 9.46,7.44C10.46,7.44 10.96,8.09 10.96,9.37V12.16H13.03V9.37C13.03,8.09 13.53,7.44 14.54,7.44C15.44,7.44 15.89,8 15.89,9.06V14.17H18V8.91Z"></path>
</svg>
</a>
</li>
<li>
<a href="https://mas.to/@TheClashFruit" target="_blank" rel="me">
<svg style="width: 24px; height: 24px;" viewBox="0 0 24 24">
<path fill="currentColor" d="M20.94,14C20.66,15.41 18.5,16.96 15.97,17.26C14.66,17.41 13.37,17.56 12,17.5C9.75,17.39 8,16.96 8,16.96V17.58C8.32,19.8 10.22,19.93 12.03,20C13.85,20.05 15.47,19.54 15.47,19.54L15.55,21.19C15.55,21.19 14.27,21.87 12,22C10.75,22.07 9.19,21.97 7.38,21.5C3.46,20.45 2.78,16.26 2.68,12L2.67,8.57C2.67,4.23 5.5,2.96 5.5,2.96C6.95,2.3 9.41,2 11.97,2H12.03C14.59,2 17.05,2.3 18.5,2.96C18.5,2.96 21.33,4.23 21.33,8.57C21.33,8.57 21.37,11.78 20.94,14M18,8.91C18,7.83 17.7,7 17.15,6.35C16.59,5.72 15.85,5.39 14.92,5.39C13.86,5.39 13.05,5.8 12.5,6.62L12,7.5L11.5,6.62C10.94,5.8 10.14,5.39 9.07,5.39C8.15,5.39 7.41,5.72 6.84,6.35C6.29,7 6,7.83 6,8.91V14.17H8.1V9.06C8.1,8 8.55,7.44 9.46,7.44C10.46,7.44 10.96,8.09 10.96,9.37V12.16H13.03V9.37C13.03,8.09 13.53,7.44 14.54,7.44C15.44,7.44 15.89,8 15.89,9.06V14.17H18V8.91Z"></path>
</svg>
</a>
</li>
<li>
<a href="https://youtube.com/@CRSS666" target="_blank" rel="me">
<svg style="width: 24px; height: 24px;" viewBox="0 0 24 24">
<path fill="currentColor" d="M10,15L15.19,12L10,9V15M21.56,7.17C21.69,7.64 21.78,8.27 21.84,9.07C21.91,9.87 21.94,10.56 21.94,11.16L22,12C22,14.19 21.84,15.8 21.56,16.83C21.31,17.73 20.73,18.31 19.83,18.56C19.36,18.69 18.5,18.78 17.18,18.84C15.88,18.91 14.69,18.94 13.59,18.94L12,19C7.81,19 5.2,18.84 4.17,18.56C3.27,18.31 2.69,17.73 2.44,16.83C2.31,16.36 2.22,15.73 2.16,14.93C2.09,14.13 2.06,13.44 2.06,12.84L2,12C2,9.81 2.16,8.2 2.44,7.17C2.69,6.27 3.27,5.69 4.17,5.44C4.64,5.31 5.5,5.22 6.82,5.16C8.12,5.09 9.31,5.06 10.41,5.06L12,5C16.19,5 18.8,5.16 19.83,5.44C20.73,5.69 21.31,6.27 21.56,7.17Z"></path>
</svg>
</a>
</li>
</ul>
</footer>

View file

@ -24,17 +24,17 @@
</ul>
<ul class="navRight">
{% if user %}
<li>
<a class="userButton" href="/u/{{ user.username }}">
{{ user.global_name }}
</a>
</li>
<li>
<a class="userButton {% if page == 'profile' %}active{% endif %}" href="{% if page == 'profile' %}#{% else %}/profile{% endif %}">
{{ user.global_name }}
</a>
</li>
{% else %}
<li>
<a class="buttonPrimary" href="{{ discord_auth }}">
Login
</a>
</li>
<li>
<a class="buttonPrimary" href="{{ discord_auth }}">
Login
</a>
</li>
{% endif %}
</ul>
</div>

View file

@ -12,11 +12,16 @@
</div>
</div>
{% include 'includes/nav.twig' with {'page': 'nations',} %}
{% include 'includes/nav.twig' with {'page': 'nations'} %}
<main class="pageContent" id="content">
<div class="container">
this is the home page
<h2>Nations</h2>
<ul>
<li>
<a href="/nation/rop">Republic of Panorama</a>
</li>
</ul>
</div>
</main>

46
template/profile.twig Normal file
View file

@ -0,0 +1,46 @@
{% include 'includes/head.twig' with {'pageTitle': 'Profile'} %}
<div class="pageHero" id="hero">
<div class="blurFiler">
<div class="container">
<h1>Clyde's Real Survival SMP</h1>
<div class="serverInfo">
Online: <label>0</label> / <label>20</label>
</div>
</div>
</div>
</div>
{% include 'includes/nav.twig' with {'page': 'profile',} %}
<main class="pageContent" id="content">
<div class="container">
<ul>
<li>
id: {{ user.id }}
</li>
<li>
username: {{ user.username }}
</li>
<li>
global_name: {{ user.global_name }}
</li>
<li>
accent_color: {{ user.accent_color }}
</li>
<li>
premium_type: {{ user.premium_type }}
</li>
<li>
public_flags: {{ user.public_flags }}
</li>
<li>
is_admin: <label>{{ db_data.is_admin }}</label>
</li>
</ul>
</div>
</main>
{% include 'includes/footer.twig' %}
{% include 'includes/foot.twig' %}

24
template/user.twig Normal file
View file

@ -0,0 +1,24 @@
{% include 'includes/head.twig' with {'pageTitle': username} %}
<div class="pageHero" id="hero">
<div class="blurFiler">
<div class="container">
<h1>Clyde's Real Survival SMP</h1>
<div class="serverInfo">
Online: <label>0</label> / <label>20</label>
</div>
</div>
</div>
</div>
{% include 'includes/nav.twig' with {'page': 'user',} %}
<main class="pageContent" id="content">
<div class="container">
{{ db_user.display_name }} is {% if db_user.is_admin == 1 %} an admin! {% else %} not an admin! {% endif %}
</div>
</main>
{% include 'includes/footer.twig' %}
{% include 'includes/foot.twig' %}

60
util/Database.php Normal file
View file

@ -0,0 +1,60 @@
<?php
class Database {
private string $host;
private string $user;
private string $pass;
private string $db;
private mysqli $conn;
function __construct($host, $user, $pass, $db) {
$this->host = $host;
$this->user = $user;
$this->pass = $pass;
$this->db = $db;
$this->conn = new mysqli($this->host, $this->user, $this->pass, $this->db);
}
function createUserRecord($user): void {
$sql = 'INSERT IGNORE INTO users (id, username, display_name) VALUES (?, ?, ?)';
$stmt = $this->conn->prepare($sql);
$stmt->bind_param('iss', $user['id'], $user['username'], $user['global_name']);
$stmt->execute();
}
function getUserRecordFromUsername($username): bool|array|null {
$sql = 'SELECT * FROM users WHERE username = ?';
$stmt = $this->conn->prepare($sql);
$stmt->bind_param('s', $username);
$stmt->execute();
$res = $stmt->get_result();
if($res->num_rows > 0) {
return $res->fetch_assoc();
} else {
return null;
}
}
function getUserRecordFromId($id): bool|array|null {
$sql = 'SELECT * FROM users WHERE id = ?';
$stmt = $this->conn->prepare($sql);
$stmt->bind_param('i', $id);
$stmt->execute();
$res = $stmt->get_result();
if($res->num_rows > 0) {
return $res->fetch_assoc();
} else {
return null;
}
}
}

View file

@ -67,7 +67,9 @@
}
function getUser($token): array {
$res = $this->curl->newRequest('get', 'https://discord.com/api/v10/users/@me')
$res = $this
->curl
->newRequest('get', 'https://discord.com/api/v10/users/@me')
->setHeader('Authorization', 'Bearer ' . $token)
->send();
@ -75,7 +77,9 @@
}
function getGuilds($token): array {
$res = $this->curl->newRequest('get', 'https://discord.com/api/v10/users/@me/guilds')
$res = $this
->curl
->newRequest('get', 'https://discord.com/api/v10/users/@me/guilds')
->setHeader('Authorization', 'Bearer ' . $token)
->send();