chomens-bot-js/index.js
2022-10-26 19:17:14 +07:00

518 lines
18 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable no-var */
/* eslint-disable prefer-rest-params */
/* eslint-disable no-tabs */
/* eslint-disable max-len */
/* eslint-disable no-undef */
const mc = require('minecraft-protocol');
const config = require('./config');
const crypto = require('crypto');
const colorConvert = require('color-convert');
const {containsIllegalCharacters} = require('./util/containsIllegalCharacters');
const generateEaglerUsername = require('./util/generateEaglerUsername');
const {EventEmitter} = require('events');
const fs = require('fs');
const path = require('path');
const uuid = require('uuid-by-string');
const readline = require('node:readline');
const {stdin: input, stdout: output} = require('node:process');
const rl = readline.createInterface({input, output});
const moment = require('moment-timezone');
const cowsay = require('cowsay2');
const cows = require('cowsay2/cows');
const util = require('node:util');
const {escapeMarkdown} = require('./util/escapeMarkdown');
const {VM} = require('vm2');
const randomstring = require('randomstring');
const mineflayer = require('mineflayer');
// readline > fix on console.log
const log = console.log;
console.log = function() {
rl.output.write('\x1b[2K\r');
log.apply(console, Array.prototype.slice.call(arguments));
rl._refreshLine();
};
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
// Load discord.js
const {
Client,
Intents,
} = require('discord.js');
// Create Discord intentions, required in v13
const intents = new Intents(['GUILDS', 'GUILD_MESSAGES']);
// Create Discord client
const dcclient = new Client({
intents,
});
const ayunboomchannel = config.discord.servers['sus.shhnowisnottheti.me:25565'];
const dinboomchannel = config.discord.servers['129.159.58.114:25565'];
const kaboomchannel = config.discord.servers['kaboom.pw:25565'];
const localclonechannel = config.discord.servers['192.168.1.103:25565'];
const kitsunechannel = config.discord.servers['kitsune.icu:25565'];
const chomensserverchannel = config.discord.servers['mc.chomens41793.ga:25565'];
let chomenschannel = '969773424387981356';
const hashchannel = '980438368422871151';
const ownerhashchannel = '980786390247833620';
/**
* Error
* @param {*} err
*/
// async function onerror(err) {
// try {
// console.log(`INFO: Disconnected: ${err}`);
// fs.appendFileSync('./logs.txt', `INFO: Disconnected: ${err}\r\n`);
// const Embed = new MessageEmbed()
// .setColor('#FF0000')
// .setTitle(`${err.message ?? 'Disconnected'}`)
// .setDescription(`\`\`\`text\n${err}\`\`\``);
// channel.send({embeds: [Embed]});
// if (err.includes('issued "end" command')) {
// bot.chat('Restarting...');
// }
// await sleep(1000);
// bot.end();
// bot._client = mc.createClient(bot.options);
// } catch (e) {
// return;
// }
// }
/**
* empty function for discord message
* @return {String}
*/
function dcmsg() {
return 'this does nothing...';
}
function botThings() {
bot = new EventEmitter();
bot.options = {
username: process.argv[2] === 'mc.chomens41793.ga' ? 'ChomeNS_Bot' : randomstring.generate(16),
host: process.argv[2],
port: process.argv[3] ? Number(process.argv[3]) : 25565,
version: config.version,
checkTimeoutInterval: '30000',
keepAlive: false,
hideErrors: true,
};
bot._client = mc.createClient(bot.options);
bot.version = bot._client.version;
bot.queue = [];
bot.write = (name, data) => bot._client.write(name, data);
bot.end = (reason = 'end') => {
bot.emit('end', reason);
bot.removeAllListeners();
bot._client.end();
bot._client.removeAllListeners();
};
bot.visibility = false;
bot.command_handler = function() {
return;
};
bot.command_handler.commands = {};
bot.getplayerusername = {};
// allink's plugin loader
const plugins = []; // NOTE: DO NOT CHANGE, PLUGINS ARE LOADED AUTOMATICALLY
fs.readdirSync(
path.join(__dirname, 'plugins'),
).forEach(function(file) { // populate plugins array
if (file.endsWith('.js')) {
plugins.push(path.join(__dirname, 'plugins', file));
}
});
plugins.forEach(function(plugin) { // load plugins
let name = plugin.split('/');
name = name[name.length - 1];
try {
const plug = require(plugin);
plug.inject(bot, dcclient, config);
} catch (e) {
console.log(`Plugin loader: Plugin ${name} is having exception loading the plugin:`);
console.log(util.inspect(e));
}
});
}
let messageloggingEnabled = true;
/**
* Main bot function
*/
function main() {
// allink's chat queue
chatQueue = setInterval(function() {
try {
if (bot.queue[0] || bot.queue[0]==='') {
try {
if (containsIllegalCharacters(bot.queue[0])) {
bot.queue.shift();
return;
};
bot.write('chat', {message: bot.queue[0].substring(0, 256)});
bot.queue.shift();
} catch (e) {
console.log(e.message);
}
}
} catch (e) {
return;
}
}, 450);
module.exports = function() {
return bot;
};
dcmsg.queue = '';
consoleQueue = [];
bot.playersAddedPlayers = {};
bot.getplayerusername = {};
bot.hash = '';
sleep = (time) => new Promise((a)=>setTimeout(a, time)),
bot.chat = (message) => {
bot.queue.push(String(message));
};
// fixCmdBlocksOnlyCore=(core)=>{
// const cmd = `/minecraft:fill ${Math.floor(bot.position.x)} 0 ${Math.floor(bot.position.z)} ${Math.floor(bot.position.x + 15)} 63 ${Math.floor(bot.position.z + 15)} command_block{CustomName: '{"text":"ChomeNS Bot Core","color":"yellow"}'} replace`;
// if (core===true) {
// bot.core.run(cmd);
// } else {
// bot.chat(cmd);
// }
// };
// fixCmdBlocks=()=>{
// bot.chat('/essentials:world world');
// fixCmdBlocksOnlyCore();
// };
discordQueue = setInterval(function() {
if (dcmsg.queue!='') {
channel.send('```ansi\n' + dcmsg.queue.substring(0, 1986) + '\n```');
dcmsg.queue = '';
}
}, 1500);
consoleQueueInterval = setInterval(function() {
if (!messageloggingEnabled) return;
if (consoleQueue.length > 50) consoleQueue = [];
if (consoleQueue[0] || consoleQueue[0]==='') {
console.log('\u001b[48:5:208m' + bot.options.host + '\u001b[0m' + ': ' + consoleQueue[0].substring(0, 10000)/* message.toAnsi() + '\u001b[0m'*/);
consoleQueue.shift();
}
}, 100);
bot.once('end', (reason, event) => {
console.log(`Disconnected from ${bot.options.host} (${event} event): ${util.inspect(reason)}`);
channel.send(`Disconnected: \`${util.inspect(reason)}\``);
const timeout = config.reconnectTimeout;
try {
if (reason.text) {
if (reason.text === 'Wait 5 seconds before connecting, thanks! :)') timeout = 1000 * 6;
if (reason.text === 'You are logging in too fast, try again later.') timeout = 1000 * 6;
}
} catch (e) {}
try {
clearInterval(notonline);
clearInterval(discordQueue);
clearInterval(chatQueue);
clearInterval(consoleQueueInterval);
} catch (e) {}
setTimeout(() => {
bot.end();
botThings();
main();
}, timeout);
});
console.log(`Connecting to: ${bot.options.host}:${bot.options.port}...`);
// fs.appendFileSync('./logs.txt', `\r\Connecting to: ${bot.options.host}:${bot.options.port}...\r\n`);
channel.send(`Connecting to: \`${bot.options.host}:${bot.options.port}\`...`);
bot._client.on('login', async function(data) {
bot.entityId = data.entityId;
bot.uuid = bot._client.uuid;
bot.username = bot._client.username;
chatMessage = require('prismarine-chat')(bot.version);
const mcData = require('minecraft-data')(bot.version);
console.log(`Successfully logged in to: ${bot.options.host}:${bot.options.port}`);
// fs.appendFileSync('./logs.txt', `\r\nSuccessfully logged in to: ${bot.options.host}:${bot.options.port}\r\n`);
channel.send(`Successfully logged in to: \`${bot.options.host}:${bot.options.port}\``);
previusMessage = undefined;
loginfinish = false;
started = false;
bot.eaglercrashstarted = false;
await sleep(1500);
bot.createCore();
bot.vmoptions = {
timeout: 2000,
sandbox: {
run: function(cmd) {
bot.core.run(cmd);
},
mc,
mineflayer,
chat: bot.chat,
moment,
randomstring,
uuid,
chatMessage,
crypto,
colorConvert,
bruhifyText: function(message) {
if (typeof message!=='string') throw new SyntaxError('message must be a string');
bot.bruhifyText = message.substring(0, 1000);
},
generateEaglerUsername,
cowsay,
cows,
mcData,
},
// require: {
// mock: {
// run: run,
// randomchar: randomchar,
// chat: bot.chat,
// mineflayer: mineflayer
// }
// }
};
bot.vm = new VM(bot.vmoptions);
loginfinish = true;
await sleep(1400);
bot.core.run('minecraft:tellraw @a ' + JSON.stringify([{text: 'ChomeNS Bot', color: 'yellow'}, {text: ' - ', color: 'dark_gray'}, {text: 'made by ', color: 'gray'}, {text: 'chayapak', color: 'gold'}]));
});
bot.on('parsed_chat', async function(message, data) {
// try catch prevents hi % exploit (it uses prismarine-chat) and json parse error
try {
if (previusMessage===message.toString()) return;
previusMessage = message.toString();
const parsedMessage = JSON.parse(data.message);
if (parsedMessage.translate==='translation.test.invalid') return;
// down here it prevents command set message
if (parsedMessage.translate==='advMode.setCommand.success') return;
if (parsedMessage.extra!==undefined) {
if (parsedMessage.extra[0].text==='Command set: ') return;
}
// prevent braille cuz it CRASHES THE ENTIRE LAPTOP
if (message.toString().includes('⣿')) return;
const cleanMessage = escapeMarkdown(message.toAnsi(), true);
discordMsg = /* '_ _ ' + */cleanMessage.replaceAll('@', '@\u200b\u200b\u200b\u200b\u200b').replaceAll('http', 'http\u200b\u200b\u200b\u200b\u200b').replaceAll('\u001b[9', '\u001b[3');// .replace(/[\r\n]/gm, '\n')
consoleQueue.push(message.toAnsi());
// fs.appendFileSync('./logs.txt', `${bot.options.host}: ${message.toMotd()}\r\n`);
// if (discordMsg)return channel.send(`${discordMsg.substring(0, 2000)}`)
if (message.toMotd().startsWith('§8[§eChomeNS §9Discord§8] §c')) return;
dcmsg.queue += '\n' + discordMsg;
} catch (e) {
return;
}
});
// bot.on('message', async function(username, message, sender) {
// try {
// const usernameraw = username;
// // let username = usernameraw.replace(/§[a-f0-9rlonmk]/g, "").replace(/§/g, "");
// const messageraw = message;
// var username = getplayerusername[sender];
// var message = messageraw.replace(/§[a-f0-9rlonmk]/g, '').replace(/§/g, '');
// // if (username===bot.username)return
// // console.log(username + ': ' + message);
// allCommands(username, message, usernameraw, sender);
// } catch (e) {
// console.log(e);
// }
// });
// bot.on('cspy', async function(username, message) {
// // eslint-disable-next-line no-redeclare
// var username = username.replace(/§[a-f0-9rlonmk]/g, '').replace(/§/g, '');
// // eslint-disable-next-line no-redeclare
// var message = message.replace(/§[a-f0-9rlonmk]/g, '').replace(/§/g, '');
// const args = message.substring(5).trim().split(' ');
// args[0] = args[0].toLowerCase();
// try {
// allCommands(username, message, username, '00000000-0000-0000-0000-000000000000');
// } catch (e) {
// bot.core.run('minecraft:tellraw @a ' + JSON.stringify({text: String(e), color: 'red'}));
// }
// });
bot.on('player_added', (player) => {
bot.playersAddedPlayers[player.name] = player.UUID;
bot.getplayerusername[player.UUID] = player.name;
});
bot._client.on('end', function(reason) {
bot.emit('end', reason, 'end');
// onerror('end event: ' + util.inspect(reason).replaceAll('runner', 'chayapak1'));
});
bot._client.on('keep_alive', (packet) => bot.write('keep_alive', {keepAliveId: packet.keepAliveId}));
// bot._client.on('tab_complete', (packet) => bot.tabcompleteplayers = packet.matches);
bot._client.on('kick_disconnect', function(data) {
const parsed = JSON.parse(data.reason);
bot.emit('end', parsed, 'kick_disconnect');
// onerror('kick_disconnect event: ' + util.inspect(reason));
});
bot._client.on('disconnect', function(data) {
const parsed = JSON.parse(data.reason);
bot.emit('end', parsed, 'disconnect');
});
bot._client.on('error', function() {
// console.log('Error: ' + util.inspect(error));
// channel.send('Error: ' + util.inspect(error));
// onerror('error event: ' + util.inspect(err).replaceAll('runner', 'chayapak1'));
});
process.on('uncaughtException', (error) => {
console.log('uncaught ' + util.inspect(error));
channel.send('uncaught ```\n' + util.inspect(error) + '\n```');
bot.emit('end', 'uncaughtException', 'process: uncaughtException');
});
}
dcclient.on('ready', async () => {
botThings();
// Find the Discord channel messages will be sent to
if (process.argv[2]==='sus.shhnowisnottheti.me') {
channel = dcclient.channels.cache.get(ayunboomchannel);
bot.channel = dcclient.channels.cache.get(ayunboomchannel);
}
if (process.argv[2]==='129.159.58.114') {
channel = dcclient.channels.cache.get(dinboomchannel);
bot.channel = dcclient.channels.cache.get(dinboomchannel);
}
if (process.argv[2]==='kaboom.pw') {
channel = dcclient.channels.cache.get(kaboomchannel);
bot.channel = dcclient.channels.cache.get(kaboomchannel);
}
if (process.argv[2]==='192.168.1.103') {
channel = dcclient.channels.cache.get(localclonechannel);
bot.channel = dcclient.channels.cache.get(localclonechannel);
}
if (process.argv[2]==='kitsune.icu') {
channel = dcclient.channels.cache.get(kitsunechannel);
bot.channel = dcclient.channels.cache.get(kitsunechannel);
}
if (process.argv[2]==='mc.chomens41793.ga') {
channel = dcclient.channels.cache.get(chomensserverchannel);
bot.channel = dcclient.channels.cache.get(chomensserverchannel);
}
await sleep(200);
main();
chomenschannel = dcclient.channels.cache.get(chomenschannel);
bot.hashchannel = dcclient.channels.cache.get(hashchannel);
bot.ownerhashchannel = dcclient.channels.cache.get(ownerhashchannel);
bot.channelId = channel.id;
attachmentlink = '';
// Console COMMANDS
rl.on('line', function(line) {
try {
if (line.toLowerCase()==='' || line.toLowerCase().startsWith(' ')) return;
if (line.toLowerCase()==='.exit' || line.toLowerCase()==='.end') {
bot.emit('end', 'end command');
// onerror('Console issued "end" command, rebooting bot...');
return;
}
if (line.toLowerCase().startsWith('.servereval ')) {
try {
bot.core.run('minecraft:tellraw @a ' + JSON.stringify({text: `${util.inspect(eval(`${line.substring(12)}`))}`, color: 'green'}));
return;
} catch (err) {
bot.core.run('minecraft:tellraw @a ' + JSON.stringify({text: `${util.inspect(err)}`, color: 'red'}));
return;
}
}
if (line==='.clearconsolequeue') {
consoleQueue = [];
return;
}
if (line==='.messagelogging on') {
messageloggingEnabled = true;
return;
}
if (line==='.messagelogging off') {
messageloggingEnabled = false;
return;
}
if (line==='.kill') process.exit();
// if (line.startsWith("."))return console.log('command not found')
if (line.startsWith('.')) return bot.command_handler.run('Console', '§a§lConsole§r', '*' + line.substring(1), 'c0ns0le-uuid');
bot.core.run('minecraft:tellraw @a ' + JSON.stringify(['', {'text': '[', 'color': 'dark_gray'}, {'text': `${bot.username} Console`, 'color': 'gray'}, {'text': '] ', 'color': 'dark_gray'}, {'text': 'chayapak ', 'color': 'green'}, {'text': ' ', 'color': 'dark_gray'}, chatMessage.MessageBuilder.fromString('&7' + line)]));
} catch (e) {
console.log(e);
}
});
});
// Redirect Discord messages to in-game chat
dcclient.on('messageCreate', async (message) => {
// Ignore messages from the bot itself
if (message.author.id === dcclient.user.id) return;
// Only handle messages in specified channel
if (message.channel.id != channel.id) return;
if (message.content.startsWith(config.discord.prefix)) return;
try {
const attachmentsComponent = [];
if (message.attachments) {
message.attachments.forEach((value) => {
attachmentsComponent.push({
text: ' [Attachment]',
color: 'green',
clickEvent: {
action: 'open_url',
value: value.proxyURL,
},
});
});
}
const component = [
{text: '[', color: 'dark_gray'},
{text: 'ChomeNS ', color: 'yellow', clickEvent: {
action: 'open_url',
value: 'https://discord.gg/xdgCkUyaA4',
}},
{text: 'Discord', color: 'blue', clickEvent: {
action: 'open_url', value: 'https://discord.gg/xdgCkUyaA4',
}},
{text: '] ', color: 'dark_gray'},
{text: `${message.member.displayName}`, color: 'red', clickEvent: {
action: 'copy_to_clipboard', value: `${message.author.username}#${message.author.discriminator}`,
}},
{text: ' ', color: 'dark_gray'},
chatMessage.MessageBuilder.fromString('&7' + message.content),
attachmentsComponent.length === 0 ? '' : attachmentsComponent,
];
bot.core.run('minecraft:tellraw @a ' + JSON.stringify(component));
} catch (e) {
return;
}
});
dcclient.login(config.discord.token);