mirror of
https://github.com/Dinnerbone/mcstatus.git
synced 2026-04-06 12:01:24 +08:00
Compare commits
9 Commits
release-2.
...
release-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ed78fa7d8 | ||
|
|
88961d3b46 | ||
|
|
6ac2ead3cd | ||
|
|
1ac30d15fd | ||
|
|
9c4596e807 | ||
|
|
ac92ee3388 | ||
|
|
3ceb1e1135 | ||
|
|
d0d0d159bb | ||
|
|
fff9b05389 |
@@ -3,6 +3,6 @@ python:
|
|||||||
- 3.3
|
- 3.3
|
||||||
- 2.7
|
- 2.7
|
||||||
install:
|
install:
|
||||||
- if [[ $TRAVIS_PYTHON_VERSION == 2* ]]; then pip install -r requirements/python2.txt --use-mirrors; fi
|
- if [[ $TRAVIS_PYTHON_VERSION == 2* ]]; then pip install -r requirements/python2.txt; fi
|
||||||
- if [[ $TRAVIS_PYTHON_VERSION == 3* ]]; then pip install -r requirements/python3.txt --use-mirrors; fi
|
- if [[ $TRAVIS_PYTHON_VERSION == 3* ]]; then pip install -r requirements/python3.txt; fi
|
||||||
script: nosetests
|
script: nosetests
|
||||||
@@ -1,3 +1,9 @@
|
|||||||
|
2.2
|
||||||
|
* Added new CLI
|
||||||
|
* Clean up sockets better
|
||||||
|
* Fixed connecting to ports greater than 32767
|
||||||
|
* Took a very very long time. :D
|
||||||
|
|
||||||
2.1
|
2.1
|
||||||
* Fixed the connections hanging when no data is received
|
* Fixed the connections hanging when no data is received
|
||||||
* Sped up Query requests by caching DNS
|
* Sped up Query requests by caching DNS
|
||||||
|
|||||||
38
README.md
38
README.md
@@ -28,6 +28,44 @@ query = server.query()
|
|||||||
print("The server has the following players online: {0}".format(", ".join(query.players.names)))
|
print("The server has the following players online: {0}".format(", ".join(query.players.names)))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Command Line Interface
|
||||||
|
```
|
||||||
|
$ mcstatus
|
||||||
|
Usage: mcstatus [OPTIONS] ADDRESS COMMAND [ARGS]...
|
||||||
|
|
||||||
|
mcstatus provides an easy way to query Minecraft servers for any
|
||||||
|
information they can expose. It provides three modes of access: query,
|
||||||
|
status, and ping.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
$ mcstatus example.org ping
|
||||||
|
21.120ms
|
||||||
|
|
||||||
|
$ mcstatus example.org:1234 ping
|
||||||
|
159.903ms
|
||||||
|
|
||||||
|
$ mcstatus example.org status
|
||||||
|
version: v1.8.8 (protocol 47)
|
||||||
|
description: "A Minecraft Server"
|
||||||
|
players: 1/20 ['Dinnerbone (61699b2e-d327-4a01-9f1e-0ea8c3f06bc6)']
|
||||||
|
|
||||||
|
$ mcstatus example.org query
|
||||||
|
host: 93.148.216.34:25565
|
||||||
|
software: v1.8.8 vanilla
|
||||||
|
plugins: []
|
||||||
|
motd: "A Minecraft Server"
|
||||||
|
players: 1/20 ['Dinnerbone (61699b2e-d327-4a01-9f1e-0ea8c3f06bc6)']
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help Show this message and exit.
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
ping prints server latency
|
||||||
|
query detailed server information
|
||||||
|
status basic server information
|
||||||
|
```
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class ServerPinger:
|
|||||||
packet.write_varint(0)
|
packet.write_varint(0)
|
||||||
packet.write_varint(self.version)
|
packet.write_varint(self.version)
|
||||||
packet.write_utf(self.host)
|
packet.write_utf(self.host)
|
||||||
packet.write_short(self.port)
|
packet.write_ushort(self.port)
|
||||||
packet.write_varint(1) # Intention to query status
|
packet.write_varint(1) # Intention to query status
|
||||||
|
|
||||||
self.connection.write_buffer(packet)
|
self.connection.write_buffer(packet)
|
||||||
|
|||||||
@@ -149,6 +149,9 @@ class TCPSocketConnection(Connection):
|
|||||||
def write(self, data):
|
def write(self, data):
|
||||||
self.socket.send(data)
|
self.socket.send(data)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.socket.close()
|
||||||
|
|
||||||
|
|
||||||
class UDPSocketConnection(Connection):
|
class UDPSocketConnection(Connection):
|
||||||
def __init__(self, addr, timeout=3):
|
def __init__(self, addr, timeout=3):
|
||||||
@@ -176,3 +179,6 @@ class UDPSocketConnection(Connection):
|
|||||||
if isinstance(data, Connection):
|
if isinstance(data, Connection):
|
||||||
data = bytearray(data.flush())
|
data = bytearray(data.flush())
|
||||||
self.socket.sendto(data, self.addr)
|
self.socket.sendto(data, self.addr)
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
self.socket.close()
|
||||||
0
mcstatus/scripts/__init__.py
Normal file
0
mcstatus/scripts/__init__.py
Normal file
94
mcstatus/scripts/mcstatus.py
Normal file
94
mcstatus/scripts/mcstatus.py
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
import click
|
||||||
|
|
||||||
|
from .. import MinecraftServer
|
||||||
|
|
||||||
|
server = None
|
||||||
|
|
||||||
|
|
||||||
|
@click.group(context_settings=dict(help_option_names=['-h', '--help']))
|
||||||
|
@click.argument("address")
|
||||||
|
def cli(address):
|
||||||
|
"""
|
||||||
|
mcstatus provides an easy way to query Minecraft servers for
|
||||||
|
any information they can expose. It provides three modes of
|
||||||
|
access: query, status, and ping.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
\b
|
||||||
|
$ mcstatus example.org ping
|
||||||
|
21.120ms
|
||||||
|
|
||||||
|
\b
|
||||||
|
$ mcstatus example.org:1234 ping
|
||||||
|
159.903ms
|
||||||
|
|
||||||
|
\b
|
||||||
|
$ mcstatus example.org status
|
||||||
|
version: v1.8.8 (protocol 47)
|
||||||
|
description: "A Minecraft Server"
|
||||||
|
players: 1/20 ['Dinnerbone (61699b2e-d327-4a01-9f1e-0ea8c3f06bc6)']
|
||||||
|
|
||||||
|
\b
|
||||||
|
$ mcstatus example.org query
|
||||||
|
host: 93.148.216.34:25565
|
||||||
|
software: v1.8.8 vanilla
|
||||||
|
plugins: []
|
||||||
|
motd: "A Minecraft Server"
|
||||||
|
players: 1/20 ['Dinnerbone (61699b2e-d327-4a01-9f1e-0ea8c3f06bc6)']
|
||||||
|
"""
|
||||||
|
global server
|
||||||
|
server = MinecraftServer.lookup(address)
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command(short_help="prints server latency")
|
||||||
|
def ping():
|
||||||
|
"""
|
||||||
|
Ping server for latency.
|
||||||
|
"""
|
||||||
|
click.echo("{}ms".format(server.ping()))
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command(short_help="basic server information")
|
||||||
|
def status():
|
||||||
|
"""
|
||||||
|
Prints server status. Supported by all Minecraft
|
||||||
|
servers that are version 1.7 or higher.
|
||||||
|
"""
|
||||||
|
response = server.status()
|
||||||
|
click.echo("version: v{} (protocol {})".format(response.version.name, response.version.protocol))
|
||||||
|
click.echo("description: \"{}\"".format(response.description))
|
||||||
|
click.echo(
|
||||||
|
"players: {}/{} {}".format(
|
||||||
|
response.players.online,
|
||||||
|
response.players.max,
|
||||||
|
[
|
||||||
|
"{} ({})".format(player.name, player.id)
|
||||||
|
for player in response.players.sample
|
||||||
|
] if response.players.sample is not None else "No players online"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@cli.command(short_help="detailed server information")
|
||||||
|
def query():
|
||||||
|
"""
|
||||||
|
Prints detailed server information. Must be enabled in
|
||||||
|
servers' server.properties file.
|
||||||
|
"""
|
||||||
|
response = server.query()
|
||||||
|
click.echo("host: {}:{}".format(response.raw['hostip'], response.raw['hostport']))
|
||||||
|
click.echo("software: v{} {}".format(response.software.version, response.software.brand))
|
||||||
|
click.echo("plugins: {}".format(response.software.plugins))
|
||||||
|
click.echo("motd: \"{}\"".format(response.motd))
|
||||||
|
click.echo(
|
||||||
|
"players: {}/{} {}".format(
|
||||||
|
response.players.online,
|
||||||
|
response.players.max,
|
||||||
|
response.players.names,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
cli()
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
six==1.7.3
|
six==1.7.3
|
||||||
mock==1.0.1
|
mock==1.0.1
|
||||||
|
click==6.2
|
||||||
|
|||||||
12
setup.py
12
setup.py
@@ -1,9 +1,9 @@
|
|||||||
from distutils.core import setup
|
from setuptools import setup
|
||||||
import sys
|
import sys
|
||||||
PY2 = sys.version_info[0] == 2
|
PY2 = sys.version_info[0] == 2
|
||||||
|
|
||||||
install_requires = [
|
install_requires = [
|
||||||
'six'
|
'six', 'Click'
|
||||||
]
|
]
|
||||||
|
|
||||||
if PY2:
|
if PY2:
|
||||||
@@ -17,11 +17,11 @@ tests_require = [
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='mcstatus',
|
name='mcstatus',
|
||||||
version='2.1',
|
version='2.2',
|
||||||
author='Nathan Adams',
|
author='Nathan Adams',
|
||||||
author_email='dinnerbone@dinnerbone.com',
|
author_email='dinnerbone@dinnerbone.com',
|
||||||
url='https://pypi.python.org/pypi/mcstatus',
|
url='https://pypi.python.org/pypi/mcstatus',
|
||||||
packages=['mcstatus', 'mcstatus.protocol'],
|
packages=['mcstatus', 'mcstatus.protocol', 'mcstatus.scripts'],
|
||||||
description='A library to query Minecraft Servers for their status and capabilities.',
|
description='A library to query Minecraft Servers for their status and capabilities.',
|
||||||
install_requires=install_requires,
|
install_requires=install_requires,
|
||||||
tests_require=tests_require,
|
tests_require=tests_require,
|
||||||
@@ -35,4 +35,8 @@ setup(
|
|||||||
'Operating System :: OS Independent',
|
'Operating System :: OS Independent',
|
||||||
'Topic :: Software Development :: Libraries :: Python Modules',
|
'Topic :: Software Development :: Libraries :: Python Modules',
|
||||||
],
|
],
|
||||||
|
entry_points='''
|
||||||
|
[console_scripts]
|
||||||
|
mcstatus=mcstatus.scripts.mcstatus:cli
|
||||||
|
''',
|
||||||
)
|
)
|
||||||
Reference in New Issue
Block a user