@ -1,9 +1,11 @@
const cmd = require ( './cmd' ) ,
music = require ( './music' ) ,
data = require ( './data ') ,
utils = require ( './utils.js ') ,
config = require ( '../config.json' ) ,
servercmd = require ( '../commands/servercommands' ) ,
handlers = { } ;
sqlite3 = require ( 'sqlite3' ) ,
handlers = { } ,
dbDir = './data/gdb' ;
let logger = require ( 'winston' ) ;
exports . setLogger = function ( newLogger ) {
@ -11,61 +13,65 @@ exports.setLogger = function (newLogger) {
music . setLogger ( logger ) ;
} ;
/ * *
* Server - Specific commands , music and more
* @ type { GuildHandler }
* /
exports . GuildHandler = class {
constructor ( guild , prefix ) {
this . guild = guild ;
this . dataHandler = new data . DataHandler ( guild . name ) ;
this . dj = null ;
this . mention = false ;
this . prefix = prefix || config . prefix ;
this . servant = new cmd . Servant ( this . prefix ) ;
utils . dirExistence ( './data' , ( ) => {
utils . dirExistence ( './data/gdb' , ( ) => {
this . db = new sqlite3 . Database ( ` ./data/gdb/ ${ guild } .db ` ) ;
this . createTables ( ) ;
} )
} ) ;
this . registerMusicCommands ( ) ;
}
/ * *
* function shortcut returns the data from the dataHandler
* @ param name
* @ returns { { } }
* /
getData ( name ) {
return this . dataHandler . getData ( name ) ;
}
/ * *
* appends data to the data handler
* @ param name
* @ param key
* @ param value
* /
appendData ( name , key , value ) {
let data = this . getData ( name ) ;
data [ key ] = value ;
this . dataHandler . setData ( name , data ) ;
}
/ * *
* deletes an entry from the data handler
* @ param name
* @ param key
* Creates all tables needed in the Database .
* These are at the moment :
* messages - logs all messages send on the server
* playlists - save playlists to play them later
* /
deleteDataEntry ( name , key ) {
let data = this . getData ( name ) ;
delete data [ key ] ;
this . dataHandler . setData ( name , data ) ;
createTables ( ) {
let createCmd = 'CREATE TABLE IF NOT EXISTS' ;
let autoIdPK = 'id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL' ;
this . db . run ( ` ${ createCmd } messages (
$ { autoIdPK } ,
creation _timestamp DATETIME NOT NULL ,
author VARCHAR ( 128 ) NOT NULL ,
author _name VARCHAR ( 128 ) ,
content TEXT NOT NULL
) ` );
this . db . run ( ` ${ createCmd } playlists (
$ { autoIdPK } ,
name VARCHAR ( 32 ) UNIQUE NOT NULL ,
url VARCHAR ( 255 ) NOT NULL
) ` );
}
/ * *
* registers all music commands and initializes a dj
* @ param cmdPrefix
* /
/ * *
* handles the message by letting the servant parse the command . Depending on the message setting it
* replies or just sends the answer .
* @ param msg
* /
handleMessage ( msg ) {
if ( this . db ) {
this . db . run (
'INSERT INTO messages (author, creation_timestamp, author_name, content) values (?, ?, ?, ?)' ,
[ msg . author . id , msg . createdTimestamp , msg . author . username , msg . content ] ,
( err ) => {
if ( err )
logger . error ( err . message ) ;
}
) ;
}
let answer = this . servant . parseCommand ( msg ) ;
if ( ! answer ) return ;
if ( this . mention ) {
@ -75,59 +81,98 @@ exports.GuildHandler = class {
}
}
/ * *
* Connect to a voice - channel if not connected and play the url
* @ param vc
* @ param url
* /
connectAndPlay ( vc , url ) {
if ( ! this . dj . connected ) {
this . dj . connect ( vc ) . then ( ( ) => {
this . dj . playYouTube ( url ) ;
} ) ;
} else {
this . dj . playYouTube ( url ) ;
}
}
/ * *
* registers all music commands and initializes a dj
* @ param cmdPrefix
* /
registerMusicCommands ( cmdPrefix ) {
let prefix = cmdPrefix || this . prefix ;
this . dj = new music . DJ ( ) ;
// play command
this . servant . createCommand ( servercmd . music . play , ( msg , argv ) => {
this . servant . createCommand ( servercmd . music . play , ( msg , kwargs, argv) => {
let vc = msg . member . voiceChannel ;
let url = argv [ 'url' ] ;
let url = kwargs [ 'url' ] ;
if ( ! vc )
return 'You are not connected to a VoiceChannel' ;
if ( ! url )
return servercmd . music . play . response . no _url ;
if ( ! url . match ( /http/g ) ) {
if ( this . getData ( 'savedplaylists' ) && this . getData ( 'savedplaylists' ) [ url ] ) {
url = this . getData ( 'savedplaylists' ) [ url ] ;
} else {
return servercmd . music . play . response . url _invalid ;
}
}
try {
if ( ! this . dj . connected ) {
this . dj . connect ( vc ) . then ( ( ) => {
this . dj . playYouTube ( url ) ;
} ) ;
} else {
this . dj . playYouTube ( url ) ;
if ( argv )
url += ' ' + argv . join ( ' ' ) ;
this . db . get ( 'SELECT url FROM playlists WHERE name = ?' , [ url ] , ( err , row ) => {
if ( err ) {
console . error ( err . message ) ;
}
if ( ! row ) {
return servercmd . music . play . response . url _invalid ;
}
url = row . url ;
try {
this . connectAndPlay ( vc , url ) ;
} catch ( err ) {
logger . error ( err . message ) ;
return servercmd . music . play . response . failure ;
}
} ) ;
} else {
try {
this . connectAndPlay ( vc , url ) ;
} catch ( err ) {
logger . error ( err . message ) ;
return servercmd . music . play . response . failure ;
}
} catch ( err ) {
logger . error ( err ) ;
return servercmd . music . play . response . failure ;
}
return servercmd . music . play . response . success ;
} ) ;
// playnext command
this . servant . createCommand ( servercmd . music . playnext , ( msg , argv ) => {
this . servant . createCommand ( servercmd . music . playnext , ( msg , kwargs, argv) => {
let vc = msg . member . voiceChannel ;
if ( ! this . dj . connected ) this . dj . voiceChannel = vc ;
let url = argv [ 'url' ] ;
let url = kwargs [ 'url' ] ;
if ( ! url ) return servercmd . music . playnext . response . no _url ;
if ( ! url . match ( /http/g ) ) {
if ( this . getData ( 'savedplaylists' ) && this . getData ( 'savedplaylists' ) [ url ] ) {
url = this . getData ( 'savedplaylists' ) [ url ] ;
} else {
return servercmd . music . playnext . response . url _invalid ;
if ( argv )
url += ' ' + argv . join ( ' ' ) ;
this . db . get ( 'SELECT url FROM playlists WHERE name = ?' , [ url ] , ( err , row ) => {
if ( err ) {
console . error ( err . message ) ;
}
if ( ! row ) {
return servercmd . music . play . response . url _invalid ;
}
url = row . url ;
try {
this . dj . playYouTube ( url , true ) ;
} catch ( err ) {
logger . error ( err . message ) ;
return servercmd . music . play . response . failure ;
}
} ) ;
} else {
try {
this . dj . playYouTube ( url , true ) ;
} catch ( err ) {
logger . error ( err ) ;
return servercmd . music . playnext . response . failure ;
}
}
try {
this . dj . playYouTube ( url , true ) ;
} catch ( err ) {
logger . error ( err ) ;
return servercmd . music . playnext . response . failure ;
}
return servercmd . music . playnext . response . success ;
} ) ;
@ -206,19 +251,42 @@ exports.GuildHandler = class {
} ) ;
// saves playlists
this . servant . createCommand ( servercmd . music . save , ( msg , argv ) => {
this . appendData ( 'savedplaylists' , argv . name , argv . url ) ;
return ` Saved song/playlist as ${ argv [ 'name' ] } `
this . servant . createCommand ( servercmd . music . save , ( msg , kwargs , argv ) => {
let saveName = argv . join ( ' ' ) ;
this . db . get ( 'SELECT COUNT(*) count FROM playlists WHERE name = ?' , [ saveName ] , ( err , row ) => {
if ( err ) {
logger . error ( err . message ) ;
}
if ( ! row || row . count === 0 ) {
this . db . run ( 'INSERT INTO playlists (name, url) VALUES (?, ?)' , [ saveName , kwargs . url ] , ( err ) => {
if ( err )
logger . error ( err . message ) ;
} ) ;
} else {
this . db . run ( 'UPDATE playlists SET url = ? WHERE name = ?' , [ kwargs . url , saveName ] , ( err ) => {
if ( err )
logger . error ( err . message ) ;
} ) ;
}
} ) ;
return ` Saved song/playlist as ${ saveName } `
} ) ;
// saved command - prints out saved playlists
this . servant . createCommand ( servercmd . music . saved , ( ) => {
this . servant . createCommand ( servercmd . music . saved , ( msg ) => {
let response = '```markdown\nSaved Playlists:\n==\n' ;
Object . entries ( this . getData ( 'savedplaylists' ) ) . forEach ( ( [ key , value ] ) => {
response += ` ${ key . padEnd ( 10 , ' ' ) } ${ value } \n \n ` ;
this . db . all ( 'SELECT name, url FROM playlists' , ( err , rows ) => {
if ( err )
logger . error ( err . message ) ;
for ( let row of rows ) {
response += ` ${ row . name . padEnd ( 10 , ' ' ) } : ${ row . url } \n \n ` ;
}
response += '```' ;
if ( rows . length === 0 )
msg . channel . send ( servercmd . music . saved . response . no _saved ) ;
else
msg . channel . send ( response ) ;
} ) ;
response += '```' ;
return response ;
} ) ;
}
} ;