a method to update the latest position of all users being tracked 
            
        :return: dictionary with user_id keys and location/time dictionary values
        
        NOTE:   self.players is updated with position details
        
        {
            'user_id': {
                'time': 0.0,
                'location': 'location.id'
            }
        }

def update_positions(self):

        '''
            a method to update the latest position of all users being tracked 
            
        :return: dictionary with user_id keys and location/time dictionary values
        
        NOTE:   self.players is updated with position details
        
        {
            'user_id': {
                'time': 0.0,
                'location': 'location.id'
            }
        }
        '''
        
    # construct user list
        user_list = []
        for key in self.positions.keys():
            user_list.append(key)

    # return empty result
        if not user_list:
            return self.positions

    # compose request
        import requests
        url = self.endpoint + '/location'

        while user_list:

        # batch requests
            if len(user_list) > 50:
                user_batch = user_list[0:50]
            else:
                user_batch = user_list
            params = {
                'group': self.group_name,
                'users': ','.join(user_batch),
                'n': 1
            }
            response = requests.get(url, params=params)
    
        # ingest response
            response_details = response.json()
            from labpack.records.time import labDT
            if 'users' in response_details.keys():
                for key in response_details['users'].keys():
                    position_details = {}
                    if key in user_batch:
                        for entry in response_details['users'][key]:
                            if 'time' in entry.keys() and 'location' in entry.keys():
                                time_string = entry['time'] 
                                time_string = time_string.replace(' +0000 UTC', 'Z')
                                time_string = time_string.replace(' ', 'T')
                                time_dt = labDT.fromISO(time_string).epoch()
                                position_details = {
                                    'time': time_dt,
                                    'location': entry['location']
                                }
                                break
                        self.positions[key] = position_details

        # slice user list
            if len(user_list) > 50:
                user_list = user_list[50:0]
            else:
                user_list = []

        return self.positions