vrc-account-generator/src/index.ts

152 lines
3.1 KiB
TypeScript

import Fastify, { FastifyRequest } from "fastify";
import { Data } from "./Data";
import { KeyGenerator } from "./KeyGenerator";
import readline from "node:readline";
const PORT = parseInt(process.env.PORT || '3000');
const fastify = Fastify();
fastify.get('/keygen', async (req, res) => {
let key = KeyGenerator.generateKey();
try {
await Data.addKey(req.ip, key);
console.log('keygen', req.ip, key);
res.send(key);
} catch (err) {
console.log('errgen', req.ip, err);
res.send({
error: err
});
}
});
fastify.get('/keys', async (req, res) => {
try {
let prof = await Data.getKeyProfile(req.ip);
console.log('grab', req.ip, prof.keys);
return res.send(prof.keys);
} catch (err) {
console.log('errgrab', req.ip, err);
res.send({
error: err
});
}
});
type AdminRequest = FastifyRequest<{
Querystring: { key: string, value: any, ip: string }
}>
fastify.get('/set', async (req: AdminRequest, res) => {
let prof;
try {
prof = await Data.getKeyProfile(req.ip);
if (!prof.admin) {
console.log('adminseterr', req.ip, 'not admin');
return res.send({ error: 'not admin' });
}
} catch (err) {
return;
}
const { ip, key, value } = req.query;
try {
let mod = await Data.getKeyProfile(ip);
return res.send(JSON.stringify(await Data.setProfileValue(mod, key, JSON.parse(value))));
} catch (err) {
console.log('adminseterr', req.ip, err);
return res.send({
error: err
});
}
});
fastify.get('/get', async (req: AdminRequest, res) => {
let prof;
try {
prof = await Data.getKeyProfile(req.ip);
if (!prof.admin) {
console.log('admingeterr', req.ip, 'not admin');
return res.send({ error: 'not admin' });
}
} catch (err) {
return;
}
const { ip, key } = req.query;
try {
let mod = await Data.getKeyProfile(ip);
if (key) {
return res.send(mod[key]);
} else {
return res.send(mod);
}
} catch (err) {
console.log('admingeterr', req.ip, err);
return res.send({
error: err
});
}
});
fastify.get('/reset', async (req: AdminRequest, res) => {
let prof;
try {
prof = await Data.getKeyProfile(req.ip);
if (!prof.admin) {
console.log('adminreseterr', req.ip, 'not admin');
return res.send({ error: 'not admin' });
}
} catch (err) {
return;
}
const { ip } = req.query;
try {
return res.send(JSON.stringify(await Data.resetKeyProfile(ip)));
} catch (err) {
console.log('adminreseterr', req.ip, err);
return res.send({
error: err
});
}
});
const rl = readline.createInterface(process.stdin, process.stdout);
rl.on('line', async data => {
let str = data.toString();
let args = str.split(' ');
let argcat = str.substring(args[0].length).trim();
let cmd = args[0];
switch (cmd) {
case 'set':
if (!args[3]) return console.log('Not enough arguments: set <ip> <key> <value>');
let ip = args[1];
let key = args[2];
let val = args[3];
try {
let prof = await Data.getKeyProfile(ip);
await Data.setProfileValue(prof, key, JSON.parse(val));
} catch (err) {
console.error(err);
}
break;
}
});
fastify.listen({
port: PORT
}, (err, address) => {
if (err) throw err
});
process.on('SIGINT', async () => {
await Data.db.close();
await fastify.close();
});