NeruxVace PServer API

_7u

MVP+
Hey!
Mein Name ist Julian. Ich spiele schon seit einiger Zeit auf NeruxVace.Net und würde mir eine PServer API wünschen. Wie das ganze zum Beispiel ausschauen könnte, zeige ich in diesem Beitrag. Dieser Eintrag ist nicht für "normale" Spieler gedacht, und bezieht sich nur auf Spieler, die schon Erfahrung im Bereich JavaScript (NodeJS..), Python etc. haben. Ich bin mir sehr wohl bewusst, das ich durch gennante spezifikationen nicht viele Spieler anspreche, und dieser Beitrag somit entsprechend wenig Bedeutung hat.

NOTE:
Ich versuche alle Code Snippets in JavaScript & Python zu schreiben, aber mein Python ist bisschen eingerostet ;)

Features die die API haben könnte


  • Entity Informationen (Zugreifen auf Spieler Objekte*)
  • Block Informationen (umsetzbar mit der "minecraft-data" JavaScript library)
  • Chat

* Beispielsweise:
JSON:
{
  _7u: {
    username: '_7u',
    ping: 17,
    uuid: 'ffa76650-2df0-4665-bb7b-5d8dbfc4b50d',
    displayName: ChatMessage {
      json: [MessageBuilder],
      text: 'MVP',
      extra: [Array],
      bold: undefined,
      italic: undefined,
      underlined: undefined,
      strikethrough: undefined,
      obfuscated: undefined,
      color: 'dark_aqua'
    },
    entity: Entity {
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined,
      id: 98376,
      position: [Vec3],
      velocity: [Vec3],
      yaw: 4.067295664013512,
      pitch: -0.3000000035018413,
      onGround: true,
      height: 1.62,
      width: 0,
      effects: {},
      equipment: [Array],
      heldItem: [Item],
      isValid: true,
      metadata: [Array],
      username: '_7u',
      type: 'player',
      name: 'player',
      timeSinceOnGround: 0,
      attributes: [Object],
      isInWater: false,
      isInLava: false,
      isInWeb: undefined,
      isCollidedHorizontally: false,
      isCollidedVertically: true,
      [Symbol(kCapture)]: false
    },
    gamemode: 0
  }
}
Beispiel aus NeruxVace Lobby entnommen

Installation

Owner von PServern können mit einem Command eine ähnliche Anzeige wie bei /imgserver info bekommen.

1647181413152.png

Diese Anzeige soll einen API-Key anzeigen (wie im obrigen Bild).
Dieser Key kann dann wie z.B. im folgenden Code eingebunden werden:

Installation:
npm install neruxvaceapi

JavaScript:
const neruxvace = require('neruxvaceapi')

const pserver = neruxvace.pserver({
    auth: "key" // API-Key
})

Installation:
pip install javascript
pip install neruxvaceapi

Python:
from javascript import require
neruxvace = require('neruxvaceapi')

pserver = neruxvace.pserver({
    "auth": "key" # API-Key
})

Teilnahme

Sollte die API open-source sein, wäre es eine gute Möglichkeit, Spieler an der API teilhaben können zu lassen.


Benutzung

Um Einsteigern einen guten Anfang zu gewähren, wäre ein gute Dokumentation sehr wichtig. Bei gelegenheit könnte der NeruxVace Youtube Channel auch Tutorials (wie beim PServer System) hochladen.


Beispiele

Ingame Nachrichten in die Konsole ausgeben:
JavaScript:
const neruxvace = require('neruxvaceapi')

const pserver = neruxvace.pserver({
    auth: "key" // API-Key
})

pserver.on('chat', (username, message) {
    console.log(`${username}: ${message}`)       
})

Python:
neruxvace = require('neruxvaceapi')

pserver = neruxvace.pserver({
    "auth": "key" # API-Key
})

@On(pserver, "chat")
def handle(this, username, message, *args):
    print(f'{username}: {message}')

Mehr Beispiele
Beispiel
Beschreibung
discordVerbinde den PServer chat mit einem Discord Channel

JavaScript:
const neruxvace = require('neruxvaceapi')

const pserver = neruxvace.pserver({
    auth: "key" // API-Key
})

// Discord v13
const { Client, Collection, Intents } = require('discord.js');
const intents = new Intents([ 'GUILDS', 'GUILD_MESSAGES' ])
const client = new Client({ intents: intents })

let channel = 'CHANNEL_ID'

client.on('ready', () => {
    console.log(`Discord Bot erfolgreich gestartet (${client.user.username})!`)
    channel = client.channels.cache.get(channel)
    if(!channel) {
        return console.log(`Es wurde kein Channel gefunden.`)
    }
})

// Ingame Nachrichten weiterleiten:
pserver.on('chat', (username, message) {
    channel.send(`${username}: ${message}`)      
})

client.login("TOKEN")


Module

Eine Liste von Modulen die unterstützt werden könnten:

Modul
Beischreibung
minecraft-protocolEinlesen von Minecraft Paketen + Authentifizierung und Verschlüsselung
minecraft-dataSprachneutrales Modul um Minecraft Daten für clients, server und librarys (in unserem Fall) zu verfügung zu stellen
node-vec33d Vector Modul um sich im 3 Dimensionalen Raum zurechtzufinden.


Hier nochmal eine Liste von Möglichen Funktionen:
(In Englisch gehalten)
  • API
    • Enums
      • minecraft-data
      • mcdata.blocks
      • mcdata.items
      • mcdata.materials
      • mcdata.entities
    • Classes
      • vec3
      • Entity
      • Block
      • Biome
      • Item
    • PServer
      • neruxvace.pserver(options)
      • pserver.ScoreBoard
        • ScoreBoard.name (string)
        • ScoreBoard.title (string)
        • ScoreBoard.itemsMap (string)
        • Scoreboard.items (Object / Array)
      • pserver.Group // Bezieht sich auf die "Ränge"
        • Group.name (string)
        • Group.color (string)
        • Group.prefix (string)
        • Group.suffix (string)
        • Group.members (Object / Array)
      • pserver.entities (Object / Array)
      • pserver.players (Object / Array)
      • pserver.isRaining (bool)
      • pserver.rainState (int)
      • pserver.thunderState (int)
      • pserver.chatPatterns (Regex)
      • pserver.settings.chat (Choices: [ enabled (default), commandsOnly, disabled])
      • pserver.settings.colorsEnabled (bool (default: true))
      • pserver.time
        • pserver.time.time (int (number of days since day 0))
        • pserver.time.timeOfDay (int (ticks))
        • pserver.time.day (int (day of the world))
        • pserver.time.isDay (bool)
        • pserver.time.moonPhase
        • pserver.time.age
      • Events
        • "chat" (username, message, translate, jsonMsg, matches)
        • "start" (reason)
        • "stop" (reasion)
      • Methods
        • pserver.end
        • pserver.start (OPTIONAL)

Sehr stark inspiert von Mineflayer (https://github.com/PrismarineJS/mineflayer/blob/master/docs/api.md)

Bei Fragen gerne an mich wenden:
Minecraft: _7u
Discord: Juuulian#6666


Liebe Grüße,
_7u | Julian <3
 
Zuletzt bearbeitet:
Hey!
Mein Name ist Julian. Ich spiele schon seit einiger Zeit auf NeruxVace.Net und würde mir eine PServer API wünschen. Wie das ganze zum Beispiel ausschauen könnte, zeige ich in diesem Beitrag. Dieser Eintrag ist nicht für "normale" Spieler gedacht, und bezieht sich nur auf Spieler, die schon Erfahrung im Bereich JavaScript (NodeJS..), Python etc. haben. Ich bin mir sehr wohl bewusst, das ich durch gennante spezifikationen nicht viele Spieler anspreche, und dieser Beitrag somit entsprechend wenig Bedeutung hat.

NOTE:
Ich versuche alle Code Snippets in JavaScript & Python zu schreiben, aber mein Python ist bisschen eingerostet ;)

Features die die API haben könnte


  • Entity Informationen (Zugreifen auf Spieler Objekte*)
  • Block Informationen (umsetzbar mit der "minecraft-data" JavaScript library)
  • Chat

* Beispielsweise:
JSON:
{
  _7u: {
    username: '_7u',
    ping: 17,
    uuid: 'ffa76650-2df0-4665-bb7b-5d8dbfc4b50d',
    displayName: ChatMessage {
      json: [MessageBuilder],
      text: 'MVP',
      extra: [Array],
      bold: undefined,
      italic: undefined,
      underlined: undefined,
      strikethrough: undefined,
      obfuscated: undefined,
      color: 'dark_aqua'
    },
    entity: Entity {
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined,
      id: 98376,
      position: [Vec3],
      velocity: [Vec3],
      yaw: 4.067295664013512,
      pitch: -0.3000000035018413,
      onGround: true,
      height: 1.62,
      width: 0,
      effects: {},
      equipment: [Array],
      heldItem: [Item],
      isValid: true,
      metadata: [Array],
      username: '_7u',
      type: 'player',
      name: 'player',
      timeSinceOnGround: 0,
      attributes: [Object],
      isInWater: false,
      isInLava: false,
      isInWeb: undefined,
      isCollidedHorizontally: false,
      isCollidedVertically: true,
      [Symbol(kCapture)]: false
    },
    gamemode: 0
  }
}
Beispiel aus NeruxVace Lobby entnommen

Installation

Owner von PServern können mit einem Command eine ähnliche Anzeige wie bei /imgserver info bekommen.

Den Anhang 9554 betrachten

Diese Anzeige soll einen API-Key anzeigen (wie im obrigen Bild).
Dieser Key kann dann wie z.B. im folgenden Code eingebunden werden:

Installation:
npm install neruxvaceapi

JavaScript:
const neruxvace = require('neruxvaceapi')

const pserver = neruxvace.pserver({
    auth: "key" // API-Key
})

Installation:
pip install javascript
pip install neruxvaceapi

Python:
from javascript import require
neruxvace = require('neruxvaceapi')

pserver = neruxvace.pserver({
    "auth": "key" # API-Key
})

Teilnahme

Sollte die API open-source sein, wäre es eine gute Möglichkeit, Spieler an der API teilhaben können zu lassen.


Benutzung

Um Einsteigern einen guten Anfang zu gewähren, wäre ein gute Dokumentation sehr wichtig. Bei gelegenheit könnte der NeruxVace Youtube Channel auch Tutorials (wie beim PServer System) hochladen.


Beispiele

Ingame Nachrichten in die Konsole ausgeben:
JavaScript:
const neruxvace = require('neruxvaceapi')

const pserver = neruxvace.pserver({
    auth: "key" // API-Key
})

pserver.on('chat', (username, message) {
    console.log(`${username}: ${message}`)     
})

Python:
neruxvace = require('neruxvaceapi')

pserver = neruxvace.pserver({
    "auth": "key" # API-Key
})

@On(pserver, "chat")
def handle(this, username, message, *args):
    print(f'{username}: {message}')

Mehr Beispiele
Beispiel
Beschreibung
discordVerbinde den PServer chat mit einem Discord Channel

JavaScript:
const neruxvace = require('neruxvaceapi')

const pserver = neruxvace.pserver({
    auth: "key" // API-Key
})

// Discord v13
const { Client, Collection, Intents } = require('discord.js');
const intents = new Intents([ 'GUILDS', 'GUILD_MESSAGES' ])
const client = new Client({ intents: intents })

let channel = 'CHANNEL_ID'

client.on('ready', () => {
    console.log(`Discord Bot erfolgreich gestartet (${client.user.username})!`)
    channel = client.channels.cache.get(channel)
    if(!channel) {
        return console.log(`Es wurde kein Channel gefunden.`)
    }
})

// Ingame Nachrichten weiterleiten:
pserver.on('chat', (username, message) {
    channel.send(`${username}: ${message}`)    
})

client.login("TOKEN")


Module

Eine Liste von Modulen die unterstützt werden könnten:

Modul
Beischreibung
minecraft-protocolEinlesen von Minecraft Paketen + Authentifizierung und Verschlüsselung
minecraft-dataSprachneutrales Modul um Minecraft Daten für clients, server und librarys (in unserem Fall) zu verfügung zu stellen
node-vec33d Vector Modul um sich im 3 Dimensionalen Raum zurechtzufinden.


Hier nochmal eine Liste von Möglichen Funktionen:
(In Englisch gehalten)
  • API
    • Enums
      • minecraft-data
      • mcdata.blocks
      • mcdata.items
      • mcdata.materials
      • mcdata.entities
    • Classes
      • vec3
      • Entity
      • Block
      • Biome
      • Item
    • PServer
      • neruxvace.pserver(options)
      • pserver.ScoreBoard
        • ScoreBoard.name (string)
        • ScoreBoard.title (string)
        • ScoreBoard.itemsMap (string)
        • Scoreboard.items (Object / Array)
      • pserver.Group // Bezieht sich auf die "Ränge"
        • Group.name (string)
        • Group.color (string)
        • Group.prefix (string)
        • Group.suffix (string)
        • Group.members (Object / Array)
      • pserver.entities (Object / Array)
      • pserver.players (Object / Array)
      • pserver.isRaining (bool)
      • pserver.rainState (int)
      • pserver.thunderState (int)
      • pserver.chatPatterns (Regex)
      • pserver.settings.chat (Choices: [ enabled (default), commandsOnly, disabled])
      • pserver.settings.colorsEnabled (bool (default: true))
      • pserver.time
        • pserver.time.time (int (number of days since day 0))
        • pserver.time.timeOfDay (int (ticks))
        • pserver.time.day (int (day of the world))
        • pserver.time.isDay (bool)
        • pserver.time.moonPhase
        • pserver.time.age
      • Events
        • "chat" (username, message, translate, jsonMsg, matches)
        • "start" (reason)
        • "stop" (reasion)
      • Methods
        • pserver.end
        • pserver.start (OPTIONAL)

Sehr stark inspiert von Mineflayer (https://github.com/PrismarineJS/mineflayer/blob/master/docs/api.md)

Bei Fragen gerne an mich wenden:
Minecraft: _7u
Discord: Juuulian#6666


Liebe Grüße,
_7u | Julian <3
Salut!

Ich habe in meiner Zeit im Team als Entwickler bereits diesen Vorschlag getätigt.
Meiner Meinung nach wären dies grundsätzlich eine gute Idee, jedoch denke ich einfach mal, dass es aktuell einfach andere Projekte gibt, welche eine höhere Priorität haben, da sie wichtiger für das Netzwerk sind.
Eine PServer-API wäre ein "nice to have" Feature. Genau wie eine allgemeine ServerAPI welche beispielweise Stats von Spielern via Rest abfragbar macht. Siehe diese public API von Hypixel. (Siehe hier: https://github.com/HypixelDev/PublicAPI/)

Also: Ich gebe dir komplett recht, dass eine solche API "nice to have" ist, jedoch aus meiner Sicht nicht so super notwendig.
 

DiesesFloo

Test-Developer
Meiner Meinung nach eine viel bessere und auch eine mit allen Sprachen kompatiblere Umsetzung wäre (meiner Meinung nach) eine REST-API. Dies könnte man auch mit der lange erwünschten Stats-API verknüpfen und somit neben PUSH-Requests auch GET-Requests machen. Eine von dir gewünschte Implementierung in JS oder Python könnte so auch von Usern selbst gemacht werden.

/users/USERNAMEorUUID
Parameters:
key (required): The API-Key


JSON:
{
  "username": "DiesesFloo",
  "rank": "MVP",
  "cookies": "123456789",
  "uuid": "123456789",
  "connections": {
    "teamspeak": {
      "verified": true,
      "uuid": "123456789"
    },
    "discord": {
      "verified": true,
      "id": "123456789"
    },
    "forum": {
      "verified": true,
      "url": "https://forum.neruxvace.net/members/diesesfloo.42455/"
    }
  },
  "online": false,
  "playtime": 1234
}

/stats/USERNAMEorUUID
Parameters:
key (required): The API-Key
mode (not required): The Game you want to get the stats from


JSON:
{
  "username": "DiesesFloo",
  "hidden": false,
  "points": 133654,
  "kills": 3264,
  "deaths": 5828,
  "k_d": 0.56,
  "wins": 514,
  "place": 3722,
  "playtime": 84
}

/pserver/ID
Parameters:
key (required): The API-Key
action (not required): The action which should be done on the PServer, if not given it just returns the status of the server.


JSON:
{
  "successful": true
}


JSON:
{
  "id": 476027,
  "owner_name": "DiesesFloo",
  "owner_uuid": "123456",
  "description": "This is a description",
  "status": "active",
  "players": 3,
  "creation_date": "2014-01-01T00:00:00Z",
  "last_start_date": "2014-01-01T00:00:00Z"
}

/news
Parameter:
key: The API-Key


JSON:
{
  "title": "Ostern auf NeruxVace 2022",
  "description": "Frohe Ostern, liebe Community!\n\nAuch dieses Jahr haben wir uns passend zur Osterzeit ein paar kleine Updates, sowie Events überlegt.",
  "image_url": "https://forum.neruxvace.net/attachments/ostersale-png.9618/",
  "date": "2020-04-23T00:00:00+00:00"
}

Das ganze könnte man ziemlich einfach dann in Python oder JS nutzen und dann einen Discord Bot erstellen oder sogar ein Web-Panel. Dies ermöglicht der Community einen sehr großen Spielraum. Hier zum Beispiel ein kleines Python Script, wie man dann einen PServer starten könnte:

Python:
import requests


def start_private_server():
    url = "https://api.neruxvace.net/pserver/"
    key = "DEMO_KEY"
    action = "start"

    params = {
        "key": key,
        "action": action
    }

    request = requests.get(url, params=params)
    start_data = request.json()
    status = start_data["successful"]

    if status is True:
        print("Server started")
    else:
        print("Server failed to start")


start_private_server()

Ich freue mich schon auf die Umsetzung (sofern eine erfolgt)!

Mit freundlichen Grüßen
Floo
 
Zuletzt bearbeitet:
Sowas würden wir nieeeee einbauen :)

R9Epi9enAw.png
 
Top