adventureland-gui
Version:
Basic UI for headless AdventureLand clients
186 lines • 6.6 kB
JavaScript
import Express from "express";
import Http from "http";
import fs from "fs";
import { fileURLToPath } from "url";
import Path, { dirname } from "path";
import * as SocketIO from "socket.io";
import axios from "axios";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const clientFolder = Path.join(__dirname, "../client");
const app = Express();
const server = Http.createServer(app);
const bots = new Map();
let bankCache = undefined;
let io;
const observers = new Map();
export async function startServer(port = 8080) {
const G = await getGData();
app.use(Express.static(clientFolder));
server.listen(port, () => {
console.log(`Server started at http://localhost:${port}`);
});
io = new SocketIO.Server(server);
io.on("connection", (connection) => {
for (const [id, data] of bots)
connection.emit("addBot", id, data);
if (bankCache)
connection.emit("bank", bankCache);
});
}
export function addBot(id, socket, character) {
if (!bots.has(id)) {
const uiData = {
character: {
cx: character.cx,
going_x: character.going_x,
going_y: character.going_y,
hp: character.hp,
id: character.id,
level: character.level,
max_hp: character.max_hp,
max_mp: character.max_mp,
moving: character.moving,
mp: character.mp,
rip: character.rip,
s: character.s,
skin: character.skin,
speed: character.speed,
x: character.x,
xp: character.xp,
y: character.y
},
inventory: {
equipment: character.slots,
gold: character.gold,
items: character.items
},
map: {
map: character.map,
x: character.x,
y: character.y
}
};
io.emit("addBot", id, uiData);
bots.set(id, uiData);
}
socket.onAny((eventName, args) => {
switch (eventName) {
case "entities": {
const data = args;
for (const player of data.players) {
if (player.id == id) {
const botData = bots.get(id);
const charData = {
cx: player.cx,
going_x: player.going_x,
going_y: player.going_y,
hp: player.hp,
id: player.id,
level: player.level,
max_hp: player.max_hp,
max_mp: player.max_mp,
moving: player.moving,
mp: player.mp,
rip: player.rip,
s: player.s,
skin: player.skin,
speed: player.speed,
x: player.x,
xp: player.xp,
y: player.y
};
botData.character = charData;
io.emit("player", id, charData);
bots.set(id, botData);
}
else {
}
}
break;
}
case "player": {
const data = args;
const botData = bots.get(id);
const charData = {
cx: data.cx,
going_x: data.going_x,
going_y: data.going_y,
hp: data.hp,
id: data.id,
level: data.level,
max_hp: data.max_hp,
max_mp: data.max_mp,
moving: data.moving,
mp: data.mp,
rip: data.rip,
s: data.s,
skin: data.skin,
speed: data.speed,
x: data.x,
xp: data.xp,
y: data.y
};
botData.character = charData;
io.emit("player", id, charData);
const invData = {
equipment: data.slots,
gold: data.gold,
items: data.items
};
botData.inventory = invData;
io.emit("inventory", id, invData);
if (data.user) {
bankCache = data.user;
io.emit("bank", data.user);
}
bots.set(id, botData);
break;
}
case "new_map": {
const data = args;
const botData = bots.get(id);
const mapData = {
map: data.name,
x: data.x,
y: data.y
};
botData.map = mapData;
io.emit("map", id, mapData);
bots.set(id, botData);
break;
}
case "welcome": {
const data = args;
const botData = bots.get(id);
const mapData = {
map: data.map,
x: data.x,
y: data.y
};
botData.map = mapData;
io.emit("map", id, mapData);
bots.set(id, botData);
break;
}
default: {
break;
}
}
});
socket.emit("send_updates", {});
}
async function getGData() {
const response = await axios.get("https://adventure.land/data.js");
if (response.status == 200) {
const matches = response.data.match(/var\s+G\s*=\s*(\{.+\});/);
const rawG = matches[1];
const G = JSON.parse(rawG);
fs.writeFileSync(`${clientFolder}/G.json`, JSON.stringify(G));
return Promise.resolve(G);
}
else {
return Promise.reject(`${response}\nError fetching https://adventure.land/data.js`);
}
}
//# sourceMappingURL=index.js.map