def find_multi_mod_folders(self):
        """
        Some mods contain many mas files in a folder, e.g. F1_1988_Tracks
        Try to spot them by checking the number of mas files in a revision
        folder.
        Mod folder structure is <mod name>\<revision>\*.mas

        The REAL test is to look for more than one .SCN file for tracks and
        .VEH files for cars (also found in all_vehicles.ini)

        rF2 installed_folder: 'vehicles' or 'locations'
        """
        rF2_dir = os.path.join(rF2root, 'Installed')
        _mods = getListOfFiles(os.path.join(rF2_dir, self.installed_folder),
                               pattern='*',
                               recurse=False)
        multi_mas = list()
        multi_mfts = list()
        for _mod_folder, _mod in _mods:
            _revs = getListOfFiles(_mod_folder, pattern='*', recurse=False)
            for _rev in _revs:
                _mas_files = getListOfFiles(_rev[0],
                                            pattern='*.mas',
                                            recurse=True)
                if len(_mas_files) > 10:
                    multi_mas.append(_mod)
                    _mft_files = getListOfFiles(_rev[0],
                                                pattern='*.mft',
                                                recurse=True)
                    multi_mfts += _mft_files
        pass
        return multi_mas, multi_mfts
Esempio n. 2
0
def changeCar(vehPath=r'Norma_M30-LMP3_2017\1.51', vehName='NORMAM30_08'):
    if vehName == '':
        return "VehFile not in rFactory's car data file.\nPlease edit entry"

    # if vehPath is for example Installed\vehicles\Norma_M30-LMP3_2017\1.50
    # check for Installed\vehicles\Norma_M30-LMP3_2017\1.51
    # which is an update.  We have to use that.
    try:
        _vehFile = os.path.join(rF2root, vehPath)
        _vehPath, __ = os.path.split(_vehFile)
        _versions = getListOfFiles(_vehPath, '*.*')
        _vehPath = _versions[-1][0]
    except BaseException:
        return "Data file error '%s'" % _vehFile

    _vehFile = os.path.join(_vehPath, vehName).replace(
        '\\', '\\\\\\\\')  # +'.veh' no longer required

    allTracks = os.path.join(rF2root, r'UserData\player\All Tracks & Cars.cch')
    _text3, error = readFile(allTracks)
    _edit3 = [r'( *SinglePlayerVehicle *=).*', r'\1"' + _vehFile + '"']
    _edit5 = [r'( *SinglePlayerFilter *=).*', r'\1""']  # blank it
    _edited = __edit(_text3, [_edit3, _edit5], doubleSlash=False)
    writeFile(allTracks, _edited)
    return 'OK'
 def get_data_files_and_timestamps(self):
     """
     rFactory datafiles_folder: 'CarDatafilesFolder' or 'TrackDatafilesFolder'
     """
     _mft_files = getListOfFiles(self.datafiles_folder,
                                 pattern='*.txt',
                                 recurse=False)
     self.data_files_and_timestamps = dict()
     for folder in _mft_files:
         _timestamp = os.path.getmtime(folder[0])
         self.data_files_and_timestamps[folder[0].lower()] = _timestamp
     return self.data_files_and_timestamps
Esempio n. 4
0
 def dir_files_in_mas_files(self, folder):
     """
     Dict of mas files and the files they contain
     """
     masFiles = getListOfFiles(folder, '*.mas')
     _pop = os.getcwd()  # save current directory
     os.chdir(os.path.dirname(masFiles[0][0]))
     files = dict()
     for mas in masFiles:
         # We need to record mas file name as well
         files[mas[1]] = self.dir_files_in_single_mas_file(mas[1])
     os.chdir(_pop)
     return files
 def get_mfts_and_timestamps(self):
     """
     rF2 installed_folder: 'vehicles' or 'locations'
     """
     rF2_dir = os.path.join(rF2root, 'Installed')
     _mft_files = getListOfFiles(os.path.join(rF2_dir,
                                              self.installed_folder),
                                 pattern='*.mft',
                                 recurse=True)
     self.mfts_and_timestamps = dict()
     for folder in _mft_files:
         _folder = folder[0].lower()  # os.path.dirname(
         _timestamp = os.path.getmtime(_folder)
         self.mfts_and_timestamps[_folder] = _timestamp
     return self.mfts_and_timestamps
    def find_single_mod_folders(self):
        """
        Find ALL folders with .MFT files then subtract multi-mod folders

        Looks like none of the multifold

        rF2 installed_folder: 'vehicles' or 'locations'
        """
        rF2_dir = os.path.join(rF2root, 'Installed')
        all_mfts = getListOfFiles(os.path.join(rF2_dir, self.installed_folder),
                                  pattern='*.mft',
                                  recurse=True)
        self.multis, multi_mfts = self.find_multi_mod_folders()
        # all_mfts, list of folder, mft tuples
        # self.multis, list of folders
        # multi_mfts, list of folder, mft tuples
        for mmft in multi_mfts:
            for i, mft in enumerate(all_mfts):
                if mft[1] == mmft[1]:
                    del all_mfts[i]
        return all_mfts
Esempio n. 7
0
    def __init__(self, parentFrame):
        """ Put this into the parent frame """
        self.settings = {}
        self.vars = {}

        xPadding = 10
        #############################################
        vehicles_path = os.path.join(rF2root, 'Installed', 'Vehicles')
        vehicles = getListOfFiles(vehicles_path, pattern='*')

        tkFrame_vehicles = tk.LabelFrame(parentFrame,
                                         text='Vehicles',
                                         padx=xPadding)
        tkFrame_vehicles.grid(column=0, row=0, sticky='ew')

        # find the widest
        v = [x[1] for x in vehicles]
        w = max(v, key=len)
        self.tkVehicleListbox = tk.Listbox(tkFrame_vehicles,
                                           selectmode=tk.EXTENDED,
                                           width=len(w) - 2,
                                           height=min(20, len(vehicles)))
        self.tkVehicleListbox.grid(rowspan=2)
        #
        tkVehicleScrollbar = tk.Scrollbar(tkFrame_vehicles, orient="vertical")
        tkVehicleScrollbar.config(command=self.tkVehicleListbox.yview)
        tkVehicleScrollbar.grid(column=1, row=0, sticky='ns', rowspan=2)

        for __, _v in vehicles:
            self.tkVehicleListbox.insert(tk.END, _v)

        self.tkVehicleListbox.activate(1)
        if _main:
            # Double click selects the server
            self.tkVehicleListbox.bind("<Double-Button-1>", self.copy_vehicles)

        ############################################
        tk.Button(tkFrame_vehicles, text="=>", command=self.copy_vehicles).\
            grid(column=2, row=0, pady=20, padx=xPadding)
        tk.Button(tkFrame_vehicles, text="<=", command=self.uncopy_vehicles).\
            grid(column=2, row=1, pady=20, padx=xPadding)

        #############################################
        self.tkSelectedVehicleListbox = tk.Listbox(tkFrame_vehicles,
                                                   selectmode=tk.EXTENDED,
                                                   width=20,
                                                   height=min(
                                                       20, len(vehicles)))
        self.tkSelectedVehicleListbox.grid(column=3, row=0, rowspan=2)

        #############################################
        #############################################
        locations_path = os.path.join(rF2root, 'Installed', 'Locations')
        locations = getListOfFiles(locations_path, pattern='*')

        tkFrame_locations = tk.LabelFrame(parentFrame,
                                          text='Locations',
                                          padx=xPadding)
        tkFrame_locations.grid(column=2, row=0, sticky='ew')

        # find the widest
        l = [x[1] for x in locations]
        w = max(l, key=len)
        self.tkLocationListbox = tk.Listbox(tkFrame_locations,
                                            selectmode=tk.EXTENDED,
                                            width=len(w) - 2,
                                            height=min(20, len(locations)))
        self.tkLocationListbox.grid(rowspan=2)
        #
        tkLocationScrollbar = tk.Scrollbar(tkFrame_locations,
                                           orient="vertical")
        tkLocationScrollbar.config(command=self.tkLocationListbox.yview)
        tkLocationScrollbar.grid(column=1, row=0, sticky='ns', rowspan=2)

        for __, _v in locations:
            self.tkLocationListbox.insert(tk.END, _v)

        self.tkLocationListbox.activate(1)
        if _main:
            # Double click selects the server
            self.tkLocationListbox.bind("<Double-Button-1>",
                                        self.copy_locations)

        ############################################
        tk.Button(tkFrame_locations, text="=>", command=self.copy_locations).\
            grid(column=2, row=0, pady=20, padx=xPadding)
        tk.Button(tkFrame_locations, text="<=",
                  command=self.uncopy_locations).grid(column=2,
                                                      row=1,
                                                      pady=20,
                                                      padx=xPadding)

        #############################################
        self.tkSelectedLocationListbox = tk.Listbox(tkFrame_locations,
                                                    selectmode=tk.EXTENDED,
                                                    width=20,
                                                    height=min(
                                                        20, len(locations)))
        self.tkSelectedLocationListbox.grid(column=3, row=0, rowspan=2)
    def multi_mod(self, folder):
        """
        Multiple mods in one folder with a single MFT file

        Generator function, returns one mod each time
        Generator version broke when run in VS debugger, OK when run as Python file or exe
        for _tags, cache_write in tdf.multi_mod(folder):
        """

        rF2_dir = os.path.join(rF2root, 'Installed')
        mft_files = getListOfFiles(os.path.join(rF2_dir, self.installed_folder,
                                                folder),
                                   pattern='*.mft',
                                   recurse=True)
        mas_files = getListOfFiles(os.path.join(rF2_dir, self.installed_folder,
                                                folder),
                                   pattern='*.mas',
                                   recurse=True)

        results = list()
        for _mod in mas_files:
            cache_write = False
            _mft_tags = self._get_mft_tags(mft_files[0][0])  # Get the name
            if 'Date' in _mft_tags:
                _mft_tags['Date'] = translate_date(_mft_tags['Date'])
            else:
                _mft_tags['Date'] = ''

            _mft_tags['Name'] = _mod[1][:-4]
            cached_tag_name = _mft_tags['Name']
            cached_tags = self.cache_o.get_values(cached_tag_name)
            if not cached_tags:
                # Newly-installed mod
                files = self.dir_files_in_single_mas_file(_mod[0])
                if 'Track Name' in _mft_tags:
                    del _mft_tags['Track Name']
                for _tag, _val in _mft_tags.items():
                    cached_tags[_tag] = _val
                cached_tags['Rating'] = '***'  # Default
                cached_tags, cache_write = self._read_mas_file(
                    cached_tags, _mod[0], files)
                if cache_write:
                    cached_tags['strippedName'] = cached_tags['Name']
                    cached_tags = parse_name(cached_tags)
                    cached_tags = parse_mfr_model(cached_tags)
                    for tag, val in cached_tags.items():
                        self.cache_o.set_value(cached_tag_name, tag, val)
                    if 'Latitude' in cached_tags:
                        # It's a track
                        tag = 'Track Name'
                        val = cached_tags['strippedName'].replace('_',
                                                                  ' ').strip()
                        cached_tags[tag] = val
                        self.cache_o.set_value(cached_tag_name, tag, val)
                else:
                    if not _mod[0] + '\n' in self.unusable_mas_files:
                        self.unusable_mas_files.append(_mod[0] + '\n')
                        writeFile(unusableMasFilesFile,
                                  self.unusable_mas_files)

            if cache_write:
                for tag, val in _mft_tags.items():
                    self.cache_o.set_value(cached_tag_name, tag, val)

            for _tag in []:  # ['Desc', 'Name', 'strippedName']:
                if _tag in _mft_tags:
                    cached_tags[_tag] = _mft_tags[_tag]
            results.append([cached_tags, cache_write])
        return results