def main(): options = parse_args() dl_address = (options.dshost, options.dlport) print("Trying to work with:") print("Server console client on %s:%d." % (options.dshost, options.csport)) print("Device Link on %s:%d." % dl_address) def on_start(_): print("Successfully connected to game server.") f = HeightmapCreatorFactory(clients[0], clients[1], options.dir) connector = reactor.listenTCP(options.port, f, interface=options.host) host = connector.getHost() print("Listening clients on %s:%d." % (host.host, host.port)) def on_connected(client): clients.append(client) d = dl_client.on_start.addCallback(on_start) reactor.listenUDP(0, dl_client) return d def on_fail(err): print("Failed to connect to game server: %s" % err.value) reactor.stop() def on_connection_lost(err): print("Connection was lost.") dl_client = DeviceLinkClient(dl_address, timeout_value=DL_TIMEOUT) clients = [dl_client, ] p = ConsoleParser( (service.PilotBaseService(), service.MissionBaseService())) f = ConsoleClientFactory(parser=p, timeout_value=DS_CONSOLE_TIMEOUT) f.on_connecting.addCallbacks(on_connected, on_fail) f.on_connection_lost.addErrback(on_connection_lost) reactor.connectTCP(options.dshost, options.csport, f) reactor.run()
def __init__(self): MultiService.__init__(self) self.clear_shared_storage() # Place to store some of server confs values -------------------------- self.confs = {} # Init pilots service ------------------------------------------------- from commander.service.pilots import PilotsService pilots = PilotsService() pilots.setServiceParent(self) # Init objects service ------------------------------------------------ from commander.service.objects import ObjectsService objects = ObjectsService() objects.setServiceParent(self) # Init missions service with log watcher ------------------------------ from commander.service.missions import MissionsService log_watcher = LogWatchingService(settings.IL2_EVENTS_LOG_PATH) missions = MissionsService(log_watcher) log_parser = EventLogParser((pilots, objects, missions, )) log_watcher.set_parser(log_parser) missions.setServiceParent(self) # Init console and DeviceLink parsers --------------------------------- console_parser = ConsoleParser((pilots, missions, )) device_link_parser = DeviceLinkParser() # Group parsers and services ------------------------------------------ self.parsers = namedtuple('commander_parsers', field_names=['console', 'device_link', 'log'])( console_parser, device_link_parser, log_parser) self.services = namedtuple('commander_services', field_names=['pilots', 'objects', 'missions'])( pilots, objects, missions)
def setUp(self): self.pilot_srvc = PilotService() self.parser = ConsoleParser(self.pilot_srvc) self.pilot_srvc.startService()
class ConsoleParserTestCase(TestCase): def setUp(self): self.pilot_srvc = PilotService() self.parser = ConsoleParser(self.pilot_srvc) self.pilot_srvc.startService() def tearDown(self): return self.pilot_srvc.stopService() def test_server_info(self): datas = [ "Type: Local server", "Name: Test server", "Description: Horus test server", ] result = self.parser.server_info(datas) self.assertIsInstance(result, dict) self.assertEqual(result.get('type'), "Local server") self.assertEqual(result.get('name'), "Test server") self.assertEqual(result.get('description'), "Horus test server") def test_mission_status(self): status, mission = self.parser.mission_status([ "Mission NOT loaded", ]) self.assertEqual(status, MISSION_STATUS.NOT_LOADED) self.assertEqual(mission, None) status, mission = self.parser.mission_status([ "Mission: net/dogfight/test.mis is Loaded", ]) self.assertEqual(status, MISSION_STATUS.LOADED) self.assertEqual(mission, "net/dogfight/test.mis") status, mission = self.parser.mission_status([ "Mission: net/dogfight/test.mis is Playing", ]) self.assertEqual(status, MISSION_STATUS.PLAYING) self.assertEqual(mission, "net/dogfight/test.mis") datas = ["some fake data", ] result = self.parser.mission_status(datas) self.assertIsInstance(result, list) self.assertEqual(len(datas), len(result)) self.assertEqual(datas[0], result[0]) def test_mission_load(self): datas = [ "Loading mission net/dogfight/test.mis...", "Load bridges", "Load static objects", "##### House without collision (3do/Tree/Tree2.sim)", "##### House without collision " "(3do/Buildings/Port/Floor/live.sim)", "##### House without collision " "(3do/Buildings/Port/BaseSegment/live.sim)", "Mission: net/dogfight/test.mis is Loaded", ] status, mission = self.parser.mission_load(datas) self.assertEqual(status, MISSION_STATUS.LOADED) self.assertEqual(mission, "net/dogfight/test.mis") def test_mission_begin(self): status, mission = self.parser.mission_begin([ "Mission: net/dogfight/test.mis is Playing", ]) self.assertEqual(status, MISSION_STATUS.PLAYING) self.assertEqual(mission, "net/dogfight/test.mis") def test_mission_end(self): status, mission = self.parser.mission_end([ "Mission: net/dogfight/test.mis is Loaded", ]) self.assertEqual(status, MISSION_STATUS.LOADED) self.assertEqual(mission, "net/dogfight/test.mis") def test_mission_destroy(self): status, mission = self.parser.mission_destroy([ "Mission NOT loaded", ]) self.assertEqual(status, MISSION_STATUS.NOT_LOADED) self.assertEqual(mission, None) def test_user_joined(self): self.parser.parse_line( "socket channel '0' start creating: ip 192.168.1.2:21000") self.parser.parse_line("Chat: --- user0 joins the game.") self.parser.parse_line( "socket channel '0', ip 192.168.1.2:21000, user0, " "is complete created.") self.assertEqual(len(self.pilot_srvc.joined), 1) info = self.pilot_srvc.joined[0] self.assertIsInstance(info, dict) self.assertEqual(info.get('channel'), 0) self.assertEqual(info.get('ip'), "192.168.1.2") self.assertEqual(info.get('callsign'), "user0") def test_user_left(self): self.parser.parse_line( "socketConnection with 192.168.1.2:21000 on channel 0 lost. " "Reason: ") self.parser.parse_line("Chat: --- user0 has left the game.") self.assertEqual(len(self.pilot_srvc.left), 1) info = self.pilot_srvc.left[0] self.assertIsInstance(info, dict) self.assertEqual(info.get('channel'), 0) self.assertEqual(info.get('ip'), "192.168.1.2") self.assertEqual(info.get('callsign'), "user0") self.assertEqual(info.get('reason'), PILOT_LEAVE_REASON.DISCONNECTED) self.parser.parse_line( "socketConnection with 192.168.1.3:21000 on channel 1 lost. " "Reason: You have been kicked from the server.") self.parser.parse_line("Chat: --- user1 has left the game.") self.assertEqual(len(self.pilot_srvc.left), 2) info = self.pilot_srvc.left[1] self.assertIsInstance(info, dict) self.assertEqual(info.get('channel'), 1) self.assertEqual(info.get('ip'), "192.168.1.3") self.assertEqual(info.get('callsign'), "user1") self.assertEqual(info.get('reason'), PILOT_LEAVE_REASON.KICKED)
class ConsoleParserTestCase(TestCase): def setUp(self): self.pilot_srvc = PilotService() self.parser = ConsoleParser(self.pilot_srvc) self.pilot_srvc.startService() def tearDown(self): return self.pilot_srvc.stopService() def test_server_info(self): datas = [ "Type: Local server", "Name: Test server", "Description: Horus test server", ] result = self.parser.server_info(datas) self.assertIsInstance(result, dict) self.assertEqual(result.get('type'), "Local server") self.assertEqual(result.get('name'), "Test server") self.assertEqual(result.get('description'), "Horus test server") def test_mission_status(self): status, mission = self.parser.mission_status([ "Mission NOT loaded", ]) self.assertEqual(status, MISSION_STATUS.NOT_LOADED) self.assertEqual(mission, None) status, mission = self.parser.mission_status([ "Mission: net/dogfight/test.mis is Loaded", ]) self.assertEqual(status, MISSION_STATUS.LOADED) self.assertEqual(mission, "net/dogfight/test.mis") status, mission = self.parser.mission_status([ "Mission: net/dogfight/test.mis is Playing", ]) self.assertEqual(status, MISSION_STATUS.PLAYING) self.assertEqual(mission, "net/dogfight/test.mis") datas = [ "some fake data", ] result = self.parser.mission_status(datas) self.assertIsInstance(result, list) self.assertEqual(len(datas), len(result)) self.assertEqual(datas[0], result[0]) def test_mission_load(self): datas = [ "Loading mission net/dogfight/test.mis...", "Load bridges", "Load static objects", "##### House without collision (3do/Tree/Tree2.sim)", "##### House without collision " "(3do/Buildings/Port/Floor/live.sim)", "##### House without collision " "(3do/Buildings/Port/BaseSegment/live.sim)", "Mission: net/dogfight/test.mis is Loaded", ] status, mission = self.parser.mission_load(datas) self.assertEqual(status, MISSION_STATUS.LOADED) self.assertEqual(mission, "net/dogfight/test.mis") def test_mission_begin(self): status, mission = self.parser.mission_begin([ "Mission: net/dogfight/test.mis is Playing", ]) self.assertEqual(status, MISSION_STATUS.PLAYING) self.assertEqual(mission, "net/dogfight/test.mis") def test_mission_end(self): status, mission = self.parser.mission_end([ "Mission: net/dogfight/test.mis is Loaded", ]) self.assertEqual(status, MISSION_STATUS.LOADED) self.assertEqual(mission, "net/dogfight/test.mis") def test_mission_destroy(self): status, mission = self.parser.mission_destroy([ "Mission NOT loaded", ]) self.assertEqual(status, MISSION_STATUS.NOT_LOADED) self.assertEqual(mission, None) def test_user_joined(self): self.parser.parse_line( "socket channel '0' start creating: ip 192.168.1.2:21000") self.parser.parse_line("Chat: --- user0 joins the game.") self.parser.parse_line( "socket channel '0', ip 192.168.1.2:21000, user0, " "is complete created.") self.assertEqual(len(self.pilot_srvc.joined), 1) info = self.pilot_srvc.joined[0] self.assertIsInstance(info, dict) self.assertEqual(info.get('channel'), 0) self.assertEqual(info.get('ip'), "192.168.1.2") self.assertEqual(info.get('callsign'), "user0") def test_user_left(self): self.parser.parse_line( "socketConnection with 192.168.1.2:21000 on channel 0 lost. " "Reason: ") self.parser.parse_line("Chat: --- user0 has left the game.") self.assertEqual(len(self.pilot_srvc.left), 1) info = self.pilot_srvc.left[0] self.assertIsInstance(info, dict) self.assertEqual(info.get('channel'), 0) self.assertEqual(info.get('ip'), "192.168.1.2") self.assertEqual(info.get('callsign'), "user0") self.assertEqual(info.get('reason'), PILOT_LEAVE_REASON.DISCONNECTED) self.parser.parse_line( "socketConnection with 192.168.1.3:21000 on channel 1 lost. " "Reason: You have been kicked from the server.") self.parser.parse_line("Chat: --- user1 has left the game.") self.assertEqual(len(self.pilot_srvc.left), 2) info = self.pilot_srvc.left[1] self.assertIsInstance(info, dict) self.assertEqual(info.get('channel'), 1) self.assertEqual(info.get('ip'), "192.168.1.3") self.assertEqual(info.get('callsign'), "user1") self.assertEqual(info.get('reason'), PILOT_LEAVE_REASON.KICKED)