def input(self, buffer_): """ @param buffer_ str """ messages = self.split_buffer(buffer_) for m in messages: try: m = factory(m) except IndexError: msg = factory(7) msg.message = m log.debug("raw <-: %s", m) self.send(msg) # FIXME: what to do in here with the rest of the messages? # 1. disregard (hey, it may work ;)) # 2. send a "resend" request when pipelining is implemented # then client can try to fix the message, create a new plan # or request disregarding it else: try: log.debug("<-: %s", m) self.protocol.msg_received(m) except RuntimeError: msg = factory(9) msg.message = m self.send(m)
def msg_received(self, msg): # TODO: this will require reimplementing messages in some kind of # FSM DSL, ideally programming lang agnostic if msg.id == 1: if not self.state is SS.NEW_CLIENT: raise RuntimeError self.name = msg.name self.transport.send(factory(2)) self.state = SS.GAME_CHALLENGE elif self.state is SS.GAME_CHALLENGE: if msg.id == 4: self.sock.shutdown(2) elif msg.id == 5: self.world = World(20, 20) self.player = self.world.spawn(Player, owner=self) Greenlet.spawn(self.world.ticker()) msg = factory(6) msg.shape = self.world.shape msg.size = self.world.size self.transport.send(msg) self.state = SS.GAME_IN_PROGRESS else: raise RuntimeError elif self.state is SS.GAME_IN_PROGRESS: if msg.id == 8: args = [int(x) for x in msg.coord.split(" ")] self.player.move(Coord(*args)) else: raise RuntimeError
def connection_made(self, addr): log.info('client connected %s', addr) self.addr = addr hello = factory(1) hello.name = self.name self.transport.send(hello) self.state = SS.NEW_CLIENT self.world = None
def listen(self): try: while True: self.input(self.sock.recv(4096)) except Exception as e: log.exception(e) self.send(factory(3)) raise
def test_7(self): m1 = factory(7, message='info: world: shape=square size=20x20') m2 = factory(str(m1)) self.assertEqual(m1.message, m2.message)
def test_move_negative(self): msg = factory("move -2 -3") self.assertTrue((Coord(*msg.coord.split(" "))==Coord("-2", "-3")).all())
def test_move_negative(self): msg = factory("move 20 30") self.assertTrue((Coord(*msg.coord.split(" "))==Coord("20", "30")).all())
def test_parse_without_arg(self): msg = factory("Yes\n") self.assertEquals(msg.id, 5)
def test_parse_with_arg(self): msg = factory("Hi, this is Xaralax.\n") self.assertEquals(msg.name, "Xaralax") self.assertEquals(msg.id, 1)
def test_get_by_id(self): msg = factory(1) msg.name = 'Mel' self.assertEquals("Hi, this is Mel.", str(msg))
def connection_made(self, _): hello = factory(1) hello.name = self.name self.transport.send(hello) self.transport.send(factory("Yes"))