mirror of
https://dev.s-ul.net/Galexion/MaiMaiDXNet.git
synced 2024-11-24 07:10:16 +01:00
3 words. Nested. Fucking. Divs.
This commit is contained in:
parent
13a06b19da
commit
93a9e0ee64
71
public/javascript/login.js
Normal file
71
public/javascript/login.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
// Get the cookie string
|
||||||
|
const cookieString = document.cookie;
|
||||||
|
|
||||||
|
// Parse the cookie string and extract the values
|
||||||
|
const cookies = cookieString.split(';');
|
||||||
|
let ext_id, luid;
|
||||||
|
|
||||||
|
for (let i = 0; i < cookies.length; i++) {
|
||||||
|
const cookie = cookies[i].trim();
|
||||||
|
const cookieParts = cookie.split('=');
|
||||||
|
|
||||||
|
if (cookieParts[0] === 'ext_id') {
|
||||||
|
ext_id = cookieParts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cookieParts[0] === 'luid') {
|
||||||
|
luid = cookieParts[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sends user to User Page if already signed in
|
||||||
|
if (ext_id && luid) {
|
||||||
|
console.log(`User Data Detected, sending to user page.`);
|
||||||
|
window.location = "/user";
|
||||||
|
} else {
|
||||||
|
console.log('User Data Not Detected! Please Sign In.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const form = document.getElementById("myForm");
|
||||||
|
form.addEventListener("submit", function(event) {
|
||||||
|
event.preventDefault(); // Prevent the default form submission behavior
|
||||||
|
|
||||||
|
const input = document.getElementsByName("myInput")[0].value;
|
||||||
|
const url = "/api/getExtId"; // Replace with your API endpoint URL
|
||||||
|
|
||||||
|
// Send the input data to the API endpoint using fetch
|
||||||
|
fetch(url, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
input: input
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
console.log(data)
|
||||||
|
let releventData = {
|
||||||
|
luid: data.data.luid,
|
||||||
|
ext_id: data.data.ext_id
|
||||||
|
}
|
||||||
|
console.log(releventData)
|
||||||
|
// Set the cookie expiration to 7 days from now
|
||||||
|
const expirationDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
|
||||||
|
// Set the ext_id cookie
|
||||||
|
document.cookie = `ext_id=${data.data.ext_id}; expires=${expirationDate.toUTCString()}`;
|
||||||
|
|
||||||
|
// Set the luid cookie
|
||||||
|
document.cookie = `luid=${data.data.luid}; expires=${expirationDate.toUTCString()}`;
|
||||||
|
console.log(data.data.id)
|
||||||
|
// Set the aime_card_id cookie
|
||||||
|
document.cookie = `aime_card_id=${data.data.id.toString()}; expires=${expirationDate.toUTCString()}`;
|
||||||
|
|
||||||
|
// Set the cookie
|
||||||
|
window.location = "/user";
|
||||||
|
})
|
||||||
|
.catch(error => console.error(error));
|
||||||
|
});
|
105
public/javascript/user.js
Normal file
105
public/javascript/user.js
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
// Get the clear storage button element
|
||||||
|
const clearStorageBtn = document.getElementById('clear-storage-btn');
|
||||||
|
|
||||||
|
// Add a click event listener to the clear storage button
|
||||||
|
clearStorageBtn.addEventListener('click', () => {
|
||||||
|
// Remove the cookies
|
||||||
|
function removeCookies() {
|
||||||
|
// Set the expiration date to a date in the past
|
||||||
|
const expirationDate = new Date(0).toUTCString();
|
||||||
|
|
||||||
|
// Set the ext_id cookie to expire
|
||||||
|
document.cookie = `ext_id=; expires=${expirationDate}`;
|
||||||
|
|
||||||
|
// Set the luid cookie to expire
|
||||||
|
document.cookie = `luid=; expires=${expirationDate}`;
|
||||||
|
|
||||||
|
// Set the aime_card_id cookie to expire
|
||||||
|
document.cookie = `aime_card_id=; expires=${expirationDate}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Example usage
|
||||||
|
removeCookies();
|
||||||
|
|
||||||
|
console.log('Local storage cleared.');
|
||||||
|
window.location = "/";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the cookie string
|
||||||
|
const cookieString = document.cookie;
|
||||||
|
|
||||||
|
// Parse the cookie string and extract the values
|
||||||
|
const cookies = cookieString.split(';');
|
||||||
|
let ext_id, luid;
|
||||||
|
|
||||||
|
for (let i = 0; i < cookies.length; i++) {
|
||||||
|
const cookie = cookies[i].trim();
|
||||||
|
const cookieParts = cookie.split('=');
|
||||||
|
|
||||||
|
if (cookieParts[0] === 'ext_id') {
|
||||||
|
ext_id = cookieParts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cookieParts[0] === 'luid') {
|
||||||
|
luid = cookieParts[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the user to the sign in page if they aren't already signed in to the website.
|
||||||
|
if (ext_id && luid) {
|
||||||
|
console.log(`ext_id: ${ext_id}, luid: ${luid}`);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
console.log('User Data Not Detected! Please Sign In.');
|
||||||
|
window.location = "/";
|
||||||
|
}
|
||||||
|
const userdata = JSON.parse(document.currentScript.getAttribute('data-userdata'));
|
||||||
|
|
||||||
|
// Check if the user image element exists
|
||||||
|
if(userdata.icon_id === 10) {
|
||||||
|
const userImage = document.getElementById('user-image');
|
||||||
|
userImage.src = "images/" + ext_id + '-up.jpg';
|
||||||
|
} else if (document.currentScript.getAttribute('data-userdata')) {
|
||||||
|
const userImage = document.getElementById('user-image');
|
||||||
|
const UI_Icon = userdata.icon_id;
|
||||||
|
|
||||||
|
// Pad the number because game weird
|
||||||
|
function padNumber(num, size) {
|
||||||
|
let s = num + "";
|
||||||
|
while (s.length < size) {
|
||||||
|
s = "0" + s;
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the user image source
|
||||||
|
userImage.src = "assets/icon/UI_Icon_" + padNumber(Number(UI_Icon), 6) + '.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
// title getting
|
||||||
|
const request = new XMLHttpRequest();
|
||||||
|
request.open('GET', '/assets/metadata/titleMetadata.json', true);
|
||||||
|
|
||||||
|
request.onload = function() {
|
||||||
|
if (this.status >= 200 && this.status < 400) {
|
||||||
|
const data = JSON.parse(this.response);
|
||||||
|
const userTitle = document.getElementById('user-title-text');
|
||||||
|
var userTitleText = ""
|
||||||
|
for (title of data) {
|
||||||
|
if(userdata.title_id === title.titleId) {
|
||||||
|
userTitleText = title.name
|
||||||
|
break
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
userTitle.textContent = userTitleText
|
||||||
|
} else {
|
||||||
|
// handle the error
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
request.onerror = function() {
|
||||||
|
// handle the error
|
||||||
|
};
|
||||||
|
|
||||||
|
request.send();
|
@ -2,8 +2,8 @@
|
|||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
max-width: 8em;
|
max-width: 100%;
|
||||||
height: auto;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#User {
|
#User {
|
||||||
@ -12,3 +12,79 @@
|
|||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
margin: 1%;
|
margin: 1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#wrapper {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#user-profile-wrapper {
|
||||||
|
display: inline-grid;
|
||||||
|
margin: 0px;
|
||||||
|
grid-template-areas:
|
||||||
|
"profile-image user-title user-title"
|
||||||
|
"profile-image user-name dx-rating"
|
||||||
|
"profile-image user-class awakens";
|
||||||
|
gap: 10px;
|
||||||
|
border: 2px solid black;
|
||||||
|
border-radius: 10px;
|
||||||
|
justify-items: center;
|
||||||
|
align-items: center;
|
||||||
|
width: fit-content;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
#user-profile-wrapper {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0;
|
||||||
|
padding: 20px;
|
||||||
|
border: 2px solid black;
|
||||||
|
border-radius: 10px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-image {
|
||||||
|
grid-area: profile-image;
|
||||||
|
max-width: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-title {
|
||||||
|
grid-area: user-title;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-name {
|
||||||
|
grid-area: user-name;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dx-rating {
|
||||||
|
grid-area: dx-rating;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-rank {
|
||||||
|
grid-area: user-rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
.awakens {
|
||||||
|
grid-area: awakens;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
h4 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
h4 {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
}
|
14
readme.md
14
readme.md
@ -36,13 +36,15 @@ Create a `config.json` file and paste this in, with paths to your instance.
|
|||||||
# Project Progress
|
# Project Progress
|
||||||
|
|
||||||
ToDo:
|
ToDo:
|
||||||
- Make User Profile on User Page (almost done)
|
- Create Play Data Tab
|
||||||
- fuck you go work on divs and grids and spacing and go watch Hyperplexed you no name piece of shit - literally me talking to me
|
- Create Photos Tab
|
||||||
|
- Create Area Tab
|
||||||
- Literally everything else
|
- Create Collection Tab
|
||||||
|
- Create Ranking Tab
|
||||||
|
- Create Options Tab
|
||||||
|
- add a background i guess
|
||||||
|
|
||||||
Complete:
|
Complete:
|
||||||
- Sign In Page
|
- Sign In Page
|
||||||
- Make User Profile on User Page (almost done)
|
- Make User Profile on User Page (almost done)
|
||||||
- (Done) Get User Data, and send it.
|
- Fuck you css go kill yourself
|
||||||
- (Done) Grab the User Profile, and get the custom one if the user icon ID is set to 10.
|
|
@ -1,85 +1,16 @@
|
|||||||
<% var rootPath='../' ; %>
|
<% var rootPath='../' ; %>
|
||||||
<%- include(rootPath + 'templates/header.ejs' ); %>
|
<%- include(rootPath + 'templates/header.ejs' ); %>
|
||||||
|
|
||||||
<div id="loginContent">
|
<div id="loginContent">
|
||||||
<h1>MaiMaiDX.Net</h1>
|
<h1>MaiGateDX</h1>
|
||||||
<h5>Total Users Registered: <%= params.totalUsers %>
|
<h5>Total Users Registered: <%= params.totalUsers %></h5>
|
||||||
</h5>
|
<h4>Please Input your 20 Digit Access Code.</h4>
|
||||||
|
<form id="myForm">
|
||||||
|
<input type="text" name="myInput" maxlength="20" placeholder="0000011111222223333344444" required>
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
<script type="text/javascript" src="/javascript/login.js"></script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
<h4>Please Input your 20 Digit Access Code.</h4>
|
</html>
|
||||||
<form id="myForm">
|
|
||||||
<input type="text" name="myInput" maxlength="20" placeholder="0000011111222223333344444" required>
|
|
||||||
<button type="submit">Submit</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// Get the cookie string
|
|
||||||
const cookieString = document.cookie;
|
|
||||||
|
|
||||||
// Parse the cookie string and extract the values
|
|
||||||
const cookies = cookieString.split(';');
|
|
||||||
let ext_id2, luid2;
|
|
||||||
|
|
||||||
for (let i = 0; i < cookies.length; i++) {
|
|
||||||
const cookie = cookies[i].trim();
|
|
||||||
const cookieParts = cookie.split('=');
|
|
||||||
|
|
||||||
if (cookieParts[0] === 'ext_id') {
|
|
||||||
ext_id2 = cookieParts[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cookieParts[0] === 'luid') {
|
|
||||||
luid2 = cookieParts[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sends user to User Page if already signed in
|
|
||||||
if (ext_id2 && luid2) {
|
|
||||||
console.log(`User Data Detected, sending to user page.`);
|
|
||||||
window.location = "/user";
|
|
||||||
} else {
|
|
||||||
console.log('User Data Not Detected! Please Sign In.');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const form = document.getElementById("myForm");
|
|
||||||
form.addEventListener("submit", function (event) {
|
|
||||||
event.preventDefault(); // Prevent the default form submission behavior
|
|
||||||
|
|
||||||
const input = document.getElementsByName("myInput")[0].value;
|
|
||||||
const url = "/api/getExtId"; // Replace with your API endpoint URL
|
|
||||||
|
|
||||||
// Send the input data to the API endpoint using fetch
|
|
||||||
fetch(url, {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ input: input })
|
|
||||||
})
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(data => {
|
|
||||||
console.log(data)
|
|
||||||
let releventData = { luid: data.data.luid, ext_id: data.data.ext_id }
|
|
||||||
console.log(releventData)
|
|
||||||
// Set the cookie expiration to 7 days from now
|
|
||||||
const expirationDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
|
|
||||||
// Set the ext_id cookie
|
|
||||||
document.cookie = `ext_id=${data.data.ext_id}; expires=${expirationDate.toUTCString()}`;
|
|
||||||
|
|
||||||
// Set the luid cookie
|
|
||||||
document.cookie = `luid=${data.data.luid}; expires=${expirationDate.toUTCString()}`;
|
|
||||||
console.log(data.data.id)
|
|
||||||
// Set the aime_card_id cookie
|
|
||||||
document.cookie = `aime_card_id=${data.data.id.toString()}; expires=${expirationDate.toUTCString()}`;
|
|
||||||
|
|
||||||
// Set the cookie
|
|
||||||
window.location = "/user";
|
|
||||||
})
|
|
||||||
.catch(error => console.error(error));
|
|
||||||
});
|
|
||||||
</script> <!-- ToDo: Move this script to a seperate JS file.-->
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
136
views/user.ejs
136
views/user.ejs
@ -1,102 +1,42 @@
|
|||||||
<% var rootPath='../' ; %>
|
<% var rootPath='../' ; %>
|
||||||
<%- include(rootPath + 'templates/header.ejs' ); %>
|
<%- include(rootPath + 'templates/header.ejs' ); %>
|
||||||
<% function normalizeText(text) { return text .normalize('NFD') .replace(/[\u0300-\u036f]/g, '' )
|
<% function normalizeText(text) { return text .normalize('NFD') .replace(/[\u0300-\u036f]/g, ''
|
||||||
.replace(/[\uFF01-\uFF5E]/g, function(ch) { return String.fromCharCode(ch.charCodeAt(0) - 0xFEE0); }); } %>
|
).replace(/[\uFF01-\uFF5E]/g, function(ch) { return String.fromCharCode(ch.charCodeAt(0) - 0xFEE0); }); } %>
|
||||||
<link href="/stylesheets/user.css" rel="stylesheet" type="text/css">
|
<link href="/stylesheets/user.css" rel="stylesheet" type="text/css">
|
||||||
<div id="User">
|
<div id="User">
|
||||||
<h1>Yo! Welcome Back <%= normalizeText(userdata.user_name) %>!</h1>
|
<h1>Yo! Welcome Back <%= normalizeText(userdata.user_name) %>!</h1>
|
||||||
<button id="clear-storage-btn">Sign Out</button>
|
<div id="wrapper">
|
||||||
|
<div id="user-profile-wrapper">
|
||||||
|
<div class="profile-image"><img id="user-image" src="" alt="User Image" onerror="this.src='assets/icon/UI_Icon_000000.png'"></div>
|
||||||
|
<div class="user-title">
|
||||||
|
<h4 id="user-title-text"></h4>
|
||||||
|
</div>
|
||||||
|
<div class="user-name">
|
||||||
|
<h4><%= normalizeText(userdata.user_name) %></h4>
|
||||||
|
</div>
|
||||||
|
<div class="dx-rating">
|
||||||
|
<h4><%= userdata.music_rating%></h4>
|
||||||
|
</div>
|
||||||
|
<div class="user-class"></div>
|
||||||
|
<div class="awakens">
|
||||||
|
<h4>★ ☓<%= userdata.total_awake%></h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<details>
|
||||||
|
<summary>Developer Only Information</summary>
|
||||||
|
For Development purposes only, send statistics found in this menu when encontering UI
|
||||||
|
Errors.
|
||||||
|
<details>
|
||||||
|
<summary>Raw User Details</summary>
|
||||||
|
<pre><code><%=JSON.stringify(userdata, null, 2)%></code></pre>
|
||||||
|
</details>
|
||||||
|
</details>
|
||||||
|
<button id="clear-storage-btn">Sign Out</button>
|
||||||
|
|
||||||
<script>
|
</div>
|
||||||
const extId = localStorage.getItem('ext_id');
|
|
||||||
const luid = localStorage.getItem('luid');
|
|
||||||
const clearStorageBtn = document.getElementById('clear-storage-btn');
|
|
||||||
clearStorageBtn.addEventListener('click', () => {
|
|
||||||
// Remove the cookies
|
|
||||||
function removeCookies() {
|
|
||||||
// Set the expiration date to a date in the past
|
|
||||||
const expirationDate = new Date(0).toUTCString();
|
|
||||||
|
|
||||||
// Set the ext_id cookie to expire
|
<script type="text/javascript" src="/javascript/user.js" data-userdata="<%=JSON.stringify(userdata)%>"></script>
|
||||||
document.cookie = `ext_id=; expires=${expirationDate}`;
|
</body>
|
||||||
|
|
||||||
// Set the luid cookie to expire
|
</html>
|
||||||
document.cookie = `luid=; expires=${expirationDate}`;
|
|
||||||
|
|
||||||
// Set the aime_card_id cookie to expire
|
|
||||||
document.cookie = `aime_card_id=; expires=${expirationDate}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Example usage
|
|
||||||
removeCookies();
|
|
||||||
|
|
||||||
console.log('Local storage cleared.');
|
|
||||||
window.location = "/";
|
|
||||||
});
|
|
||||||
|
|
||||||
// Get the cookie string
|
|
||||||
const cookieString = document.cookie;
|
|
||||||
|
|
||||||
// Parse the cookie string and extract the values
|
|
||||||
const cookies = cookieString.split(';');
|
|
||||||
let ext_id2, luid2;
|
|
||||||
|
|
||||||
for (let i = 0; i < cookies.length; i++) {
|
|
||||||
const cookie = cookies[i].trim();
|
|
||||||
const cookieParts = cookie.split('=');
|
|
||||||
|
|
||||||
if (cookieParts[0] === 'ext_id') {
|
|
||||||
ext_id2 = cookieParts[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cookieParts[0] === 'luid') {
|
|
||||||
luid2 = cookieParts[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sends user to the sign in page if they aren't already signed in to the website.
|
|
||||||
if (ext_id2 && luid2) {
|
|
||||||
console.log(`ext_id: ${ext_id2}, luid: ${luid2}`);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
console.log('User Data Not Detected! Please Sign In.');
|
|
||||||
window.location = "/";
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<% if(userdata.icon_id===10) { %> <!-- If the user icon id is set to 10, it's a custom image and you need to grab the image that the user uploaded. -->
|
|
||||||
<img id="user-image" src="" alt="User Image">
|
|
||||||
|
|
||||||
<script>
|
|
||||||
const userImage = document.getElementById('user-image');
|
|
||||||
userImage.src = "images/" + ext_id2 + '-up.jpg';
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<% } else {%> <!-- If Not, use the userdata.icon_id variable to find which icon you need. -->
|
|
||||||
<img id="user-image" src="" alt="User Image">
|
|
||||||
|
|
||||||
<script data-userdata="<%=JSON.stringify(userdata)%>">
|
|
||||||
const userdata = JSON.parse(document.currentScript.getAttribute('data-userdata'));
|
|
||||||
const userImage = document.getElementById('user-image');
|
|
||||||
const UI_Icon = userdata.icon_id
|
|
||||||
function padNumber(num, size) { // pad the number because haha game weird
|
|
||||||
var s = num + "";
|
|
||||||
while (s.length < size) s = "0" + s;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Usage:
|
|
||||||
userImage.src = "assets/icon/UI_Icon_" + padNumber(Number(UI_Icon),6) + '.png';
|
|
||||||
</script>
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Developer Only Information</summary>
|
|
||||||
For Development purposes only, send statistics found in this menu when encontering UI
|
|
||||||
Errors.
|
|
||||||
<details>
|
|
||||||
<summary>Raw User Details</summary>
|
|
||||||
<pre><code><%=JSON.stringify(userdata, null, 2)%></code></pre>
|
|
||||||
</details>
|
|
||||||
</details>
|
|
||||||
</div>
|
|
Loading…
Reference in New Issue
Block a user