2 changed files with 49 additions and 1 deletions
@ -0,0 +1,47 @@ |
|||
from asyncio import StreamReader, StreamWriter, open_connection |
|||
from rcon.exceptions import SessionTimeout, WrongPassword |
|||
from rcon.source.proto import Packet, Type |
|||
from rcon.source.async_rcon import close, communicate |
|||
|
|||
# https://github.com/conqp/rcon/blob/929f358f1a7d155141704866b736c6f9666b4bd1/rcon/source/async_rcon.py#L45 |
|||
async def rcon( |
|||
command: str, |
|||
*arguments: str, |
|||
host: str, |
|||
port: int, |
|||
passwd: str, |
|||
encoding: str = 'utf-8', |
|||
frag_threshold: int = 4096, |
|||
frag_detect_cmd: str = '' |
|||
) -> str: |
|||
"""Run a command asynchronously.""" |
|||
|
|||
reader, writer = await open_connection(host, port) |
|||
response = await communicate( |
|||
reader, |
|||
writer, |
|||
Packet.make_login(passwd, encoding=encoding), |
|||
frag_threshold=frag_threshold, |
|||
frag_detect_cmd=frag_detect_cmd |
|||
) |
|||
|
|||
# Wait for SERVERDATA_AUTH_RESPONSE according to: |
|||
# https://developer.valvesoftware.com/wiki/Source_RCON_Protocol |
|||
while response.type != Type.SERVERDATA_AUTH_RESPONSE: |
|||
response = await Packet.aread(reader) |
|||
|
|||
if response.id == -1: |
|||
await close(writer) |
|||
raise WrongPassword() |
|||
|
|||
request = Packet.make_command(command, *arguments, encoding=encoding) |
|||
response = await communicate(reader, writer, request) |
|||
await close(writer) |
|||
|
|||
if response.id != request.id: |
|||
raise SessionTimeout() |
|||
|
|||
try: |
|||
return response.payload.decode(encoding) |
|||
except UnicodeDecodeError: |
|||
return response.payload.decode(encoding, errors="ignore") |
Loading…
Reference in new issue