diff options
| author | 8cy <[email protected]> | 2020-04-19 06:40:16 -0700 |
|---|---|---|
| committer | 8cy <[email protected]> | 2020-04-19 06:40:16 -0700 |
| commit | ed6e347bbcce356bde0cfeba498dab3d39a6c946 (patch) | |
| tree | 419225e81e9a3967ccf6f385a6e1c9c204d0b19c /dist/2b2w | |
| parent | link favi, v7.2.4 (diff) | |
| download | dep-core-test-2b2t.tar.xz dep-core-test-2b2t.zip | |
fix on a rainy day, added most of the supporttest-2b2t
issue, TypeError: Cannot read property 'end' of undefined when trying to stop
Diffstat (limited to 'dist/2b2w')
| -rw-r--r-- | dist/2b2w/config.json | 9 | ||||
| -rw-r--r-- | dist/2b2w/index.css | 40 | ||||
| -rw-r--r-- | dist/2b2w/index.html | 75 | ||||
| -rw-r--r-- | dist/2b2w/main.js | 134 | ||||
| -rw-r--r-- | dist/2b2w/secrets.json | 4 | ||||
| -rw-r--r-- | dist/2b2w/webserver.js | 65 |
6 files changed, 327 insertions, 0 deletions
diff --git a/dist/2b2w/config.json b/dist/2b2w/config.json new file mode 100644 index 0000000..6715543 --- /dev/null +++ b/dist/2b2w/config.json @@ -0,0 +1,9 @@ +{ + "ports": { + "minecraft": 25565, + "web": 80 + }, + "openBrowserOnStart": false, + "password": "", + "MCversion": "1.12.2" +} diff --git a/dist/2b2w/index.css b/dist/2b2w/index.css new file mode 100644 index 0000000..6a54055 --- /dev/null +++ b/dist/2b2w/index.css @@ -0,0 +1,40 @@ +body { + display: flex; + justify-content: center; + align-items: center; + width: 100vw; + height: 100vh; + margin: 0; + background-color: rgb(16, 16, 26); +} + +h1, .content { + margin: 0; + color: rgb(228, 228, 228); + font-family: sans-serif; +} + +button { + width: 128px; + height: 32px; + background-color: transparent; + border: none; + outline: none; + cursor: pointer; + font-family: sans-serif; + border-radius: 5px; + color: #e4e4e4; + transition-duration: 0.3s; +} + +button.start { + border: 3px solid #25c525; +} + +button.stop { + border: 2px solid #f32727; +} + +.place, .ETA{ + display: inline-block; +} diff --git a/dist/2b2w/index.html b/dist/2b2w/index.html new file mode 100644 index 0000000..f2efe0b --- /dev/null +++ b/dist/2b2w/index.html @@ -0,0 +1,75 @@ +<html> + <head> + <title>2Bored2Wait</title> + <link rel="stylesheet" href="index.css"> + </head> + <body> + <div class="content"> + <h1>Place in queue: <div class="place">None</div> </h1> + <h1>ETA: <div class="ETA">None</div> </h1> + Password (leave blank if none) : <input type="password" class="password"><br> + <button id="queueButton" class="start" onclick="start()">Start queuing</button><br><br> + <input type="checkbox" class="restartQueue" onchange="toggleRestartQueue()"> Restart the queue if you're not connected at the end of it? + </div> + <script> + setInterval(() => { //each second, update the info. + const xhr = new XMLHttpRequest(); + xhr.open("GET", "/update", true); + xhr.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + const response = JSON.parse(this.responseText); + document.getElementsByClassName("place")[0].innerHTML = response.place; + document.getElementsByClassName("ETA")[0].innerHTML = response.ETA; + document.getElementsByClassName("restartQueue")[0].checked = response.restartQueue + const queueButton = document.getElementById('queueButton'); + if(response.inQueue){ + queueButton.innerHTML = "Stop queuing"; + queueButton.setAttribute('onclick', 'stop()'); + queueButton.className = 'stop'; + }else{ + queueButton.innerHTML = "Start queuing"; + queueButton.setAttribute('onclick', 'start()'); + queueButton.className = 'start'; + } + } + } + xhr.setRequestHeader('XPassword', document.getElementsByClassName('password')[0].value) + xhr.send(); + + }, 1000); + + function start() { + const xhr = new XMLHttpRequest(); + xhr.open("GET", "/start", true); + xhr.setRequestHeader('XPassword', document.getElementsByClassName('password')[0].value) + xhr.send(); + const queueButton = document.getElementById('queueButton'); + queueButton.innerHTML = "Stop queuing"; + queueButton.setAttribute('onclick', 'stop()'); + queueButton.setAttribute('onclick', 'stop()'); + queueButton.className = 'stop'; + } + + function stop() { + const xhr = new XMLHttpRequest(); + xhr.open("GET", "/stop", true); + xhr.setRequestHeader('XPassword', document.getElementsByClassName('password')[0].value) + xhr.send(); + const queueButton = document.getElementById('queueButton'); + queueButton.innerHTML = "Start queuing"; + queueButton.setAttribute('onclick', 'start()'); + queueButton.className = 'start'; + document.getElementsByClassName("place")[0].innerHTML = 'None'; + document.getElementsByClassName("ETA")[0].innerHTML = 'None'; + } + + function toggleRestartQueue(){ + const xhr = new XMLHttpRequest(); + xhr.open("GET", "/togglerestart", true); + xhr.setRequestHeader('XPassword', document.getElementsByClassName('password')[0].value) + xhr.send(); + } + + </script> + </body> +</html> diff --git a/dist/2b2w/main.js b/dist/2b2w/main.js new file mode 100644 index 0000000..44119bb --- /dev/null +++ b/dist/2b2w/main.js @@ -0,0 +1,134 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const minecraft_protocol_1 = __importDefault(require("minecraft-protocol")); +const webserver = require('./webserver.js'); +const opn_1 = __importDefault(require("opn")); +const secrets_json_1 = __importDefault(require("./secrets.json")); +const config_json_1 = __importDefault(require("./config.json")); +webserver.createServer(config_json_1.default.ports.web); +webserver.password = config_json_1.default.password; +webserver.onstart(() => { + startQueuing(); +}); +webserver.onstop(() => { + stop(); +}); +if (config_json_1.default.openBrowserOnStart) { + opn_1.default('http://localhost:' + config_json_1.default.ports.web); +} +let proxyClient; +let client; +let server; +function stop() { + webserver.isInQueue = false; + webserver.queuePlace = "None"; + webserver.ETA = "None"; + client.end("disconnect"); + if (proxyClient) { + proxyClient.end("Stopped the proxy."); + } + server.close(); +} +exports.stop = stop; +function startQueuing() { + var playerId; + webserver.isInQueue = true; + client = minecraft_protocol_1.default.createClient({ + host: "2b2t.org", + port: 25565, + username: secrets_json_1.default.username, + password: secrets_json_1.default.password, + version: config_json_1.default.MCversion + }); + let finishedQueue = false; + client.on("packet", (data, meta) => { + if (!finishedQueue && meta.name === "playerlist_header") { + let headermessage = JSON.parse(data.header); + let positioninqueue = headermessage.text.split("\n")[5].substring(25); + let ETA = headermessage.text.split("\n")[6].substring(27); + webserver.queuePlace = positioninqueue; + webserver.ETA = ETA; + server.motd = `Place in queue: ${positioninqueue}`; + } + if (meta.name == "login") { + playerId = data.entityId; + } + if (finishedQueue === false && meta.name === "chat") { + let chatMessage = JSON.parse(data.message); + if (chatMessage.text && chatMessage.text === "Connecting to the server...") { + if (webserver.restartQueue && proxyClient == null) { + stop(); + setTimeout(startQueuing, 100); + } + else { + finishedQueue = true; + webserver.queuePlace = "FINISHED"; + webserver.ETA = "NOW"; + } + } + } + if (proxyClient) { + filterPacketAndSend(data, meta, proxyClient); + } + }); + client.on('end', () => { + if (proxyClient) { + proxyClient.end("Connection reset by 2b2t server.\nReconnecting..."); + proxyClient = null; + } + stop(); + }); + client.on('error', (err) => { + if (proxyClient) { + proxyClient.end(`Connection error by 2b2t server.\n Error message: ${err}\nReconnecting...`); + proxyClient = null; + } + console.log('err', err); + stop(); + }); + server = minecraft_protocol_1.default.createServer({ + 'online-mode': true, + encryption: true, + host: '0.0.0.0', + port: config_json_1.default.ports.minecraft, + version: config_json_1.default.MCversion, + 'max-players': maxPlayers = 1 + }); + server.on('login', (newProxyClient) => { + if (newProxyClient.username !== client.username) { + stop(); + } + newProxyClient.write('login', { + entityId: playerId, + levelType: 'default', + gameMode: 0, + dimension: 0, + difficulty: 2, + maxPlayers: server.maxPlayers, + reducedDebugInfo: false + }); + newProxyClient.write('position', { + x: 0, + y: 1.62, + z: 0, + yaw: 0, + pitch: 0, + flags: 0x00 + }); + newProxyClient.on('packet', (data, meta) => { + filterPacketAndSend(data, meta, proxyClient); + }); + proxyClient = newProxyClient; + }); +} +exports.startQueuing = startQueuing; +function filterPacketAndSend(data, meta, dest) { + if (meta.name != "keep_alive" && meta.name != "update_time") { + dest.write(meta.name, data); + } +} +exports.filterPacketAndSend = filterPacketAndSend; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy8yYjJ3L21haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0RUFBb0M7QUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUE7QUFDM0MsOENBQXNCO0FBQ3RCLGtFQUFxQztBQUNyQyxnRUFBbUM7QUFFbkMsU0FBUyxDQUFDLFlBQVksQ0FBQyxxQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QyxTQUFTLENBQUMsUUFBUSxHQUFHLHFCQUFNLENBQUMsUUFBUSxDQUFDO0FBQ3JDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO0lBQ3RCLFlBQVksRUFBRSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBQ0gsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7SUFDckIsSUFBSSxFQUFFLENBQUM7QUFDUixDQUFDLENBQUMsQ0FBQztBQUVILElBQUkscUJBQU0sQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixhQUFHLENBQUMsbUJBQW1CLEdBQUcscUJBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Q0FDL0M7QUFJRCxJQUFJLFdBQVcsQ0FBQztBQUNoQixJQUFJLE1BQU0sQ0FBQztBQUNYLElBQUksTUFBTSxDQUFDO0FBR1gsU0FBZ0IsSUFBSTtJQUNuQixTQUFTLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUM1QixTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztJQUM5QixTQUFTLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztJQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pCLElBQUksV0FBVyxFQUFFO1FBQ2hCLFdBQVcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztLQUN0QztJQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FB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
\ No newline at end of file diff --git a/dist/2b2w/secrets.json b/dist/2b2w/secrets.json new file mode 100644 index 0000000..2bc9d32 --- /dev/null +++ b/dist/2b2w/secrets.json @@ -0,0 +1,4 @@ +{ + "username": "[email protected]", + "password": "BGyorok2" +} diff --git a/dist/2b2w/webserver.js b/dist/2b2w/webserver.js new file mode 100644 index 0000000..f93e874 --- /dev/null +++ b/dist/2b2w/webserver.js @@ -0,0 +1,65 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const http_1 = __importDefault(require("http")); +const fs_1 = __importDefault(require("fs")); +module.exports = { + createServer: (port) => { + http_1.default.createServer((req, res) => { + if (req.url === "./") { + res.writeHead(200, { 'Content-type': 'text/html' }); + res.write(fs_1.default.readFileSync('index.html')); + res.end(); + } + else if (req.url === "./index.css") { + res.writeHead(200, { 'Content-type': 'text/css' }); + res.write(fs_1.default.readFileSync('index.css')); + res.end(); + } + else if (module.exports.password == "" || req.headers.xpassword == module.exports.password) { + if (req.url === "/update") { + res.writeHead(200, { 'Content-type': 'text/json' }); + res.write("{\"username\": \"" + module.exports.username + "\",\"place\": \"" + module.exports.queuePlace + "\",\"ETA\": \"" + module.exports.ETA + "\", \"inQueue\": " + module.exports.isInQueue + ", \"restartQueue\":" + module.exports.restartQueue + "}"); + res.end(); + } + else if (req.url === "/start") { + res.writeHead(200); + res.end(); + module.exports.onstartcallback(); + } + else if (req.url === "/stop") { + res.writeHead(200); + res.end(); + module.exports.onstopcallback(); + } + else if (req.url === "/togglerestart") { + module.exports.restartQueue = !module.exports.restartQueue; + } + else { + res.writeHead(404); + res.end(); + } + } + else { + res.writeHead(403); + res.end(); + } + }).listen(port); + }, + onstart: (callback) => { + module.exports.onstartcallback = callback; + }, + onstop: (callback) => { + module.exports.onstopcallback = callback; + }, + queuePlace: "None", + ETA: "None", + isInQueue: false, + onstartcallback: null, + onstopcallback: null, + restartQueue: false, + password: "" +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjLzJiMncvd2Vic2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsZ0RBQXdCO0FBQ3hCLDRDQUFvQjtBQUVwQixNQUFNLENBQUMsT0FBTyxHQUFHO0lBQ2IsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbkIsY0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMzQixJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUNsQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO2dCQUNsRCxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDekMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ2I7aUJBQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLGFBQWEsRUFBRTtnQkFDbEMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBQyxjQUFjLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQztnQkFDakQsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNiO2lCQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUMxRixJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFO29CQUN2QixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO29CQUNsRCxHQUFHLENBQUMsS0FBSyxDQUFDLG1CQUFtQixHQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFFLGtCQUFrQixHQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFFLGdCQUFnQixHQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFFLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFDLHFCQUFxQixHQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNuUCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ2I7cUJBQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtvQkFDN0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDbkIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNWLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQ3BDO3FCQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7b0JBQzVCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDVixNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO2lCQUNuQztxQkFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssZ0JBQWdCLEVBQUM7b0JBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7aUJBQzlEO3FCQUFNO29CQUNILEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDYjthQUNKO2lCQUFNO2dCQUNILEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUNiO1FBQ0wsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDOUMsQ0FBQztJQUNELE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsVUFBVSxFQUFHLE1BQU07SUFDbkIsR0FBRyxFQUFFLE1BQU07SUFDWCxTQUFTLEVBQUUsS0FBSztJQUNoQixlQUFlLEVBQUUsSUFBSTtJQUNyQixjQUFjLEVBQUUsSUFBSTtJQUNwQixZQUFZLEVBQUUsS0FBSztJQUNuQixRQUFRLEVBQUUsRUFBRTtDQUNmLENBQUMifQ==
\ No newline at end of file |