Source code for evennia.contrib.base_systems.components.component

"""
Components - ChrisLR 2022

This file contains the base class to inherit for creating new components.
"""
import itertools


[docs]class Component: """ This is the base class for components. Any component must inherit from this class to be considered for usage. Each Component must supply the name, it is used as a slot name but also part of the attribute key. """ name = ""
[docs] def __init__(self, host=None): assert self.name, "All Components must have a Name" self.host = host
[docs] @classmethod def default_create(cls, host): """ This is called when the host is created and should return the base initialized state of a component. Args: host (object): The host typeclass instance Returns: Component: The created instance of the component """ new = cls(host) return new
[docs] @classmethod def create(cls, host, **kwargs): """ This is the method to call when supplying kwargs to initialize a component. Args: host (object): The host typeclass instance **kwargs: Key-Value of default values to replace. To persist the value, the key must correspond to a DBField. Returns: Component: The created instance of the component """ new = cls.default_create(host) for key, value in kwargs.items(): setattr(new, key, value) return new
[docs] def cleanup(self): """ This deletes all component attributes from the host's db """ for attribute in self._all_db_field_names: delattr(self, attribute)
[docs] @classmethod def load(cls, host): """ Loads a component instance This is called whenever a component is loaded (ex: Server Restart) Args: host (object): The host typeclass instance Returns: Component: The loaded instance of the component """ return cls(host)
[docs] def at_added(self, host): """ This is the method called when a component is registered on a host. Args: host (object): The host typeclass instance """ if self.host: if self.host == host: return else: raise ComponentRegisterError("Components must not register twice!") self.host = host
[docs] def at_removed(self, host): """ This is the method called when a component is removed from a host. Args: host (object): The host typeclass instance """ if host != self.host: raise ComponentRegisterError("Component attempted to remove from the wrong host.") self.host = None
@property def attributes(self): """ Shortcut property returning the host's AttributeHandler. Returns: AttributeHandler: The Host's AttributeHandler """ return self.host.attributes @property def nattributes(self): """ Shortcut property returning the host's In-Memory AttributeHandler (Non Persisted). Returns: AttributeHandler: The Host's In-Memory AttributeHandler """ return self.host.nattributes @property def _all_db_field_names(self): return itertools.chain(self.db_field_names, self.ndb_field_names) @property def db_field_names(self): db_fields = getattr(self, "_db_fields", {}) return db_fields.keys() @property def ndb_field_names(self): ndb_fields = getattr(self, "_ndb_fields", {}) return ndb_fields.keys() @property def tag_field_names(self): tag_fields = getattr(self, "_tag_fields", {}) return tag_fields.keys()
[docs]class ComponentRegisterError(Exception): pass