mirror of
https://dev.s-ul.net/Galexion/MaiMaiDXNet.git
synced 2024-11-28 00:20:50 +01:00
The Bare-Minimum login
This commit is contained in:
commit
22fd9e36ff
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
config.json
|
||||||
|
public/images
|
||||||
|
node_modules
|
83
index.js
Normal file
83
index.js
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
const chokidar = require('chokidar');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
var createError = require('http-errors');
|
||||||
|
var express = require('express');
|
||||||
|
var cookieParser = require('cookie-parser');
|
||||||
|
var logger = require('morgan');
|
||||||
|
var indexRouter = require('./routes/index');
|
||||||
|
var apiRouter = require('./routes/api');
|
||||||
|
var config = require("./config.json");
|
||||||
|
|
||||||
|
const watcher = chokidar.watch(config.DXMemorialImageDirectory, {
|
||||||
|
depth: 0,
|
||||||
|
persistent: true
|
||||||
|
});
|
||||||
|
|
||||||
|
watcher
|
||||||
|
.on('add', (filePath) => {
|
||||||
|
const isImage = /\.(jpe?g|png|gif)$/i.test(filePath);
|
||||||
|
if (isImage) {
|
||||||
|
const fileName = path.basename(filePath);
|
||||||
|
const destPath = path.join(config.imageFolder, fileName);
|
||||||
|
fs.access(destPath, (err) => {
|
||||||
|
if (err) {
|
||||||
|
fs.copyFile(filePath, destPath, (err) => {
|
||||||
|
if (err) throw err;
|
||||||
|
console.log(`${fileName} Imported.`);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('error', (error) => {
|
||||||
|
console.error(`Watcher error: ${error}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// readFileSync function must use __dirname get current directory
|
||||||
|
// require use ./ refer to current directory.
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
};
|
||||||
|
|
||||||
|
var app = express()
|
||||||
|
|
||||||
|
// Create HTTPs server.
|
||||||
|
|
||||||
|
//var httpsServer = https.createServer(options, app);
|
||||||
|
|
||||||
|
// view engine setup
|
||||||
|
app.set('views', path.join(__dirname, 'views'));
|
||||||
|
app.set('view engine', 'ejs');
|
||||||
|
app.use(express.static(__dirname + '/public'));
|
||||||
|
app.use(logger('dev'));
|
||||||
|
app.use(express.urlencoded({ extended: false }));
|
||||||
|
app.use(cookieParser());
|
||||||
|
app.use(express.json({ extended: false }));
|
||||||
|
|
||||||
|
|
||||||
|
app.use('/', indexRouter);
|
||||||
|
app.use('/api/', apiRouter);
|
||||||
|
|
||||||
|
// catch 404 and forward to error handler
|
||||||
|
app.use(function(req, res, next) {
|
||||||
|
next(createError(404));
|
||||||
|
});
|
||||||
|
|
||||||
|
var PORT = process.env.PORT || 8000
|
||||||
|
|
||||||
|
// error handler
|
||||||
|
app.use(function(err, req, res, next) {
|
||||||
|
// set locals, only providing error in development
|
||||||
|
res.locals.message = err.message;
|
||||||
|
res.locals.error = req.app.get('env') === 'development' ? err : {};
|
||||||
|
|
||||||
|
// render the error page
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.render('error');
|
||||||
|
});
|
||||||
|
|
||||||
|
app.listen(PORT, () => console.log(`Server is running in port ${PORT}`));
|
||||||
|
|
||||||
|
module.exports = app;
|
3797
package-lock.json
generated
Normal file
3797
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
23
package.json
Normal file
23
package.json
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "aquaimagegrabber",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"chokidar": "^3.5.3",
|
||||||
|
"cookie-parser": "^1.4.6",
|
||||||
|
"cross-fetch": "^3.1.5",
|
||||||
|
"ejs": "^3.1.8",
|
||||||
|
"express": "^4.18.2",
|
||||||
|
"fs": "^0.0.1-security",
|
||||||
|
"http-errors": "^2.0.0",
|
||||||
|
"morgan": "^1.10.0",
|
||||||
|
"path": "^0.12.7",
|
||||||
|
"sqlite3": "^5.1.4"
|
||||||
|
}
|
||||||
|
}
|
BIN
public/MaiMaiDXNet/maimaidxex.jpg
Normal file
BIN
public/MaiMaiDXNet/maimaidxex.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 167 KiB |
34
public/stylesheets/style.css
Normal file
34
public/stylesheets/style.css
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#ACode {
|
||||||
|
width:225px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wrapper {
|
||||||
|
margin-top: -1%;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loginContent {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin: 1%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3em;
|
||||||
|
}
|
||||||
|
h5 {
|
||||||
|
font-size: 1.3em;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
22
readme.md
Normal file
22
readme.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# Open Source MaiMaiDX.Net Interface
|
||||||
|
|
||||||
|
This is a Open Source MaiMaiDX.Net Interface.
|
||||||
|
|
||||||
|
### This Interface Requires a Server Database.
|
||||||
|
|
||||||
|
Currently, I only have access to AQUA, but ARTEMiS could be supported once AQUA support is finished.
|
||||||
|
|
||||||
|
# How to use:
|
||||||
|
|
||||||
|
## Aqua
|
||||||
|
|
||||||
|
Create a `config.json` file and paste this in, with paths to your instance.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"DXMemorialImageDirectory": "A:\\path\\to\\aqua\\data",
|
||||||
|
"imageFolder": "N:\\MaiMaiDXNet\\public\\images"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, create the `/public/image/` folder. this will be where the images will be stored.
|
30
routes/api.js
Normal file
30
routes/api.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
var fetch = require('cross-fetch');
|
||||||
|
const sqlite3 = require('sqlite3').verbose();
|
||||||
|
|
||||||
|
let db = new sqlite3.Database('A:\\db.sqlite');
|
||||||
|
|
||||||
|
router.post('/getExtId/', function (req, res, next) {
|
||||||
|
db.all('SELECT * FROM sega_card', (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
// Return a Failed Message.
|
||||||
|
res.status(500).json({ error: err.message, status: "Failed" });
|
||||||
|
} else {
|
||||||
|
// Make the Request easier to get to.
|
||||||
|
var request = req.body;
|
||||||
|
var mUser = undefined // Leave the Matched User undefined until the user is found.
|
||||||
|
for (user of rows) { // For Each User in Rows
|
||||||
|
if (request.input === user.luid) { // If the Access Code for the card is in the system,
|
||||||
|
mUser = user; // set the Matched User Variable to the User, and break the for Loop.
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Return a Response with the whole identifiable user data. the EXT_ID will be used later to identify images and other things and match them to the user's profile.
|
||||||
|
res.status(200).json({ data: mUser, status: "Complete" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
42
routes/index.js
Normal file
42
routes/index.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
var fetch = require('cross-fetch');
|
||||||
|
const sqlite3 = require('sqlite3').verbose();
|
||||||
|
|
||||||
|
let db = new sqlite3.Database('A:\\db.sqlite');
|
||||||
|
/* GET home page. */
|
||||||
|
var title = 'Webapp Mission Test'
|
||||||
|
router.get('/', function (req, res, next) {
|
||||||
|
db.all('SELECT * FROM sega_card', (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
res.render('error', {error: err});
|
||||||
|
} else {
|
||||||
|
console.log(rows);
|
||||||
|
console.log(`There are Currently ${rows.length} Users Registered.`); // this check could probably be changed into an API
|
||||||
|
var params = {
|
||||||
|
totalUsers: rows.length
|
||||||
|
}
|
||||||
|
res.render('index', {title: title, params: params});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/user', function (req, res, next) {
|
||||||
|
db.all('SELECT * FROM sega_card', (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
res.render('error', {error: err});
|
||||||
|
} else {
|
||||||
|
console.log(rows);
|
||||||
|
console.log(`There are Currently ${rows.length} Users Registered.`); // this check could probably be changed into an API
|
||||||
|
var params = {
|
||||||
|
totalUsers: rows.length
|
||||||
|
}
|
||||||
|
res.render('user', {title: title, params: params});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = router;
|
14
templates/header.ejs
Normal file
14
templates/header.ejs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="/stylesheets/style.css" rel="stylesheet" type="text/css">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||||
|
<link rel="manifest" href="/site.webmanifest">
|
||||||
|
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#ef7408">
|
||||||
|
<meta name="msapplication-TileColor" content="#da532c">
|
||||||
|
<meta name="theme-color" content="#ffffff">
|
||||||
|
</head>
|
||||||
|
<body>
|
6
views/error.ejs
Normal file
6
views/error.ejs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<% var rootPath='../' ; %>
|
||||||
|
<%- include(rootPath + 'templates/header.ejs' ); %>
|
||||||
|
<h1>Fuck. Something Went Wrong or you got 404'd.</h1>
|
||||||
|
<%=error%>
|
||||||
|
</body>
|
||||||
|
</html>
|
60
views/index.ejs
Normal file
60
views/index.ejs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<% var rootPath='../' ; %>
|
||||||
|
<%- include(rootPath + 'templates/header.ejs' ); %>
|
||||||
|
<div id="wrapper">
|
||||||
|
<img src="MaiMaiDXNet/maimaidxex.jpg">
|
||||||
|
</div>
|
||||||
|
<div id="loginContent">
|
||||||
|
<h1>MaiMaiDX.Net</h1>
|
||||||
|
<h5>Total Users Registered: <%= params.totalUsers %>
|
||||||
|
</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>
|
||||||
|
const extId = localStorage.getItem('ext_id');
|
||||||
|
const luid = localStorage.getItem('luid');
|
||||||
|
|
||||||
|
if (extId === null || luid === null) {
|
||||||
|
console.log('User Data Not Detected! Please Sign In.');
|
||||||
|
} else {
|
||||||
|
console.log(`User Data Found! Redirecting to User Page.`);
|
||||||
|
window.location = "/user";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
// Save data to local storage
|
||||||
|
localStorage.setItem('ext_id', data.data.ext_id);
|
||||||
|
localStorage.setItem('luid', data.data.luid);
|
||||||
|
window.location = "/user";
|
||||||
|
})
|
||||||
|
.catch(error => console.error(error));
|
||||||
|
});
|
||||||
|
</script> <!-- ToDo: Move this script to a seperate JS file.-->
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
28
views/user.ejs
Normal file
28
views/user.ejs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<% var rootPath='../' ; %>
|
||||||
|
<%- include(rootPath + 'templates/header.ejs' ); %>
|
||||||
|
<h1>Yo! Welcome Back ${User}!</h1>
|
||||||
|
<button id="clear-storage-btn">Sign Out</button>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const extId = localStorage.getItem('ext_id');
|
||||||
|
const luid = localStorage.getItem('luid');
|
||||||
|
|
||||||
|
if (extId === null || luid === null) {
|
||||||
|
console.log('User Data Not Detected! Please Sign In.');
|
||||||
|
window.location = "/";
|
||||||
|
} else {
|
||||||
|
console.log(`User Data Found!`);
|
||||||
|
}
|
||||||
|
const clearStorageBtn = document.getElementById('clear-storage-btn');
|
||||||
|
clearStorageBtn.addEventListener('click', () => {
|
||||||
|
localStorage.removeItem('ext_id');
|
||||||
|
localStorage.removeItem('luid');
|
||||||
|
console.log('Local storage cleared.');
|
||||||
|
window.location = "/";
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Developer Only Information</summary>
|
||||||
|
For Development purposes only, send statistics found in this menu when encontering UI Errors.
|
||||||
|
</details>
|
Loading…
Reference in New Issue
Block a user