Get a list of servers to poll from PrivateServers.

This commit is contained in:
A. Svensson 2015-04-06 12:15:15 +02:00
parent 637a7ba3bd
commit f3411362df

View File

@ -7,19 +7,21 @@ import re
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from .models import PrivateServer
def poll_ss13_server(host, port, timeout=30): def poll_ss13_server(server, timeout=30):
# Thanks to /u/headswe for showing how to poll servers. # Thanks to /u/headswe for showing how to poll servers.
# Source: http://www.reddit.com/r/SS13/comments/31b5im/a_bunch_of_graphs_for_all_servers/cq11nld # Source: http://www.reddit.com/r/SS13/comments/31b5im/a_bunch_of_graphs_for_all_servers/cq11nld
print 'polling:', host, port addr = (server.host, server.port)
print 'polling:', server
query = '\x00\x83{0}\x00\x00\x00\x00\x00?players\x00'.format( query = '\x00\x83{0}\x00\x00\x00\x00\x00?players\x00'.format(
struct.pack('>H', 14) # 14 = 6 null bytes + len(?players) struct.pack('>H', 14) # 14 = 6 null bytes + len(?players)
) )
try: try:
sock = socket.create_connection((host, port), timeout=timeout) sock = socket.create_connection(addr, timeout=timeout)
except socket.timeout: except socket.timeout:
return return 0, server
try: try:
sock.sendall(query) sock.sendall(query)
@ -28,14 +30,13 @@ def poll_ss13_server(host, port, timeout=30):
response = '' response = ''
sock.close() sock.close()
print 'done:', host, port
if len(response) < 1: if len(response) < 1:
return return 0, server
else: else:
if not response[:5] == '\x00\x83\x00\x05\x2a': if not response[:5] == '\x00\x83\x00\x05\x2a':
return return 0, server
tmp = struct.unpack('f', response[5:9]) tmp = struct.unpack('f', response[5:9])
return (int(tmp[0]), host, port) return int(tmp[0]), server
class ServerPoller(object): class ServerPoller(object):
@ -49,18 +50,14 @@ class ServerPoller(object):
return servers return servers
def _get_servers(self): def _get_servers(self):
return [ servers = PrivateServer.objects.filter(active=True)
('baystation12.net', 8000), return servers
('8.8.4.4', 3333),
('ss13.lljk.net', 26100),
('204.152.219.158', 3333),
]
def _poll_servers(self, targets): def _poll_servers(self, targets):
pool = Pool(processes=self.workers) pool = Pool(processes=self.workers)
results = [] results = []
for (host, port) in targets: for server in targets:
future = pool.apply_async(poll_ss13_server, (host, port, timeout)) future = pool.apply_async(poll_ss13_server, (server, self.timeout))
results.append(future) results.append(future)
pool.close() pool.close()
@ -74,14 +71,11 @@ class ServerPoller(object):
return servers return servers
def _handle_future(self, future): def _handle_future(self, future):
tmp = future.get() players, server = future.get()
if not tmp:
return
(players, host, port) = tmp
server = dict( server = dict(
title = host, title = server.title,
game_url = 'byond://{}:{}'.format(host, port), game_url = 'byond://{}:{}'.format(server.host, server.port),
site_url = '', site_url = server.site_url,
player_count = players, player_count = players,
) )
return server return server