Skip to content

Commit

Permalink
Merge pull request #43 from adilosa/master
Browse files Browse the repository at this point in the history
Implement CLI using Click (fixes #36)
Made cli install with pip install
  • Loading branch information
Dinnerbone committed Apr 1, 2017
1 parent 6ac2ead commit 88961d3
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 3 deletions.
38 changes: 38 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
------------

Expand Down
Empty file added mcstatus/scripts/__init__.py
Empty file.
94 changes: 94 additions & 0 deletions mcstatus/scripts/mcstatus.py
Original file line number Diff line number Diff line change
@@ -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()
3 changes: 2 additions & 1 deletion requirements/base.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
six==1.7.3
mock==1.0.1
mock==1.0.1
click==6.2
8 changes: 6 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
PY2 = sys.version_info[0] == 2

install_requires = [
'six'
'six', 'Click'
]

if PY2:
Expand All @@ -21,7 +21,7 @@
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,
Expand All @@ -35,4 +35,8 @@
'Operating System :: OS Independent',
'Topic :: Software Development :: Libraries :: Python Modules',
],
entry_points='''
[console_scripts]
mcstatus=mcstatus.scripts.mcstatus:cli
''',
)

0 comments on commit 88961d3

Please sign in to comment.