def checkTimeOut(self):
     if int(time.time()) - self.lastAlive > 15:
         if self.ID != None:
             r = room.findRoomByID(self.ID)
             print 'player', self.address, 'is disconnected'
             for i in range(len(r.players)):
                 if r.players[i] == self:
                     del r.players[i]
                     break
    def handle(self):
        global player, room
        data = self.request[0].strip()
        data = json.loads(data)
        socket = self.request[1]
        ################################
        #
        # Situations when game not ready
        #
        ################################
        #
        # Create new room
        if data[0] == 'new-room':
            print self.client_address, 'want to create a room'
            p = player.findPlayerByAddress(self.client_address)
            if p != None and p.ID != None:
                print 'but he\'d joined room', p.ID
                return
            r = room.newRoom()
            r.addPlayer(self.client_address)
            print 'he is now in room', r.ID
        #
        # Get the player's current room info
        # msg format is
        # [player's name, [room ID, number of players, , track, etc]]
        elif data[0] == 'my-room':
            p = player.findPlayerByAddress(self.client_address)
            if p == None:
                data = ['', 'my-room', [-1]]
                self.send(data)
            else:
                data = roomInfo(ID, 'my-room')
                self.send(data)
        #
        # Get the rooms list
        elif data[0] == 'view-rooms':
            room.processTimeOut()
            room_list = map(lambda x:x.ID, room.rooms)
            data = ['', 'room-list', room_list]
            self.send(data)
            print self.client_address, 'want to view rooms'
        #
        # change track
        elif data[0] == 'chg-track':
            # Do exception handling TODO
            p = player.findPlayerByAddress(self.client_address)
            r = room.findRoomByID(p.ID)
            r.track = data[1]
            data = room.roomInfo(ID, 'my-room')
            self.send(data)
        #
        # Join the player to a room
        elif data[0] == 'join-room':
            p = player.findPlayerByAddress(self.client_address)
            ID = data[1]
            if p != None and p.ID == ID:
                print 'he\'d already joined the room'
                return
            # TODO quit room
            r = room.findRoomByID(ID)
            if r != None:
                r.addPlayer(self.client_address)
                print self.client_address, 'joined room', ID
                # tell the player the current room info
                data = room.roomInfo(ID, 'my-room')
                self.send(data)
        #
        # Tell all players in the room to start the game
        elif data[0] == 'start':
            p = player.findPlayerByAddress(self.client_address)
            if p == None:
                print 'He didn\'t join a room'
                data = ['', 'msg', 'Join a room first!']
            else:
                r = room.findRoomByID(p.ID)
                r.status = 'running'
                # tell every player in the room to start the game
                # and initialize their position
                # TODO! Replace position with 'Sequence'
                seq = 0
                for p in r.players:
                    p.seq = seq
                    print p.getName(), 'is at', p.seq
                    seq += 1
                # First start a player's game,
                # then add other players to his game
                for p in r.players:
                    print 'I want to tell', p.address, 'to start'
                    self.startGame(p, r)
        #
        # When a player want to be started
        # just start him
        elif data[0] == 'start-me':
            p = player.findPlayerByAddress(self.client_address)
            r = room.findRoomByID(p.ID)
            self.startGame(p, r)

        elif data[0] == 'request-player':
            p = player.findPlayerByAddress(self.client_address)
            if p == None:
                print 'error occur'
                return
            p.setLastAlive()
            r = room.findRoomByID(p.ID)
            for p in r.players:
                print 'I want to tell', p.address, 'to add player'
                for p_o in r.players:
                    if p == p_o:
                        adj_data = json.dumps(['player', 'adjust-pos', p_o.seq])
                        socket.sendto(adj_data, p.address)
                        continue
                    print 'add', p_o.getName()
                    crt_data = json.dumps([p_o.getName(), 'create-player', p_o.seq])
                    socket.sendto(crt_data, p.address)
                    adj_data = json.dumps([p_o.getName(), 'adjust-pos', p_o.seq])
                    socket.sendto(adj_data, p.address)
        ################################
        #
        # Situations after game started
        #
        ################################
        #
        # Adjust a player's physics info
        elif data[0] == 'adjust-physical':
            p = player.findPlayerByAddress(self.client_address)
            if p == None:
                print 'Error! Player not found when adjusting physics'
            r = room.findRoomByID(p.ID)
            if r.status != 'running': return
            adjust_data = [p.getName(), 'adjust-physical', data[1]]
            for p_o in r.players:
                if p == p_o: continue
                self.send(adjust_data, p_o.address)
        #
        # Sync keys
        elif data[0] == 'keys':
            p = player.findPlayerByAddress(self.client_address)
            p.setLastAlive()
            r = room.findRoomByID(p.ID)
            if r.status != 'running': return
            sync_data= [p.getName(), 'keys', data[1]]
            for p_o in r.players:
                if p_o == p: continue
                self.send(sync_data, p_o.address)
        #
        # Someone win the game
        elif data[0] == 'win':
            p = player.findPlayerByAddress(self.client_address)
            r = room.findRoomByID(p.ID)
            if r.status != 'running': return
            r.status = 'over'
            lose_data= ['', 'lose']
            for p_o in r.players:
                if p_o == p: continue
                self.send(lose_data, p_o.address)