Exemple #1
0
 def __init__(self):
     self.__load_list()
     self.presets = Presets()
     self.tracks = Tracks()
Exemple #2
0
class ServerList(object):
    def __init__(self):
        self.__load_list()
        self.presets = Presets()
        self.tracks = Tracks()

    def __load_list(self):
        self.servers = []
        serverlist = os.listdir('servers')
        serverlist.sort()
        serverlist.remove('00_template')
        for entry in serverlist:
            self.servers.append( Server(entry) )

    def add_server(self, name, track, layout, carlist, session, dyntrack,
                    weathers, adminpw, max_clients, description):
        # first, create the directory
        server_id = self.__get_next_id()
        path = 'servers/' + str( server_id ).zfill(2) + '_' + name
        os.mkdir(path)

        error = False
        # then, copy entry list of the cars
        if not self.__copy_carlist(carlist, path):
            print('Invalid carlist ID (%d), choose one of the following:' %
                    carlist)
            self.presets.display('cars')
            error = True

        # then, create server_cfg.ini
        if not error and not self.__create_server_cfg(server_id, path, name,
                                    track, layout, carlist, session, dyntrack,
                                    weathers, adminpw, max_clients,
                                    description):
            error = True

        if error:
            print('\nThere were errors creating the server instance')
            shutil.rmtree(path)
            sys.exit(1)

        self.servers.append( Server(path) )
        self.servers.sort()

    def __create_server_cfg(self, server_id, dest, name, track, layout, carlist,
                            session, dyntrack, weathers, adminpw, max_clients,
                            description):
        dest += '/server_cfg.ini'
        if not self.__copy_base_config(dest):
            return False

        with open(dest, 'r') as file:
            content = file.read()

        config = Config()
        port = config.get_udptcp_port() + server_id
        http_port = config.get_http_port() + server_id
        content = content.replace('PLACEHOLDER_UDP_TCP_PORT', str(port) )
        content = content.replace('PLACEHOLDER_HTTP_PORT', str(http_port) )

        if not self.tracks.exists(track, layout):
            return False

        if layout == 'default':
            layout = ''
        content = content.replace('PLACEHOLDER_TRACK_CONFIG', layout)
        content = content.replace('PLACEHOLDER_TRACK', track)

        max_clients = self.__get_max_clients(   max_clients,
                                                carlist,
                                                track,
                                                layout)
        if max_clients < 1:
            return False
        content = content.replace('PLACEHOLDER_MAX_CLIENTS', str(max_clients) )

        (content, success) = self.__set_carlist_of(content, carlist)
        if not success:
            return False
        (content, success) = self.__set_sessions_of(content, session)
        if not success:
            return False
        (content, success) = self.__set_dyntrack_of(content, dyntrack)
        if not success:
            return False
        (content, success) = self.__set_weather_of(content, weathers)
        if not success:
            return False

        name_prefix = config.get_name_prefix()
        if name_prefix == None:
            server_name = name
        else:
            server_name = config.get_name_prefix() + ' - ' +  name
        content = content.replace('PLACEHOLDER_NAME', server_name)
        content = content.replace('PLACEHOLDER_ADMIN_PW', adminpw)

        if description != None:
            content = content.replace('PLACEHOLDER_DESC', description)

        with open(dest, 'w') as file:
            file.write(content)

        return True

    def __get_max_clients(self, max_clients, carlist, track, layout):
        track_slots = self.tracks.get_pits_of_track(track, layout)
        car_slots = self.presets.get_amount_of_cars_in(carlist)
        if max_clients == 0:
            return min(track_slots, car_slots)
        else:
            return min(max_clients, track_slots, car_slots)

    def __copy_base_config(self, dest):
        try:
            shutil.copyfile('presets/base.ini', dest)
            return True
        except (IOError, OSError) as e:
            return False

    def __copy_carlist(self, id, dest):
        src = self.presets.get_location_of_preset('cars_entry_list', id)
        try:
            shutil.copyfile(src, dest + '/entry_list.ini')
            return True
        except (TypeError, IOError, OSError) as e:
            return False

    def __set_carlist_of(self, config, id):
        src = self.presets.get_location_of_preset('cars_carlist', id)
        if not src:
            print('Invalid carlist ID (%d), choose one of the following:' % id)
            self.presets.display('cars')
            return (config, False)
        with open(src, 'r') as file:
            content = file.read().replace('\n', '')

        return (config.replace('PLACEHOLDER_CARS', content), True)

    def __set_sessions_of(self, config, id):
        src = self.presets.get_location_of_preset('sessions', id)
        if not src:
            print('Invalid session ID (%d), choose one of the following:' % id)
            self.presets.display('sessions')
            return (config, False)
        with open(src, 'r') as file:
            content = file.read()

        return (config.replace('PLACEHOLDER_SESSIONS', content), True)

    def __set_dyntrack_of(self, config, id):
        src = self.presets.get_location_of_preset('dyntracks', id)
        if not src:
            print('Invalid dynamic-track ID (%d), choose one of the following:'
                        % id)
            self.presets.display('dyntracks')
            return (config, False)
        with open(src, 'r') as file:
            content = file.read()

        return (config.replace('PLACEHOLDER_DYNAMIC_TRACK', content), True)

    def __set_weather_of(self, config, ids):
        content = ''
        counter = 0
        for id in ids:
            src = self.presets.get_location_of_preset('weathers', id)
            if not src:
                print('Invalid weather ID (%d), choose some of the following:'
                            % id)
                self.presets.display('weathers')
                return (config, False)
            with open(src, 'r') as file:
                content += file.read().replace('{{ID}}', str(counter))
            content += '\n\n'
            counter += 1

        return (config.replace('PLACEHOLDER_WEATHER', content), True)

    def __get_next_id(self):
        last = 0
        sid = 0
        for server in self.servers:
            sid = server.get_id()
            if sid > last + 1:
                return last + 1
            else:
                last = sid

        return sid + 1

    def display(self):
        print("Found %d servers:" % len(self.servers) )
        for server in self.servers:
            server.display()