settings.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. const {defaultSettings} = require('../util/default.json');
  2. const Lang = require('../util/i18n.js');
  3. const allLangs = Lang.allLangs();
  4. var db = require('../util/database.js');
  5. var allSites = [];
  6. const getAllSites = require('../util/allSites.js');
  7. getAllSites.then( sites => allSites = sites );
  8. function cmd_settings(lang, msg, args, line, wiki) {
  9. if ( !allSites.length ) getAllSites.get().then( sites => allSites = sites );
  10. if ( !msg.isAdmin() ) return msg.reactEmoji('❌');
  11. db.all( 'SELECT channel, lang, wiki, prefix, inline FROM discord WHERE guild = ? ORDER BY channel DESC', [msg.guild.id], (error, rows) => {
  12. if ( error ) {
  13. console.log( '- Error while getting the settings: ' + error );
  14. msg.reactEmoji('error', true);
  15. return error;
  16. }
  17. var guild = rows.find( row => !row.channel );
  18. if ( !guild ) guild = Object.assign({prefix: process.env.prefix}, defaultSettings);
  19. var prefix = guild.prefix;
  20. var text = lang.get('settings.missing').replaceSave( '%1$s', '`' + prefix + 'settings lang`' ).replaceSave( '%2$s', '`' + prefix + 'settings wiki`' );
  21. if ( rows.length ) {
  22. text = lang.get('settings.current') + '\n' + lang.get('settings.currentlang') + ' `' + allLangs.names[guild.lang][1] + '` - `' + prefix + 'settings lang`';
  23. if ( msg.guild.id in patreons ) text += '\n' + lang.get('settings.currentprefix') + ' `' + prefix.replace( / $/, '·' ) + '` - `' + prefix + 'settings prefix`';
  24. text += '\n' + lang.get('settings.currentinline') + ' ' + ( guild.inline ? '~~' : '' ) + '`[[' + lang.get('search.page') + ']]`' + ( guild.inline ? '~~' : '' ) + ' - `' + prefix + 'settings inline`';
  25. text += '\n' + lang.get('settings.currentwiki') + ' ' + guild.wiki + ' - `' + prefix + 'settings wiki`';
  26. text += '\n' + lang.get('settings.currentchannel') + ' `' + prefix + 'settings channel`\n';
  27. if ( rows.length === 1 ) text += lang.get('settings.nochannels');
  28. else text += rows.filter( row => row !== guild ).map( row => '<#' + row.channel + '>: ' + ( msg.guild.id in patreons ? '`' + allLangs.names[row.lang][1] + '` - ' : '' ) + '<' + row.wiki + '>' + ( msg.guild.id in patreons ? ' - ' + ( row.inline ? '~~' : '' ) + '`[[' + lang.get('search.page') + ']]`' + ( row.inline ? '~~' : '' ) : '' ) ).join('\n');
  29. }
  30. if ( !args.length ) {
  31. return msg.replyMsg( text, {split:true}, true );
  32. }
  33. var prelang = '';
  34. args[0] = args[0].toLowerCase();
  35. if ( args[0] === 'channel' ) {
  36. prelang = 'channel ';
  37. if ( !rows.length ) return msg.replyMsg( text, {split:true}, true );
  38. var channel = rows.find( row => row.channel === msg.channel.id );
  39. if ( !channel ) channel = Object.assign({channel:msg.channel.id}, guild);
  40. text = lang.get('settings.' + prelang + 'current');
  41. if ( msg.guild.id in patreons ) {
  42. text += '\n' + lang.get('settings.currentlang') + ' `' + allLangs.names[channel.lang][1] + '` - `' + prefix + 'settings channel lang`';
  43. text += '\n' + lang.get('settings.currentinline') + ' ' + ( channel.inline ? '~~' : '' ) + '`[[' + lang.get('search.page') + ']]`' + ( channel.inline ? '~~' : '' ) + ' - `' + prefix + 'settings channel inline`';
  44. }
  45. text += '\n' + lang.get('settings.currentwiki') + ' ' + channel.wiki + ' - `' + prefix + 'settings channel wiki`';
  46. if ( !args[1] ) return msg.replyMsg( text, {}, true );
  47. args[0] = args[1].toLowerCase();
  48. args[1] = args.slice(2).join(' ').toLowerCase().trim().replace( /^<\s*(.*)>$/, '$1' );
  49. }
  50. else args[1] = args.slice(1).join(' ').toLowerCase().trim().replace( /^<\s*(.*)>$/, '$1' );
  51. if ( args[0] === 'wiki' ) {
  52. prelang += 'wiki';
  53. var wikihelp = '\n' + lang.get('settings.wikihelp').replaceSave( '%s', prefix + 'settings ' + prelang );
  54. if ( !args[1] ) {
  55. if ( !rows.length ) return msg.replyMsg( lang.get('settings.wikimissing') + wikihelp, {}, true );
  56. else return msg.replyMsg( lang.get('settings.' + prelang) + ' ' + ( channel || guild ).wiki + wikihelp, {}, true );
  57. }
  58. var regex = args[1].match( /^(?:https:\/\/)?([a-z\d-]{1,50}\.(?:gamepedia\.com|(?:fandom\.com|wikia\.org)(?:(?!\/wiki\/)\/[a-z-]{1,8})?))(?:\/|$)/ );
  59. if ( !regex ) {
  60. var value = args[1].split(' ');
  61. if ( value.length === 2 && value[1] === '--force' ) return msg.reactEmoji('⏳', true).then( reaction => {
  62. got.get( value[0] + 'api.php?action=query&meta=siteinfo&siprop=general|extensions&format=json', {
  63. responseType: 'json'
  64. } ).then( response => {
  65. var body = response.body;
  66. if ( response.statusCode !== 200 || !body || body.batchcomplete === undefined ) {
  67. console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + ( body && body.error && body.error.info ) );
  68. if ( reaction ) reaction.removeEmoji();
  69. msg.reactEmoji('nowiki', true);
  70. return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
  71. }
  72. var sql = 'UPDATE discord SET wiki = ? WHERE guild = ? AND wiki = ?';
  73. var sqlargs = [value[0], msg.guild.id, guild.wiki];
  74. if ( !rows.length ) {
  75. sql = 'INSERT INTO discord(wiki, guild) VALUES(?, ?)';
  76. sqlargs.pop();
  77. }
  78. if ( channel ) {
  79. sql = 'UPDATE discord SET wiki = ? WHERE guild = ? AND channel = ?';
  80. sqlargs[2] = msg.channel.id;
  81. if ( !rows.includes( channel ) ) {
  82. if ( channel.wiki === value[0] ) {
  83. if ( reaction ) reaction.removeEmoji();
  84. return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + channel.wiki + wikihelp, {}, true );
  85. }
  86. sql = 'INSERT INTO discord(wiki, guild, channel, lang, prefix) VALUES(?, ?, ?, ?, ?)';
  87. sqlargs.push(guild.lang, guild.prefix);
  88. }
  89. }
  90. return db.run( sql, sqlargs, function (dberror) {
  91. if ( dberror ) {
  92. console.log( '- Error while editing the settings: ' + dberror );
  93. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  94. if ( reaction ) reaction.removeEmoji();
  95. return dberror;
  96. }
  97. console.log( '- Settings successfully updated.' );
  98. if ( channel ) channel.wiki = value[0];
  99. else guild.wiki = value[0];
  100. if ( channel || !rows.some( row => row.channel === msg.channel.id ) ) wiki = value[0];
  101. if ( reaction ) reaction.removeEmoji();
  102. msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + value[0] + wikihelp, {}, true );
  103. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
  104. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join('|') + ')', channels, function (delerror) {
  105. if ( delerror ) {
  106. console.log( '- Error while removing the settings: ' + delerror );
  107. return delerror;
  108. }
  109. console.log( '- Settings successfully removed.' );
  110. } );
  111. } );
  112. }, ferror => {
  113. console.log( '- Error while testing the wiki: ' + ferror );
  114. if ( reaction ) reaction.removeEmoji();
  115. msg.reactEmoji('nowiki', true);
  116. return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
  117. } );
  118. } );
  119. if ( allSites.some( site => site.wiki_domain === value.join('') + '.gamepedia.com' ) ) {
  120. regex = ['https://' + value.join('') + '.gamepedia.com/',value.join('') + '.gamepedia.com'];
  121. }
  122. else if ( /^(?:[a-z-]{1,8}\.)?[a-z\d-]{1,50}$/.test(value.join('')) ) {
  123. if ( !value.join('').includes( '.' ) ) regex = ['https://' + value.join('') + '.fandom.com/',value.join('') + '.fandom.com'];
  124. else regex = ['https://' + value.join('').split('.')[1] + '.fandom.com/' + value.join('').split('.')[0] + '/',value.join('').split('.')[1] + '.fandom.com/' + value.join('').split('.')[0]];
  125. } else {
  126. var text = lang.get('settings.wikiinvalid') + wikihelp;
  127. var sites = allSites.filter( site => site.wiki_display_name.toLowerCase().includes( value.join(' ') ) );
  128. if ( 0 < sites.length && sites.length < 21 ) {
  129. text += '\n\n' + lang.get('settings.foundwikis') + '\n' + sites.map( site => site.wiki_display_name + ': `' + site.wiki_domain + '`' ).join('\n');
  130. }
  131. return msg.replyMsg( text, {split:true}, true );
  132. }
  133. }
  134. var sql = 'UPDATE discord SET wiki = ? WHERE guild = ? AND wiki = ?';
  135. var sqlargs = ['https://' + regex[1] + '/', msg.guild.id, guild.wiki];
  136. if ( !rows.length ) {
  137. sql = 'INSERT INTO discord(wiki, guild) VALUES(?, ?)';
  138. sqlargs.pop();
  139. }
  140. if ( channel ) {
  141. sql = 'UPDATE discord SET wiki = ? WHERE guild = ? AND channel = ?';
  142. sqlargs[2] = msg.channel.id;
  143. if ( !rows.includes( channel ) ) {
  144. if ( channel.wiki === 'https://' + regex[1] + '/' ) {
  145. return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + channel.wiki + wikihelp, {}, true );
  146. }
  147. sql = 'INSERT INTO discord(wiki, guild, channel, lang, prefix) VALUES(?, ?, ?, ?, ?)';
  148. sqlargs.push(guild.lang, guild.prefix);
  149. }
  150. }
  151. return db.run( sql, sqlargs, function (dberror) {
  152. if ( dberror ) {
  153. console.log( '- Error while editing the settings: ' + dberror );
  154. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  155. return dberror;
  156. }
  157. console.log( '- Settings successfully updated.' );
  158. if ( channel ) channel.wiki = 'https://' + regex[1] + '/';
  159. else guild.wiki = 'https://' + regex[1] + '/';
  160. if ( channel || !rows.some( row => row.channel === msg.channel.id ) ) wiki = 'https://' + regex[1] + '/';
  161. msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' https://' + regex[1] + '/' + wikihelp, {}, true );
  162. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
  163. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join('|') + ')', channels, function (delerror) {
  164. if ( delerror ) {
  165. console.log( '- Error while removing the settings: ' + delerror );
  166. return delerror;
  167. }
  168. console.log( '- Settings successfully removed.' );
  169. } );
  170. } );
  171. }
  172. if ( args[0] === 'lang' ) {
  173. if ( channel && !( msg.guild.id in patreons ) ) return msg.replyMsg( lang.get('patreon') + ' <' + process.env.patreon + '>', {}, true );
  174. prelang += 'lang';
  175. var langhelp = '\n' + lang.get('settings.langhelp').replaceSave( '%s', prefix + 'settings ' + prelang ) + ' `' + Object.values(allLangs.names).map( val => val[0] ).join('`, `') + '`';
  176. if ( !args[1] ) {
  177. return msg.replyMsg( lang.get('settings.' + prelang) + ' `' + allLangs.names[( channel || guild ).lang][1] + '`' + langhelp, {}, true );
  178. }
  179. if ( !( args[1] in allLangs.map ) ) {
  180. return msg.replyMsg( lang.get('settings.langinvalid') + langhelp, {}, true );
  181. }
  182. var sql = 'UPDATE discord SET lang = ? WHERE guild = ? AND lang = ?';
  183. var sqlargs = [allLangs.map[args[1]], msg.guild.id, guild.lang];
  184. if ( !rows.length ) {
  185. sql = 'INSERT INTO discord(lang, guild) VALUES(?, ?)';
  186. sqlargs.pop();
  187. }
  188. if ( channel ) {
  189. sql = 'UPDATE discord SET lang = ? WHERE guild = ? AND channel = ?';
  190. sqlargs[2] = msg.channel.id;
  191. if ( !rows.includes( channel ) ) {
  192. if ( channel.lang === allLangs.map[args[1]] ) {
  193. return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' `' + allLangs.names[channel.lang][1] + '`' + langhelp, {}, true );
  194. }
  195. sql = 'INSERT INTO discord(lang, guild, channel, wiki, prefix) VALUES(?, ?, ?, ?, ?)';
  196. sqlargs.push(guild.wiki, guild.prefix);
  197. }
  198. }
  199. return db.run( sql, sqlargs, function (dberror) {
  200. if ( dberror ) {
  201. console.log( '- Error while editing the settings: ' + dberror );
  202. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  203. return dberror;
  204. }
  205. console.log( '- Settings successfully updated.' );
  206. if ( channel ) channel.lang = allLangs.map[args[1]];
  207. else {
  208. guild.lang = allLangs.map[args[1]];
  209. if ( msg.guild.id in voice ) voice[msg.guild.id] = guild.lang;
  210. }
  211. if ( channel || !( msg.guild.id in patreons ) || !rows.some( row => row.channel === msg.channel.id ) ) lang = new Lang(allLangs.map[args[1]]);
  212. msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' `' + allLangs.names[allLangs.map[args[1]]][1] + '`\n' + lang.get('settings.langhelp').replaceSave( '%s', prefix + 'settings ' + prelang ) + ' `' + Object.values(allLangs.names).join('`, `') + '`', {}, true );
  213. var channels = rows.filter( row => row.channel && row.lang === lang.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
  214. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join('|') + ')', channels, function (delerror) {
  215. if ( delerror ) {
  216. console.log( '- Error while removing the settings: ' + delerror );
  217. return delerror;
  218. }
  219. console.log( '- Settings successfully removed.' );
  220. } );
  221. } );
  222. }
  223. if ( args[0] === 'prefix' && !channel ) {
  224. if ( !( msg.guild.id in patreons ) ) {
  225. return msg.replyMsg( lang.get('patreon') + ' <' + process.env.patreon + '>', {}, true );
  226. }
  227. var prefixhelp = '\n' + lang.get('settings.prefixhelp').replaceSave( '%s', prefix + 'settings prefix' );
  228. args[1] = args[1].replace( /(?<!\\)_$/, ' ' ).replace( /\\([_\W])/g, '$1' );
  229. if ( !args[1].trim() ) {
  230. return msg.replyMsg( lang.get('settings.prefix') + ' `' + prefix.replace( / $/, '·' ) + '`' + prefixhelp, {}, true );
  231. }
  232. if ( args[1].includes( '`' ) || args[1].length > 100 ) {
  233. return msg.replyMsg( lang.get('settings.prefixinvalid') + prefixhelp, {}, true );
  234. }
  235. if ( args[1] === 'reset' || args[1] === 'default' ) args[1] = process.env.prefix;
  236. var sql = 'UPDATE discord SET prefix = ? WHERE guild = ?';
  237. var sqlargs = [args[1], msg.guild.id];
  238. if ( !rows.length ) {
  239. sql = 'INSERT INTO discord(prefix, guild) VALUES(?, ?)';
  240. }
  241. return db.run( sql, sqlargs, function (dberror) {
  242. if ( dberror ) {
  243. console.log( '- Error while editing the settings: ' + dberror );
  244. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  245. return dberror;
  246. }
  247. console.log( '- Settings successfully updated.' );
  248. guild.prefix = args[1];
  249. msg.client.shard.broadcastEval( `global.patreons['${msg.guild.id}'] = '${args[1]}'` );
  250. msg.replyMsg( lang.get('settings.prefixchanged') + ' `' + args[1].replace( / $/, '·' ) + '`\n' + lang.get('settings.prefixhelp').replaceSave( '%s', args[1] + 'settings prefix' ), {}, true );
  251. } );
  252. }
  253. if ( args[0] === 'inline' ) {
  254. if ( channel && !( msg.guild.id in patreons ) ) return msg.replyMsg( lang.get('patreon') + ' <' + process.env.patreon + '>', {}, true );
  255. prelang += 'inline';
  256. var toggle = 'inline ' + ( ( channel || guild ).inline ? 'disabled' : 'enabled' );
  257. var inlinehelp = '\n' + lang.get('settings.' + toggle + '.help').replaceSave( '%1$s', prefix + 'settings ' + prelang + ' toggle' ).replaceSave( /%2\$s/g, lang.get('search.page') );
  258. if ( args[1] !== 'toggle' ) {
  259. return msg.replyMsg( lang.get('settings.' + toggle + '.' + prelang) + inlinehelp, {}, true );
  260. }
  261. var value = ( ( channel || guild ).inline ? null : 1 );
  262. var sql = 'UPDATE discord SET inline = ? WHERE guild = ?';
  263. var sqlargs = [value, msg.guild.id];
  264. if ( !rows.length ) {
  265. sql = 'INSERT INTO discord(inline, guild) VALUES(?, ?)';
  266. }
  267. if ( channel ) {
  268. sql = 'UPDATE discord SET inline = ? WHERE guild = ? AND channel = ?';
  269. sqlargs.push(msg.channel.id);
  270. if ( !rows.includes( channel ) ) {
  271. sql = 'INSERT INTO discord(inline, guild, channel, wiki, prefix) VALUES(?, ?, ?, ?, ?)';
  272. sqlargs.push(guild.wiki, guild.prefix);
  273. }
  274. }
  275. return db.run( sql, sqlargs, function (dberror) {
  276. if ( dberror ) {
  277. console.log( '- Error while editing the settings: ' + dberror );
  278. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  279. return dberror;
  280. }
  281. console.log( '- Settings successfully updated.' );
  282. if ( channel ) channel.inline = value;
  283. else guild.inline = value;
  284. toggle = 'inline ' + ( ( channel || guild ).inline ? 'disabled' : 'enabled' );
  285. msg.replyMsg( lang.get('settings.' + toggle + '.' + prelang + 'changed') + '\n' + lang.get('settings.' + toggle + '.help').replaceSave( '%1$s', prefix + 'settings ' + prelang + ' toggle' ).replaceSave( /%2\$s/g, lang.get('search.page') ), {}, true );
  286. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.inline === guild.inline ).map( row => row.channel );
  287. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join('|') + ')', channels, function (delerror) {
  288. if ( delerror ) {
  289. console.log( '- Error while removing the settings: ' + delerror );
  290. return delerror;
  291. }
  292. console.log( '- Settings successfully removed.' );
  293. } );
  294. } );
  295. }
  296. return msg.replyMsg( text, {split:true}, true );
  297. } );
  298. }
  299. module.exports = {
  300. name: 'settings',
  301. everyone: true,
  302. pause: true,
  303. owner: false,
  304. run: cmd_settings
  305. };