241 lines
7.9 KiB
JavaScript
241 lines
7.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getEmbed = exports.get = exports.setLang = void 0;
|
|
const discord_js_1 = require("discord.js");
|
|
/* UTIL FUNCS */
|
|
function template(str, args) {
|
|
return str.replace(/{\w+}/g, str => {
|
|
const key = str.substring(1, str.length - 1);
|
|
if (key in args)
|
|
return args[key];
|
|
return key;
|
|
});
|
|
}
|
|
function bigString(str) {
|
|
if (typeof str === 'object')
|
|
return str.join('\n');
|
|
return str;
|
|
}
|
|
function resolveColor(color) {
|
|
color = color.replace(/[^0-9a-f]/gi, '');
|
|
const colorNum = [0, 0, 0];
|
|
if (color.length === 3 || color.length === 6) {
|
|
const colorSpl = /([0-9a-f]{1,2})([0-9a-f]{1,2})([0-9a-f]{1,2})/.exec(color);
|
|
if (!colorSpl)
|
|
return colorNum;
|
|
for (let i = 0; i < colorSpl.length && i < colorNum.length; i++)
|
|
colorNum[i] = parseInt(colorSpl[i], 16);
|
|
}
|
|
return colorNum;
|
|
}
|
|
function embedObjStr(embedData, fallback = '') {
|
|
if (embedData.content !== undefined)
|
|
return bigString(embedData.content);
|
|
if (embedData.description !== undefined)
|
|
return bigString(embedData.description);
|
|
return fallback;
|
|
}
|
|
function embedObjEmbed(embedObj, args = {}) {
|
|
const embed = new discord_js_1.MessageEmbed(), { author, color, description, fields, footer, image, thumbnail, timestamp, title, url } = embedObj;
|
|
if (author !== undefined) {
|
|
let authorFix;
|
|
if (typeof author === 'string')
|
|
authorFix = {
|
|
name: template(author, args)
|
|
};
|
|
else {
|
|
const { name, icon, url } = author;
|
|
authorFix = {
|
|
name: template(name, args)
|
|
};
|
|
if (icon !== undefined)
|
|
authorFix.icon = template(icon, args);
|
|
if (url !== undefined)
|
|
authorFix.url = template(url, args);
|
|
}
|
|
embed.setAuthor(authorFix);
|
|
}
|
|
if (footer !== undefined) {
|
|
let footerFix;
|
|
if (typeof footer === 'string')
|
|
footerFix = {
|
|
text: template(footer, args)
|
|
};
|
|
else {
|
|
const { text, icon } = footer;
|
|
footerFix = {
|
|
text: template(text, args)
|
|
};
|
|
if (icon !== undefined)
|
|
footerFix.icon = template(icon, args);
|
|
}
|
|
embed.setFooter(footerFix);
|
|
}
|
|
if (color !== undefined)
|
|
embed.setColor(resolveColor(template(color, args)));
|
|
if (description !== undefined)
|
|
embed.setDescription(template(bigString(description), args));
|
|
if (image !== undefined)
|
|
embed.setImage(template(image, args));
|
|
if (thumbnail !== undefined)
|
|
embed.setThumbnail(template(thumbnail, args));
|
|
if (title !== undefined)
|
|
embed.setTitle(template(title, args));
|
|
if (url !== undefined)
|
|
embed.setURL(template(url, args));
|
|
if (timestamp === true)
|
|
embed.setTimestamp();
|
|
else if (typeof timestamp === 'string')
|
|
embed.setTimestamp(new Date(template(timestamp, args)));
|
|
else if (timestamp !== false)
|
|
embed.setTimestamp(timestamp);
|
|
fields?.forEach(field => {
|
|
embed.addField(template(field.name, args), template(bigString(field.value), args), field.inline);
|
|
});
|
|
return embed;
|
|
}
|
|
/* LANG */
|
|
const LANG = {
|
|
en: {
|
|
main: {
|
|
login: 'Logged in as {user}'
|
|
},
|
|
discord: {
|
|
botRestart: 'The bot has just restarted, anybody previously in the queue has been reset',
|
|
create: 'A queue for teams of {teamsize} has been created',
|
|
close: 'Queue has been closed',
|
|
join: 'Joined the queue',
|
|
leave: 'Left the queue',
|
|
team: {
|
|
embed: true,
|
|
title: 'Team',
|
|
description: '{team}'
|
|
},
|
|
queue: {
|
|
embed: true,
|
|
title: 'Active Queue',
|
|
fields: [
|
|
{
|
|
name: 'Team Size',
|
|
value: '{teamsize}'
|
|
},
|
|
{
|
|
name: 'Players Joined',
|
|
value: '{playercount}'
|
|
}
|
|
],
|
|
footer: 'type `/join`'
|
|
}
|
|
},
|
|
api: {
|
|
player: {
|
|
embed: true,
|
|
title: '{name} ({id})',
|
|
url: 'https://uniteapi.dev/p/{nameEncoded}',
|
|
timestamp: true,
|
|
thumbnail: '{avatar}',
|
|
description: [
|
|
'Level {level}',
|
|
'{rank} {elo}',
|
|
'',
|
|
'**Battles** {battles}',
|
|
'**Wins** {wins}',
|
|
'**Win Rate** {winrate}'
|
|
]
|
|
}
|
|
},
|
|
error: {
|
|
main: {
|
|
missingToken: 'Missing Discord Token, please enter the bot token into the token file'
|
|
},
|
|
discord: {
|
|
noQueue: 'There is not an active queue in this channel, type `/open` to create one',
|
|
noChannel: 'Unable to find channel {channelId} for teams of {teamsize}',
|
|
noCreate: 'There is already an active queue in this channel for teams of {teamsize}',
|
|
inQueue: 'You are already in the queue',
|
|
notInQueue: 'You aren\'t in the queue',
|
|
notMod: 'Member is not a moderator'
|
|
},
|
|
general: {
|
|
noMember: 'Unable to retrieve guild member information, please try again',
|
|
noChannel: 'Unable to retrieve text channel information, please try again'
|
|
},
|
|
api: {
|
|
noUser: 'Unable to find user'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
/* MAIN */
|
|
let LANGID = 'en';
|
|
if (!(LANGID in LANG))
|
|
throw 'language id does not exist';
|
|
function setLang(langid) {
|
|
if (langid in LANG)
|
|
LANGID = langid;
|
|
else
|
|
throw 'language id does not exist';
|
|
}
|
|
exports.setLang = setLang;
|
|
/**
|
|
* reads language json (just strings)
|
|
* @param id ex: discord.error.noActiveQueue
|
|
* @param args list of key/value pairs to represent template values
|
|
* @returns language value, defaults to `id` parameter
|
|
*/
|
|
function get(id, args = {}) {
|
|
const keySpl = id.split('.').map(k => k.trim()).filter(k => k);
|
|
let finding = LANG[LANGID];
|
|
for (const key of keySpl) {
|
|
if (key in finding) {
|
|
const found = finding[key];
|
|
if (typeof found === 'string')
|
|
return template(found, args);
|
|
if (found.embed === true)
|
|
return embedObjStr(found, id);
|
|
finding = found;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
return id;
|
|
}
|
|
exports.get = get;
|
|
/**
|
|
* reads language json as an object (could be embed or just string)
|
|
* @param id ex: discord.error.noActiveQueue
|
|
* @param args list of key/value pairs to represent template values
|
|
* @param otherOptions values to be passed through to the return value
|
|
* @returns language value, defaults to `id` parameter
|
|
*/
|
|
function getEmbed(id, args = {}, otherOptions = {}) {
|
|
const embedData = {
|
|
...otherOptions,
|
|
embeds: []
|
|
};
|
|
const keySpl = id.split('.').map(k => k.trim()).filter(k => k);
|
|
let finding = LANG[LANGID];
|
|
for (const key of keySpl) {
|
|
if (key in finding) {
|
|
const found = finding[key];
|
|
if (typeof found === 'string') {
|
|
embedData.content = template(found, args);
|
|
break;
|
|
}
|
|
if (found.embed === true) {
|
|
const embedObj = found, { content } = embedObj, embed = embedObjEmbed(embedObj, args);
|
|
embedData.embeds.push(embed);
|
|
if (content !== undefined)
|
|
embedData.content = content;
|
|
return embedData;
|
|
}
|
|
finding = found;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
return embedData;
|
|
}
|
|
exports.getEmbed = getEmbed;
|
|
debugger;
|