2020-07-20 23:03:12 -04:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2020-07-19 15:32:22 -04:00
*
2020-07-20 22:59:08 -04:00
* DLMP3 Bot : A Discord bot that plays local mp3 audio tracks .
2020-07-20 22:37:44 -04:00
* ( C ) Copyright 2020
2020-07-20 22:59:08 -04:00
* Programmed by Andrew Lee
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
2020-07-20 23:03:12 -04:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2020-07-18 19:28:42 -04:00
const Discord = require ( 'discord.js' ) ;
2020-07-20 16:02:49 -04:00
const fs = require ( 'fs' ) ;
2020-07-18 19:28:42 -04:00
const client = new Discord . Client ( ) ;
2020-07-20 16:09:35 -04:00
const config = require ( './config.json' ) ;
2020-07-20 17:12:55 -04:00
let dispatcher ;
2020-07-20 19:58:06 -04:00
let audio ;
2020-07-21 17:13:52 -04:00
let voiceChannel ;
2020-07-20 16:02:49 -04:00
client . login ( config . token ) ;
2020-07-18 19:28:42 -04:00
2020-07-19 13:42:52 -04:00
function playAudio ( ) {
2020-07-21 17:13:52 -04:00
voiceChannel = client . channels . cache . get ( config . voiceChannel ) ;
if ( ! voiceChannel ) return console . error ( 'The voice channel does not exist!\n(Have you looked at your configuration?)' ) ;
2020-07-20 14:43:33 -04:00
2020-07-21 17:13:52 -04:00
voiceChannel . join ( ) . then ( connection => {
2020-07-20 16:02:49 -04:00
let files = fs . readdirSync ( './music' ) ;
2020-07-20 14:43:33 -04:00
2020-07-20 16:02:49 -04:00
while ( true ) {
audio = files [ Math . floor ( Math . random ( ) * files . length ) ] ;
2020-07-20 19:58:06 -04:00
console . log ( 'Searching .mp3 file...' ) ;
2020-07-20 16:02:49 -04:00
if ( audio . endsWith ( '.mp3' ) ) {
break ;
}
}
2020-07-20 17:12:55 -04:00
dispatcher = connection . play ( './music/' + audio ) ;
2020-07-20 20:07:03 -04:00
2020-07-20 19:58:06 -04:00
dispatcher . on ( 'start' , ( ) => {
console . log ( 'Now playing ' + audio ) ;
2020-07-21 16:04:20 -04:00
2020-07-21 14:01:00 -04:00
const statusEmbed = new Discord . MessageEmbed ( )
. addField ( 'Now Playing' , ` ${ audio } ` )
. setColor ( '#0066ff' )
2020-07-21 16:04:20 -04:00
2020-07-20 20:17:40 -04:00
let statusChannel = client . channels . cache . get ( config . statusChannel ) ;
2020-07-21 15:44:14 -04:00
if ( ! statusChannel ) return console . error ( 'The status channel does not exist! Skipping.' ) ;
2020-07-21 14:01:00 -04:00
statusChannel . send ( statusEmbed ) ;
2020-07-20 19:58:06 -04:00
} ) ;
2020-07-20 16:57:03 -04:00
2020-07-20 19:58:06 -04:00
dispatcher . on ( 'error' , console . error ) ;
2020-07-20 16:57:03 -04:00
dispatcher . on ( 'finish' , ( ) => {
2020-07-21 15:29:57 -04:00
console . log ( 'Music has finished playing.' ) ;
2020-07-20 16:57:03 -04:00
playAudio ( ) ;
} ) ;
2020-07-19 12:59:04 -04:00
} ) . catch ( e => {
console . error ( e ) ;
} ) ;
2020-07-20 16:22:28 -04:00
2020-07-19 13:42:52 -04:00
}
2020-07-21 16:04:20 -04:00
2020-07-19 13:42:52 -04:00
client . on ( 'ready' , ( ) => {
2020-07-20 17:12:55 -04:00
console . log ( 'Bot is ready!' ) ;
2020-07-19 13:42:52 -04:00
console . log ( ` Logged in as ${ client . user . tag } ! ` ) ;
2020-07-20 16:09:35 -04:00
console . log ( ` Prefix: ${ config . prefix } ` ) ;
2020-07-20 17:12:55 -04:00
console . log ( ` Owner ID: ${ config . botOwner } ` ) ;
2020-07-20 20:26:26 -04:00
console . log ( ` Voice Channel: ${ config . voiceChannel } ` ) ;
2020-07-20 21:02:26 -04:00
console . log ( ` Status Channel: ${ config . statusChannel } \n ` ) ;
2020-07-21 15:29:57 -04:00
2020-07-21 14:31:02 -04:00
client . user . setStatus ( 'online' ) ;
2020-07-20 19:58:06 -04:00
console . log ( 'Connected to the voice channel.' ) ;
2020-07-19 13:42:52 -04:00
playAudio ( ) ;
2020-07-18 19:28:42 -04:00
} ) ;
client . on ( 'message' , async msg => {
2020-07-20 16:22:28 -04:00
if ( msg . author . bot ) return ;
if ( ! msg . guild ) return ;
if ( ! msg . content . startsWith ( config . prefix ) ) return ;
let command = msg . content . split ( ' ' ) [ 0 ] ;
command = command . slice ( config . prefix . length ) ;
2020-07-18 19:28:42 -04:00
2020-07-20 16:16:19 -04:00
// Public allowed commands
if ( command == 'help' ) {
2020-07-22 20:10:07 -04:00
if ( ! msg . guild . member ( client . user ) . hasPermission ( 'EMBED_LINKS' ) ) return msg . reply ( 'ERROR: This bot doesn\'t have the permission to send embed links please enable them to use the full help.' ) ;
2020-07-20 19:58:06 -04:00
const helpEmbed = new Discord . MessageEmbed ( )
2020-07-22 20:12:11 -04:00
. setAuthor ( ` ${ client . user . username } Help ` )
2020-07-22 20:05:19 -04:00
. setDescription ( ` Currently playing \` ${ audio } \` . ` )
. addField ( ` Commands ` , ` ${ config . prefix } help \n ${ config . prefix } ping \n ${ config . prefix } git \n ${ config . prefix } playing \n ${ config . prefix } about \n ` )
2020-07-21 14:01:00 -04:00
. setFooter ( '© Copyright 2020 Andrew Lee. Licensed with GPL-3.0.' )
2020-07-20 19:58:06 -04:00
. setColor ( '#0066ff' )
msg . channel . send ( helpEmbed ) ;
2020-07-20 16:22:28 -04:00
}
if ( command == 'ping' ) {
msg . reply ( 'Pong!' ) ;
2020-07-20 16:16:19 -04:00
}
if ( command == 'git' ) {
2020-07-21 16:59:55 -04:00
msg . reply ( 'This is the source code of this project.\nhttps://github.com/Alee14/DLMP3' ) ;
2020-07-20 16:16:19 -04:00
}
2020-07-22 20:05:19 -04:00
if ( command == 'playing' ) {
msg . channel . send ( 'Currently playing `' + audio + '`.' ) ;
}
2020-07-20 16:22:28 -04:00
if ( command == 'about' ) {
2020-07-22 20:05:19 -04:00
msg . channel . send ( 'The bot code was created by Andrew Lee (Alee#4277). Written in Discord.JS and licensed with GPL-3.0.' ) ;
2020-07-18 19:28:42 -04:00
}
2020-07-18 20:45:06 -04:00
2020-07-20 16:16:19 -04:00
if ( ! [ config . botOwner ] . includes ( msg . author . id ) ) return ;
// Bot owner exclusive
2020-07-18 20:45:06 -04:00
if ( command == 'join' ) {
2020-07-20 16:02:49 -04:00
msg . reply ( 'Joining voice channel.' ) ;
2020-07-20 19:58:06 -04:00
console . log ( 'Connected to the voice channel.' ) ;
2020-07-20 16:02:49 -04:00
playAudio ( ) ;
2020-07-18 19:28:42 -04:00
}
2020-07-20 16:09:35 -04:00
2020-07-20 17:12:55 -04:00
if ( command == 'skip' ) {
2020-07-20 20:41:47 -04:00
msg . reply ( 'Skipping `' + audio + '`...' ) ;
2020-07-20 17:12:55 -04:00
dispatcher . pause ( ) ;
2020-07-20 21:00:08 -04:00
dispatcher = null ;
2020-07-20 17:12:55 -04:00
playAudio ( ) ;
}
2020-07-18 20:45:06 -04:00
if ( command == 'leave' ) {
2020-07-21 17:13:52 -04:00
voiceChannel = client . channels . cache . get ( config . voiceChannel ) ;
if ( ! voiceChannel ) return console . error ( 'The voice channel does not exist!\n(Have you looked at your configuration?)' ) ;
2020-07-20 20:41:47 -04:00
msg . reply ( 'Leaving voice channel.' ) ;
2020-07-20 16:02:49 -04:00
console . log ( 'Leaving voice channel.' ) ;
2020-07-20 21:02:26 -04:00
dispatcher . destroy ( ) ;
2020-07-21 17:13:52 -04:00
voiceChannel . leave ( ) ;
2020-07-18 19:28:42 -04:00
}
2020-07-20 00:11:36 -04:00
2020-07-20 16:22:28 -04:00
if ( command == 'stop' ) {
2020-07-20 20:41:47 -04:00
await msg . reply ( 'Powering off...' ) ;
2020-07-20 16:22:28 -04:00
console . log ( 'Powering off...' ) ;
client . destroy ( ) ;
process . exit ( 0 ) ;
}
2020-07-21 16:59:55 -04:00
} ) ;