def __init__(self): self.__load_list() self.presets = Presets() self.tracks = Tracks()
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()