const util = require('util') const mc = require('minecraft-protocol') const { loadPlugins } = require('../util/loadPlugins') function inject (bot, dcclient, config) { if (!config.proxy.enabled) return let index config.servers.forEach((server, _index) => { if (bot.options.host !== server.host) return index = _index }) const version = config.proxy.version const srv = mc.createServer({ 'online-mode': false, port: 25566 + index, keepAlive: false, version }) srv.on('login', function (client) { bot.console.info(`[Proxy] ${client.username} connected to proxy`) let clientEnded = false let targetEnded = false const target = mc.createClient({ username: client.username, host: bot.options.host, version }) const targetPacketBlacklist = [] target.chat = function (message) { target.write('chat', { message }) } target.on('login', (packet) => { bot.console.info(`[Proxy] ${client.username} target logged in`) target.entityId = packet.entityId loadPlugins(bot, null, config, null, target, client, true, targetPacketBlacklist) }) target.on('packet', (data, meta) => { if (!clientEnded && meta.state === mc.states.PLAY && client.state === mc.states.PLAY && !targetPacketBlacklist.includes(meta.name) ) client.write(meta.name, data) }) target.on('error', () => {}) target.on('end', () => { target.end() targetEnded = true }) client.on('end', function () { clientEnded = true target.end() target.removeAllListeners() client.removeAllListeners() bot.console.info(`[Proxy] ${client.username} ended`) }) client.on('error', function () { clientEnded = true target.removeAllListeners() client.removeAllListeners() bot.console.info(`[Proxy] ${client.username} got error`) }) client.on('packet', (data, meta) => { if (meta.name === 'chat' && !data.message?.startsWith('/')) { if (data.message.startsWith('.')) { return bot.command_handler.run( client.username, client.username, '*' + data.message.substring(1), client.uuid, null, 'h', 'o', client.username ) } return } target.write(meta.name, data) }) function endListener (reason) { client.end(`Bot disconnected with reason: ${util.inspect(reason)}`) bot.off('end', endListener) srv.close() srv.removeAllListeners() } bot.on('end', endListener) }) }; module.exports = { inject }