Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
const fetch = require ( "node-fetch" ) ;
const { decodeEntities } = require ( "../../utils/misc.js" ) ;
const paginator = require ( "../../utils/pagination/pagination.js" ) ;
const Command = require ( "../../classes/command.js" ) ;
class YouTubeCommand extends Command {
async run ( ) {
if ( this . args . length === 0 ) return ` ${ this . message . author . mention } , you need to provide something to search for! ` ;
2021-04-30 17:31:53 +00:00
this . client . sendChannelTyping ( this . message . channel . id ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
const messages = [ ] ;
const request = await fetch ( ` https://www.googleapis.com/youtube/v3/search?part=snippet&q= ${ encodeURIComponent ( this . args . join ( " " ) ) } &key= ${ process . env . GOOGLE } &maxResults=50 ` ) ;
const result = await request . json ( ) ;
if ( result . error && result . error . code === 403 ) return ` ${ this . message . author . mention } , I've exceeded my YouTube API search quota for the day. Check back later. ` ;
for ( const [ i , value ] of result . items . entries ( ) ) {
if ( value . id . kind === "youtube#channel" ) {
messages . push ( ` Page ${ i + 1 } of ${ result . items . length } \n <:youtube:637020823005167626> ** ${ decodeEntities ( value . snippet . title ) . replaceAll ( "*" , "\\*" ) } ** \n https://youtube.com/channel/ ${ value . id . channelId } ` ) ;
} else if ( value . id . kind === "youtube#playlist" ) {
messages . push ( ` Page ${ i + 1 } of ${ result . items . length } \n <:youtube:637020823005167626> ** ${ decodeEntities ( value . snippet . title ) . replaceAll ( "*" , "\\*" ) } ** \n Created by ** ${ decodeEntities ( value . snippet . channelTitle ) . replaceAll ( "*" , "\\*" ) } ** \n https://youtube.com/playlist?list= ${ value . id . playlistId } ` ) ;
} else {
messages . push ( ` Page ${ i + 1 } of ${ result . items . length } \n <:youtube:637020823005167626> ** ${ decodeEntities ( value . snippet . title ) . replaceAll ( "*" , "\\*" ) } ** \n Uploaded by ** ${ decodeEntities ( value . snippet . channelTitle ) . replaceAll ( "*" , "\\*" ) } ** on ** ${ value . snippet . publishedAt . split ( "T" ) [ 0 ] } ** \n https://youtube.com/watch?v= ${ value . id . videoId } ` ) ;
}
}
return paginator ( this . client , this . message , messages ) ;
}
static description = "Searches YouTube" ;
static aliases = [ "yt" , "video" , "ytsearch" ] ;
static arguments = [ "[query]" ] ;
static requires = "google" ;
}
module . exports = YouTubeCommand ;