Browse Source

SC: added GameServers builtin

pull/41/head
Rossen Georgiev 9 years ago
parent
commit
9ee0afdaf2
  1. 8
      docs/api/steam.client.builtins.rst
  2. 3
      steam/client/builtins/__init__.py
  3. 159
      steam/client/builtins/gameservers.py

8
docs/api/steam.client.builtins.rst

@ -42,3 +42,11 @@ Leaderboards
:members: :members:
:undoc-members: :undoc-members:
:show-inheritance: :show-inheritance:
Game Servers
------------
.. automodule:: steam.client.builtins.gameservers
:members:
:undoc-members:
:show-inheritance:

3
steam/client/builtins/__init__.py

@ -6,8 +6,9 @@ from steam.client.builtins.user import User
from steam.client.builtins.web import Web from steam.client.builtins.web import Web
from steam.client.builtins.unified_messages import UnifiedMessages from steam.client.builtins.unified_messages import UnifiedMessages
from steam.client.builtins.leaderboards import Leaderboards from steam.client.builtins.leaderboards import Leaderboards
from steam.client.builtins.gameservers import GameServers
class BuiltinBase(Misc, User, Web, UnifiedMessages, Leaderboards): class BuiltinBase(Misc, User, Web, UnifiedMessages, Leaderboards, GameServers):
""" """
This object is used as base to implement all high level functionality. This object is used as base to implement all high level functionality.
The features are separated into submodules. The features are separated into submodules.

159
steam/client/builtins/gameservers.py

@ -0,0 +1,159 @@
"""
Game Servers related functionality
"""
from steam.steamid import SteamID
from steam.core.msg import MsgProto
from steam.enums.emsg import EMsg
from steam.util import ip_to_int, ip_from_int, proto_to_dict
class GameServers(object):
def __init__(self, *args, **kwargs):
super(GameServers, self).__init__(*args, **kwargs)
self.gameservers = SteamGameServers(self) #: instance of :class:`SteamGameServers`
class SteamGameServers(object):
def __init__(self, steam):
self.steam = steam
def query(self, filter_text, max_servers=10, **kwargs):
r"""
Query game servers
https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol
.. note::
When specifying ``filter_text`` use *raw strings* otherwise python won't treat backslashes
as literal characters (e.g. ``query(r'\appid\730\white\1')``)
:param filter_text: filter for servers
:type filter_text: str
:param max_servers: (optional) number of servers to return
:type max_servers: int
:param app_id: (optional) app id
:type app_id: int
:param geo_location_ip: (optional) ip (e.g. '1.2.3.4')
:type geo_location_ip: str
:returns: list of servers, see below. (``None`` is returned steam doesn't respond)
:rtype: :class:`list`, :class:`None`
Sample response:
.. code:: python
[{'auth_players': 0, 'server_ip': '1.2.3.4', 'server_port': 27015},
{'auth_players': 6, 'server_ip': '1.2.3.4', 'server_port': 27016},
...
]
"""
if 'geo_location_ip' in kwargs:
kwargs['geo_location_ip'] = ip_to_int(kwargs['geo_location_ip'])
kwargs['filter_text'] = filter_text
kwargs['max_servers'] = max_servers
resp = self.steam.send_job_and_wait(MsgProto(EMsg.ClientGMSServerQuery), kwargs, timeout=30)
if resp is None: return None
resp = proto_to_dict(resp)
for server in resp['servers']:
server['server_ip'] = ip_from_int(server['server_ip'])
return resp['servers']
def get_server_list(self, filter_text, max_servers=10):
"""
Get list of servers. Works similiarly to :meth:`query`, but the response has more details.
:param filter_text: filter for servers
:type filter_text: str
:param max_servers: (optional) number of servers to return
:type max_servers: int
:returns: list of servers, see below. (``None`` is returned steam doesn't respond)
:rtype: :class:`list`, :class:`None`
Sample response:
.. code:: python
[{'addr': '1.2.3.4:27067',
'appid': 730,
'bots': 0,
'dedicated': True,
'gamedir': 'csgo',
'gameport': 27067,
'gametype': 'valve_ds,empty,secure',
'map': 'de_dust2',
'max_players': 10,
'name': 'Valve CS:GO Asia Server (srcdsXXX.XXX.XXX)',
'os': 'l',
'players': 0,
'product': 'csgo',
'region': 5,
'secure': True,
'steamid': SteamID(id=3279818759, type='AnonGameServer', universe='Public', instance=7011),
'version': '1.35.4.0'}
]
"""
resp = self.steam.unified_messages.send_and_wait("GameServers.GetServerList#1", {
"filter": filter_text,
"limit": max_servers,
}, timeout=30)
if resp is None: return None
resp = proto_to_dict(resp)
for server in resp['servers']:
server['steamid'] = SteamID(server['steamid'])
return resp['servers']
def get_ips_from_steamid(self, server_steam_ids):
"""Resolve IPs from SteamIDs
:param server_steam_ids: a list of steamids
:type server_steam_ids: list
:return: map of ips to steamids
:rtype: dict
Sample response:
.. code:: python
{SteamID(id=123456, type='AnonGameServer', universe='Public', instance=1234): '1.2.3.4:27060'}
"""
resp = self.steam.unified_messages.send_and_wait("GameServers.GetServerIPsBySteamID#1", {
"server_steamids": server_steam_ids,
}, timeout=30)
if resp is None: return None
return {SteamID(server.steamid): server.addr for server in resp.servers}
def get_steamids_from_ip(self, server_ips):
"""Resolve SteamIDs from IPs
:param steam_ids: a list of ips (e.g. ``['1.2.3.4:27015',...]``)
:type steam_ids: list
:return: map of steamids to ips
:rtype: dict
Sample response:
.. code:: python
{'1.2.3.4:27060': SteamID(id=123456, type='AnonGameServer', universe='Public', instance=1234)}
"""
resp = self.steam.unified_messages.send_and_wait("GameServers.GetServerSteamIDsByIP#1", {
"server_ips": server_ips,
}, timeout=30)
if resp is None: return None
return {server.addr: SteamID(server.steamid) for server in resp.servers}
Loading…
Cancel
Save