Browse Source

lang default guild preferred locale

Markus-Rost 4 years ago
parent
commit
6d145cee27
11 changed files with 37 additions and 20 deletions
  1. 7 8
      bot.js
  2. 2 2
      cmds/rcscript.js
  3. 1 1
      cmds/test.js
  4. 6 4
      dashboard/i18n.js
  5. 3 0
      dashboard/i18n/allLangs.json
  6. 5 3
      dashboard/settings.js
  7. 1 0
      dashboard/util.js
  8. 3 0
      i18n/allLangs.json
  9. 1 1
      interactions/inline.js
  10. 2 1
      main.js
  11. 6 0
      util/i18n.js

+ 7 - 8
bot.js

@@ -17,7 +17,6 @@ global.got = require('got').extend( {
 	responseType: 'json'
 } );
 
-const {defaultSettings} = require('./util/default.json');
 const Lang = require('./util/i18n.js');
 const Wiki = require('./util/wiki.js');
 const newMessage = require('./util/newMessage.js');
@@ -260,8 +259,8 @@ client.on( 'raw', rawEvent => {
 				}
 			}, log_error );
 		}
-		var lang = new Lang(row.lang || defaultSettings.lang);
-		if ( row.role && !interaction.member.roles.includes( row.role ) && channel?.guild?.roles.cache.has(row.role) && ( !interaction.member.roles.length || !interaction.member.roles.some( role => channel.guild.roles.cache.get(role)?.comparePositionTo(row.role) >= 0 ) ) ) {
+		var lang = new Lang(( row?.lang || channel?.guild?.preferredLocale ));
+		if ( row?.role && !interaction.member.roles.includes( row.role ) && channel?.guild?.roles.cache.has(row.role) && ( !interaction.member.roles.length || !interaction.member.roles.some( role => channel.guild.roles.cache.get(role)?.comparePositionTo(row.role) >= 0 ) ) ) {
 			return got.post( `https://discord.com/api/v8/interactions/${interaction.id}/${interaction.token}/callback`, {
 				json: {
 					//type: 4,
@@ -280,7 +279,7 @@ client.on( 'raw', rawEvent => {
 				}
 			}, log_error );
 		}
-		var wiki = new Wiki(row.wiki || defaultSettings.wiki);
+		var wiki = new Wiki(row?.wiki);
 		return slash[interaction.data.name](interaction, lang, wiki, channel);
 	} );
 } );
@@ -293,7 +292,7 @@ client.on( 'message', msg => {
 				console.log( msg.guild.name + ': ' + msg.content );
 				db.get( 'SELECT lang FROM discord WHERE guild = ? AND (channel = ? OR channel = ? OR channel IS NULL) ORDER BY channel DESC', [msg.guild.id, msg.channel.id, '#' + msg.channel.parentID], (dberror, row) => {
 					if ( dberror ) console.log( '- Error while getting the lang: ' + dberror );
-					msg.replyMsg( new Lang(( row || defaultSettings ).lang).get('general.prefix', patreons[msg.guild.id]), {}, true );
+					msg.replyMsg( new Lang(( row?.lang || msg.guild.preferredLocale ), 'general').get('prefix', patreons[msg.guild.id]), {}, true );
 				} );
 			}
 		}
@@ -309,7 +308,7 @@ client.on( 'message', msg => {
 					db.get( 'SELECT lang FROM discord WHERE guild = ? AND (channel = ? OR channel = ? OR channel IS NULL) ORDER BY channel DESC', [msg.guild.id, msg.channel.id, '#' + msg.channel.parentID], (dberror, row) => {
 						if ( dberror ) console.log( '- Error while getting the lang: ' + dberror );
 						if ( msg.content.hasPrefix(( patreons[msg.guild.id] || process.env.prefix ), 'm') ) {
-							msg.replyMsg( new Lang(( row || defaultSettings ).lang).get('general.missingperm') + ' `' + missing.join('`, `') + '`', {}, true );
+							msg.replyMsg( new Lang(( row?.lang || msg.guild.preferredLocale ), 'general').get('missingperm') + ' `' + missing.join('`, `') + '`', {}, true );
 						}
 					} );
 				}
@@ -321,7 +320,7 @@ client.on( 'message', msg => {
 				console.log( '- Error while getting the wiki: ' + dberror );
 				if ( permissions.has('SEND_MESSAGES') ) {
 					msg.sendChannel( '⚠️ **Limited Functionality** ⚠️\nNo settings found, please contact the bot owner!\n' + process.env.invite, {}, true );
-					newMessage(msg, new Lang());
+					newMessage(msg, new Lang(msg.guild.preferredLocale));
 				}
 				return dberror;
 			}
@@ -333,7 +332,7 @@ client.on( 'message', msg => {
 			}
 			else {
 				msg.defaultSettings = true;
-				newMessage(msg, new Lang());
+				newMessage(msg, new Lang(msg.guild.preferredLocale));
 			}
 		} );
 	}

+ 2 - 2
cmds/rcscript.js

@@ -1,6 +1,6 @@
 const cheerio = require('cheerio');
 const help_setup = require('../functions/helpsetup.js');
-const {limit: {rcgcdw: rcgcdwLimit}, defaultSettings} = require('../util/default.json');
+const {limit: {rcgcdw: rcgcdwLimit}} = require('../util/default.json');
 const Lang = require('../util/i18n.js');
 const allLangs = Lang.allLangs(true);
 const Wiki = require('../util/wiki.js');
@@ -138,7 +138,7 @@ function cmd_rcscript(lang, msg, args, line, wiki) {
 							reason: lang.get('rcscript.audit_reason', wikinew.href)
 						} ).then( webhook => {
 							console.log( '- Webhook successfully created.' );
-							var webhook_lang = new Lang(( allLangs.map[lang.lang] || allLangs.map[body.query.general.lang] || defaultSettings.lang ), 'rcscript.webhook');
+							var webhook_lang = new Lang(( allLangs.map[lang.lang] || allLangs.map[body.query.general.lang] ), 'rcscript.webhook');
 							webhook.send( webhook_lang.get('created', body.query.general.sitename) + '\n<' + wikinew.toLink(body.query.pages['-1'].title) + ( enableFeeds ? '>\n<' + wikinew + 'f' : '' ) + '>' ).catch(log_error);
 							var new_configid = 1;
 							for ( let i of rows.map( row => row.configid ) ) {

+ 1 - 1
cmds/test.js

@@ -87,7 +87,7 @@ function cmd_test(lang, msg, args, line, wiki) {
 				embed.addField( wiki, ping );
 			} ).finally( () => {
 				if ( msg.isOwner() ) return msg.client.shard.fetchClientValues('ws.status').then( values => {
-					return '```css\n' + values.map( (status, id) => '[' + id + ']: ' + ( wsStatus[status] || status ) ).join('\n') + '\n```';
+					return '```less\n' + values.map( (status, id) => '[' + id + ']: ' + ( wsStatus[status] || status ) ).join('\n') + '\n```';
 				}, error => {
 					return '```js\n' + error + '\n```';
 				} ).then( shards => {

+ 6 - 4
dashboard/i18n.js

@@ -14,10 +14,12 @@ class Lang {
 	 * @constructs Lang
 	 */
 	constructor(...langs) {
-		this.lang = ( langs.find( lang => {
-			if ( typeof lang !== 'string' ) lang = '';
-			return i18n.allLangs.map[lang.toLowerCase()]
-		} ) || defaultSettings.lang );
+		this.lang = ( langs.filter( lang => {
+			if ( typeof lang !== 'string' ) return false;
+			return i18n.allLangs.map.hasOwnProperty(lang.toLowerCase());
+		} ).map( lang => {
+			return i18n.allLangs.map[lang.toLowerCase()];
+		} )[0] || defaultSettings.lang );
 		this.fallback = ( i18n?.[this.lang]?.fallback.slice() || [defaultSettings.lang] ).filter( fb => fb.trim() );
 		this.fromCookie = [];
 	}

+ 3 - 0
dashboard/i18n/allLangs.json

@@ -17,6 +17,8 @@
 		},
 		"map": {
 			"en": "en",
+			"en-gb": "en",
+			"en-us": "en",
 			"eng": "en",
 			"english": "en",
 			"english (en)": "en",
@@ -29,6 +31,7 @@
 			"deutsch": "de",
 			"deutsch (de)": "de",
 			"es": "es",
+			"es-es": "es",
 			"spanish": "es",
 			"español": "es",
 			"español (es)": "es",

+ 5 - 3
dashboard/settings.js

@@ -185,9 +185,11 @@ function dashboard_settings(res, $, guild, args, dashboardLang) {
 		$('<p>').html(dashboardLang.get('settings.desc', true, $('<code>').text(guild.name))).appendTo('#text .description');
 		if ( !rows.length ) {
 			$('.channel#settings').addClass('selected');
-			createForm($, dashboardLang.get('settings.form.default'), dashboardLang, Object.assign({
-				prefix: process.env.prefix
-			}, defaultSettings), guild.roles).attr('action', `/guild/${guild.id}/settings/default`).appendTo('#text');
+			createForm($, dashboardLang.get('settings.form.default'), dashboardLang, {
+				prefix: process.env.prefix,
+				wiki: defaultSettings.wiki,
+				lang: ( guild.locale || defaultSettings.lang )
+			}, guild.roles).attr('action', `/guild/${guild.id}/settings/default`).appendTo('#text');
 			let body = $.html();
 			res.writeHead(200, {'Content-Length': Buffer.byteLength(body)});
 			res.write( body );

+ 1 - 0
dashboard/util.js

@@ -52,6 +52,7 @@ const db = new sqlite3.Database( './wikibot.db', mode, dberror => {
  * @property {String} [botPermissions]
  * @property {Channel[]} [channels]
  * @property {Role[]} [roles]
+ * @property {String} [locale]
  */
 
 /**

+ 3 - 0
i18n/allLangs.json

@@ -18,6 +18,8 @@
 		},
 		"map": {
 			"en": "en",
+			"en-gb": "en",
+			"en-us": "en",
 			"eng": "en",
 			"english": "en",
 			"english (en)": "en",
@@ -30,6 +32,7 @@
 			"deutsch": "de",
 			"deutsch (de)": "de",
 			"es": "es",
+			"es-es": "es",
 			"spanish": "es",
 			"español": "es",
 			"español (es)": "es",

+ 1 - 1
interactions/inline.js

@@ -11,7 +11,7 @@ const {limitLength, partialURIdecode, allowDelete} = require('../util/functions.
  */
 function slash_inline(interaction, lang, wiki, channel) {
 	var text = ( interaction.data.options?.[0]?.value || '' ).replace( /\]\(/g, ']\\(' );
-	text = text.replace( /\x1F/g, '' ).trim();
+	text = text.replace( /\x1F/g, '' ).replace( /(?<!@)\u200b/g, '' ).trim();
 	if ( !text ) {
 		return got.post( `https://discord.com/api/v8/interactions/${interaction.id}/${interaction.token}/callback`, {
 			json: {

+ 2 - 1
main.js

@@ -124,7 +124,8 @@ if ( process.env.dashboard ) {
 												name: role.name,
 												lower: ( guild.me.roles.highest.comparePositionTo(role) > 0 && !role.managed )
 											};
-										} )
+										} ),
+										locale: guild.preferredLocale
 									};
 								}, error => {
 									return 'noMember';

+ 6 - 0
util/i18n.js

@@ -17,6 +17,12 @@ class Lang {
 	 */
 	constructor(lang = defaultSettings.lang, namespace = '') {
 		if ( typeof lang !== 'string' ) lang = defaultSettings.lang;
+		else if ( lang === 'allLangs' || !i18n.hasOwnProperty(lang) ) {
+			if ( i18n.allLangs.map.hasOwnProperty(lang.toLowerCase()) ) {
+				lang = i18n.allLangs.map[lang.toLowerCase()];
+			}
+			else lang = defaultSettings.lang;
+		}
 		this.lang = lang;
 		this.namespace = namespace;
 		this.fallback = ( i18n?.[lang]?.fallback.slice() || [defaultSettings.lang] ).filter( fb => fb.trim() );