This commit is contained in:
ayunami2000 2022-04-08 21:28:41 -04:00
commit d0b4d5f8df
10 changed files with 17676 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
bukkit_command/
node_modules/
package-lock.json

70
app.js Normal file
View 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
View 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
View 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
run.bat Normal file
View File

@ -0,0 +1,3 @@
@echo off
node app.js
pause

3
runeag.bat Normal file
View File

@ -0,0 +1,3 @@
@echo off
node eagler.js
pause

BIN
www/assets.epk Normal file

Binary file not shown.

17362
www/classes.js Normal file

File diff suppressed because one or more lines are too long

1
www/classes.js.map Normal file

File diff suppressed because one or more lines are too long

40
www/index.html Normal file
View 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>