Source code for stringtables.downloads

# ../stringtables/downloads.py

"""Provides access to the Downloadables stringtable."""

# =============================================================================
# >> IMPORTS
# =============================================================================
# Source.Python Imports
#   Core
from core import AutoUnload
#   Events
from events.manager import event_manager
#   Paths
from paths import GAME_PATH
#   Stringtables
from stringtables import string_tables


# =============================================================================
# >> ALL DECLARATION
# =============================================================================
__all__ = ('Downloadables',
           )


# =============================================================================
# >> CLASSES
# =============================================================================
[docs]class Downloadables(AutoUnload, set): """Class used to store downloadables for a script."""
[docs] def __init__(self): """Add the instance to the downloadables list.""" super().__init__() _downloadables_list.append(self)
[docs] def add(self, item): """Add an item to the downloadables for a script. :param str item: The path to add to the downloadables. """ # Is the item already in the list? if item in self: # If so, no need to add it return # Add the item to the downloadables stringtable _downloadables_list._add_to_download_table(item) # Add the item to the script's downloadables super().add(item)
[docs] def add_directory(self, directory): """Add all files in the given directory to the downloadables. :param str directory: The directory to add to the downloadables. :return: Return the number of files that have been added. :rtype: int """ index = 0 for index, file in enumerate(GAME_PATH.joinpath(directory).walkfiles(), 1): self.add(file.replace(GAME_PATH, '').replace('\\', '/').lstrip('/')) return index
[docs] def remove_directory(self, directory): """Remove all files in the given directory from the downloadables. :param str directory: The directory to remove from the downloadables. """ # Convert slashes directory = directory.replace('\\', '/') # Loop through all items in the set for item in list(self): # Is the current item in the given directory? if item.startswith(directory): # Remove the item from the set self.remove(item)
def _set_all_downloads(self): """Add all downloadables for the script on level init.""" # Loop through all items in the list for item in self: # Add the item to the downloadables stringtable _downloadables_list._add_to_download_table(item) def _unload_instance(self): """Remove the instance from the downloadables list.""" _downloadables_list.remove(self)
class _DownloadablesList(list): """List object used to store downloads on a per-script basis.""" def __init__(self): """Refresh the downloadables table instance.""" super().__init__() self._refresh_table_instance() def _refresh_table_instance(self): """Get the current instance of the downloadables table.""" self.download_table = string_tables.downloadables def _add_to_download_table(self, item): """Add the given file to the downloadables table.""" # Is the server still in launching process? if self.download_table is None: # If so, no need to go further... return # Add the given file to the downloadables table. self.download_table.add_string(item, item) def server_spawn(self, game_event): """Add all items stored as downloadables to the stringtable.""" # Refresh the downloadables table instance self._refresh_table_instance() # Loop through all items in the list for item in self: # Set all items in the current item as downloadables item._set_all_downloads() # Get the _DownloadablesList instance _downloadables_list = _DownloadablesList() # Register for the event server_spawn in # order to reset all downloads on map change event_manager.register_for_event( 'server_spawn', _downloadables_list.server_spawn)