From 7261e3392afc8e5092dbc4fcf3867592d3159346 Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Mon, 20 Apr 2009 21:30:10 +0000 Subject: [PATCH] Update the lobbybot such that it can work both with 2.0,2.1 and 2.2 lobbies, defaulting to 2.1 (as that's the current release) git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@7101 4a71c877-e1ca-e34f-864e-861f7616d084 --- tools/lobby/client.py | 26 ++++++++++++++++++++++---- tools/lobby/ircbot.py | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/tools/lobby/client.py b/tools/lobby/client.py index 28130e877..880660142 100644 --- a/tools/lobby/client.py +++ b/tools/lobby/client.py @@ -23,6 +23,7 @@ from __future__ import with_statement from contextlib import contextmanager +from pkg_resources import parse_version import socket import struct @@ -40,12 +41,29 @@ def _swap_endianness(i): return struct.unpack(">I", struct.pack("= 2.0 data + name_length = 64 + host_length = 16 + + # >= 2.2 data + misc_length = 64 + extra_length = 255 + versionstring_length = 64 + modlist_length = 255 + host = None port = None - def __init__(self, host, port): - self.host = host - self.port = port + def __init__(self, host, port, version = '2.2'): + # Binary struct format to use (GAMESTRUCT) + if parse_version(version) >= parse_version('2.0'): + gameFormat = "!%dsII%ds6I" % (self.name_length, self.host_length) + if parse_version(version) >= parse_version('2.2'): + gameFormat += '%ds%ds%ds%ds10I' % (self.misc_length, self.extra_length, self.versionstring_length, self.modlist_length) + + self.host = host + self.port = port + self.version = version def list(self, allowException = False): with _socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -58,7 +76,7 @@ class masterserver_connection: (count,) = self._recv(s, "!I") for i in xrange(0,count): (description, size, flags, host, maxPlayers, currentPlayers, - user1, user2, user3, user4 ) = self._recv(s, "!64sII16sIIIIII") + user1, user2, user3, user4) = self._recv(s, self.gameFormat) description = description.strip("\0") host = host.strip("\0") # Workaround for the fact that some of the diff --git a/tools/lobby/ircbot.py b/tools/lobby/ircbot.py index f53aa8f1b..63fb6c8c5 100755 --- a/tools/lobby/ircbot.py +++ b/tools/lobby/ircbot.py @@ -46,7 +46,7 @@ class Bot: self.commands = BotCommands() self.commands.bot = self self.irc = bot_connection(self.commands, ircServer, ircPort, ircChannel, ircNick) - self.lobby = masterserver_connection(lobbyServer, lobbyPort) + self.lobby = masterserver_connection(lobbyServer, lobbyPort, version='2.1') self.check = change_notifier(self.irc, self.lobby) def start(self):