Example #1
0
    def send_update(self):
        self.scheduler.enter(self.update_rate, 1, self.send_update)

        if not self.session or not self.session.is_connected:
            return

        # collect player info
        self.player.pre_update_player_state()
        self.player.update_player_state(sid=self.session.sid, player=self.agar_client.player, party_token=self.agar_client.server_token)

        # collect world status
        self.player.world.pre_update_world()
        cells = self.agar_client.player.world.cells.copy()
        cells = {cid: c for cid, c in cells.items() if cid in self.player.own_ids or c.mass > 20 or c.is_food or c.is_ejected_mass}
        self.player.world.update_world(cells)

        # send update
        try:
            buf = BufferStruct()

            # player status
            if self.player.has_update() or self.force_player_update:
                buf.push_uint8(110)
                self.player.pack_player_update(buf)
            self.force_player_update = False

            # world status
            if self.player.world.has_update():
                buf.push_uint8(111)
                self.player.world.pack_world_update(buf)

            if buf.buffer:
                self.session.sendall(buf.buffer)
        except socket.error:
            self.disconnect()
Example #2
0
    def recv_update(self):
        self.scheduler.enter(self.update_rate, 1, self.recv_update)

        if not self.session or not self.session.is_connected:
            return

        while 1:
            msg = self.session.pop_msg()
            if msg is None:
                return

            buf = BufferStruct(msg)
            while not buf.empty():
                self.dispatcher.dispatch(buf)
Example #3
0
    def client_handler(self, sock, addr):
        try:
            sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)

            buf = BufferStruct(sock.recv(1024))
            opcode = buf.pop_uint8()

            if opcode != 100:
                print("Rejected connection from %s due to wrong opcode %d!" % (addr, opcode))
                sock.close()
                return

            # get client challenge
            hash = buf.pop_null_str8()
            rand = buf.pop_uint8()
            m = hashlib.md5()
            m.update(self.password.encode("utf-16"))
            m.update(str(rand).encode("utf-8"))

            # check if hashes are matching
            if m.hexdigest() != hash:
                msg = str("Rejected connection from %s due to wrong password!" % (addr,))
                print(msg)

                buf = BufferStruct(opcode=201)
                buf.push_len_str16(msg)
                sock.send(buf.buffer)
                sock.close()
                return

            client_version = buf.pop_len_str8()
            if client_version != PROTOCOL_VERSION:
                msg = str(
                    "Rejected connection from %s due to wrong protocol version (Client: %s, Server: %s)!"
                    % (addr, client_version, str(PROTOCOL_VERSION))
                )
                print(msg)

                buf = BufferStruct(opcode=201)
                buf.push_len_str16(msg)
                sock.send(buf.buffer)
                sock.close()
                return

            print("Accepted connection from: ", addr)

            # init session
            id = uuid.uuid4()

            # send session id to client
            buf = BufferStruct(opcode=200)
            buf.push_len_str8(str(id))

            # add welcome message
            buf.push_uint8(201)
            buf.push_len_str16("Welcome on Tagar server at %s" % (self.address,))

            sock.send(buf.buffer)

            self.player_list_lock.acquire()
            self.world_lock.acquire()

            session = Session(id, sock)
            self.player_list.append(Player(session))
            self.force_player_list_update = True
            # TODO: Send full map

            self.player_list_lock.release()
            self.world_lock.release()

        except socket.error:
            sock.close()
Example #4
0
    def connect(self, addr, port, password):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)

        # try to connect to server
        try:
            # Connect to server and send data
            sock.connect((addr, port))

            buf = BufferStruct(opcode=100)

            # create challenge
            rand = random.randint(1, 254)
            m = hashlib.md5()
            m.update(password.encode('utf-16'))
            m.update(str(rand).encode('utf-8'))

            # send login challenge
            buf.push_null_str8(m.hexdigest())
            buf.push_uint8(rand)

            # add protocol version
            buf.push_len_str8(PROTOCOL_VERSION)
            sock.send(buf.buffer)

            # Receive data from the server
            msg = sock.recv(1024)
            if msg is None or len(msg) == 0:
                msg = str()

            sid = None

            buf = BufferStruct(msg)
            while not buf.empty():
                opcode = buf.pop_uint8()

                if opcode == 200:
                    print("Connected to tagar server: %s:%d" % (addr, port))
                    sid = buf.pop_len_str8()
                    login_ok = True

                if opcode == 201:
                    print("[Tagar Server]: %s" % (buf.pop_len_str16(),))

            if not sid:
                print("Connection to team server rejected!")
                sock.close()
                return

            self.session = Session(sid, sock)
            self.player = Player(self.session)
            self.force_player_update = True

        except socket.error:
            print("Could not connect to tagar server: %s:%d" % (addr, port))
Example #5
0
 def parse_msg(self, msg):
     buf = BufferStruct(msg)
     while not buf.empty():
         self.dispatcher.dispatch(buf)