mirror of
https://github.com/darverdevs/BetterMultiPort.git
synced 2024-12-21 14:44:11 -08:00
fard
This commit is contained in:
commit
d0b4d5f8df
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
bukkit_command/
|
||||||
|
node_modules/
|
||||||
|
package-lock.json
|
70
app.js
Normal file
70
app.js
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
const Net = require('net');
|
||||||
|
const listenPort = 25565;
|
||||||
|
const mcHost = "freedom.play.totalfreedom.me";
|
||||||
|
const mcPort = 25565;
|
||||||
|
const httpHost = "localhost";
|
||||||
|
const httpPort = 8080;
|
||||||
|
const timeout = 10000;
|
||||||
|
|
||||||
|
const server = new Net.Server();
|
||||||
|
server.listen(listenPort, function() {
|
||||||
|
//
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on('connection', function(socket) {
|
||||||
|
let client = null;
|
||||||
|
|
||||||
|
let determinedClient = false;
|
||||||
|
|
||||||
|
socket.on('data', function(chunk) {
|
||||||
|
if(!determinedClient){
|
||||||
|
let req = chunk.toString();
|
||||||
|
if(req.startsWith("GET ")||req.startsWith("HEAD ")||req.startsWith("POST ")||req.startsWith("PUT ")||req.startsWith("DELETE ")||req.startsWith("CONNECT ")||req.startsWith("OPTIONS ")||req.startsWith("TRACE ")||req.startsWith("PATCH ")){
|
||||||
|
makeClient(httpHost,httpPort,socket,c=>client=c);
|
||||||
|
}else{
|
||||||
|
makeClient(mcHost,mcPort,socket,c=>client=c);
|
||||||
|
}
|
||||||
|
determinedClient=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeData(chunk);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('end', function() {
|
||||||
|
if(client!=null)client.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('error', function(err) {
|
||||||
|
//console.log(`Server Error: ${err}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function writeData(chunk){
|
||||||
|
let i=Date.now();
|
||||||
|
while(client==null&&(Date.now()-i<timeout/10)){
|
||||||
|
await new Promise(a=>setTimeout(a,10));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(client==null&&socket!=null)return socket.end();
|
||||||
|
|
||||||
|
client.write(chunk);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function makeClient(host,port,socket,cb){
|
||||||
|
const client = new Net.Socket();
|
||||||
|
client.connect({ port: port, host: host }, function() {
|
||||||
|
cb(client);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('end', function() {
|
||||||
|
if(socket!=null)socket.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('data', function(chunk) {
|
||||||
|
if(socket!=null)socket.write(chunk);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('error', function(err) {
|
||||||
|
//console.log(`Client Error: ${err}`);
|
||||||
|
});
|
||||||
|
}
|
186
eagler.js
Normal file
186
eagler.js
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
const Net = require('net');
|
||||||
|
const listenPort = 25565;
|
||||||
|
const mcHost = "localhost";
|
||||||
|
const mcPort = 25569;
|
||||||
|
const httpPort = 8080;
|
||||||
|
const timeout = 10000;
|
||||||
|
const changeProtocol = true;
|
||||||
|
const removeSkin = true;
|
||||||
|
|
||||||
|
const { WebSocketServer, WebSocket } = require('ws');
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const mime = require("mime-types");
|
||||||
|
const bufferReplace = require('buffer-replace');
|
||||||
|
|
||||||
|
const prefix = "www";
|
||||||
|
|
||||||
|
let files = [];
|
||||||
|
let cache = {};
|
||||||
|
|
||||||
|
function throughDirectory(directory) {
|
||||||
|
fs.readdirSync(directory).forEach(file => {
|
||||||
|
const absolute = path.join(directory, file);
|
||||||
|
if (fs.statSync(absolute).isDirectory()) return throughDirectory(absolute);
|
||||||
|
else return files.push(absolute.toString().slice(prefix.length+1).replace(/\\/g,"/"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
throughDirectory(prefix);
|
||||||
|
|
||||||
|
const httpsrv = require("http").createServer((req,res)=>{
|
||||||
|
let url = req.url;
|
||||||
|
if(url.startsWith("/"))url=url.slice(1);
|
||||||
|
if(url=="")url = "index.html";
|
||||||
|
if(files.includes(url)){
|
||||||
|
res.writeHead(200,{"Content-Type":mime.contentType(url)});
|
||||||
|
if(!(url in cache)){
|
||||||
|
cache[url]=fs.readFileSync(prefix+"/"+url);
|
||||||
|
}
|
||||||
|
res.end(cache[url]);
|
||||||
|
}else{
|
||||||
|
res.writeHead(404,{"Content-Type":"text/plain"});
|
||||||
|
res.end("404 Not Found");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const wss = new WebSocketServer({ server: httpsrv });
|
||||||
|
|
||||||
|
wss.on('connection', function(ws) {
|
||||||
|
let client = null;
|
||||||
|
makeWsMcClient(ws,c=>client=c);
|
||||||
|
|
||||||
|
let msgNum = 0;
|
||||||
|
|
||||||
|
ws.on('message', function(data) {
|
||||||
|
if(msgNum==0){
|
||||||
|
msgNum++;
|
||||||
|
if(changeProtocol)data=bufferReplace(data,Buffer.from("0245","hex"),Buffer.from("023d","hex"));
|
||||||
|
}else if(msgNum==1){
|
||||||
|
msgNum++;
|
||||||
|
if(removeSkin)return;//eaglercraft skin
|
||||||
|
}
|
||||||
|
writeData(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
ws.on('close', function(){
|
||||||
|
closeIt();
|
||||||
|
});
|
||||||
|
|
||||||
|
async function writeData(chunk){
|
||||||
|
if(await waitForIt())client.write(chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function closeIt(){
|
||||||
|
if(await waitForIt())client.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function waitForIt(){
|
||||||
|
let i=Date.now();
|
||||||
|
while(client==null&&(Date.now()-i<timeout/10)){
|
||||||
|
await new Promise(a=>setTimeout(a,10));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(client==null){
|
||||||
|
if(ws.readyState==WebSocket.OPEN)ws.close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
httpsrv.listen(httpPort);
|
||||||
|
|
||||||
|
const server = new Net.Server();
|
||||||
|
server.listen(listenPort, function() {
|
||||||
|
//
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on('connection', function(socket) {
|
||||||
|
let client = null;
|
||||||
|
|
||||||
|
let determinedClient = false;
|
||||||
|
|
||||||
|
socket.on('data', function(chunk) {
|
||||||
|
if(!determinedClient){
|
||||||
|
let req = chunk.toString();
|
||||||
|
if(req.startsWith("GET ")||req.startsWith("HEAD ")||req.startsWith("POST ")||req.startsWith("PUT ")||req.startsWith("DELETE ")||req.startsWith("CONNECT ")||req.startsWith("OPTIONS ")||req.startsWith("TRACE ")||req.startsWith("PATCH ")){
|
||||||
|
makeClient("localhost",httpPort,socket,c=>client=c);
|
||||||
|
}else{
|
||||||
|
makeClient(mcHost,mcPort,socket,c=>client=c);
|
||||||
|
}
|
||||||
|
determinedClient=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeData(chunk);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('end', function() {
|
||||||
|
if(client!=null)client.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('error', function(err) {
|
||||||
|
//console.log(`Server Error: ${err}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function writeData(chunk){
|
||||||
|
if(await waitForIt())client.write(chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function closeIt(){
|
||||||
|
if(await waitForIt())client.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function waitForIt(){
|
||||||
|
let i=Date.now();
|
||||||
|
while(client==null&&(Date.now()-i<timeout/10)){
|
||||||
|
await new Promise(a=>setTimeout(a,10));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(client==null){
|
||||||
|
socket.end();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function makeClient(host,port,socket,cb){
|
||||||
|
const client = new Net.Socket();
|
||||||
|
client.connect({ port: port, host: host }, function() {
|
||||||
|
cb(client);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('end', function() {
|
||||||
|
socket.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('data', function(chunk) {
|
||||||
|
socket.write(chunk);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('error', function(err) {
|
||||||
|
//console.log(`Client Error: ${err}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeWsMcClient(ws,cb){
|
||||||
|
const client = new Net.Socket();
|
||||||
|
client.connect({ port: mcPort, host: mcHost }, function() {
|
||||||
|
cb(client);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('end', function() {
|
||||||
|
if(ws.readyState==WebSocket.OPEN)ws.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('data', function(chunk) {
|
||||||
|
if(ws.readyState==WebSocket.OPEN)ws.send(chunk);
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('error', function(err) {
|
||||||
|
//console.log(`Client Error: ${err}`);
|
||||||
|
});
|
||||||
|
}
|
8
package.json
Normal file
8
package.json
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"buffer-replace": "^1.0.0",
|
||||||
|
"mime-types": "^2.1.35",
|
||||||
|
"minesquire": "^0.0.2",
|
||||||
|
"ws": "^8.5.0"
|
||||||
|
}
|
||||||
|
}
|
3
runeag.bat
Normal file
3
runeag.bat
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
@echo off
|
||||||
|
node eagler.js
|
||||||
|
pause
|
BIN
www/assets.epk
Normal file
BIN
www/assets.epk
Normal file
Binary file not shown.
17362
www/classes.js
Normal file
17362
www/classes.js
Normal file
File diff suppressed because one or more lines are too long
1
www/classes.js.map
Normal file
1
www/classes.js.map
Normal file
File diff suppressed because one or more lines are too long
40
www/index.html
Normal file
40
www/index.html
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>eagler</title>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<meta name="description" content="Eaglercraft is real Minecraft 1.5.2 that you can play in any regular web browser. That includes school chromebooks, it works on all chromebooks. You can join real Minecraft 1.5.2 servers with it through a custom proxy based on Bungeecord." />
|
||||||
|
<meta name="keywords" content="minecraft, applet, chromebook, lax1dude, games, eaglercraft, eagler" />
|
||||||
|
<meta name="author" content="LAX1DUDE" />
|
||||||
|
<meta property="og:title" content="Eaglercraft" />
|
||||||
|
<meta property="og:locale" content="en-US" />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:image" content="https://media.discordapp.net/attachments/378764518081429506/932053915061587978/thumbnail2.png" />
|
||||||
|
<meta property="og:description" content="Eaglercraft is real Minecraft 1.5.2 that you can play in any regular web browser. That includes school chromebooks, it works on all chromebooks. You can join real Minecraft 1.5.2 servers with it through a custom proxy based on Bungeecord." />
|
||||||
|
<!-- Change this: <meta property="og:url" content="https://g.eags.us/eaglercraft/" /> -->
|
||||||
|
<script type="text/javascript" src="classes.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
const srvName = "ayunami2000's Minecraft server";
|
||||||
|
const srvMotd = "ayunami2000's Minecraft server";
|
||||||
|
const srvIp = "ws"+location.origin.slice(4);
|
||||||
|
window.addEventListener("load", function(){
|
||||||
|
window.minecraftOpts = [
|
||||||
|
"game_frame","assets.epk",
|
||||||
|
btoa(atob("CgAACQAHc2VydmVycwoAAAABCAAKZm9yY2VkTU9URABtb3RkaGVyZQEAC2hpZGVBZGRyZXNzAQgAAmlwAGlwaGVyZQgABG5hbWUAbmFtZWhlcmUAAA==").replace("motdhere",String.fromCharCode(srvName.length)+srvName).replace("namehere",String.fromCharCode(srvMotd.length)+srvMotd).replace("iphere",String.fromCharCode(srvIp.length)+srvIp))
|
||||||
|
];
|
||||||
|
(function(){
|
||||||
|
var q = window.location.search;
|
||||||
|
if(typeof q === 'string' && q.startsWith("?")) {
|
||||||
|
q = new URLSearchParams(q);
|
||||||
|
var s = q.get("server");
|
||||||
|
if(s) window.minecraftOpts.push(s);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
main();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body style="margin:0px;width:100vw;height:100vh;" id="game_frame">
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user