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))
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)
def parse_msg(self, msg): buf = BufferStruct(msg) while not buf.empty(): self.dispatcher.dispatch(buf)