Get a list of servers to poll from PrivateServers.
This commit is contained in:
parent
637a7ba3bd
commit
f3411362df
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user