From 91482bfd6838c8857d04aa826dd44b27819743a4 Mon Sep 17 00:00:00 2001 From: AlphaNecron Date: Wed, 6 Oct 2021 18:30:09 +0700 Subject: [PATCH] build: converted everything into typescript --- config.example.toml | 1 + package.json | 16 ++-- scripts/{deployDb.js => deployDb.ts} | 6 +- scripts/{prismaRun.js => prismaRun.ts} | 8 +- server/{index.js => index.ts} | 39 +++++----- src/lib/config.ts | 5 +- src/lib/{configReader.js => configReader.ts} | 15 ++-- src/lib/logger.js | 29 -------- src/lib/logger.ts | 29 ++++++++ src/lib/{mimetype.js => mimetypes.ts} | 6 +- src/lib/types.ts | 3 +- .../lib/validateConfig.ts | 9 ++- src/pages/api/upload.ts | 2 +- src/pages/index.tsx | 2 +- tsconfig.json | 8 +- twilight/commands/help.ts | 2 +- twilight/commands/shorten.ts | 5 +- twilight/commands/upload.ts | 74 +++++++++++++++++++ twilight/commands/user.ts | 5 +- twilight/{index.ts => twilight.ts} | 23 +++--- void-env.d.ts | 2 + yarn.lock | 44 +++++------ 22 files changed, 207 insertions(+), 126 deletions(-) rename scripts/{deployDb.js => deployDb.ts} (66%) rename scripts/{prismaRun.js => prismaRun.ts} (76%) rename server/{index.js => index.ts} (72%) rename src/lib/{configReader.js => configReader.ts} (88%) delete mode 100644 src/lib/logger.js create mode 100644 src/lib/logger.ts rename src/lib/{mimetype.js => mimetypes.ts} (98%) rename server/validateConfig.js => src/lib/validateConfig.ts (85%) create mode 100644 twilight/commands/upload.ts rename twilight/{index.ts => twilight.ts} (64%) diff --git a/config.example.toml b/config.example.toml index c5320a7..bd01c83 100644 --- a/config.example.toml +++ b/config.example.toml @@ -11,6 +11,7 @@ prefix = '&' token = '' admin = [''] log_channel = '' +default_uid = 1 hostname = 'example.com' [shortener] diff --git a/package.json b/package.json index 7b3dbe6..db1c4dc 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,28 @@ { "name": "void", - "version": "0.3.0", + "version": "0.4.0", "private": true, "engines": { "node": ">=14" }, "scripts": { - "dev": "NODE_ENV=development node server", + "dev": "NODE_ENV=development ts-node --compiler-options \"{\\\"module\\\":\\\"commonjs\\\"}\" server", "build": "npm-run-all build:schema build:next", "build:next": "next build", "build:schema": "prisma generate --schema=prisma/schema.prisma", - "start:server": "node server", - "start:twilight": "ts-node --compiler-options \"{\\\"module\\\":\\\"commonjs\\\"}\" twilight", - "start": "npm-run-all -p start:server start:twilight", + "start": "ts-node --compiler-options \"{\\\"module\\\":\\\"commonjs\\\"}\" server", "prepare": "husky install", "lint": "next lint --fix" }, "prisma": { - "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" + "seed": "ts-node --compiler-options {\"module\":\"commonjs\"} prisma/seed.ts" }, "dependencies": { "@chakra-ui/react": "^1.6.8", "@emotion/react": "^11", "@emotion/styled": "^11", "@iarna/toml": "^2.2.5", - "@prisma/client": "^3.1.1", + "@prisma/client": "^3.2.0", "@reduxjs/toolkit": "^1.6.1", "argon2": "^0.28.2", "cookie": "^0.4.1", @@ -34,7 +32,7 @@ "framer-motion": "^4", "multer": "^1.4.3", "next": "^11.1.2", - "prisma": "^3.1.1", + "prisma": "^3.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-dropzone": "^11.4.2", @@ -48,7 +46,7 @@ "devDependencies": { "@commitlint/cli": "^13.2.0", "@commitlint/config-conventional": "^13.2.0", - "@types/node": "^14.14.31", + "@types/node": "^16.10.3", "@types/react": "^17.0.27", "@typescript-eslint/parser": "^4.32.0", "eslint": "7.32.0", diff --git a/scripts/deployDb.js b/scripts/deployDb.ts similarity index 66% rename from scripts/deployDb.js rename to scripts/deployDb.ts index 8864ced..fdcba6a 100644 --- a/scripts/deployDb.js +++ b/scripts/deployDb.ts @@ -1,7 +1,7 @@ -const { error } = require('../src/lib/logger'); -const prismaRun = require('./prismaRun'); +import { error } from '../src/lib/logger'; +import prismaRun from './prismaRun'; -module.exports = async (config) => { +export default async function(config) { try { await prismaRun(config.core.database_url, ['migrate', 'deploy']); await prismaRun(config.core.database_url, ['generate'], true); diff --git a/scripts/prismaRun.js b/scripts/prismaRun.ts similarity index 76% rename from scripts/prismaRun.js rename to scripts/prismaRun.ts index 0ab8a71..f0be702 100644 --- a/scripts/prismaRun.js +++ b/scripts/prismaRun.ts @@ -1,7 +1,7 @@ -const { spawn } = require('child_process'); -const { join } = require('path'); +import { spawn } from 'child_process'; +import { join } from 'path'; -module.exports = (url, args, nostdout = false) => { +export default function run(url: string, args: string[], nostdout?: boolean): Promise { return new Promise((res, rej) => { const proc = spawn(join(process.cwd(), 'node_modules', '.bin', 'prisma'), args, { env: { @@ -9,9 +9,7 @@ module.exports = (url, args, nostdout = false) => { ...process.env }, }); - let a = ''; - proc.stdout.on('data', d => { if (!nostdout) console.log(d.toString()); a += d.toString(); diff --git a/server/index.js b/server/index.ts similarity index 72% rename from server/index.js rename to server/index.ts index 4a97c3e..5a39d42 100644 --- a/server/index.js +++ b/server/index.ts @@ -1,15 +1,15 @@ -const next = require('next'); -const { createServer } = require('http'); -const { stat, mkdir, readFile } = require('fs/promises'); -const { extname } = require('path'); -const { PrismaClient } = require('@prisma/client'); -const validateConfig = require('./validateConfig'); -const { info, error } = require('../src/lib/logger'); -const prismaRun = require('../scripts/prismaRun'); -const configReader = require('../src/lib/configReader'); -const mimes = require('../src/lib/mimetype'); -const deployDb = require('../scripts/deployDb'); -const { join } = require('path'); +import { PrismaClient } from '@prisma/client'; +import { mkdir, readFile, stat } from 'fs/promises'; +import { createServer } from 'http'; +import next from 'next'; +import { extname, join } from 'path'; +import deployDb from '../scripts/deployDb'; +import prismaRun from '../scripts/prismaRun'; +import { error, info } from '../src/lib/logger'; +import mimetypes from '../src/lib/mimetypes'; +import validate from '../src/lib/validateConfig'; +import readConfig from '../src/lib/configReader'; +import start from '../twilight/twilight'; info('SERVER', 'Starting Void server'); @@ -17,22 +17,26 @@ const dev = process.env.NODE_ENV === 'development'; (async () => { try { - const config = await validateConfig(configReader()); + const config = await validate(readConfig()); const data = await prismaRun(config.core.database_url, ['migrate', 'status'], true); if (data.match(/Following migrations? have not yet been applied/)) { info('DB', 'Some migrations are not applied, applying them now...'); await deployDb(config); info('DB', 'Finished applying migrations'); - await prismaRun(config.core.database_url, ['db', 'seed'], false) + await prismaRun(config.core.database_url, ['db', 'seed']) } process.env.DATABASE_URL = config.core.database_url; + if (config.bot.enabled) { + if (!config.bot.token) error('BOT', 'Token is not specified'); + else start(config); + } await stat('./.next'); await mkdir(config.uploader.directory, { recursive: true }); const app = next({ dir: '.', dev, quiet: dev - }, config.core.port, config.core.host); + }); await app.prepare(); const handle = app.getRequestHandler(); const prisma = new PrismaClient(); @@ -58,7 +62,7 @@ const dev = process.env.NODE_ENV === 'development'; if (file) { res.setHeader('Content-Type', file.mimetype); } else { - const mimetype = mimes[extname(parts[2])] ?? 'application/octet-stream'; + const mimetype = mimetypes[extname(parts[2])] ?? 'application/octet-stream'; res.setHeader('Content-Type', mimetype); } res.setHeader('Content-Length', data.byteLength); @@ -78,9 +82,10 @@ const dev = process.env.NODE_ENV === 'development'; srv.on('listening', async () => { info('SERVER', `Listening on ${config.core.host}:${config.core.port}`); }); - srv.listen(config.core.port, config.core.host ?? '0.0.0.0'); + srv.listen(config.core.port, config.core.host); } catch (e) { if (e.message && e.message.startsWith('Could not find a production')) { + console.log(e.message); error('WEB', 'There is no production build - run yarn build'); } else if (e.code && e.code === 'ENOENT') { if (e.path === './.next') error('WEB', 'There is no production build - run yarn build'); diff --git a/src/lib/config.ts b/src/lib/config.ts index fa63a08..3670621 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,4 +1,5 @@ -import configReader from './configReader'; +import readConfig from './configReader'; import type { Config } from './types'; -if (!global.config) global.config = configReader() as Config; + +if (!global.config) global.config = readConfig() as Config; export default global.config; \ No newline at end of file diff --git a/src/lib/configReader.js b/src/lib/configReader.ts similarity index 88% rename from src/lib/configReader.js rename to src/lib/configReader.ts index f91297a..3d04d9b 100644 --- a/src/lib/configReader.js +++ b/src/lib/configReader.ts @@ -1,6 +1,7 @@ -const { join } = require('path'); -const { info, error } = require('./logger'); -const { existsSync, readFileSync } = require('fs'); +import { existsSync, readFileSync } from 'fs'; +import { join } from 'path'; +import { error, info } from './logger'; +import parse from '@iarna/toml/parse-string'; const e = (val, type, fn) => ({ val, type, fn }); @@ -21,13 +22,14 @@ const envValues = [ e('BOT_TOKEN', 'string', (c, v) => c.bot.token = v), e('BOT_ADMINS', 'array', (c, v) => v ? c.bot.admins = v : c.bot.admins = []), e('BOT_LOG_CHANNEL', 'string', (c, v) => c.bot.log_channel = v), + e('BOT_DEFAULT_UID', 'string', (c, v) => c.bot.default_uid = v), e('BOT_HOSTNAME', 'string', (c, v) => c.bot.hostname = v), e('SHORTENER_ROUTE', 'string', (c, v) => c.shortener.route = v), e('SHORTENER_LENGTH', 'number', (c, v) => c.shortener.length = v) ]; -module.exports = () => { +export default function readConfig() { if (!existsSync(join(process.cwd(), 'config.toml'))) { error('CONFIG', 'Config file not found, please create one.'); return tryReadEnv(); @@ -35,7 +37,7 @@ module.exports = () => { if (process.env.JEST_WORKER_ID) return; info('CONFIG', 'Reading config file'); const str = readFileSync(join(process.cwd(), 'config.toml'), 'utf8'); - const parsed = require('@iarna/toml/parse-string')(str); + const parsed = parse(str); return parsed; } }; @@ -60,6 +62,7 @@ function tryReadEnv() { prefix: undefined, admins: undefined, log_channel: undefined, + default_uid: undefined, hostname: undefined }, shortener: { @@ -70,7 +73,7 @@ function tryReadEnv() { for (let i = 0, L = envValues.length; i !== L; ++i) { const envValue = envValues[i]; - let value = process.env[envValue.val]; + let value = process.env[envValue.val] as any; if (!value) { envValues[i].fn(config, undefined); } else { diff --git a/src/lib/logger.js b/src/lib/logger.js deleted file mode 100644 index a887f3f..0000000 --- a/src/lib/logger.js +++ /dev/null @@ -1,29 +0,0 @@ -const colors = { - red: '\x1b[41m', - green: '\x1b[42m', - yellow: '\x1b[43m', - blue: '\x1b[44m', - magenta: '\x1b[45m', - cyan: '\x1b[46m', - reset: '\x1b[0m', - black: '\x1b[30m' -}; - -function log(color, stype, msg, srv) { - console.log(`${colors.blue}${colors.black} ${(new Date()).toLocaleTimeString()} ${color} ${srv}/${stype} ${colors.reset} ${msg}`); -} - -module.exports = { - debug: function(stype, msg) { - log(colors.magenta, stype, msg, 'DBUG'); - }, - warn: function(stype, msg) { - log(colors.yellow, stype, msg, 'WARN'); - }, - error: function(stype, msg) { - log(colors.red, stype, msg, 'ERR'); - }, - info: function(stype, msg) { - log(colors.cyan, stype, msg, 'INFO'); - }, -}; diff --git a/src/lib/logger.ts b/src/lib/logger.ts new file mode 100644 index 0000000..41c3645 --- /dev/null +++ b/src/lib/logger.ts @@ -0,0 +1,29 @@ +const colors = { + red: '\x1b[41m', + green: '\x1b[42m', + yellow: '\x1b[43m', + blue: '\x1b[44m', + magenta: '\x1b[45m', + cyan: '\x1b[46m', + reset: '\x1b[0m', + black: '\x1b[30m' +}; + +enum Severity { Debug = 'DEBUG', Warn = 'WARN', Error = 'ERR', Info = 'INFO' }; + +function log(color: string, type: string, msg, srv = '') { + console.log(`${colors.blue}${colors.black} ${(new Date()).toLocaleTimeString()} ${color} ${srv}/${type} ${colors.reset} ${msg}`); +} + +export function debug(type, msg) { + log(colors.magenta, type, msg, Severity.Debug); +}; +export function warn(type, msg) { + log(colors.yellow, type, msg, Severity.Warn); +}; +export function error(type, msg) { + log(colors.red, type, msg, Severity.Error); +}; +export function info(type, msg) { + log(colors.cyan, type, msg, Severity.Info); +}; diff --git a/src/lib/mimetype.js b/src/lib/mimetypes.ts similarity index 98% rename from src/lib/mimetype.js rename to src/lib/mimetypes.ts index 5c77372..0303590 100644 --- a/src/lib/mimetype.js +++ b/src/lib/mimetypes.ts @@ -1,4 +1,4 @@ -module.exports = { +const mimetypes = { '.aac': 'audio/aac', '.abw': 'application/x-abiword', '.arc': 'application/x-freearc', @@ -75,4 +75,6 @@ module.exports = { '.3gp': 'video/3gpp', '.3g2': 'video/3gpp2', '.7z': 'application/x-7z-compressed' -}; \ No newline at end of file +}; + +export default mimetypes; \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index 5304d2e..a7cc9f3 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -3,7 +3,7 @@ export interface Core { secret: string; host: string; port: number; - database_url: string + database_url: string; } export interface Bot { @@ -12,6 +12,7 @@ export interface Bot { token: string; admins: string[]; log_channel: string; + default_uid: number; hostname: string; } diff --git a/server/validateConfig.js b/src/lib/validateConfig.ts similarity index 85% rename from server/validateConfig.js rename to src/lib/validateConfig.ts index ef632f7..c3ec22b 100644 --- a/server/validateConfig.js +++ b/src/lib/validateConfig.ts @@ -1,4 +1,4 @@ -const yup = require('yup'); +import * as yup from 'yup'; const validator = yup.object({ core: yup.object({ @@ -14,7 +14,8 @@ const validator = yup.object({ token: yup.string(), admins: yup.array().default([]), log_channel: yup.string(), - hostname: yup.string() + default_uid: yup.number().default(1), + hostname: yup.string().default('localhost') }), shortener: yup.object({ allow_vanity: yup.bool().default(false), @@ -29,10 +30,10 @@ const validator = yup.object({ }).required(), }); -module.exports = async config => { +export default async function validate(config) { try { return await validator.validate(config, { abortEarly: false }); } catch (e) { throw `${e.errors.length} errors occured\n${e.errors.map(x => '\t' + x).join('\n')}`; } -}; +}; \ No newline at end of file diff --git a/src/pages/api/upload.ts b/src/pages/api/upload.ts index 5a5cbe0..c313cba 100644 --- a/src/pages/api/upload.ts +++ b/src/pages/api/upload.ts @@ -3,7 +3,7 @@ import cfg from 'lib/config'; import generate, { emoji, zws } from 'lib/generators'; import { info } from 'lib/logger'; import { NextApiReq, NextApiRes, withVoid } from 'lib/middleware/withVoid'; -import mimetypes from 'lib/mimetype'; +import mimetypes from 'lib/mimetypes'; import prisma from 'lib/prisma'; import multer from 'multer'; import { join } from 'path'; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 70e7d31..3b5d2f5 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -13,4 +13,4 @@ export default function Index() { ); -} +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4d2f74a..f487d5e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "dom.iterable", "esnext" ], - "allowJs": true, + "allowJs": false, "skipLibCheck": true, "strict": false, "forceConsistentCasingInFileNames": true, @@ -32,7 +32,8 @@ "hooks/*": [ "hooks/*" ] - } + }, + "allowJs": true }, "include": [ "next-env.d.ts", @@ -44,8 +45,5 @@ "exclude": [ "node_modules", "uploads" - ], - "collectCoverageFrom": [ - "!src/lib/config.ts" ] } diff --git a/twilight/commands/help.ts b/twilight/commands/help.ts index 3dd73b0..36317e6 100644 --- a/twilight/commands/help.ts +++ b/twilight/commands/help.ts @@ -1,6 +1,6 @@ import { Message, MessageEmbed } from 'discord.js'; import config from '../../src/lib/config'; -import { commands } from '../index'; +import { commands } from '../twilight'; const help = { command: 'help', diff --git a/twilight/commands/shorten.ts b/twilight/commands/shorten.ts index 36026f3..ede3ec1 100644 --- a/twilight/commands/shorten.ts +++ b/twilight/commands/shorten.ts @@ -35,10 +35,11 @@ const shorten = { data: { short: vanity ? vanity : rand, destination: schemify(dest), - userId: user.id, + userId: config.bot.default_uid, }, }); - info('URL', `User shortened a URL: ${url.destination} (${url.id})`); + info('URL', `User ${msg.author.username}#${msg.author.discriminator} shortened a URL: ${url.destination} (${url.id})`); + global.logger.log(`User ${msg.author.username}#${msg.author.discriminator} shortened a URL: ${url.destination} (${url.id})`); msg.channel.send(`http${config.core.secure ? 's' : ''}://${config.bot.hostname}${config.shortener.route}/${url.short}`); } }; diff --git a/twilight/commands/upload.ts b/twilight/commands/upload.ts new file mode 100644 index 0000000..34509a8 --- /dev/null +++ b/twilight/commands/upload.ts @@ -0,0 +1,74 @@ +import { Message } from 'discord.js'; +import { writeFile } from 'fs/promises'; +import fetch from 'node-fetch'; +import { extname, join } from 'path'; +import url from 'url'; +import config from '../../src/lib/config'; +import generate, { emoji, zws } from '../../src/lib/generators'; +import { info, error } from '../../src/lib/logger'; +import mimetypes from '../../src/lib/mimetypes'; +import prisma from '../../src/lib/prisma'; + +const upload = { + command: 'upload', + description: 'Upload a new file', + syntax: '{PREFIX}upload [generator]', + scopes: ['dm', 'text'], + execute: async (msg: Message, args: string[]) => { + if (!args[0]) return msg.channel.send('No URL.'); + let buffer, res; + try { + res = await fetch(args[0]); + if (!res.ok) return msg.channel.send('Unable to fetch the file.'); + buffer = await res.buffer(); + } + catch (e) { + error('BOT', e.message); + return msg.channel.send(e.message); + } + const fileName = url.parse(args[0]).pathname; + const ext = extname(fileName); + const rand = generate(config.uploader.length); + let slug; + switch (args[1] ?? 'normal') { + case 'zws': { + slug = zws(config.uploader.length); + break; + } + case 'emoji': { + slug = emoji(config.uploader.length); + break; + } + default: { + slug = rand; + break; + } + } + const deletionToken = generate(15); + function getMimetype(current, ext) { + if (current === 'application/octet-stream') { + if (mimetypes[ext]) { + return mimetypes[ext]; + } + return current; + } + return current; + } + const file = await prisma.file.create({ + data: { + slug, + origFileName: fileName.split('/').pop(), + fileName: `${rand}${ext}`, + mimetype: getMimetype(res.headers.get('Content-Type'), ext), + userId: config.bot.default_uid, + deletionToken + } + }); + await writeFile(join(process.cwd(), config.uploader.directory, file.fileName), buffer); + info('FILE', `User ${msg.author.username}#${msg.author.discriminator} uploaded a file: ${file.fileName} (${file.id})`); + global.logger.log(`User ${msg.author.username}#${msg.author.discriminator} uploaded a file: ${file.fileName}`); + msg.channel.send(`http${config.core.secure ? 's' : ''}://${config.bot.hostname}/${file.slug}`); + } +}; + +export default upload; \ No newline at end of file diff --git a/twilight/commands/user.ts b/twilight/commands/user.ts index 5f71fbe..4e433d0 100644 --- a/twilight/commands/user.ts +++ b/twilight/commands/user.ts @@ -2,7 +2,6 @@ import { Message, MessageEmbed } from 'discord.js'; import { info } from '../../src/lib/logger'; import prisma from '../../src/lib/prisma'; import { generateToken, hashPassword } from '../../src/lib/utils'; -import { logger } from '../index'; const user = { command: 'user', @@ -42,7 +41,7 @@ const user = { { name: 'id', value: newUser.id }, { name: 'Username', value: newUser.username } ); - logger.log(embed); + global.logger.log(embed); msg.channel.send(embed.addField('Token', newUser.token)); info('USER',`${msg.author.username}#${msg} created a user: ${newUser.username}`); } @@ -63,7 +62,7 @@ const user = { .setColor('#B794F4') .setFooter(`By: ${msg.author.username}#${msg.author.discriminator}`) .addField('Username', userToDelete.username, true); - logger.log(embed); + global.logger.log(embed); msg.channel.send(embed); info('USER',`${msg.author.username}#${msg} created a user: ${userToDelete.username}`); } diff --git a/twilight/index.ts b/twilight/twilight.ts similarity index 64% rename from twilight/index.ts rename to twilight/twilight.ts index 75280af..37eb8c2 100644 --- a/twilight/index.ts +++ b/twilight/twilight.ts @@ -1,15 +1,9 @@ import Discord, { Message, MessageEmbed } from 'discord.js'; import { readdir } from 'fs'; -import { exit } from 'process'; -import config from '../src/lib/config'; import { error, info } from '../src/lib/logger'; import { Logger } from './utils/logger'; -if (!config.bot.enabled) exit(0); -process.env.DATABASE_URL = config.core.database_url; -if (!config.bot.token) exit(1); - -export let logger; +let config; const client = new Discord.Client(); @@ -17,23 +11,23 @@ export const commands = []; client.once('ready', () => { info('BOT', 'Twilight is ready'); - logger = new Logger(client); - logger.log(new MessageEmbed() + global.logger = new Logger(client); + global.logger.log(new MessageEmbed() .setTitle('Twilight is ready') .setColor('#B794F4')); readdir(`${__dirname}/commands`, (err, files) => { if(err) error('BOT', err.message); files.forEach(file => { if (file.toString().includes('.ts')) { - commands.push(require(`${__dirname}/commands/${file.toString()}`).default); + import(`${__dirname}/commands/${file.toString()}`).then(command => commands.push(command.default)); info('COMMAND', `Loaded command: ${file.toString().split('.').slice(0, -1)}`);} }); }); }); client.on('message', (msg: Message) => { - if (config.bot.admins.includes(msg.author.id) && msg.content.startsWith(config.bot.prefix)) { - const args = msg.content.slice(config.bot.prefix.length).trim().split(/ +/g); + if ((config.admins).includes(msg.author.id) && msg.content.startsWith(config.prefix)) { + const args = msg.content.slice(config.prefix.length).trim().split(/ +/g); const cmd = args.shift().toString().toLowerCase(); commands.forEach(command => { if (command.command === cmd) @@ -44,4 +38,7 @@ client.on('message', (msg: Message) => { } }); -client.login(config.bot.token); +export default function start({ bot }) { + config = bot; + client.login(config.token); +} \ No newline at end of file diff --git a/void-env.d.ts b/void-env.d.ts index 59c1da8..ee32978 100644 --- a/void-env.d.ts +++ b/void-env.d.ts @@ -1,11 +1,13 @@ import type { PrismaClient } from '@prisma/client'; import type { Config } from './src/lib/types'; +import type { Logger } from './twilight/utils/logger'; declare global { namespace NodeJS { interface Global { prisma: PrismaClient; config: Config; + logger: Logger; } } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d207c01..c27681b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1098,22 +1098,22 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.4.tgz#11d5db19bd178936ec89cd84519c4de439574398" integrity sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg== -"@prisma/client@^3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.1.1.tgz#f4012631528049c22d12b212846dcf503db33cfe" - integrity sha512-8ud8vVFMIg37yrkZ4wPpjKoMxFbCL0Pesq5eyLnag/s0LTKsVEN7ZBIQq9JzWW+AUqOzGKXr2Jt4Sl8xdGI99w== +"@prisma/client@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.2.0.tgz#6aa79b2945ca7553d5a4c14bbe0067d9f975e061" + integrity sha512-YCS/N3DZWoaKXhyS8dHwgUvT/NKXvlLbB5fsy0FvYC305JgNtMLjNbxsx0HjIcNw82MEhP7zWEXNvOLpOgGCUg== dependencies: - "@prisma/engines-version" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/engines-version" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" -"@prisma/engines-version@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#f9908eb7808f2a546634398063942eaecb2474ef" - integrity sha512-EuEMKLuwIcBO7uInZQHeG1yaywcfl32Tq8TDf5tgLvblk+ka70sej7S67lh3BV5gXMLTc3GdthSHPfDqZEK5uA== +"@prisma/engines-version@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": + version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#bd63ad4bbc32935ec43e93cb59220495893c844d" + integrity sha512-zYzFOmFvk5YzShqm6DuK7ULtjbJQpebAeD3gcpPfPjx6Uf9pug3bxeswp8/3sk2KKVUeKPUQg5p3TZLskyBNjA== -"@prisma/engines@3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f": - version "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f.tgz#7b45708e6a42523dc9bc2214e5c62781f608dc3a" - integrity sha512-6NEp0VlLho3hVtIvj2P4h0e19AYqQSXtFGts8gSIXDnV+l5pRFZaDMfGo2RiLMR0Kfrs8c3ZYxYX0sWmVL0tWw== +"@prisma/engines@3.2.0-34.afdab2f10860244038c4e32458134112852d4dad": + version "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.2.0-34.afdab2f10860244038c4e32458134112852d4dad.tgz#d8e6ceaddae105f0c882ac9113873f8f1e89d64a" + integrity sha512-MiZORXXsGORXTF9RqqKIlN/2ohkaxAWTsS7qxDJTy5ThTYLrXSmzxTSohM4qN/AI616B+o5WV7XTBhjlPKSufg== "@reach/alert@0.13.2": version "0.13.2" @@ -1219,10 +1219,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.6.tgz#040a64d7faf9e5d9e940357125f0963012e66f04" integrity sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ== -"@types/node@^14.14.31": - version "14.17.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.20.tgz#74cc80438fd0467dc4377ee5bbad89a886df3c10" - integrity sha512-gI5Sl30tmhXsqkNvopFydP7ASc4c2cLfGNQrVKN3X90ADFWFsPEsotm/8JHSUJQKTHbwowAHtcJPeyVhtKv0TQ== +"@types/node@^16.10.3": + version "16.10.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" + integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -4633,12 +4633,12 @@ prism-media@^1.2.9: resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.2.tgz#a1f04423ec15d22f3d62b1987b6a25dc49aad13b" integrity sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g== -prisma@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.1.1.tgz#4c13c35dd3a58af9134008c8ed0fdc21a632802c" - integrity sha512-+eZtWIL6hnOKUOvqq9WLBzSw2d/EbTmOx1Td1LI8/0XE40ctXMLG2N1p6NK5/+yivGaoNJ9PDpPsPL9lO4nJrQ== +prisma@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.2.0.tgz#d4247114f1e4e4c67b9c70381c9aea4434882a38" + integrity sha512-o8+DH0RD5DbP8QTZej2dsY64yvjOwOG3TWOlJyoCHQ+8DH9m4tzxo38j6IF/PqpN4PmAGPpHuNi/nssG1cvYlQ== dependencies: - "@prisma/engines" "3.1.0-24.c22652b7e418506fab23052d569b85d3aec4883f" + "@prisma/engines" "3.2.0-34.afdab2f10860244038c4e32458134112852d4dad" prismjs@^1.22.0: version "1.25.0"