115 lines
3.6 KiB
TypeScript
115 lines
3.6 KiB
TypeScript
import dotenv = require('dotenv')
|
|
dotenv.config()
|
|
|
|
import Discord = require('discord.js')
|
|
import _ = require('lodash')
|
|
import { db } from './components/db'
|
|
|
|
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')
|
|
break
|
|
|
|
//dev testing commands
|
|
case 'save':
|
|
if(args.length<1){
|
|
await message.channel.send('no args')
|
|
return
|
|
}
|
|
db.run('INSERT INTO saved_data (msg_id,data)' +
|
|
'VALUES(?,?)', [message.id, args[0]], async (err) =>{
|
|
if(err){
|
|
await message.channel.send(err)
|
|
return
|
|
}
|
|
await message.channel.send('saved "'+args[0]+'" with id '+message.id+'.')
|
|
})
|
|
break
|
|
case 'dump':
|
|
//TODO: make messages be embeds to test
|
|
let flag : boolean = true
|
|
let outEmbed = new Discord.MessageEmbed().setColor('#0099ff').setTitle('Database Dump').setURL('https://www.youtube.com/watch?v=dQw4w9WgXcQ').addField("test", "test", true)
|
|
await db.each('SELECT * FROM saved_data', (err, rows) =>{
|
|
if(err){
|
|
flag = false;
|
|
return;
|
|
}
|
|
console.log(rows['msg_id'], rows['data'])
|
|
outEmbed = outEmbed.addField(rows['msg_id'], rows['data'], true)
|
|
console.log(outEmbed)
|
|
})
|
|
console.log(outEmbed)
|
|
if(flag){
|
|
if(outEmbed.fields.values.length == 0){
|
|
await message.channel.send("empty")
|
|
}
|
|
else{
|
|
await message.channel.send(outEmbed)
|
|
}
|
|
}
|
|
else{
|
|
await message.channel.send("error")
|
|
}
|
|
break;
|
|
case 'clear':
|
|
db.run('DELETE FROM saved_data', async (err) =>{
|
|
if(err){
|
|
await message.channel.send(err)
|
|
return
|
|
}
|
|
await message.channel.send("Cleared.")
|
|
|
|
})
|
|
}
|
|
}
|
|
|
|
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()
|