This commit is contained in:
ChomeNS 2022-11-16 09:33:16 +07:00
parent 3b0a7ebadb
commit 681fa526e4
14 changed files with 78 additions and 172 deletions

View file

@ -11,7 +11,6 @@
"sourceType": "module" "sourceType": "module"
}, },
"rules": { "rules": {
"linebreak-style": 0, "linebreak-style": 0
"require-jsdoc": 0
} }
} }

View file

@ -1,3 +1,4 @@
/* eslint-disable require-jsdoc */
/* eslint-disable no-var */ /* eslint-disable no-var */
/* eslint-disable max-len */ /* eslint-disable max-len */
const {MessageEmbed} = require('discord.js'); const {MessageEmbed} = require('discord.js');

View file

@ -1,9 +1,10 @@
/* eslint-disable require-jsdoc */
/* eslint-disable max-len */ /* eslint-disable max-len */
/* eslint-disable prefer-rest-params */ /* eslint-disable prefer-rest-params */
const moment = require('moment-timezone'); const moment = require('moment-timezone');
const util = require('util'); const util = require('util');
function inject(bot, dcclient, config, rl) { function inject(bot, _dcclient, config, rl) {
if (!config.console) return; if (!config.console) return;
const chatMessage = require('prismarine-chat')(bot.version); const chatMessage = require('prismarine-chat')(bot.version);

View file

@ -1,3 +1,4 @@
/* eslint-disable require-jsdoc */
/* eslint-disable max-len */ /* eslint-disable max-len */
function inject(bot) { function inject(bot) {
bot.tellraw = function(selector, message) { bot.tellraw = function(selector, message) {

View file

@ -1,7 +1,17 @@
/* eslint-disable max-len */ /* eslint-disable max-len */
/**
* character allowed in mc chat
* @param {String} character the character
* @return {boolean} allowed
*/
function isAllowedCharacter(character) { function isAllowedCharacter(character) {
return character !== '\xa7' && character >= ' ' && character !== '\x7f'; return character !== '\xa7' && character >= ' ' && character !== '\x7f';
} }
/**
* mc chat check if contains illegal chars.
* @param {String} string the string
* @return {boolean} if contains then true else false
*/
function containsIllegalCharacters(string) { function containsIllegalCharacters(string) {
for (let i = 0; i < string.length; i++) if (!isAllowedCharacter(string[i])) return true; for (let i = 0; i < string.length; i++) if (!isAllowedCharacter(string[i])) return true;
} }

View file

@ -1,15 +1,18 @@
/* eslint-disable no-var */
/* eslint-disable max-len */
/** /**
* escape markdown so on discord it will be \_ChipMC\_ instead of ChipMC in italic * escape markdown so on discord it will be \_ChipMC\_ instead of _ChipMC_
* @param {String} text * @param {String} text
* @param {Boolean} zwsp * @param {Boolean} zwsp
* @return {String} * @return {String}
*/ */
function escapeMarkdown(text, zwsp) { function escapeMarkdown(text, zwsp) {
let unescaped;
let escaped;
try { try {
var unescaped = text.replace(/\\(\*|@|_|`|~|\\)/g, '$1'); unescaped = text.replace(/\\(\*|@|_|`|~|\\)/g, '$1');
var escaped = unescaped.replace(/(\*|@|_|`|~|\\)/g, zwsp ? '\u200b\u200b\u200b\u200b\u200b$1' : '\\$1'); escaped = unescaped.replace(/(\*|@|_|`|~|\\)/g, zwsp ?
'\u200b\u200b$1' :
'\\$1',
);
} catch (e) { } catch (e) {
return unescaped; return unescaped;
} }

View file

@ -1,14 +1,19 @@
const fs = require('fs/promises') const fs = require('fs/promises');
async function fileExists (filepath) { /**
* check if file exists
* @param {String} filepath the file path
* @return {boolean} if file exists true else false
*/
async function fileExists(filepath) {
try { try {
await fs.access(filepath) await fs.access(filepath);
return true return true;
} catch (error) { } catch (error) {
if (error.code !== 'ENOENT') throw error if (error.code !== 'ENOENT') throw error;
return false return false;
} }
} }
module.exports = fileExists module.exports = fileExists;

View file

@ -1,13 +1,18 @@
const fs = require('fs/promises') const fs = require('fs/promises');
async function list (filepath = '.') { /**
const files = await fs.readdir(filepath) * just list the files
* @param {String} filepath file path
* @return {Array} component.
*/
async function list(filepath = '.') {
const files = await fs.readdir(filepath);
const component = [] const component = [];
files.forEach((filename, index) => { files.forEach((filename, index) => {
component.push(filename) component.push(filename);
}) });
return component return component;
} }
module.exports = list module.exports = list;

View file

@ -8,6 +8,11 @@ const profanityNames = ['Eagler', 'Eagler', 'Bitch', 'Cock', 'Milf', 'Milf', 'Ye
const names = ['Yeeish', 'Yeeish', 'Yee', 'Yee', 'Yeer', 'Yeeler', 'Eagler', 'Eagl', const names = ['Yeeish', 'Yeeish', 'Yee', 'Yee', 'Yeer', 'Yeeler', 'Eagler', 'Eagl',
'Darver', 'Darvler', 'Vool', 'Vigg', 'Vigg', 'Deev', 'Yigg', 'Yeeg']; 'Darver', 'Darvler', 'Vool', 'Vigg', 'Vigg', 'Deev', 'Yigg', 'Yeeg'];
/**
* gets a random item in an array
* @param {Array} arr the array
* @return {*} the item in the array
*/
function getRandomItem(arr) { function getRandomItem(arr) {
const randomIndex = Math.floor(Math.random() * arr.length); const randomIndex = Math.floor(Math.random() * arr.length);
const item = arr[randomIndex]; const item = arr[randomIndex];
@ -15,6 +20,11 @@ function getRandomItem(arr) {
return item; return item;
} }
/**
* generates an eaglercraft username (totally not converted from the eaglercraft repo)
* @param {boolean} profanity bad words.
* @return {String} the output of the generated eagler username
*/
function genUsername(profanity) { function genUsername(profanity) {
let username; let username;
if (profanity) { if (profanity) {

View file

@ -1,3 +1,9 @@
/**
* resize image.
* @param {number} width width
* @param {number} height height
* @return {object} width and height
*/
function resize(width, height) { function resize(width, height) {
const aspectRatio = width / height; const aspectRatio = width / height;

View file

@ -2,6 +2,13 @@ const fs = require('fs/promises');
const util = require('util'); const util = require('util');
const path = require('path'); const path = require('path');
/**
* load plugins
* @param {object} bot the bot object
* @param {object} dcclient discord client
* @param {object} config the config
* @param {object} rl readline
*/
async function loadPlugins(bot, dcclient, config, rl) { async function loadPlugins(bot, dcclient, config, rl) {
const plugins = await fs.readdir(path.join(__dirname, '..', 'plugins')); const plugins = await fs.readdir(path.join(__dirname, '..', 'plugins'));

View file

@ -1,6 +1,11 @@
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
/**
* loads js files
* @param {string} directory the directory that contains the js files
* @return {Array} an array of require()ed js files
*/
function loadPlugins(directory) { function loadPlugins(directory) {
const plugins = []; const plugins = [];

View file

@ -1,7 +1,7 @@
/** /**
* from codegrepper * from codegrepper
* @param {Number} d * @param {Number} d seconds
* @return {String} * @return {String} X hour, X minute, X second
*/ */
function secondsToHms(d) { function secondsToHms(d) {
d = Number(d); d = Number(d);

View file

@ -1,147 +0,0 @@
/* eslint-disable max-len */
const {language} = require('minecraft-data')('1.16.1');
const colormap = {
black: '§0',
dark_blue: '§1',
dark_green: '§2',
dark_aqua: '§3',
dark_red: '§4',
dark_purple: '§5',
gold: '§6',
gray: '§7',
dark_gray: '§8',
blue: '§9',
green: '§a',
aqua: '§b',
red: '§c',
light_purple: '§d',
yellow: '§e',
white: '§f',
reset: '§r',
};
const ansimap = {
'§0': '\x1b[0m\x1b[30m',
'§1': '\x1b[0m\x1b[34m',
'§2': '\x1b[0m\x1b[32m',
'§3': '\x1b[0m\x1b[36m',
'§4': '\x1b[0m\x1b[31m',
'§5': '\x1b[0m\x1b[35m',
'§6': '\x1b[0m\x1b[33m',
'§7': '\x1b[0m\x1b[37m',
'§8': '\x1b[0m\x1b[90m',
'§9': '\x1b[0m\x1b[94m',
'§a': '\x1b[0m\x1b[92m',
'§b': '\x1b[0m\x1b[96m',
'§c': '\x1b[0m\x1b[91m',
'§d': '\x1b[0m\x1b[95m',
'§e': '\x1b[0m\x1b[93m',
'§f': '\x1b[0m\x1b[97m',
'§r': '\x1b[0m',
'§l': '\x1b[1m',
'§o': '\x1b[3m',
'§n': '\x1b[4m',
'§m': '\x1b[9m',
'§k': '\x1b[6m',
};
/**
* Parses a native minecraft text component in string form.
* @param {string} string - A text component string, such as the chat packet's "message" property.
* @return {object} Parsed message in { raw, clean, ansi } form.
*/
function parseText(string) {
const json = JSON.parse(string);
let raw = parseJson(json, {color: 'reset'});
if (raw.startsWith('§r')) {
raw = raw.substring(2);
}
const clean = raw.replace(/§.?/g, '');
const ansi = raw.replace(/§.?/g, (m) => ansimap[m] || '');
return {raw, clean, ansi};
}
/**
* Parses a native minecraft text component in JSON form.
* @param {object} json - The json message.
* @param {object} parent - The parent json.
* @return {string} The parsed raw string.
*/
function parseJson(json, parent) {
if (typeof json === 'string') json = {text: json};
json.color ??= parent.color;
json.bold ??= parent.bold;
json.italic ??= parent.italic;
json.underlined ??= parent.underlined;
json.strikethrough ??= parent.strikethrough;
json.obfuscated ??= parent.obfuscated;
let raw = '';
let formatting = '';
raw += colormap[json.color] ?? '';
if (json.bold) {
formatting += '§l';
}
if (json.italic) {
formatting += '§o';
}
if (json.underlined) {
formatting += '§n';
}
if (json.strikethrough) {
formatting += '§m';
}
if (json.obfuscated) {
formatting += '§k';
}
raw += formatting;
if (json.text) {
raw += json.text;
} else if (json.translate) { // I checked with the native minecraft code. This is how Minecraft does the matching and group indexing. -hhhzzzsss
if (language[json.translate]) {
const _with = json.with ?? [];
let i = 0;
raw += language[json.translate].replace(/%(?:(\d+)\$)?(s|%)/g, (g0, g1) => {
if (g0 === '%%') {
return '%';
} else {
const idx = g1 ? parseInt(g1) : i++;
if (_with[idx]) {
return parseJson(_with[idx], json) + formatting;
} else {
return '';
}
}
});
} else {
raw += json.translate;
}
} else if (json.selector) {
raw += json.selector;
} else if (json.keybind) {
raw += json.keybind;
}
// Remove trailing section signs
let end = raw.length;
while (raw[end - 1] === '§') end--;
raw = raw.substring(0, end);
if (json.extra) {
json.extra.forEach((extra) => {
raw += parseJson(extra, json);
});
}
return raw;
}
module.exports = parseText;