Rewrite in typescrypt #327

Merged
Sirherobrine23 merged 13 commits from re_Typescript into main 2022-03-28 21:43:14 +00:00
15 changed files with 347 additions and 167 deletions
Showing only changes of commit 52c9ab7748 - Show all commits

View File

@ -1,3 +1,11 @@
node_modules/
.git/
/node_modules/
/.git/
/.github/
/.vscode/
/.devcontainer/
/*.md
.*ignore
.gitpod.y*ml
dist/
Dockerfile
docker-compose.y*ml

View File

@ -43,7 +43,7 @@ jobs:
with:
context: .
push: true
target: server
target: bdscore
tags: ${{ env.DOCKERIMAGE }}:latest
platforms: ${{ env.DOCKERPLATFORM }}
cache-from: type=gha,scope=${{ github.ref }}_${{ hashFiles('**/package-lock.json') }}

View File

@ -36,7 +36,7 @@ jobs:
with:
context: .
push: true
target: server
target: bdscore
tags: ${{ env.DOCKERIMAGE }}:latest
platforms: ${{ env.DOCKERPLATFORM }}
cache-from: type=gha,scope=${{ github.ref }}_${{ hashFiles('**/package-lock.json') }}

View File

@ -1,74 +1,98 @@
FROM debian:latest
LABEL name="Bds Maneger Docker"
FROM debian:latest AS nodedowload
ENV DEBIAN_FRONTEND="noninteractive"
RUN apt update && apt -y install wget tar lsb-release
# Install latest docker image
RUN mkdir /tmp/Node && NODEURL=""; NODEVERSION=$(wget -qO- https://api.github.com/repos/nodejs/node/releases | grep tag_name | cut -d '"' -f 4 | sort -V | tail -n 1) && \
case $(uname -m) in \
x86_64 ) NODEURL="https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-x64.tar.gz";; \
aarch64 ) NODEURL="https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-arm64.tar.gz";; \
armv7l ) NODEURL="https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-armv7l.tar.gz";; \
ppc64le ) NODEURL="https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-ppc64le.tar.gz";; \
s390x ) NODEURL="https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-s390x.tar.gz";; \
*) echo "Unsupported architecture ($(uname -m))"; exit 1;; \
esac && \
echo "Node bin Url: ${NODEURL}"; wget -q "${NODEURL}" -O /tmp/node.tar.gz && \
tar xfz /tmp/node.tar.gz -C /tmp/Node && \
mkdir /tmp/nodebin && cp -rp /tmp/Node/*/* /tmp/nodebin && ls /tmp/nodebin && rm -rfv /tmp/nodebin/LICENSE /tmp/nodebin/*.md
FROM debian:latest AS libries
ENV DEBIAN_FRONTEND="noninteractive"
RUN apt update && apt -y install wget unzip zip
RUN mkdir -p /libries; mkdir /libries/lib64; \
if [ "$(uname -m)" != "x86_64" ];then \
apt install -y qemu-user-static; \
wget -q "https://github.com/The-Bds-Maneger/external_files/raw/main/Linux/libs_amd64.zip" -O /tmp/libries.zip; \
unzip -o /tmp/libries.zip -d /libries; \
rm -rfv /tmp/libries.zip; \
fi
FROM debian:latest AS bdscore
LABEL org.opencontainers.image.title="Bds Maneger Docker"
LABEL org.opencontainers.image.description="Start Minecraft Server with Docker containers and Auto Control Server wirh Bds Maneger Core."
LABEL org.opencontainers.image.vendor="Sirherobrine23"
LABEL org.opencontainers.image.licenses="MIT"
LABEL org.opencontainers.image.source="https://github.com/The-Bds-Maneger/Bds-Maneger-Core.git"
ENV DEBIAN_FRONTEND="noninteractive"
# Install Core Packages
RUN apt update && apt install -y curl wget unzip zip xz-utils tar procps
# Install external Libries to another architecture
RUN if [ "$(uname -m)" != "x86_64" ];then \
mkdir -p /lib64; \
apt install -y qemu-user-static; \
wget -q "https://github.com/The-Bds-Maneger/external_files/raw/main/Linux/libs_amd64.zip" -O /tmp/libries.zip; \
unzip -o /tmp/libries.zip -d /; \
rm -rfv /tmp/libries.zip; \
fi
COPY --from=libries /libries/ /
# Install NodeJS and latest NPM
COPY --from=nodedowload /tmp/nodebin/ /usr
RUN npm -g install npm@latest
# Install external Libries to ARM64
RUN apt install -y ca-certificates make build-essential procps lsb-release xdg-utils g++ libatomic1 libnss3 libatk-bridge2.0-0 gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxrandr2 libxrender1 libxss1 libxtst6 fonts-liberation libnss3 libgbm-dev
# Install Node.js
RUN NODEVERSION=$(wget -qO- https://api.github.com/repos/nodejs/node/releases | grep tag_name | cut -d '"' -f 4 | sort -V | tail -n 1) && \
case $(uname -m) in \
x86_64 ) wget -q "https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-x64.tar.xz" -O /tmp/node.tar.xz;; \
aarch64 ) wget -q "https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-arm64.tar.xz" -O /tmp/node.tar.xz;; \
armv7l ) wget -q "https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-armv7l.tar.xz" -O /tmp/node.tar.xz;; \
ppc64el ) wget -q "https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-ppc64le.tar.xz" -O /tmp/node.tar.xz;; \
s390x ) wget -q "https://nodejs.org/download/release/$NODEVERSION/node-$NODEVERSION-linux-s390x.tar.xz" -O /tmp/node.tar.xz;; \
*) echo "Unsupported architecture"; exit 1;; \
esac && \
mkdir /tmp/Node && \
tar -xJf /tmp/node.tar.xz -C /tmp/Node && \
rm -rf /tmp/node.tar.xz && \
cp -rf /tmp/Node/*/* /usr && \
rm -rf /tmp/Node && \
npm -g install npm@latest
# Install Core Packages
ENV DEBIAN_FRONTEND="noninteractive"
RUN apt update && \
apt install -y procps ca-certificates procps lsb-release xdg-utils g++ libatomic1 libnss3 \
libatk-bridge2.0-0 gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \
libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 \
libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \
libxcursor1 libxdamage1 libxext6 libxfixes3 libxrandr2 libxrender1 libxss1 libxtst6 fonts-liberation libnss3 libgbm-dev
# Install openjdk
RUN apt update && \
JAVAVERSIONS="$(apt search openjdk|grep '/'|grep "openjdk-"|sed 's|/| |g'|awk '{print $1}'|grep 'jre'|sed -e 's|-jre.*||g'|uniq)";\
JAVAVERSIONS="$(apt search openjdk|grep '/'|grep 'openjdk-'|sed 's|/| |g'|awk '{print $1}'|grep 'jre'|sed -e 's|-jre.*||g'|uniq)";\
case $JAVAVERSIONS in \
*openjdk-17* ) apt install -y openjdk-17*;; \
*openjdk-16* ) apt install -y openjdk-16*;; \
*17* ) apt install -y openjdk-17*;; \
*16* ) apt install -y openjdk-16*;; \
*) echo "Unsupported Java Version, avaibles"; echo "$JAVAVERSIONS";exit 0;; \
esac
# Create Volume to Storage Server And Config
VOLUME [ "/root/bds_core" ]
# Create Volume to Storage Server
VOLUME [ "/data" ]
# App Workspace
WORKDIR /app
ENTRYPOINT [ "node", "--trace-warnings", "/app/dist/cjs/bin/docker.js" ]
# Ports
EXPOSE 3000/tcp
EXPOSE 19132/udp
EXPOSE 19133/udp
EXPOSE 25565/tcp
EXPOSE 25566/tcp
# Default ENVs
ENV NODE_ENV="production"
ENV SERVER_PATH="/data/server"
ENV BACKUP_PATH="/data/backups"
ENV LOG_PATH="/data/logs"
ENV EXTRA_PATH="/data/extra"
# Server Settings
ENV DESCRIPTION="My Sample Server"
ENV WORLD_NAME="My Map"
ENV GAMEMODE="survival"
ENV DIFFICULTY="normal"
ENV MAXPLAYERS="5"
ENV REQUIRED_LOGIN="false"
ENV ALLOW_COMMADS="false"
# Bds Core Settings
ENV VERSION="latest"
ENV PLATFORM="bedrock"
# Node packages
COPY package*.json ./
RUN npm install && npm run build
# Set default ENVs to Bds Core
ENV SERVER_VERSION="true" \
PLAYERS="5" \
WORLD_NAME="The Ultimate Server" \
DESCRIPTION="running Minecraft Server on Bds Maneger by Bds Manager Project" \
GAMEMODE="survival" \
DIFFICULTY="normal" \
ENABLE_COMMANDS="false" \
ACCOUNT="false" \
LEVEL_SEED="" \
SERVER="bedrock" \
SERVER_VERSION="latest" \
NODE_ENV="production"
EXPOSE 19132/udp 19133/udp 1932/tcp
WORKDIR /opt/backend_core_scripts/
ENTRYPOINT [ "sh", "-c", "node bin/BdsManeger.js start -ak -d ${SERVER_VERSION} -p ${SERVER} --players ${PLAYERS} --world-name ${WORLD_NAME} --description ${DESCRIPTION} --gamemode ${GAMEMODE} --difficulty ${DIFFICULTY} --level-seed ${LEVEL_SEED}" ]
RUN npm install --production --no-save
COPY ./ ./
RUN npm run build:cjs

146
README.md
View File

@ -1,110 +1,100 @@
# Bds Maneger Core
Bds Maneger Core is a javascript core in Nodejs that manages several types of server seftware for Minecraft Bedrock and Java. Bds Maneger Core has integrated with a REST API with full integration with Bds Maneger Core in addition to CLI and One bot versions for the telegram.
This is a small hub to manage various servers for Minecraft Bedrock and for Minecraft Java, such as installing, starting and keeping up to date with the latest version available.
Any contribution is welcome, but before a look at [CONTRIBUTING.md](CONTRIBUTING.md), [Bds Manager Core code of conduct](CODE_OF_CONDUCT.md)
This module is fully compatible with ESM, CJS and Typescript.
## Requirements for Bds Maneger Core
## Requirements
### All
This module requires some requirements to work:
* [Nodejs 15.6.0+](https://nodejs.org/en/download/current/)
* [OpenJDK 16+](https://www.oracle.com/java/technologies/javase-jdk16-downloads.html)
* NodeJS: `^15.x`.
* Java: `^8.0` or OpenJDK: `^16`.
### Windows 10+
### For Windows Users
* [Microsoft Visual Studio C++ (The Bds Maneger Documentation)](<https://docs.bdsmaneger.com/docs/Bds Maneger core/WindowsFixDll/#windows-server>)
Minecraft Bedrock needs Visual studio C++ if you are using Windows Server ([More information you can find on the Wiki](<https://github.com/The-Bds-Maneger/Bds-Maneger-Core/wiki/Server-Platforms#minecraft-bedrock-server-alpha>)).
## Documentation
## CLI
We have a separate repository for all Bds Maneger Project documentation, [link here from the main page](<https://docs.bdsmaneger.com/Bds Maneger core>), [Repository link](https://github.com/The-Bds-Maneger/Bds-Manager-Project-Documentation)
This module also includes a simple CLI for managing servers. how:
## Badges
1. Download compatible server versions.
2. Update the server.
3. Start the server.
4. Backup Server.
[![Total alerts](https://img.shields.io/lgtm/alerts/g/Bds-Maneger/bds_maneger_api.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Bds-Maneger/bds_maneger_api/alerts/)
[![Language grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/Bds-Maneger/bds_maneger_api.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Bds-Maneger/bds_maneger_api/context:javascript)
[![DeepScan grade](https://deepscan.io/api/teams/13683/projects/16691/branches/363172/badge/grade.svg)](https://deepscan.io/dashboard#view=project&tid=13683&pid=16691&bid=363172)
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/d357bef9c4ba4198ab16be64a5adf051)](https://www.codacy.com/gh/The-Bds-Maneger/Bds-Maneger-Core/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=The-Bds-Maneger/Bds-Maneger-Core&amp;utm_campaign=Badge_Grade)
## Install
## Start Bds Maneger Core with npx
To install CLI: `npm install -g @the-bds-maneger/core` (`Linux user Use sudo or root`).
### CLI
To Install module: `npm install @the-bds-maneger/core`.
All options can be found in the bds maneger core documentation.
Run withou install: `npx @the-bds-maneger/core`.
`npx @the-bds-maneger/core@latest -sk`
## Install Bds Maneger Core globally
The commands available after installation:
* bds_maneger
`npm i -g @the-bds-maneger/core@latest`
## Launch Bds Maneger Core with a docker image
## Docker and Docker Compose
### Docker Compose
[Docker Compose Install guide](https://docs.docker.com/compose/install/)
[Docker Compose releases](<https://github.com/docker/compose/releases/latest>).
```yaml
version: "2.1"
services:
BdsCore:
image: ghcr.io/the-bds-maneger/core:latest
container_name: BdsCore
restart: always
network_mode: host
environment:
DESCRIPTION: running Minecraft Bedrock Server on the docker by Bds Manager
WORLD_NAME: Bds Maneger Docker
GAMEMODE: survival
DIFFICULTY: normal
ACCOUNT: "false"
PLAYERS: 13
SERVER: bedrock
ENABLE_COMMANDS: "false"
* MacOS and Windows docker users is already installed by default in Docker Desktop.
```yml
version: "3.9"
volumes:
- ./BdsCore:/home/bds/bds_core
server_storage:
services:
bdscore:
image: ghcr.io/the-bds-maneger/core:latest
volumes:
- server_storage:/data
environment:
# Server Settings
DESCRIPTION: "My Sample Server"
WORLD_NAME: "My Map"
GAMEMODE: "survival"
DIFFICULTY: "normal"
MAXPLAYERS: "5"
REQUIRED_LOGIN: "false"
# Bds Core Settings
VERSION: "latest"
PLATFORM: "bedrock"
ports:
# Port to API
- 3000:3000/tcp
# Server Port to bedrock
- 19132:19132/udp
- 19133:19133/udp
# Server Port to java
- 25565:25565/tcp
- 25565:25565/udp
```
### Windows
### Docker
```cmd
docker run --rm -d --name BdsManegerCore -v BdsCore:/home/bds/bds_core ^
--restart=always -p 19132:19132/udp -p 19133:19133/udp -p 1932:1932/tcp ^
-e DESCRIPTION="running Minecraft Bedrock Server on the docker by Bds Manager" ^
-e WORLD_NAME="Bds Maneger Docker" ^
-e GAMEMODE="survival" ^
-e DIFFICULTY="normal" ^
-e ACCOUNT="false" ^
-e PLAYERS="13" ^
-e SERVER="bedrock" ^
-e ENABLE_COMMANDS="false" ^
ghcr.io/the-bds-maneger/core:latest
```
create Docker volume: `docker volume create --driver local --name bds_server_storage`.
### Linux/MacOS
run image:
```bash
docker run --rm -d --name BdsManegerCore -v BdsCore/:/home/bds/bds_core \
--restart=always -p 19132:19132/udp -p 19133:19133/udp -p 1932:1932/tcp \
-e DESCRIPTION="running Minecraft Bedrock Server on the docker by Bds Manager" \
-e WORLD_NAME="Bds Maneger Docker" \
docker run --rm -d \
--name=bdscore \
-v bds_server_storage:/data \
-p 25565:25565/udp \
-p 25565:25565/tcp \
-p 19132:19132/udp \
-p 19133:19133/udp \
-p 3000:3000/tcp \
-e DESCRIPTION="My Sample Server" \
-e WORLD_NAME="My Map" \
-e GAMEMODE="survival" \
-e DIFFICULTY="normal" \
-e ACCOUNT="false" \
-e PLAYERS="13" \
-e SERVER="bedrock" \
-e ENABLE_COMMANDS="false" \
-e MAXPLAYERS="5" \
-e REQUIRED_LOGIN="false" \
-e VERSION="latest" \
-e PLATFORM="bedrock" \
ghcr.io/the-bds-maneger/core:latest
```
## Azure Container and Azure VM
We've separate the repository for azure deploy templates, [go here](https://github.com/The-Bds-Maneger/Azure#azure-deploys) if you want to deploy to azure.
## Oracle Cloud
soon!
Get log: `docker logs bdscore`.

View File

@ -19,7 +19,6 @@ services:
BDS_VERSION: "latest"
SERVER: "bedrock"
ports:
- 1932:3000/tcp
- 3000:3000/tcp
- 19132:19132/udp
- 19133:19133/udp

8
package-lock.json generated
View File

@ -22,7 +22,6 @@
"express": "^4.17.3",
"prismarine-nbt": "^2.2.1",
"properties-to-json": "^0.2.1",
"typescript": "^4.6.2",
"yargs": "^17.4.0"
},
"bin": {
@ -34,7 +33,8 @@
"@types/express": "^4.17.13",
"@types/node": "^17.0.22",
"@types/yargs": "^17.0.10",
"npm-run-all": "^4.1.5"
"npm-run-all": "^4.1.5",
"typescript": "^4.6.3"
},
"engines": {
"node": ">=15.6.0"
@ -1786,6 +1786,7 @@
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
"integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -3260,7 +3261,8 @@
"typescript": {
"version": "4.6.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
"integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw=="
"integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
"dev": true
},
"unbox-primitive": {
"version": "1.0.1",

View File

@ -6,8 +6,8 @@
},
"version": "2.0.0",
"description": "A very simple way to manage Minecraft servers",
"main": "dist/index.js",
"types": "src/index.ts",
"main": "dist/cjs/index.js",
"types": "dist/cjs/index.d.ts",
"exports": {
"require": "./dist/src/index.js",
"import": "./dist/esm/index.js"
@ -18,20 +18,21 @@
"build:esm": "tsc --module es2020 --outDir dist/esm"
},
"nodemonConfig": {
"delay": 2500,
"ext": "json,js,ts",
"ignore": [
"test/*"
],
"delay": 2500,
"watch": [
"src",
"bin",
"package.json",
"package-lock.json"
],
"exec": "npm run build:cjs && node --trace-warnings ./dist/cjs/index.js start --Develop"
"exec": "npm run build:cjs && node --trace-warnings ./dist/cjs/bin/index.js start --Develop"
},
"bin": {
"bds_maneger": "dist/cjs/index.js"
"bds_maneger": "dist/cjs/bin/index.js"
},
"repository": {
"type": "git",
@ -45,7 +46,8 @@
"java",
"pocketmine",
"server_mode",
"rest"
"rest",
"typescript"
],
"author": "Sirherobrine23",
"license": "AGPL-3.0-or-later",
@ -70,7 +72,6 @@
"express": "^4.17.3",
"prismarine-nbt": "^2.2.1",
"properties-to-json": "^0.2.1",
"typescript": "^4.6.2",
"yargs": "^17.4.0"
},
"devDependencies": {
@ -79,6 +80,7 @@
"@types/express": "^4.17.13",
"@types/node": "^17.0.22",
"@types/yargs": "^17.0.10",
"npm-run-all": "^4.1.5"
"npm-run-all": "^4.1.5",
"typescript": "^4.6.3"
}
}

View File

@ -25,7 +25,7 @@ function ensureFileSync(pathFile: string){
let serverPath = null;
let worldName = null;
const providedServerPath = path.resolve(process.env.SERVERPATH||path.join(os.homedir(), "bds_core/servers"), "bedrock");
const providedServerPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), "bedrock");
const addonPath = path.resolve(providedServerPath, "../BDS-Addons/");
if (!(fs.existsSync(addonPath))) fs.mkdirSync(addonPath, {recursive: true});
@ -55,7 +55,7 @@ const requiredFiles = ["behavior_packs", "resource_packs", "valid_known_packs.js
* Prepares to install addons for the provided Bedrock Dedicated Server.
*/
export function addonInstaller() {
// const providedServerPath = path.resolve(process.env.SERVERPATH||path.join(os.homedir(), "bds_core/servers"), "bedrock");
// const providedServerPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), "bedrock");
// Validate server path (path is provided, path is valid, path contains required files)
if (!providedServerPath) throw new Error("You must provide a server path for BDSAddonInstaller");
if (!fs.existsSync(providedServerPath)) throw new Error("The provided server path does not exist.\n" + providedServerPath);

View File

@ -5,11 +5,10 @@ import AdmZip from "adm-zip";
export default CreateBackup;
export async function CreateBackup(Platform: "bedrock"|"java"|"pocketmine"|"spigot"|"dragonfly") {
const ServerPath = path.resolve(process.env.SERVERPATH||path.join(os.homedir(), "bds_core/servers"), Platform);
const BackupPath = path.resolve(process.env.BACKUPPATH||path.join(os.homedir(), "bds_core/backups"));
const ServerPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), Platform);
const BackupPath = path.resolve(process.env.BACKUP_PATH||path.join(os.homedir(), "bds_core/backups"));
if (!(fs.existsSync(ServerPath))) throw new Error("Server no Installed or path not found");
if (!(fs.existsSync(BackupPath))) fs.mkdirSync(BackupPath, {recursive: true});
const BackupFile = path.resolve(BackupPath, `${Platform}_${new Date().toISOString().replace(/:/g, "-")}.zip`);
const Backup = new AdmZip();
if (Platform === "bedrock") {
if (fs.existsSync(path.join(ServerPath, "worlds"))) Backup.addLocalFolder(path.join(ServerPath, "worlds"));
@ -17,7 +16,8 @@ export async function CreateBackup(Platform: "bedrock"|"java"|"pocketmine"|"spig
if (fs.existsSync(path.join(ServerPath, "permissions.json"))) Backup.addLocalFile(path.join(ServerPath, "permissions.json"));
}
const BackupFile = path.resolve(BackupPath, `${Platform}_${new Date().toString().replace(/[-\(\)\:\s+]/gi, "_")}.zip`);
const zipBuffer = Backup.toBuffer();
fs.writeFileSync(BackupFile, zipBuffer);
return zipBuffer;
return {zipBuffer, BackupFile};
}

28
src/bin/docker.ts Normal file
View File

@ -0,0 +1,28 @@
import * as BdsCore from "../index";
import * as BdsTypes from "../globalType";
const {
VERSION = "latest",
PLATFORM = "bedrock",
DESCRIPTION = "My Sample Server",
WORLD_NAME = "My Map",
GAMEMODE = "survival",
DIFFICULTY = "normal",
MAXPLAYERS = "5",
REQUIRED_LOGIN = "false",
ALLOW_COMMADS = "false",
} = process.env;
(async () => {
if (VERSION === "latest") {
await BdsCore.DownloadServer.DownloadServer(PLATFORM as BdsTypes.Platform, true);
} else if (VERSION !== "latest") {
await BdsCore.DownloadServer.DownloadServer(PLATFORM as BdsTypes.Platform, VERSION);
} else {
console.log("Invalid Version");
}
const Server = await BdsCore.Server.Start(PLATFORM as BdsTypes.Platform);
Server.on("all", data => process.stdout.write(data));
Server.exit(process.exit);
})();

View File

@ -31,7 +31,7 @@ async function InstallPHP(PathToInstall: string) {
}
export async function DownloadServer(Platform: bdsTypes.Platform, Version: string|boolean) {
const ServerPath = path.resolve(process.env.SERVERPATH||path.join(os.homedir(), "bds_core/servers"), Platform);
const ServerPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), Platform);
const versions = await getVersions()
const info = versions.platform.filter(v => v.name === Platform).find(v => v.version === (typeof Version === "boolean"?versions.latest[Platform]:Version));
if (Platform === "bedrock") {
@ -43,6 +43,7 @@ export async function DownloadServer(Platform: bdsTypes.Platform, Version: strin
const JavaPath = path.resolve(ServerPath);
if (!(await fs.existsSync(JavaPath))) fs.mkdirSync(JavaPath, {recursive: true});
await fs.promises.writeFile(path.resolve(JavaPath, "Server.jar"), await getBuffer(String(info.data)));
await fs.promises.writeFile(path.resolve(JavaPath, "eula.txt"), "eula=true");
} else if (Platform === "spigot") {
const SpigotPath = path.resolve(ServerPath);
if (!(await fs.existsSync(SpigotPath))) fs.mkdirSync(SpigotPath, {recursive: true});

View File

@ -2,6 +2,7 @@ import * as Server from "./server";
import * as Backup from "./backup";
import * as DownloadServer from "./download_server";
import * as API from "./api";
import * as serverConfig from "./serverConfig";
export default {Server, Backup, DownloadServer, API};
export {Server, Backup, DownloadServer, API};
export default {Server, Backup, DownloadServer, API, serverConfig};
export {Server, Backup, DownloadServer, API, serverConfig};

View File

@ -34,7 +34,7 @@ export function getSessions() {return Sessions;}
// Start Server
export async function Start(Platform: bdsTypes.Platform): Promise<BdsSession> {
const ServerPath = path.resolve(process.env.SERVERPATH||path.join(os.homedir(), "bds_core/servers"), Platform);
const ServerPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), Platform);
if (!(fs.existsSync(ServerPath))) fs.mkdirSync(ServerPath, {recursive: true});
const Process: {command: string; args: Array<string>; env: {[env: string]: string}; cwd: string;} = {
command: "",
@ -156,7 +156,12 @@ export async function Start(Platform: bdsTypes.Platform): Promise<BdsSession> {
},
creteBackup: (crontime: string|Date) => {
const cronJob = new node_cron.CronJob(crontime, async () => {
bdsBackup.CreateBackup(Platform);
if (Platform === "bedrock") {
execCommand("save hold");
execCommand("save query");
}
await bdsBackup.CreateBackup(Platform);
if (Platform === "bedrock") execCommand("save resume");
});
cronJob.start();
return;
@ -175,9 +180,10 @@ export async function Start(Platform: bdsTypes.Platform): Promise<BdsSession> {
const bedrockConfig = await serverConfig.parseConfig(Platform);
Seesion.seed = bedrockConfig.nbt.parsed.value.RandomSeed.value.toString();
}
const logFile = path.resolve(ServerPath, `../log/${Seesion.id}.log`);
const logFile = path.resolve(process.env.LOG_PATH||path.resolve(ServerPath, "../log"), `${Platform}_${Seesion.id}.log`);
if(!(fs.existsSync(path.parse(logFile).dir))) fs.mkdirSync(path.parse(logFile).dir, {recursive: true});
const logStream = fs.createWriteStream(logFile, {flags: "w+"});
logStream.write(`[${StartDate.toISOString()}] Server started\n\n`);
onLog("all", data => logStream.write(data));
Sessions[Seesion.id] = Seesion;
return Seesion;

View File

@ -1,3 +1,4 @@
import crypto from "crypto";
import path from "path";
import os from "os";
import fs from "fs";
@ -5,10 +6,10 @@ import * as prismarineNbt from "prismarine-nbt";
import properties_to_json from "properties-to-json";
import * as bdsType from "./globalType";
type BdsConfigGet = {
export type BdsConfigGet = {
world: string;
description: string;
gamemode: string;
gamemode: "survival"|"creative"|"adventure"|"spectator";
difficulty: "peaceful"|"easy"|"normal"|"hard";
players: number;
whitelist: true|false;
@ -22,7 +23,7 @@ type BdsConfigGet = {
}
export async function parseConfig(Platform: bdsType.Platform): Promise<BdsConfigGet> {
const serverPath = path.resolve(process.env.SERVERPATH||path.join(os.homedir(), "bds_core/servers"), Platform);
const serverPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), Platform);
if (Platform === "bedrock") {
const bedrockConfigPath = path.join(serverPath, "server.properties");
if (!(fs.existsSync(bedrockConfigPath))) throw new Error("Bedrock server config not found");
@ -42,3 +43,121 @@ export async function parseConfig(Platform: bdsType.Platform): Promise<BdsConfig
}
throw new Error("Platform not supported");
}
export type BdsConfigSet = {
world: string;
seed?: string;
description: string;
gamemode: "survival"|"creative"|"adventure"|"hardcore";
difficulty: "peaceful"|"easy"|"normal"|"hard";
players: number;
whitelist: true|false;
require_login: true|false;
cheats_command: true|false;
portv4: number;
portv6: number;
}
export async function createConfig(Platform: bdsType.Platform, config: BdsConfigSet): Promise<void> {
const serverPath = path.resolve(process.env.SERVER_PATH||path.join(os.homedir(), "bds_core/servers"), Platform);
if (Platform === "bedrock") {
const bedrockConfigArray = [
"view-distance=32",
"tick-distance=4",
"player-idle-timeout=0",
"max-threads=8",
"default-player-permission-level=member",
"texturepack-required=true",
"content-log-file-enabled=false",
"compression-threshold=1",
"server-authoritative-movement=server-auth",
"player-movement-score-threshold=20",
"player-movement-action-direction-threshold=0.85",
"player-movement-distance-threshold=0.3",
"player-movement-duration-threshold-in-ms=500",
"correct-player-movement=false",
"server-authoritative-block-breaking=false",
"force-gamemode=false",
];
bedrockConfigArray.push(`level-name=${config.world}`);
if (config.seed) bedrockConfigArray.push(`level-seed=${config.seed}`);
else bedrockConfigArray.push("level-seed=");
bedrockConfigArray.push(`server-name=${config.description}`);
bedrockConfigArray.push(`gamemode=${config.gamemode}`);
bedrockConfigArray.push(`difficulty=${config.difficulty}`);
bedrockConfigArray.push(`allow-cheats=${config.cheats_command}`);
bedrockConfigArray.push(`max-players=${config.players}`);
bedrockConfigArray.push(`online-mode=${config.require_login}`);
bedrockConfigArray.push(`allow-list=${config.whitelist}`);
bedrockConfigArray.push(`server-port=${config.portv4}`);
bedrockConfigArray.push(`server-portv6=${config.portv6}`);
const bedrockConfig = bedrockConfigArray.join("\n");
fs.writeFileSync(path.join(serverPath, "server.properties"), bedrockConfig);
return;
} else if (Platform === "java") {
const javaConfigArray = [
"query.port=65551",
"enable-jmx-monitoring=false",
"enable-query=true",
"generator-settings=",
"generate-structures=true",
"network-compression-threshold=256",
"max-tick-time=60000",
"use-native-transport=true",
"enable-status=true",
"allow-flight=false",
"view-distance=32",
"max-build-height=256",
"server-ip=",
"sync-chunk-writes=true",
"prevent-proxy-connections=false",
"resource-pack=",
"entity-broadcast-range-percentage=100",
"player-idle-timeout=0",
"force-gamemode=false",
"rate-limit=0",
"broadcast-console-to-ops=true",
"spawn-npcs=true",
"spawn-animals=true",
"snooper-enabled=true",
"function-permission-level=2",
"text-filtering-config=",
"spawn-monsters=true",
"enforce-whitelist=false",
"resource-pack-sha1=",
"spawn-protection=16",
"max-world-size=29999984",
"require-resource-pack=true",
"resource-pack-prompt=",
"hide-online-players=false",
"simulation-distance=10",
"enable-rcon=false",
`rcon.password=${crypto.randomBytes(6).toString("hex")}`,
"rcon.port=25575",
"broadcast-rcon-to-ops=true"
];
javaConfigArray.push(`level-name=${config.world}`);
javaConfigArray.push(`motd=${config.description}`);
if (config.gamemode === "hardcore") {
javaConfigArray.push("gamemode=survival");
javaConfigArray.push("hardcore=true");
} else {
javaConfigArray.push(`gamemode=${config.gamemode}`);
javaConfigArray.push(`hardcore=false`);
}
javaConfigArray.push(`difficulty=${config.difficulty}`);
if (config.seed) javaConfigArray.push(`level-seed=${config.seed}`);
else javaConfigArray.push("level-seed=");
javaConfigArray.push(`enable-command-block=${config.cheats_command}`);
javaConfigArray.push(`max-players=${config.players}`);
javaConfigArray.push(`online-mode=${config.require_login}`);
javaConfigArray.push(`white-list=${config.whitelist}`);
javaConfigArray.push(`server-port=${config.portv4}`);
javaConfigArray.push("level-type=default");
javaConfigArray.push("op-permission-level=4");
javaConfigArray.push("pvp=true");
javaConfigArray.push("allow-nether=true");
await fs.promises.writeFile(path.join(serverPath, "server.properties"), javaConfigArray.join("\n"));
} else if (Platform === "pocketmine") {}
throw new Error("Platform not supported");
}