2020-12-19 00:50:25 +00:00
const collections = require ( "../collections.js" ) ;
const logger = require ( "../logger.js" ) ;
const { Pool } = require ( "pg" ) ;
2021-06-29 19:10:22 +00:00
const connection = new Pool ( {
2021-08-10 23:35:26 +00:00
connectionString : process . env . DB ,
statement _timeout : 10000
2020-12-19 00:50:25 +00:00
} ) ;
exports . getGuild = async ( query ) => {
2021-08-11 21:54:43 +00:00
return ( await connection . query ( "SELECT * FROM guilds WHERE guild_id = $1" , [ query ] ) ) . rows [ 0 ] ;
2020-12-19 00:50:25 +00:00
} ;
exports . setPrefix = async ( prefix , guild ) => {
await connection . query ( "UPDATE guilds SET prefix = $1 WHERE guild_id = $2" , [ prefix , guild . id ] ) ;
collections . prefixCache . set ( guild . id , prefix ) ;
} ;
2021-08-11 01:25:29 +00:00
exports . getTags = async ( guild ) => {
const tagArray = ( await connection . query ( "SELECT * FROM tags WHERE guild_id = $1" , [ guild ] ) ) . rows ;
const tags = { } ;
for ( const tag of tagArray ) {
tags [ tag . name ] = { content : tag . content , author : tag . author } ;
}
return tags ;
} ;
2020-12-19 00:50:25 +00:00
exports . setTag = async ( name , content , guild ) => {
2021-08-11 01:25:29 +00:00
await connection . query ( "INSERT INTO tags (guild_id, name, content, author) VALUES ($1, $2, $3, $4)" , [ guild . id , name , content . content , content . author ] ) ;
} ;
exports . editTag = async ( name , content , guild ) => {
await connection . query ( "UPDATE tags SET content = $1, author = $2 WHERE guild_id = $3 AND name = $4" , [ content . content , content . author , guild . id , name ] ) ;
2020-12-19 00:50:25 +00:00
} ;
exports . removeTag = async ( name , guild ) => {
2021-08-11 01:25:29 +00:00
await connection . query ( "DELETE FROM tags WHERE guild_id = $1 AND name = $2" , [ guild . id , name ] ) ;
2020-12-19 00:50:25 +00:00
} ;
2021-08-13 03:28:09 +00:00
exports . disableCommand = async ( guild , command ) => {
const guildDB = await this . getGuild ( guild ) ;
await connection . query ( "UPDATE guilds SET disabled_commands = $1 WHERE guild_id = $2" , [ ( guildDB . disabled _commands ? [ ... guildDB . disabled _commands , command ] : [ command ] ) . filter ( ( v ) => v !== undefined ) , guild ] ) ;
collections . disabledCmdCache . set ( guild , guildDB . disabled _commands ? [ ... guildDB . disabled _commands , command ] : [ command ] . filter ( ( v ) => v !== undefined ) ) ;
} ;
exports . enableCommand = async ( guild , command ) => {
const guildDB = await this . getGuild ( guild ) ;
const newDisabled = guildDB . disabled _commands ? guildDB . disabled _commands . filter ( item => item !== command ) : [ ] ;
await connection . query ( "UPDATE guilds SET disabled_commands = $1 WHERE guild_id = $2" , [ newDisabled , guild ] ) ;
collections . disabledCmdCache . set ( guild , newDisabled ) ;
2020-12-19 00:50:25 +00:00
} ;
exports . disableChannel = async ( channel ) => {
const guildDB = await this . getGuild ( channel . guild . id ) ;
await connection . query ( "UPDATE guilds SET disabled = $1 WHERE guild_id = $2" , [ [ ... guildDB . disabled , channel . id ] , channel . guild . id ] ) ;
2021-07-01 13:01:00 +00:00
collections . disabledCache . set ( channel . guild . id , [ ... guildDB . disabled , channel . id ] ) ;
2020-12-19 00:50:25 +00:00
} ;
exports . enableChannel = async ( channel ) => {
const guildDB = await this . getGuild ( channel . guild . id ) ;
const newDisabled = guildDB . disabled . filter ( item => item !== channel . id ) ;
await connection . query ( "UPDATE guilds SET disabled = $1 WHERE guild_id = $2" , [ newDisabled , channel . guild . id ] ) ;
2021-07-01 13:01:00 +00:00
collections . disabledCache . set ( channel . guild . id , newDisabled ) ;
2020-12-19 00:50:25 +00:00
} ;
exports . getCounts = async ( ) => {
const counts = await connection . query ( "SELECT * FROM counts" ) ;
2021-05-03 13:49:55 +00:00
//const countArray = [];
const countObject = { } ;
2020-12-19 00:50:25 +00:00
for ( const { command , count } of counts . rows ) {
2021-05-03 13:49:55 +00:00
countObject [ command ] = count ;
2020-12-19 00:50:25 +00:00
}
2021-05-03 13:49:55 +00:00
return countObject ;
2020-12-19 00:50:25 +00:00
} ;
exports . addCount = async ( command ) => {
2021-08-11 21:54:43 +00:00
let count = await connection . query ( "SELECT * FROM counts WHERE command = $1" , [ command ] ) ;
2021-04-01 03:16:23 +00:00
if ( ! count . rows [ 0 ] ) {
await connection . query ( "INSERT INTO counts (command, count) VALUES ($1, $2)" , [ command , 0 ] ) ;
2021-08-11 21:54:43 +00:00
count = await connection . query ( "SELECT * FROM counts WHERE command = $1" , [ command ] ) ;
2021-04-01 03:16:23 +00:00
}
2021-01-08 18:08:10 +00:00
await connection . query ( "UPDATE counts SET count = $1 WHERE command = $2" , [ count . rows [ 0 ] . count ? count . rows [ 0 ] . count + 1 : 1 , command ] ) ;
2020-12-19 00:50:25 +00:00
} ;
exports . addGuild = async ( guild ) => {
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 query = await this . getGuild ( guild ) ;
if ( query ) return query ;
2021-08-13 03:28:09 +00:00
await connection . query ( "INSERT INTO guilds (guild_id, prefix, disabled, disabled_commands) VALUES ($1, $2, $3, $4)" , [ guild . id , process . env . PREFIX , [ ] , [ ] ] ) ;
2020-12-19 00:50:25 +00:00
return await this . getGuild ( guild . id ) ;
} ;
exports . fixGuild = async ( guild ) => {
2021-08-09 15:12:48 +00:00
const guildDB = await connection . query ( "SELECT exists(SELECT 1 FROM guilds WHERE guild_id = $1)" , [ guild . id ] ) ;
2021-08-09 15:48:43 +00:00
if ( ! guildDB . rows [ 0 ] . exists ) {
2020-12-19 00:50:25 +00:00
logger . log ( ` Registering guild database entry for guild ${ guild . id } ... ` ) ;
return await this . addGuild ( guild ) ;
}
} ;
exports . setup = async ( ) => {
let counts ;
try {
counts = await connection . query ( "SELECT * FROM counts" ) ;
} catch {
counts = { rows : [ ] } ;
}
if ( ! counts . rows [ 0 ] ) {
for ( const command of collections . commands . keys ( ) ) {
await connection . query ( "INSERT INTO counts (command, count) VALUES ($1, $2)" , [ command , 0 ] ) ;
}
} else {
const exists = [ ] ;
for ( const command of collections . commands . keys ( ) ) {
const count = await connection . query ( "SELECT * FROM counts WHERE command = $1" , [ command ] ) ;
if ( ! count . rows [ 0 ] ) {
await connection . query ( "INSERT INTO counts (command, count) VALUES ($1, $2)" , [ command , 0 ] ) ;
}
exists . push ( command ) ;
}
for ( const { command } of counts . rows ) {
if ( ! exists . includes ( command ) ) {
await connection . query ( "DELETE FROM counts WHERE command = $1" , [ command ] ) ;
}
}
}
2020-12-19 00:57:41 +00:00
} ;
exports . stop = async ( ) => {
await connection . end ( ) ;
2020-12-19 00:50:25 +00:00
} ;