mirror of
https://github.com/PretendoNetwork/website.git
synced 2026-06-21 20:12:56 -05:00
106 lines
2.8 KiB
JavaScript
106 lines
2.8 KiB
JavaScript
const util = require('../util');
|
|
const database = require('../database');
|
|
const fs = require('fs');
|
|
const localeFileNames = fs.readdirSync(`${__dirname}/../../locales`);
|
|
|
|
async function renderDataMiddleware(request, response, next) {
|
|
if (request.path.startsWith('/assets')) {
|
|
return next();
|
|
}
|
|
|
|
if (request.path.startsWith('/account/logout')) {
|
|
return next();
|
|
}
|
|
|
|
// Get user local
|
|
const reqLocale = request.locale;
|
|
const locale = util.getLocale(reqLocale.language, reqLocale.region);
|
|
|
|
let localeList = localeFileNames.map(locale => {
|
|
const code = locale.replace('.json', '').replace('_', '-');
|
|
|
|
// Check if it's a real language code, or a custom one
|
|
if (!code.includes('@')) {
|
|
const enDisp = new Intl.DisplayNames([code], {
|
|
type: 'language',
|
|
languageDisplay: 'standard'
|
|
});
|
|
const languageName = enDisp.of(code);
|
|
|
|
return {
|
|
code,
|
|
languageName
|
|
};
|
|
} else {
|
|
switch (code) {
|
|
case 'en@uwu':
|
|
return {
|
|
code,
|
|
languageName: 'English (lolcat)'
|
|
};
|
|
|
|
default:
|
|
return {
|
|
code,
|
|
languageName: 'Unknown'
|
|
};
|
|
}
|
|
}
|
|
});
|
|
|
|
// sort the array alphabetically by languageName while making sure that objects with language codes starting with 'en' are at the top
|
|
localeList = localeList.sort((a, b) => {
|
|
if (a.code.startsWith('en') && !b.code.startsWith('en')) {
|
|
return -1;
|
|
} else if (!a.code.startsWith('en') && b.code.startsWith('en')) {
|
|
return 1;
|
|
} else {
|
|
return a.languageName.localeCompare(b.languageName);
|
|
}
|
|
});
|
|
|
|
// move all the objects with language codes containing '@' to the end of the array
|
|
localeList = localeList.sort((a, b) => {
|
|
if (a.code.includes('@') && !b.code.includes('@')) {
|
|
return 1;
|
|
} else if (!a.code.includes('@') && b.code.includes('@')) {
|
|
return -1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
});
|
|
|
|
response.locals.localeList = localeList;
|
|
|
|
response.locals.locale = locale;
|
|
response.locals.localeString = reqLocale.toString();
|
|
|
|
// Get message cookies
|
|
response.locals.success_message = request.cookies.success_message;
|
|
response.locals.error_message = request.cookies.error_message;
|
|
|
|
// Reset message cookies
|
|
response.clearCookie('success_message', { domain: '.pretendo.network' });
|
|
response.clearCookie('error_message', { domain: '.pretendo.network' });
|
|
|
|
response.locals.isLoggedIn = request.cookies.access_token && request.cookies.refresh_token;
|
|
|
|
if (response.locals.isLoggedIn) {
|
|
try {
|
|
response.locals.account = await util.getUserAccountData(request, response);
|
|
|
|
request.pnid = await database.PNID.findOne({ pid: response.locals.account.pid });
|
|
request.account = response.locals.account;
|
|
|
|
return next();
|
|
} catch (error) {
|
|
response.cookie('error_message', error.message, { domain: '.pretendo.network' });
|
|
return response.redirect('/account/logout');
|
|
}
|
|
} else {
|
|
return next();
|
|
}
|
|
}
|
|
|
|
module.exports = renderDataMiddleware;
|