settings.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. const cheerio = require('cheerio');
  2. const {MessageEmbed} = require('discord.js');
  3. const {defaultSettings} = require('../util/default.json');
  4. const Lang = require('../util/i18n.js');
  5. const allLangs = Lang.allLangs();
  6. const Wiki = require('../util/wiki.js');
  7. var db = require('../util/database.js');
  8. /**
  9. * Processes the "settings" command.
  10. * @param {Lang} lang - The user language.
  11. * @param {import('discord.js').Message} msg - The Discord message.
  12. * @param {String[]} args - The command arguments.
  13. * @param {String} line - The command as plain text.
  14. * @param {Wiki} wiki - The wiki for the message.
  15. */
  16. function cmd_settings(lang, msg, args, line, wiki) {
  17. if ( !msg.isAdmin() ) return msg.reactEmoji('❌');
  18. db.all( 'SELECT channel, wiki, lang, role, inline, prefix FROM discord WHERE guild = ? ORDER BY channel DESC', [msg.guild.id], (error, rows) => {
  19. if ( error ) {
  20. console.log( '- Error while getting the settings: ' + error );
  21. msg.reactEmoji('error', true);
  22. return error;
  23. }
  24. var guild = rows.find( row => !row.channel );
  25. if ( !guild ) guild = Object.assign({
  26. role: null, inline: null,
  27. prefix: process.env.prefix
  28. }, defaultSettings);
  29. var prefix = guild.prefix;
  30. var inlinepage = ( lang.localNames.page || 'page' );
  31. var text = lang.get('settings.missing', '`' + prefix + 'settings lang`', '`' + prefix + 'settings wiki`');
  32. if ( rows.length ) {
  33. text = lang.get('settings.current');
  34. text += `\n<${new URL(`/guild/${msg.guild.id}/settings`, process.env.dashboard).href}>`;
  35. text += '\n' + lang.get('settings.currentlang') + ' `' + allLangs.names[guild.lang] + '` - `' + prefix + 'settings lang`';
  36. if ( patreons[msg.guild.id] ) text += '\n' + lang.get('settings.currentprefix') + ' `' + prefix + '` - `' + prefix + 'settings prefix`';
  37. text += '\n' + lang.get('settings.currentrole') + ' ' + ( guild.role ? `<@&${guild.role}>` : '@everyone' ) + ' - `' + prefix + 'settings role`';
  38. text += '\n' + lang.get('settings.currentinline') + ' ' + ( guild.inline ? '~~' : '' ) + '`[[' + inlinepage + ']]`' + ( guild.inline ? '~~' : '' ) + ' - `' + prefix + 'settings inline`';
  39. text += '\n' + lang.get('settings.currentwiki') + ' ' + guild.wiki + ' - `' + prefix + 'settings wiki`';
  40. text += '\n' + lang.get('settings.currentchannel') + ' `' + prefix + 'settings channel`\n';
  41. if ( rows.length === 1 ) text += lang.get('settings.nochannels');
  42. else text += rows.filter( row => row !== guild ).map( row => '<#' + row.channel.replace( /^#/, '' ) + '>: ' + ( patreons[msg.guild.id] ? '`' + allLangs.names[row.lang] + '` - ' : '' ) + '<' + row.wiki + '>' + ( patreons[msg.guild.id] ? ' - ' + ( row.role ? `<@&${row.role}>` : '@everyone' ) + ' - ' + ( row.inline ? '~~' : '' ) + '`[[' + inlinepage + ']]`' + ( row.inline ? '~~' : '' ) : '' ) ).join('\n');
  43. }
  44. if ( !args.length ) {
  45. return msg.replyMsg( text, {split:true}, true );
  46. }
  47. var prelang = '';
  48. args[0] = args[0].toLowerCase();
  49. if ( args[0] === 'channel' ) {
  50. prelang = 'channel ';
  51. if ( !rows.length ) return msg.replyMsg( text, {split:true}, true );
  52. var channel = rows.find( row => row.channel === msg.channel.id );
  53. if ( !channel ) channel = Object.assign({}, rows.find( row => {
  54. return ( row.channel === '#' + msg.channel.parentID );
  55. } ) || guild, {channel: msg.channel.id});
  56. text = lang.get('settings.' + prelang + 'current');
  57. text += `\n<${new URL(`/guild/${msg.guild.id}/settings/${msg.channel.id}`, process.env.dashboard).href}>`;
  58. if ( patreons[msg.guild.id] ) {
  59. text += '\n' + lang.get('settings.currentlang') + ' `' + allLangs.names[channel.lang] + '` - `' + prefix + 'settings channel lang`';
  60. text += '\n' + lang.get('settings.currentrole') + ' ' + ( channel.role ? `<@&${channel.role}>` : '@everyone' ) + ' - `' + prefix + 'settings channel role`';
  61. text += '\n' + lang.get('settings.currentinline') + ' ' + ( channel.inline ? '~~' : '' ) + '`[[' + inlinepage + ']]`' + ( channel.inline ? '~~' : '' ) + ' - `' + prefix + 'settings channel inline`';
  62. }
  63. text += '\n' + lang.get('settings.currentwiki') + ' ' + channel.wiki + ' - `' + prefix + 'settings channel wiki`';
  64. if ( !args[1] ) return msg.replyMsg( text, {}, true );
  65. args[0] = args[1].toLowerCase();
  66. args[1] = args.slice(2).join(' ').toLowerCase().trim().replace( /^<\s*(.*)\s*>$/, '$1' );
  67. }
  68. else args[1] = args.slice(1).join(' ').toLowerCase().trim().replace( /^<\s*(.*)\s*>$/, '$1' );
  69. if ( args[0] === 'wiki' ) {
  70. prelang += 'wiki';
  71. var wikihelp = '\n' + lang.get('settings.wikihelp', prefix + 'settings ' + prelang);
  72. if ( !args[1] ) {
  73. if ( !rows.length ) return msg.replyMsg( lang.get('settings.wikimissing') + wikihelp, {}, true );
  74. else return msg.replyMsg( lang.get('settings.' + prelang) + ' ' + ( channel || guild ).wiki + wikihelp, {}, true );
  75. }
  76. if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly') + '\n' + process.env.invite, {}, true );
  77. var wikinew = Wiki.fromInput(args[1]);
  78. if ( !wikinew ) {
  79. var text = lang.get('settings.wikiinvalid') + wikihelp;
  80. //text += '\n\n' + lang.get('settings.foundwikis') + '\n' + sites.map( site => site.wiki_display_name + ': `' + site.wiki_domain + '`' ).join('\n');
  81. return msg.replyMsg( text, {split:true}, true );
  82. }
  83. return msg.reactEmoji('⏳', true).then( reaction => {
  84. got.get( wikinew + 'api.php?&action=query&meta=siteinfo&siprop=general|extensions&format=json', {
  85. responseType: 'text'
  86. } ).then( response => {
  87. try {
  88. response.body = JSON.parse(response.body);
  89. }
  90. catch (error) {
  91. if ( response.statusCode === 404 && typeof response.body === 'string' ) {
  92. let api = cheerio.load(response.body)('head link[rel="EditURI"]').prop('href');
  93. if ( api ) {
  94. wikinew = new Wiki(api.split('api.php?')[0], wikinew);
  95. return got.get( wikinew + 'api.php?action=query&meta=siteinfo&siprop=general|extensions&format=json' );
  96. }
  97. }
  98. }
  99. return response;
  100. } ).then( response => {
  101. var body = response.body;
  102. if ( response.statusCode !== 200 || body?.batchcomplete === undefined || !body?.query?.general || !body?.query?.extensions ) {
  103. console.log( '- ' + response.statusCode + ': Error while testing the wiki: ' + body?.error?.info );
  104. if ( reaction ) reaction.removeEmoji();
  105. if ( body?.error?.info === 'You need read permission to use this module.' ) {
  106. return msg.replyMsg( lang.get('settings.wikiinvalid_private') + wikihelp, {}, true );
  107. }
  108. msg.reactEmoji('nowiki', true);
  109. return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
  110. }
  111. wikinew.updateWiki(body.query.general);
  112. var embed;
  113. if ( !wikinew.isFandom() ) {
  114. var notice = [];
  115. if ( body.query.general.generator.replace( /^MediaWiki 1\.(\d\d).*$/, '$1' ) < 30 ) {
  116. console.log( '- This wiki is using ' + body.query.general.generator + '.' );
  117. notice.push({
  118. name: 'MediaWiki',
  119. value: lang.get('test.MediaWiki', '[MediaWiki 1.30](https://www.mediawiki.org/wiki/MediaWiki_1.30)', body.query.general.generator)
  120. });
  121. }
  122. if ( !body.query.extensions.some( extension => extension.name === 'TextExtracts' ) ) {
  123. console.log( '- This wiki is missing Extension:TextExtracts.' );
  124. notice.push({
  125. name: 'TextExtracts',
  126. value: lang.get('test.TextExtracts', '[TextExtracts](https://www.mediawiki.org/wiki/Extension:TextExtracts)')
  127. });
  128. }
  129. if ( !body.query.extensions.some( extension => extension.name === 'PageImages' ) ) {
  130. console.log( '- This wiki is missing Extension:PageImages.' );
  131. notice.push({
  132. name: 'PageImages',
  133. value: lang.get('test.PageImages', '[PageImages](https://www.mediawiki.org/wiki/Extension:PageImages)')
  134. });
  135. }
  136. if ( notice.length ) {
  137. embed = new MessageEmbed().setAuthor( body.query.general.sitename ).setTitle( lang.get('test.notice') ).addFields( notice );
  138. }
  139. }
  140. var sql = 'UPDATE discord SET wiki = ? WHERE guild = ? AND wiki = ?';
  141. var sqlargs = [wikinew.href, msg.guild.id, guild.wiki];
  142. if ( !rows.length ) {
  143. sql = 'INSERT INTO discord(wiki, guild, main) VALUES(?, ?, ?)';
  144. sqlargs[2] = msg.guild.id;
  145. }
  146. else if ( channel ) {
  147. sql = 'UPDATE discord SET wiki = ? WHERE guild = ? AND channel = ?';
  148. sqlargs[2] = msg.channel.id;
  149. if ( !rows.includes( channel ) ) {
  150. if ( channel.wiki === wikinew.href ) {
  151. if ( reaction ) reaction.removeEmoji();
  152. return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + channel.wiki + wikihelp, {embed}, true );
  153. }
  154. sql = 'INSERT INTO discord(wiki, guild, channel, lang, role, inline, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
  155. sqlargs.push(guild.lang, guild.role, guild.inline, guild.prefix);
  156. }
  157. }
  158. return db.run( sql, sqlargs, function (dberror) {
  159. if ( dberror ) {
  160. console.log( '- Error while editing the settings: ' + dberror );
  161. msg.replyMsg( lang.get('settings.save_failed'), {embed}, true );
  162. if ( reaction ) reaction.removeEmoji();
  163. return dberror;
  164. }
  165. console.log( '- Settings successfully updated.' );
  166. if ( channel ) channel.wiki = wikinew.href;
  167. else {
  168. rows.forEach( row => {
  169. if ( row.channel && row.wiki === guild.wiki ) row.wiki = wikinew.href;
  170. } );
  171. guild.wiki = wikinew.href;
  172. }
  173. if ( channel || !rows.some( row => row.channel === msg.channel.id ) ) wiki = new Wiki(wikinew);
  174. if ( reaction ) reaction.removeEmoji();
  175. msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + wikinew + wikihelp, {embed}, true );
  176. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
  177. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
  178. if ( delerror ) {
  179. console.log( '- Error while removing the settings: ' + delerror );
  180. return delerror;
  181. }
  182. console.log( '- Settings successfully removed.' );
  183. } );
  184. } );
  185. }, ferror => {
  186. if ( reaction ) reaction.removeEmoji();
  187. if ( ferror.message?.startsWith( 'connect ECONNREFUSED ' ) || ferror.message?.startsWith( 'Hostname/IP does not match certificate\'s altnames: ' ) || ferror.message === 'certificate has expired' ) {
  188. console.log( '- Error while testing the wiki: No HTTPS' );
  189. return msg.replyMsg( lang.get('settings.wikiinvalid_http') + wikihelp, {}, true );
  190. }
  191. console.log( '- Error while testing the wiki: ' + ferror );
  192. if ( ferror.message === `Timeout awaiting 'request' for ${got.defaults.options.timeout.request}ms` ) {
  193. return msg.replyMsg( lang.get('settings.wikiinvalid_timeout') + wikihelp, {}, true );
  194. }
  195. msg.reactEmoji('nowiki', true);
  196. return msg.replyMsg( lang.get('settings.wikiinvalid') + wikihelp, {}, true );
  197. } );
  198. } );
  199. }
  200. if ( args[0] === 'lang' ) {
  201. if ( channel && !patreons[msg.guild.id] ) return msg.replyMsg( lang.get('general.patreon') + '\n<' + process.env.patreon + '>', {}, true );
  202. prelang += 'lang';
  203. var langhelp = '\n' + lang.get('settings.langhelp', prefix + 'settings ' + prelang) + ' `' + Object.values(allLangs.names).join('`, `') + '`';
  204. if ( !args[1] ) {
  205. return msg.replyMsg( lang.get('settings.' + prelang) + ' `' + allLangs.names[( channel || guild ).lang] + '`' + langhelp, {files:( msg.uploadFiles() ? [`./i18n/widgets/${( channel || guild ).lang}.png`] : [] )}, true );
  206. }
  207. if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly') + '\n' + process.env.invite, {}, true );
  208. if ( !allLangs.map.hasOwnProperty(args[1]) ) {
  209. return msg.replyMsg( lang.get('settings.langinvalid') + langhelp, {}, true );
  210. }
  211. var sql = 'UPDATE discord SET lang = ? WHERE guild = ? AND lang = ?';
  212. var sqlargs = [allLangs.map[args[1]], msg.guild.id, guild.lang];
  213. if ( !rows.length ) {
  214. sql = 'INSERT INTO discord(lang, guild, main) VALUES(?, ?, ?)';
  215. sqlargs[2] = msg.guild.id;
  216. }
  217. else if ( channel ) {
  218. sql = 'UPDATE discord SET lang = ? WHERE guild = ? AND channel = ?';
  219. sqlargs[2] = msg.channel.id;
  220. if ( !rows.includes( channel ) ) {
  221. if ( channel.lang === allLangs.map[args[1]] ) {
  222. return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' `' + allLangs.names[channel.lang] + '`' + langhelp, {files:( msg.uploadFiles() ? [`./i18n/widgets/${channel.lang}.png`] : [] )}, true );
  223. }
  224. sql = 'INSERT INTO discord(lang, guild, channel, wiki, role, inline, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
  225. sqlargs.push(guild.wiki, guild.role, guild.inline, guild.prefix);
  226. }
  227. }
  228. return db.run( sql, sqlargs, function (dberror) {
  229. if ( dberror ) {
  230. console.log( '- Error while editing the settings: ' + dberror );
  231. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  232. return dberror;
  233. }
  234. console.log( '- Settings successfully updated.' );
  235. if ( channel ) channel.lang = allLangs.map[args[1]];
  236. else {
  237. rows.forEach( row => {
  238. if ( row.channel && row.lang === guild.lang ) row.lang = allLangs.map[args[1]];
  239. } );
  240. guild.lang = allLangs.map[args[1]];
  241. if ( voice[msg.guild.id] ) voice[msg.guild.id] = guild.lang;
  242. }
  243. if ( channel || !patreons[msg.guild.id] || !rows.some( row => row.channel === msg.channel.id ) ) lang = new Lang(allLangs.map[args[1]]);
  244. msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' `' + allLangs.names[allLangs.map[args[1]]] + '`\n' + lang.get('settings.langhelp', prefix + 'settings ' + prelang) + ' `' + Object.values(allLangs.names).join('`, `') + '`', {files:( msg.uploadFiles() ? [`./i18n/widgets/${allLangs.map[args[1]]}.png`] : [] )}, true );
  245. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
  246. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
  247. if ( delerror ) {
  248. console.log( '- Error while removing the settings: ' + delerror );
  249. return delerror;
  250. }
  251. console.log( '- Settings successfully removed.' );
  252. } );
  253. } );
  254. }
  255. if ( args[0] === 'role' ) {
  256. if ( channel && !patreons[msg.guild.id] ) return msg.replyMsg( lang.get('general.patreon') + '\n<' + process.env.patreon + '>', {}, true );
  257. prelang += 'role';
  258. var rolehelp = '\n' + lang.get('settings.rolehelp', prefix + 'settings ' + prelang);
  259. if ( !args[1] ) {
  260. return msg.replyMsg( lang.get('settings.' + prelang) + ' ' + ( ( channel || guild ).role ? `<@&${( channel || guild ).role}>` : '@everyone' ) + rolehelp, {}, true );
  261. }
  262. if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly') + '\n' + process.env.invite, {}, true );
  263. var role = null;
  264. if ( /^\d+$/.test(args[1]) ) role = msg.guild.roles.cache.get(args[1]);
  265. if ( !role ) role = msg.guild.roles.cache.find( gc => gc.name.toLowerCase() === args[1].replace( /^@/, '' ) );
  266. if ( !role && ['everyone', 'here', 'none', 'all'].includes( args[1].replace( /^@/, '' ) ) ) {
  267. role = msg.guild.roles.cache.get(msg.guild.id);
  268. }
  269. if ( !role ) {
  270. return msg.replyMsg( lang.get('settings.roleinvalid') + rolehelp, {}, true );
  271. }
  272. role = ( role.id === msg.guild.id ? null : role.id );
  273. var sql = 'UPDATE discord SET role = ? WHERE guild = ?';
  274. var sqlargs = [role, msg.guild.id];
  275. if ( !rows.length ) {
  276. sql = 'INSERT INTO discord(role, guild, main) VALUES(?, ?, ?)';
  277. sqlargs.push(msg.guild.id);
  278. }
  279. else if ( channel ) {
  280. sql = 'UPDATE discord SET role = ? WHERE guild = ? AND channel = ?';
  281. sqlargs.push(msg.channel.id);
  282. if ( !rows.includes( channel ) ) {
  283. if ( channel.role === role ) {
  284. return msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + ( channel.role ? `<@&${channel.role}>` : '@everyone' ) + rolehelp, {}, true );
  285. }
  286. sql = 'INSERT INTO discord(role, guild, channel, wiki, lang, inline, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
  287. sqlargs.push(guild.wiki, guild.lang, guild.inline, guild.prefix);
  288. }
  289. }
  290. else if ( guild.role ) {
  291. sql += ' AND role = ?';
  292. sqlargs.push(guild.role);
  293. }
  294. else sql += ' AND role IS NULL';
  295. return db.run( sql, sqlargs, function (dberror) {
  296. if ( dberror ) {
  297. console.log( '- Error while editing the settings: ' + dberror );
  298. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  299. return dberror;
  300. }
  301. console.log( '- Settings successfully updated.' );
  302. if ( channel ) channel.role = role;
  303. else {
  304. rows.forEach( row => {
  305. if ( row.channel && row.role === guild.role ) row.role = role;
  306. } );
  307. guild.role = role;
  308. }
  309. msg.replyMsg( lang.get('settings.' + prelang + 'changed') + ' ' + ( role ? `<@&${role}>` : '@everyone' ) + rolehelp, {}, true );
  310. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
  311. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
  312. if ( delerror ) {
  313. console.log( '- Error while removing the settings: ' + delerror );
  314. return delerror;
  315. }
  316. console.log( '- Settings successfully removed.' );
  317. } );
  318. } );
  319. }
  320. if ( args[0] === 'prefix' && !channel ) {
  321. if ( !patreons[msg.guild.id] ) {
  322. return msg.replyMsg( lang.get('general.patreon') + '\n<' + process.env.patreon + '>', {}, true );
  323. }
  324. var prefixhelp = '\n' + lang.get('settings.prefixhelp', prefix + 'settings prefix');
  325. args[1] = args[1].replace( /(?<!\\)_$/, ' ' ).replace( /\\([_\W])/g, '$1' );
  326. if ( !args[1].trim() ) {
  327. return msg.replyMsg( lang.get('settings.prefix') + ' `' + prefix + '`' + prefixhelp, {}, true );
  328. }
  329. if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly') + '\n' + process.env.invite, {}, true );
  330. if ( args[1].includes( '`' ) || args[1].includes( '\\' ) || args[1].length > 100 ) {
  331. return msg.replyMsg( lang.get('settings.prefixinvalid') + prefixhelp, {}, true );
  332. }
  333. if ( args[1] === 'reset' || args[1] === 'default' ) args[1] = process.env.prefix;
  334. var sql = 'UPDATE discord SET prefix = ? WHERE guild = ?';
  335. var sqlargs = [args[1], msg.guild.id];
  336. if ( !rows.length ) {
  337. sql = 'INSERT INTO discord(prefix, guild, main) VALUES(?, ?, ?)';
  338. sqlargs.push(msg.guild.id);
  339. }
  340. return db.run( sql, sqlargs, function (dberror) {
  341. if ( dberror ) {
  342. console.log( '- Error while editing the settings: ' + dberror );
  343. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  344. return dberror;
  345. }
  346. console.log( '- Settings successfully updated.' );
  347. guild.prefix = args[1];
  348. msg.client.shard.broadcastEval( `global.patreons['${msg.guild.id}'] = '${args[1]}'` );
  349. msg.replyMsg( lang.get('settings.prefixchanged') + ' `' + args[1] + '`\n' + lang.get('settings.prefixhelp', args[1] + 'settings prefix'), {}, true );
  350. } );
  351. }
  352. if ( args[0] === 'inline' ) {
  353. if ( channel && !patreons[msg.guild.id] ) return msg.replyMsg( lang.get('general.patreon') + '\n<' + process.env.patreon + '>', {}, true );
  354. prelang += 'inline';
  355. var toggle = 'inline ' + ( ( channel || guild ).inline ? 'disabled' : 'enabled' );
  356. var inlinehelp = '\n' + lang.get('settings.' + toggle + '.help', prefix + 'settings ' + prelang + ' toggle', inlinepage);
  357. if ( args[1] !== 'toggle' ) {
  358. return msg.replyMsg( lang.get('settings.' + toggle + '.' + prelang) + inlinehelp, {}, true );
  359. }
  360. if ( process.env.READONLY ) return msg.replyMsg( lang.get('general.readonly') + '\n' + process.env.invite, {}, true );
  361. var value = ( ( channel || guild ).inline ? null : 1 );
  362. var sql = 'UPDATE discord SET inline = ? WHERE guild = ?';
  363. var sqlargs = [value, msg.guild.id];
  364. if ( !rows.length ) {
  365. sql = 'INSERT INTO discord(inline, guild, main) VALUES(?, ?, ?)';
  366. sqlargs.push(msg.guild.id);
  367. }
  368. else if ( channel ) {
  369. sql = 'UPDATE discord SET inline = ? WHERE guild = ? AND channel = ?';
  370. sqlargs.push(msg.channel.id);
  371. if ( !rows.includes( channel ) ) {
  372. sql = 'INSERT INTO discord(inline, guild, channel, wiki, lang, role, prefix) VALUES(?, ?, ?, ?, ?, ?, ?)';
  373. sqlargs.push(guild.wiki, guild.lang, guild.role, guild.prefix);
  374. }
  375. }
  376. return db.run( sql, sqlargs, function (dberror) {
  377. if ( dberror ) {
  378. console.log( '- Error while editing the settings: ' + dberror );
  379. msg.replyMsg( lang.get('settings.save_failed'), {}, true );
  380. return dberror;
  381. }
  382. console.log( '- Settings successfully updated.' );
  383. if ( channel ) channel.inline = value;
  384. else {
  385. rows.forEach( row => {
  386. if ( row.channel && row.inline === guild.inline ) row.inline = value;
  387. } );
  388. guild.inline = value;
  389. }
  390. toggle = 'inline ' + ( ( channel || guild ).inline ? 'disabled' : 'enabled' );
  391. msg.replyMsg( lang.get('settings.' + toggle + '.' + prelang + 'changed') + '\n' + lang.get('settings.' + toggle + '.help', prefix + 'settings ' + prelang + ' toggle', inlinepage), {}, true );
  392. var channels = rows.filter( row => row.channel && row.lang === guild.lang && row.wiki === guild.wiki && row.prefix === guild.prefix && row.role === guild.role && row.inline === guild.inline ).map( row => row.channel );
  393. if ( channels.length ) db.run( 'DELETE FROM discord WHERE channel IN (' + channels.map( row => '?' ).join(', ') + ')', channels, function (delerror) {
  394. if ( delerror ) {
  395. console.log( '- Error while removing the settings: ' + delerror );
  396. return delerror;
  397. }
  398. console.log( '- Settings successfully removed.' );
  399. } );
  400. } );
  401. }
  402. return msg.replyMsg( text, {split:true}, true );
  403. } );
  404. }
  405. module.exports = {
  406. name: 'settings',
  407. everyone: true,
  408. pause: true,
  409. owner: false,
  410. run: cmd_settings
  411. };