| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 | 
							- import { createRequire } from 'module';
 
- import pg from 'pg';
 
- const require = createRequire(import.meta.url);
 
- const {defaultSettings} = require('./util/default.json');
 
- const db = new pg.Client();
 
- db.on( 'error', dberror => {
 
- 	console.log( '- Error while connecting to the database: ' + dberror );
 
- } );
 
- const schema = [`
 
- BEGIN TRANSACTION;
 
- CREATE TABLE patreons (
 
-     patreon TEXT    PRIMARY KEY
 
-                     UNIQUE
 
-                     NOT NULL,
 
-     count   INTEGER NOT NULL
 
- );
 
- CREATE INDEX idx_patreons_patreon ON patreons (
 
-     patreon
 
- );
 
- CREATE TABLE discord (
 
-     main    TEXT    UNIQUE
 
-                     CHECK (main = guild),
 
-     guild   TEXT    NOT NULL
 
-                     REFERENCES discord (main) ON DELETE CASCADE,
 
-     channel TEXT,
 
-     wiki    TEXT    NOT NULL
 
-                     DEFAULT '${defaultSettings.wiki}',
 
-     lang    TEXT    NOT NULL
 
-                     DEFAULT '${defaultSettings.lang}',
 
-     role    TEXT,
 
-     inline  INTEGER,
 
-     prefix  TEXT    NOT NULL
 
-                     DEFAULT '${process.env.prefix}',
 
-     patreon TEXT    REFERENCES patreons (patreon) ON DELETE SET NULL,
 
-     voice   INTEGER,
 
-     UNIQUE (
 
-         guild,
 
-         channel
 
-     )
 
- );
 
- CREATE INDEX idx_discord_channel ON discord (
 
-     guild,
 
-     channel DESC
 
-             NULLS LAST
 
- );
 
- CREATE INDEX idx_discord_patreon ON discord (
 
-     patreon
 
- )
 
- WHERE patreon IS NOT NULL;
 
- CREATE INDEX idx_discord_voice ON discord (
 
-     voice
 
- )
 
- WHERE voice IS NOT NULL;
 
- CREATE TABLE verification (
 
-     guild      TEXT    NOT NULL
 
-                        REFERENCES discord (main) ON DELETE CASCADE,
 
-     configid   INTEGER NOT NULL,
 
-     channel    TEXT    NOT NULL,
 
-     role       TEXT    NOT NULL,
 
-     editcount  INTEGER NOT NULL
 
-                        DEFAULT 0,
 
-     postcount  INTEGER DEFAULT 0,
 
-     usergroup  TEXT    NOT NULL
 
-                        DEFAULT 'user',
 
-     accountage INTEGER NOT NULL
 
-                        DEFAULT 0,
 
-     rename     INTEGER NOT NULL
 
-                        DEFAULT 0,
 
-     UNIQUE (
 
-         guild,
 
-         configid
 
-     )
 
- );
 
- CREATE INDEX idx_verification_config ON verification (
 
-     guild,
 
-     configid ASC,
 
-     channel
 
- );
 
- CREATE TABLE verifynotice (
 
-     guild      TEXT    UNIQUE
 
-                        NOT NULL
 
-                        REFERENCES discord (main) ON DELETE CASCADE,
 
-     logchannel TEXT,
 
-     onsuccess  TEXT,
 
-     onmatch    TEXT,
 
-     flags      INTEGER NOT NULL
 
-                        DEFAULT 0
 
- );
 
- CREATE INDEX idx_verifynotice_guild ON verifynotice (
 
-     guild
 
- );
 
- CREATE TABLE oauthusers (
 
-     userid TEXT NOT NULL,
 
-     site   TEXT NOT NULL,
 
-     token  TEXT,
 
-     UNIQUE (
 
-         userid,
 
-         site
 
-     )
 
- );
 
- CREATE INDEX idx_oauthusers_userid ON oauthusers (
 
-     userid,
 
-     site
 
- );
 
- CREATE TABLE rcgcdw (
 
-     guild    TEXT    NOT NULL
 
-                      REFERENCES discord (main) ON DELETE CASCADE,
 
-     configid INTEGER NOT NULL,
 
-     webhook  TEXT    NOT NULL
 
-                      UNIQUE,
 
-     wiki     TEXT    NOT NULL,
 
-     lang     TEXT    NOT NULL
 
-                      DEFAULT '${defaultSettings.lang}',
 
-     display  INTEGER NOT NULL
 
-                      DEFAULT 1,
 
-     rcid     INTEGER,
 
-     postid   TEXT    DEFAULT '-1',
 
-     UNIQUE (
 
-         guild,
 
-         configid
 
-     )
 
- );
 
- CREATE INDEX idx_rcgcdw_wiki ON rcgcdw (
 
-     wiki
 
- );
 
- CREATE INDEX idx_rcgcdw_webhook ON rcgcdw (
 
-     webhook
 
- );
 
- CREATE INDEX idx_rcgcdw_config ON rcgcdw (
 
-     guild,
 
-     configid ASC
 
- );
 
- CREATE TABLE blocklist (
 
-     wiki   TEXT UNIQUE
 
-                 NOT NULL,
 
-     reason TEXT
 
- );
 
- CREATE INDEX idx_blocklist_wiki ON blocklist (
 
-     wiki
 
- );
 
- COMMIT TRANSACTION;
 
- ALTER DATABASE "${process.env.PGDATABASE}" SET my.version TO 4;
 
- `,`
 
- BEGIN TRANSACTION;
 
- CREATE TABLE verifynotice (
 
-     guild      TEXT UNIQUE
 
-                     NOT NULL
 
-                     REFERENCES discord (main) ON DELETE CASCADE,
 
-     logchannel TEXT,
 
-     onsuccess  TEXT,
 
-     onmatch    TEXT
 
- );
 
- CREATE INDEX idx_verifynotice_guild ON verifynotice (
 
-     guild
 
- );
 
- COMMIT TRANSACTION;
 
- ALTER DATABASE "${process.env.PGDATABASE}" SET my.version TO 2;
 
- `,`
 
- BEGIN TRANSACTION;
 
- ALTER TABLE verifynotice
 
- ADD COLUMN flags INTEGER NOT NULL DEFAULT 0;
 
- COMMIT TRANSACTION;
 
- ALTER DATABASE "${process.env.PGDATABASE}" SET my.version TO 3;
 
- `,`
 
- BEGIN TRANSACTION;
 
- CREATE TABLE oauthusers (
 
-     userid TEXT NOT NULL,
 
-     site   TEXT NOT NULL,
 
-     token  TEXT,
 
-     UNIQUE (
 
-         userid,
 
-         site
 
-     )
 
- );
 
- CREATE INDEX idx_oauthusers_userid ON oauthusers (
 
-     userid,
 
-     site
 
- );
 
- COMMIT TRANSACTION;
 
- ALTER DATABASE "${process.env.PGDATABASE}" SET my.version TO 4;
 
- `];
 
- export default await db.connect().then( () => {
 
- 	return db.query( 'SELECT CURRENT_SETTING($1, $2) AS version', ['my.version', true] ).then( ({rows:[row]}) => {
 
- 		if ( row.version === null ) {
 
- 			return db.query( schema[0] ).then( () => {
 
- 				console.log( '- The database has been updated to: v' + schema.length );
 
- 			}, dberror => {
 
- 				console.log( '- Error while updating the database: ' + dberror );
 
- 				return Promise.reject();
 
- 			} );
 
- 		}
 
- 		row.version = parseInt(row.version, 10);
 
- 		if ( isNaN(row.version) || row.version > schema.length ) {
 
- 			console.log( '- Invalid database version: v' + row.version );
 
- 			return Promise.reject();
 
- 		}
 
- 		if ( row.version === schema.length ) {
 
- 			console.log( '- The database is up to date: v' + row.version );
 
- 			return;
 
- 		}
 
- 		console.log( '- The database is outdated: v' + row.version );
 
- 		if ( process.env.READONLY ) return Promise.reject();
 
- 		return db.query( schema.filter( (sql, version) => {
 
- 			if ( row.version === 0 ) return ( version === 0 );
 
- 			return ( row.version <= version );
 
- 		} ).join('\n') ).then( () => {
 
- 			console.log( '- The database has been updated to: v' + schema.length );
 
- 		}, dberror => {
 
- 			console.log( '- Error while updating the database: ' + dberror );
 
- 			return Promise.reject();
 
- 		} );
 
- 	}, dberror => {
 
- 		console.log( '- Error while getting the database version: ' + dberror );
 
- 		return Promise.reject();
 
- 	} );
 
- }, dberror => {
 
- 	console.log( '- Error while connecting to the database: ' + dberror );
 
- 	return Promise.reject();
 
- } ).then( () => {
 
- 	db.end().catch( dberror => {
 
- 		console.log( '- Error while closing the database connection: ' + dberror );
 
- 	} );
 
- }, () => {
 
- 	return db.end().then( () => {
 
- 		console.log( '- Closed the database connection.' );
 
- 	}, dberror => {
 
- 		console.log( '- Error while closing the database connection: ' + dberror );
 
- 	} ).then( () => {
 
- 		process.exit(1);
 
- 	} );
 
- } );
 
 
  |