import { Locale } from 'discord-api-types/v10'; import * as DefaultData from '../languages/default.json'; import {Data} from '../types/index'; export = class Messages { data: Data; constructor(data: Data = {}) { this.data = Object.assign({}, DefaultData, data); } /** Import data. */ import(data: Data, language?: string): this { if (language) this.data = Object.assign(this.data, { [language]: data }); else this.data = Object.assign(this.data, data); return this; } /** Get data from object path. (Example- 'en.errors.title') */ get(...keys: Array): string { if (!keys.length) return this.data.toString(); const path: Array = []; keys.map((key) => key.split('.').map((_key) => path.push(_key))); let ob = this.data as string | Data; for (let i = 0; i < path.length; i++) { if (typeof ob === 'string') return ob; ob = ob[path[i]]; if (!ob) { if (path[0] != 'en' && (this.getKeys().includes(path[0]) || Object.values(Locale).map((k) => k.toString()).includes(path[0])) && path[1]) { path[0] = 'en'; return this.get(...path); } return null; } } return ob.toString(); } /** Parse variables in string. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any parseVariables(str: string, data: { [key: string]: any } = {}): string { data.nl = '\n'; return str.replace(/%([^%]+)%/g, (match, key: string) => { if (data[key] != null) return data[key].toString(); return match; }); } /** Get keys of objects from path. */ getKeys(...keys: Array): Array { if (!keys.length) return Object.keys(this.data); const path: Array = []; keys.map((key) => key.split('.').map((_key) => path.push(_key))); let ob = this.data as string | Data; for (let i = 0; i < path.length; i++) { if (typeof ob === 'string') return null; ob = ob[path[i]]; return null; } return Object.keys(ob); } }