Core bot components
This commit is contained in:
8
.env.example
Normal file
8
.env.example
Normal file
@@ -0,0 +1,8 @@
|
||||
NODE_ENV=production
|
||||
TOKEN=
|
||||
GUILD_ID=
|
||||
DB_HOST=mysql
|
||||
DB_USERNAME=minzbot
|
||||
DB_PASSWORD=
|
||||
DB_DATABASE=minzbot
|
||||
DB_ROOTPW=
|
||||
145
.gitignore
vendored
Normal file
145
.gitignore
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/node
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=node
|
||||
|
||||
### Node ###
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
### Node Patch ###
|
||||
# Serverless Webpack directories
|
||||
.webpack/
|
||||
|
||||
# Optional stylelint cache
|
||||
|
||||
# SvelteKit build / generate output
|
||||
.svelte-kit
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/node
|
||||
13
commands/ping.js
Normal file
13
commands/ping.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const { SlashCommandBuilder } = require("@discordjs/builders");
|
||||
|
||||
module.exports = {
|
||||
data: new SlashCommandBuilder()
|
||||
.setName("ping")
|
||||
.setDescription("Ping, yes"),
|
||||
async execute(interaction) {
|
||||
interaction.reply({
|
||||
content: "Pong!",
|
||||
ephemeral: true
|
||||
});
|
||||
}
|
||||
}
|
||||
5
docker-compose-dev.yml
Normal file
5
docker-compose-dev.yml
Normal file
@@ -0,0 +1,5 @@
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
bot:
|
||||
command: sh -c "npm install && npm run dev"
|
||||
25
docker-compose.yml
Normal file
25
docker-compose.yml
Normal file
@@ -0,0 +1,25 @@
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
bot:
|
||||
image: node:16.9.0-alpine
|
||||
command: sh -c "npm install && node ."
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- "mysql"
|
||||
working_dir: /app
|
||||
volumes:
|
||||
- ./:/app
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
ports:
|
||||
- 3306:3306
|
||||
volumes:
|
||||
- bandbot-db:/var/lib/mysql
|
||||
- ./db:/tmp/db
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${DB_ROOTPW}
|
||||
MYSQL_DATABASE: ${DB_DATABASE}
|
||||
|
||||
volumes:
|
||||
bandbot-db:
|
||||
25
events/interactionCreate.js
Normal file
25
events/interactionCreate.js
Normal file
@@ -0,0 +1,25 @@
|
||||
require("dotenv").config();
|
||||
const { REST } = require("@discordjs/rest");
|
||||
const { Routes } = require("discord-api-types/v9")
|
||||
|
||||
module.exports = {
|
||||
name: "interactionCreate",
|
||||
async execute (interaction) {
|
||||
if (!interaction.isCommand()) return;
|
||||
|
||||
const command = interaction.client.commands.get(interaction.commandName);
|
||||
|
||||
if (!command) return;
|
||||
|
||||
try {
|
||||
await command.execute(interaction);
|
||||
} catch (err) {
|
||||
if (err) console.log(err);
|
||||
await interaction.reply({
|
||||
content: "An error occured processing the command",
|
||||
ephemeral: true
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
32
events/ready.js
Normal file
32
events/ready.js
Normal file
@@ -0,0 +1,32 @@
|
||||
require("dotenv").config();
|
||||
const { REST } = require("@discordjs/rest");
|
||||
const { Routes } = require("discord-api-types/v9")
|
||||
|
||||
module.exports = {
|
||||
name: "ready",
|
||||
once: true,
|
||||
async execute (client, commands) {
|
||||
console.log("Bot started.");
|
||||
|
||||
const CLIENT_ID = client.user.id;
|
||||
const rest = new REST({
|
||||
version: 9
|
||||
}).setToken(process.env.TOKEN);
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
console.log("Registering commands...");
|
||||
if(process.env.ENV === "production") {
|
||||
await rest.put(Routes.applicationCommands(CLIENT_ID), {body: commands });
|
||||
console.log("Global commands registered");
|
||||
} else {
|
||||
await rest.put(Routes.applicationGuildCommands(CLIENT_ID, process.env.GUILD_ID), {body: commands });
|
||||
console.log("Local commands registered");
|
||||
}
|
||||
} catch (err){
|
||||
if (err) console.log(err);
|
||||
}
|
||||
})();
|
||||
|
||||
}
|
||||
}
|
||||
50
index.js
Normal file
50
index.js
Normal file
@@ -0,0 +1,50 @@
|
||||
require("dotenv").config();
|
||||
const { Console } = require("console");
|
||||
const fs = require("fs");
|
||||
const {Client, Intents, Collection} = require("discord.js");
|
||||
const dbUtil = require("./util/db")
|
||||
|
||||
const logger = new Console({
|
||||
stdout: process.stdout,
|
||||
stderr: process.stderr
|
||||
});
|
||||
const client = new Client({intents: [
|
||||
Intents.FLAGS.GUILDS,
|
||||
Intents.FLAGS.GUILD_MESSAGES,
|
||||
Intents.FLAGS.GUILD_MEMBERS,
|
||||
Intents.FLAGS.GUILD_PRESENCES
|
||||
]});
|
||||
|
||||
const commandFiles = fs.readdirSync("./commands").filter(file => file.endsWith(".js"));
|
||||
const commands = [];
|
||||
client.commands = new Collection();
|
||||
|
||||
for (const file of commandFiles) {
|
||||
const command = require(`./commands/${file}`);
|
||||
commands.push(command.data.toJSON());
|
||||
client.commands.set(command.data.name, command);
|
||||
logger.log(`Registered command: ${command.data.name}`);
|
||||
}
|
||||
|
||||
const eventFiles = fs.readdirSync("./events").filter(file => file.endsWith(".js"));
|
||||
for (const file of eventFiles) {
|
||||
const event = require(`./events/${file}`);
|
||||
|
||||
if (event.once) {
|
||||
client.once(event.name, (...args) => event.execute(...args, commands));
|
||||
} else {
|
||||
client.on(event.name, (...args) => event.execute(...args, commands));
|
||||
}
|
||||
|
||||
logger.log(`Registered event: ${event.name}`);
|
||||
}
|
||||
|
||||
logger.log("Connecting to database...");
|
||||
dbUtil.initDb();
|
||||
logger.log("Connected to database!");
|
||||
logger.log("Starting bot...");
|
||||
client.login(process.env.TOKEN);
|
||||
|
||||
|
||||
|
||||
|
||||
2720
package-lock.json
generated
Normal file
2720
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
20
package.json
Normal file
20
package.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "bandbot",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"dev": "nodemon index.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@discordjs/builders": "^0.12.0",
|
||||
"@discordjs/rest": "^0.3.0",
|
||||
"discord.js": "^13.6.0",
|
||||
"dotenv": "^16.0.0",
|
||||
"mysql2": "^2.3.3",
|
||||
"nodemon": "^2.0.15"
|
||||
}
|
||||
}
|
||||
33
util/db.js
Normal file
33
util/db.js
Normal file
@@ -0,0 +1,33 @@
|
||||
require("dotenv").config();
|
||||
const mysql = require("mysql2/promise")
|
||||
|
||||
let _db;
|
||||
|
||||
async function connect() {
|
||||
const host = process.env.NODE_ENV === "production"
|
||||
try {
|
||||
const connection = await mysql.createConnection({
|
||||
"host" : process.env.DB_HOST,
|
||||
"port" : 3306,
|
||||
"user" : process.env.DB_USERNAME,
|
||||
"password" : process.env.DB_PASSWORD,
|
||||
"database" : process.env.DB_DATABASE
|
||||
});
|
||||
_db = connection;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
|
||||
function initDb() {
|
||||
connect();
|
||||
}
|
||||
|
||||
function getDb() {
|
||||
return _db;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
initDb,
|
||||
getDb
|
||||
}
|
||||
Reference in New Issue
Block a user