diff options
Diffstat (limited to 'accounts.ts')
-rw-r--r-- | accounts.ts | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/accounts.ts b/accounts.ts new file mode 100644 index 0000000..1dc96ac --- /dev/null +++ b/accounts.ts @@ -0,0 +1,77 @@ +import { createHash } from "node:crypto"; +import cuid2 from "@paralleldrive/cuid2"; +import fs from "node:fs"; + +const cuid = cuid2.init() + +if (!fs.existsSync("db")) fs.mkdirSync("db"); +if (!fs.existsSync("db/users.json")) fs.writeFileSync("db/users.json", "{}"); + +const db = JSON.parse(fs.readFileSync("db/users.json").toString()); + +/** + * Syncs DB to file + */ +function syncDB() { + fs.writeFileSync("db/users.json", JSON.stringify(db)); +} + +/** + * Checks if account exists + * @param {String} username Username to check + * @returns {Boolean} + */ +export function checkAccount(username: string) { + return db[username] != undefined; +} + +/** + * Does a loose check on if the account exists + */ +export function checkAccountLoose(username: string): boolean { + return Object.keys(db).find(n => n.toLowerCase() == username.toLowerCase()) ? true : false; +} + +/** + * Create an account + */ +export function createAccount(username: string, password: string, admin: boolean = false) { + const hashedPassword = createHash("sha256").update(password).digest("hex"); + db[username] = { + admin, + id: cuid(), + password: hashedPassword, + ips: [], + t: Number(new Date()) / 1000, + }; + syncDB(); +} + +/** + * Log IP address (for IP bans) + */ +export function logIP(username: string, ip: string) { + if (!db[username].ips) db[username].ips = []; + if (!db[username].ips.includes(ip)) db[username].ips.push(ip); + syncDB(); +} + +/** + * Check if password is correct + * @returns {Boolean} + */ +export function checkPassword(username: string, password: string) { + const hashedPassword = createHash("sha256").update(password).digest("hex"); + return db[username]?.password === hashedPassword; +} + +/** + * Get account data + * @param {String} username The username + * @returns {User} + */ +export function getAccountData(username: string) { + const returnData = JSON.parse(JSON.stringify(db[username])); + returnData.password = null; + return returnData; +} |