Setting up a simple bot command framework and linter/formatter See merge request csc/discord-bot!1merge-requests/2/head
commit
66c9560430
@ -0,0 +1,11 @@ |
||||
{ |
||||
"parser": "@typescript-eslint/parser", // Specifies the ESLint parser |
||||
"env": { |
||||
"ecmaVersion": 2020 // Allows for the parsing of modern ECMAScript features |
||||
}, |
||||
"extends": [ |
||||
"plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin |
||||
"prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier |
||||
"plugin:prettier/recommended" |
||||
] |
||||
} |
@ -0,0 +1,2 @@ |
||||
/node_modules |
||||
.env |
@ -0,0 +1,6 @@ |
||||
{ |
||||
"semi": true, |
||||
"trailingComma": "none", |
||||
"singleQuote": true, |
||||
"printWidth": 120 |
||||
} |
@ -1 +1,10 @@ |
||||
# Codey Bot |
||||
# Codey Bot |
||||
|
||||
## Required environment variables |
||||
- `BOT_TOKEN`: the token found in the bot user account. |
||||
- `NOTIF_CHANNEL_ID`: the ID of the channel the bot will send system notifications to. |
||||
|
||||
## Running the bot locally |
||||
1. Run `yarn` to install dependencies. |
||||
1. Add the required environment variables in a `.env` file in the root directory. |
||||
1. Run `yarn dev` to start the bot locally. |
||||
|
@ -0,0 +1,61 @@ |
||||
import dotenv = require('dotenv') |
||||
dotenv.config() |
||||
|
||||
import Discord = require('discord.js') |
||||
import _ = require('lodash') |
||||
|
||||
const NOTIF_CHANNEL_ID: string = process.env.NOTIF_CHANNEL_ID |
||||
const BOT_TOKEN: string = process.env.BOT_TOKEN |
||||
const BOT_PREFIX = "." |
||||
|
||||
const client = new Discord.Client() |
||||
|
||||
const parseCommand = message => { |
||||
// extract arguments by splitting by spaces and grouping strings in quotes
|
||||
// e.g. .ping 1 "2 3" => ['ping', '1', '2 3']
|
||||
let args = message.content.slice(BOT_PREFIX.length).match(/[^\s"']+|"([^"]*)"|'([^']*)'/g) |
||||
args = _.map(args, arg => { |
||||
if (arg[0].match(/'|"/g) && arg[arg.length-1].match(/'|"/g)) { |
||||
return arg.slice(1,arg.length-1) |
||||
} |
||||
return arg |
||||
}) |
||||
const firstArg = args.shift() |
||||
if (!firstArg) return |
||||
const command = firstArg.toLowerCase() |
||||
return { command, args } |
||||
} |
||||
|
||||
const handleCommand = async (message, command, args) => { |
||||
switch(command) { |
||||
case 'ping': |
||||
await message.channel.send('pong') |
||||
} |
||||
} |
||||
|
||||
const handleMessage = async message => { |
||||
// ignore messages without bot prefix and messages from other bots
|
||||
if (!message.content.startsWith(BOT_PREFIX) || message.author.bot) return |
||||
// obtain command and args from the command message
|
||||
const { command, args } = parseCommand(message) |
||||
// TODO: log commands
|
||||
|
||||
try { |
||||
await handleCommand(message, command, args) |
||||
} catch(e) { |
||||
// TODO: handle error
|
||||
} |
||||
} |
||||
|
||||
const startBot = async () => { |
||||
client.once('ready', async () => { |
||||
const notif = await client.channels.fetch(NOTIF_CHANNEL_ID) as Discord.TextChannel |
||||
notif.send('Codey is up!') |
||||
}) |
||||
|
||||
client.on('message', handleMessage) |
||||
|
||||
client.login(BOT_TOKEN) |
||||
} |
||||
|
||||
startBot() |
@ -0,0 +1,30 @@ |
||||
{ |
||||
"name": "csc-discord-bot", |
||||
"version": "0.1.0", |
||||
"description": "", |
||||
"main": "index.js", |
||||
"scripts": { |
||||
"dev": "nodemon index.ts", |
||||
"test": "echo \"Error: no test specified\" && exit 1" |
||||
}, |
||||
"author": "", |
||||
"license": "ISC", |
||||
"dependencies": { |
||||
"discord.js": "^12.5.3", |
||||
"dotenv": "^8.2.0", |
||||
"lodash": "^4.17.21", |
||||
"typescript": "^4.2.4" |
||||
}, |
||||
"devDependencies": { |
||||
"@types/lodash": "^4.14.168", |
||||
"@types/node": "^15.0.1", |
||||
"@typescript-eslint/eslint-plugin": "^4.22.0", |
||||
"@typescript-eslint/parser": "^4.22.0", |
||||
"eslint": "^7.25.0", |
||||
"eslint-config-prettier": "^8.3.0", |
||||
"eslint-plugin-prettier": "^3.4.0", |
||||
"nodemon": "^2.0.7", |
||||
"prettier": "^2.2.1", |
||||
"ts-node": "^9.1.1" |
||||
} |
||||
} |
Loading…
Reference in new issue