diff --git a/README.md b/README.md index a09f928..ea82866 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,44 @@ query = server.query() 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 ------------ diff --git a/mcstatus/scripts/__init__.py b/mcstatus/scripts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mcstatus/scripts/mcstatus.py b/mcstatus/scripts/mcstatus.py new file mode 100644 index 0000000..a5d0bc7 --- /dev/null +++ b/mcstatus/scripts/mcstatus.py @@ -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() diff --git a/requirements/base.txt b/requirements/base.txt index e77b00b..0ae9230 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,2 +1,3 @@ six==1.7.3 -mock==1.0.1 \ No newline at end of file +mock==1.0.1 +click==6.2 diff --git a/setup.py b/setup.py index 9bb0ef7..c32f29e 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ import sys PY2 = sys.version_info[0] == 2 install_requires = [ - 'six' + 'six', 'Click' ] if PY2: @@ -21,7 +21,7 @@ setup( author='Nathan Adams', author_email='dinnerbone@dinnerbone.com', 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.', install_requires=install_requires, tests_require=tests_require, @@ -35,4 +35,8 @@ setup( 'Operating System :: OS Independent', 'Topic :: Software Development :: Libraries :: Python Modules', ], + entry_points=''' + [console_scripts] + mcstatus=mcstatus.scripts.mcstatus:cli + ''', )