mirror of
https://github.com/maierfelix/POGOserver.git
synced 2026-04-06 17:24:55 -05:00
228 lines
4.8 KiB
JavaScript
228 lines
4.8 KiB
JavaScript
import fs from "fs";
|
|
import os from "os";
|
|
import request from "request";
|
|
import readline from "readline";
|
|
import POGOProtos from "pokemongo-protobuf";
|
|
|
|
import {
|
|
_toCC,
|
|
deXOR,
|
|
inherit,
|
|
getHashCodeFrom
|
|
} from "./utils";
|
|
|
|
import print from "./print";
|
|
import CFG from "../cfg";
|
|
|
|
import World from "./models/World";
|
|
|
|
import * as _api from "./api";
|
|
import * as _commands from "./commands";
|
|
import * as _dump from "./dump";
|
|
import * as _http from "./http";
|
|
import * as _setup from "./setup";
|
|
import * as _cycle from "./cycle";
|
|
import * as _request from "./request";
|
|
import * as _response from "./response";
|
|
import * as _process from "./process";
|
|
import * as _mysql from "./db/index";
|
|
import * as _mysql_get from "./db/get";
|
|
import * as _mysql_query from "./db/query";
|
|
import * as _mysql_create from "./db/create";
|
|
|
|
const greetMessage = fs.readFileSync(".greet", "utf8");
|
|
|
|
/**
|
|
* @class GameServer
|
|
*/
|
|
export default class GameServer {
|
|
|
|
/** @constructor */
|
|
constructor() {
|
|
|
|
this.STATES = {
|
|
PAUSE: false,
|
|
DEBUG: false,
|
|
CRASH: false
|
|
};
|
|
|
|
this.db = null;
|
|
|
|
this.repository = null;
|
|
|
|
this.apiClients = {};
|
|
|
|
this.socket = null;
|
|
this.cycleInstance = null;
|
|
|
|
// Timer things
|
|
this.tick = 0;
|
|
this.time = 0;
|
|
this.fullTick = 0;
|
|
this.saveTick = 0;
|
|
this.spawnTick = 0;
|
|
this.timeoutTick = 0;
|
|
this.passedTicks = 0;
|
|
|
|
if (CFG.GREET) this.greet();
|
|
|
|
this.getLatestVersion().then((latest) => {
|
|
print(this.repository);
|
|
let current = require("../package.json").version;
|
|
print(`Booting Server v${current}`, 33);
|
|
if (current < latest) {
|
|
print(`WARNING: Please update to the latest build v${latest}!`, 33);
|
|
}
|
|
this.setup().then(() => {
|
|
this.world = new World(this);
|
|
});
|
|
});
|
|
|
|
}
|
|
|
|
fetchVersioningUrl() {
|
|
return new Promise((resolve) => {
|
|
let url = "";
|
|
let branch = "master";
|
|
let base = "https://raw.githubusercontent.com";
|
|
url = require("../package.json").repository.url;
|
|
url = url.replace("git://", "");
|
|
url = url.replace(".git", "");
|
|
url = url.replace("github.com/", "");
|
|
this.repository = `https://github.com/${url}`;
|
|
url = `${base}/${url}/${branch}/package.json`;
|
|
resolve(url);
|
|
});
|
|
}
|
|
|
|
getLatestVersion() {
|
|
return new Promise((resolve) => {
|
|
this.fetchVersioningUrl().then((url) => {
|
|
request({url: url}, (error, response, body) => {
|
|
let json = null;
|
|
try {
|
|
json = JSON.parse(body);
|
|
} catch (e) {
|
|
json = {};
|
|
print(e, 31);
|
|
}
|
|
resolve(json.version);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {Object} obj
|
|
* @return {Boolean}
|
|
*/
|
|
isApiCall(call) {
|
|
let action = String(call.action);
|
|
return (
|
|
"api_" + action in _api
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param {String} msg
|
|
* @param {Function} fn
|
|
* @param {Number} timer
|
|
*/
|
|
retry(msg, fn, timer) {
|
|
process.stdout.clearLine();
|
|
process.stdout.cursorTo(0);
|
|
print(`${msg}${timer}s`, 33, true);
|
|
if (timer >= 1) setTimeout(() => this.retry(msg, fn, --timer), 1e3);
|
|
else {
|
|
process.stdout.write("\n");
|
|
fn();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return {String}
|
|
*/
|
|
getLocalIPv4() {
|
|
let address = null;
|
|
let interfaces = os.networkInterfaces();
|
|
for (var dev in interfaces) {
|
|
interfaces[dev].filter((details) => details.family === "IPv4" && details.internal === false ? address = details.address: void 0);
|
|
};
|
|
return (address);
|
|
}
|
|
|
|
/**
|
|
* @param {Buffer} buffer
|
|
* @param {String} schema
|
|
*/
|
|
parseProtobuf(buffer, schema) {
|
|
try {
|
|
return POGOProtos.parseWithUnknown(buffer, schema);
|
|
} catch (e) {
|
|
print(e, 31);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {String} path
|
|
* @return {Boolean}
|
|
*/
|
|
fileExists(path) {
|
|
try {
|
|
fs.statSync(path);
|
|
} catch (e) {
|
|
return (false);
|
|
}
|
|
return (true);
|
|
}
|
|
|
|
/**
|
|
* @return {String}
|
|
*/
|
|
getCurrentTime() {
|
|
let date = new Date();
|
|
return (
|
|
`${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`
|
|
);
|
|
}
|
|
|
|
greet() {
|
|
console.log(greetMessage);
|
|
}
|
|
|
|
}
|
|
|
|
inherit(GameServer, _api);
|
|
inherit(GameServer, _commands);
|
|
inherit(GameServer, _dump);
|
|
inherit(GameServer, _http);
|
|
inherit(GameServer, _setup);
|
|
inherit(GameServer, _cycle);
|
|
inherit(GameServer, _request);
|
|
inherit(GameServer, _response);
|
|
inherit(GameServer, _process);
|
|
inherit(GameServer, _mysql);
|
|
inherit(GameServer, _mysql_get);
|
|
inherit(GameServer, _mysql_query);
|
|
inherit(GameServer, _mysql_create);
|
|
|
|
(() => {
|
|
|
|
const server = new GameServer();
|
|
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
terminal: false
|
|
});
|
|
|
|
rl.on("line", (data) => {
|
|
server.stdinInput(data);
|
|
});
|
|
|
|
process.on("uncaughtException", (data) => {
|
|
server.uncaughtException(data);
|
|
});
|
|
|
|
})();
|