Exemple #1
0
 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)
Exemple #2
0
    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
Exemple #3
0
    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
Exemple #4
0
    def listen(self):
        try:
            while True:
                self.input(self.sock.recv(4096))

        except Exception as e:
            log.exception(e)
            self.send(factory(3))
            raise
Exemple #5
0
 def test_7(self):
     m1 = factory(7, message='info: world: shape=square size=20x20')
     m2 = factory(str(m1))
     self.assertEqual(m1.message, m2.message)
Exemple #6
0
 def test_move_negative(self):
     msg = factory("move -2 -3")
     self.assertTrue((Coord(*msg.coord.split(" "))==Coord("-2", "-3")).all())
Exemple #7
0
 def test_move_negative(self):
     msg = factory("move 20 30")
     self.assertTrue((Coord(*msg.coord.split(" "))==Coord("20", "30")).all())
Exemple #8
0
    def test_parse_without_arg(self):
        msg = factory("Yes\n")

        self.assertEquals(msg.id, 5)
Exemple #9
0
    def test_parse_with_arg(self):
        msg = factory("Hi, this is Xaralax.\n")

        self.assertEquals(msg.name, "Xaralax")
        self.assertEquals(msg.id, 1)
Exemple #10
0
    def test_get_by_id(self):
        msg = factory(1)
        msg.name = 'Mel'

        self.assertEquals("Hi, this is Mel.", str(msg))
Exemple #11
0
 def connection_made(self, _):
     hello = factory(1)
     hello.name = self.name
     self.transport.send(hello)
     self.transport.send(factory("Yes"))