mirror of
https://github.com/evennia/evennia.git
synced 2026-04-02 05:57:16 +02:00
369 lines
No EOL
32 KiB
HTML
369 lines
No EOL
32 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>evennia.utils.containers — Evennia latest documentation</title>
|
|
<link rel="stylesheet" href="../../../_static/nature.css" type="text/css" />
|
|
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
|
|
<script id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
|
|
<script src="../../../_static/jquery.js"></script>
|
|
<script src="../../../_static/underscore.js"></script>
|
|
<script src="../../../_static/doctools.js"></script>
|
|
<script src="../../../_static/language_data.js"></script>
|
|
<link rel="shortcut icon" href="../../../_static/favicon.ico"/>
|
|
<link rel="index" title="Index" href="../../../genindex.html" />
|
|
<link rel="search" title="Search" href="../../../search.html" />
|
|
</head><body>
|
|
|
|
|
|
<div class="admonition important">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
|
|
</div>
|
|
|
|
|
|
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" accesskey="U">evennia</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">evennia.utils.containers</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
|
|
<div class="documentwrapper">
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<p class="logo"><a href="../../../index.html">
|
|
<img class="logo" src="../../../_static/evennia_logo.png" alt="Logo"/>
|
|
</a></p>
|
|
<div id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../../../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" />
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script>$('#searchbox').show(0);</script><h3>Links</h3>
|
|
<ul>
|
|
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
|
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
|
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
|
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
|
<li>
|
|
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
|
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
|
<a href="https://evennia.blogspot.com/">Blog</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for evennia.utils.containers</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""</span>
|
|
<span class="sd">Containers</span>
|
|
|
|
<span class="sd">Containers are storage classes usually initialized from a setting. They</span>
|
|
<span class="sd">represent Singletons and acts as a convenient place to find resources (</span>
|
|
<span class="sd">available as properties on the singleton)</span>
|
|
|
|
<span class="sd">evennia.GLOBAL_SCRIPTS</span>
|
|
<span class="sd">evennia.OPTION_CLASSES</span>
|
|
|
|
<span class="sd">"""</span>
|
|
|
|
|
|
<span class="kn">from</span> <span class="nn">pickle</span> <span class="kn">import</span> <span class="n">dumps</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">django.conf</span> <span class="kn">import</span> <span class="n">settings</span>
|
|
<span class="kn">from</span> <span class="nn">django.db.utils</span> <span class="kn">import</span> <span class="n">OperationalError</span><span class="p">,</span> <span class="n">ProgrammingError</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">evennia.utils</span> <span class="kn">import</span> <span class="n">logger</span>
|
|
<span class="kn">from</span> <span class="nn">evennia.utils.utils</span> <span class="kn">import</span> <span class="n">callables_from_module</span><span class="p">,</span> <span class="n">class_from_module</span>
|
|
|
|
<span class="n">SCRIPTDB</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
|
<div class="viewcode-block" id="Container"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.Container">[docs]</a><span class="k">class</span> <span class="nc">Container</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Base container class. A container is simply a storage object whose</span>
|
|
<span class="sd"> properties can be acquired as a property on it. This is generally</span>
|
|
<span class="sd"> considered a read-only affair.</span>
|
|
|
|
<span class="sd"> The container is initialized by a list of modules containing callables.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">storage_modules</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<div class="viewcode-block" id="Container.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.Container.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Read data from module.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span> <span class="o">=</span> <span class="kc">None</span></div>
|
|
|
|
<div class="viewcode-block" id="Container.load_data"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.Container.load_data">[docs]</a> <span class="k">def</span> <span class="nf">load_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Delayed import to avoid eventual circular imports from inside</span>
|
|
<span class="sd"> the storage modules.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span> <span class="o">=</span> <span class="p">{}</span>
|
|
<span class="k">for</span> <span class="n">module</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage_modules</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">callables_from_module</span><span class="p">(</span><span class="n">module</span><span class="p">))</span></div>
|
|
|
|
<span class="k">def</span> <span class="fm">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="Container.get"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.Container.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Retrive data by key (in case of not knowing it beforehand).</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> key (str): The name of the script.</span>
|
|
<span class="sd"> default (any, optional): Value to return if key is not found.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> any (any): The data loaded on this container.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">load_data</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="Container.all"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.Container.all">[docs]</a> <span class="k">def</span> <span class="nf">all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get all stored data</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> scripts (list): All global script objects stored on the container.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">load_data</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="o">.</span><span class="n">values</span><span class="p">())</span></div></div>
|
|
|
|
|
|
<div class="viewcode-block" id="OptionContainer"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.OptionContainer">[docs]</a><span class="k">class</span> <span class="nc">OptionContainer</span><span class="p">(</span><span class="n">Container</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Loads and stores the final list of OPTION CLASSES.</span>
|
|
|
|
<span class="sd"> Can access these as properties or dictionary-contents.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">storage_modules</span> <span class="o">=</span> <span class="n">settings</span><span class="o">.</span><span class="n">OPTION_CLASS_MODULES</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="GlobalScriptContainer"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.GlobalScriptContainer">[docs]</a><span class="k">class</span> <span class="nc">GlobalScriptContainer</span><span class="p">(</span><span class="n">Container</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Simple Handler object loaded by the Evennia API to contain and manage a</span>
|
|
<span class="sd"> game's Global Scripts. This will list global Scripts created on their own</span>
|
|
<span class="sd"> but will also auto-(re)create scripts defined in `settings.GLOBAL_SCRIPTS`.</span>
|
|
|
|
<span class="sd"> Example:</span>
|
|
<span class="sd"> import evennia</span>
|
|
<span class="sd"> evennia.GLOBAL_SCRIPTS.scriptname</span>
|
|
|
|
<span class="sd"> Note:</span>
|
|
<span class="sd"> This does not use much of the BaseContainer since it's not loading</span>
|
|
<span class="sd"> callables from settings but a custom dict of tuples.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<div class="viewcode-block" id="GlobalScriptContainer.__init__"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.GlobalScriptContainer.__init__">[docs]</a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Note: We must delay loading of typeclasses since this module may get</span>
|
|
<span class="sd"> initialized before Scripts are actually initialized.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">typeclass_storage</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="n">key</span><span class="p">:</span> <span class="p">{}</span> <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">data</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="n">settings</span><span class="o">.</span><span class="n">GLOBAL_SCRIPTS</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
|
|
<span class="p">}</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">loaded</span> <span class="o">=</span> <span class="kc">False</span></div>
|
|
|
|
<span class="k">def</span> <span class="nf">_load_script</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
|
|
<span class="n">typeclass</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">typeclass_storage</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
|
|
<span class="n">script</span> <span class="o">=</span> <span class="n">typeclass</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span>
|
|
<span class="n">db_key</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> <span class="n">db_account__isnull</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">db_obj__isnull</span><span class="o">=</span><span class="kc">True</span>
|
|
<span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span>
|
|
|
|
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="p">[</span><span class="n">key</span><span class="p">]}</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s2">"key"</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
|
|
<span class="n">kwargs</span><span class="p">[</span><span class="s2">"persistent"</span><span class="p">]</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"persistent"</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="n">compare_hash</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">dumps</span><span class="p">(</span><span class="n">kwargs</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="mi">4</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="n">script</span><span class="p">:</span>
|
|
<span class="n">script_hash</span> <span class="o">=</span> <span class="n">script</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"global_script_settings"</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">"settings_hash"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">script_hash</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="c1"># legacy - store the hash anew and assume no change</span>
|
|
<span class="n">script</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span>
|
|
<span class="s2">"global_script_settings"</span><span class="p">,</span> <span class="n">compare_hash</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">"settings_hash"</span>
|
|
<span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">script_hash</span> <span class="o">!=</span> <span class="n">compare_hash</span><span class="p">:</span>
|
|
<span class="c1"># wipe the old version and create anew</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"GLOBAL_SCRIPTS: Settings changed for </span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">typeclass</span><span class="si">}</span><span class="s2">)."</span><span class="p">)</span>
|
|
<span class="n">script</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
|
|
<span class="n">script</span><span class="o">.</span><span class="n">delete</span><span class="p">()</span>
|
|
<span class="n">script</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">script</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">log_info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"GLOBAL_SCRIPTS: (Re)creating </span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> (</span><span class="si">{</span><span class="n">typeclass</span><span class="si">}</span><span class="s2">)."</span><span class="p">)</span>
|
|
|
|
<span class="n">script</span><span class="p">,</span> <span class="n">errors</span> <span class="o">=</span> <span class="n">typeclass</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">errors</span><span class="p">:</span>
|
|
<span class="n">logger</span><span class="o">.</span><span class="n">log_err</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">errors</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># store a hash representation of the setup</span>
|
|
<span class="n">script</span><span class="o">.</span><span class="n">attributes</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"global_script_settings"</span><span class="p">,</span> <span class="n">compare_hash</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="s2">"settings_hash"</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">script</span>
|
|
|
|
<div class="viewcode-block" id="GlobalScriptContainer.start"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.GlobalScriptContainer.start">[docs]</a> <span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Called last in evennia.__init__ to initialize the container late</span>
|
|
<span class="sd"> (after script typeclasses have finished loading).</span>
|
|
|
|
<span class="sd"> We include all global scripts in the handler and</span>
|
|
<span class="sd"> make sure to auto-load time-based scripts.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># populate self.typeclass_storage</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">load_data</span><span class="p">()</span>
|
|
|
|
<span class="c1"># make sure settings-defined scripts are loaded</span>
|
|
<span class="n">scripts_to_run</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="p">:</span>
|
|
<span class="n">script</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_script</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">script</span><span class="p">:</span>
|
|
<span class="n">scripts_to_run</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">script</span><span class="p">)</span>
|
|
<span class="c1"># start all global scripts</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">script</span> <span class="ow">in</span> <span class="n">scripts_to_run</span><span class="p">:</span>
|
|
<span class="n">script</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="p">(</span><span class="n">OperationalError</span><span class="p">,</span> <span class="n">ProgrammingError</span><span class="p">):</span>
|
|
<span class="c1"># this can happen if db is not loaded yet (such as when building docs)</span>
|
|
<span class="k">pass</span></div>
|
|
|
|
<div class="viewcode-block" id="GlobalScriptContainer.load_data"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.GlobalScriptContainer.load_data">[docs]</a> <span class="k">def</span> <span class="nf">load_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> This delayed import avoids trying to load Scripts before they are</span>
|
|
<span class="sd"> initialized.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">typeclass_storage</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
<span class="n">typeclass</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"typeclass"</span><span class="p">,</span> <span class="n">settings</span><span class="o">.</span><span class="n">BASE_SCRIPT_TYPECLASS</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">typeclass_storage</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">class_from_module</span><span class="p">(</span>
|
|
<span class="n">typeclass</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="n">settings</span><span class="o">.</span><span class="n">BASE_SCRIPT_TYPECLASS</span>
|
|
<span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">loaded</span> <span class="o">=</span> <span class="kc">True</span></div>
|
|
|
|
<div class="viewcode-block" id="GlobalScriptContainer.get"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.GlobalScriptContainer.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Retrive data by key (in case of not knowing it beforehand). Any</span>
|
|
<span class="sd"> scripts that are in settings.GLOBAL_SCRIPTS that are not found</span>
|
|
<span class="sd"> will be recreated on-demand.</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
<span class="sd"> key (str): The name of the script.</span>
|
|
<span class="sd"> default (any, optional): Value to return if key is not found</span>
|
|
<span class="sd"> at all on this container (i.e it cannot be loaded at all).</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> any (any): The data loaded on this container.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">load_data</span><span class="p">()</span>
|
|
<span class="n">out_value</span> <span class="o">=</span> <span class="n">default</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded_data</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">typeclass_storage</span><span class="p">:</span>
|
|
<span class="c1"># this means we are trying to load in a loop</span>
|
|
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"Trying to access `GLOBAL_SCRIPTS.</span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2">` before scripts have finished "</span>
|
|
<span class="s2">"initializing. This can happen if accessing GLOBAL_SCRIPTS from the same "</span>
|
|
<span class="s2">"module the script is defined in."</span>
|
|
<span class="p">)</span>
|
|
<span class="c1"># recreate if we have the info</span>
|
|
<span class="n">script_found</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_load_script</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">script_found</span><span class="p">:</span>
|
|
<span class="n">out_value</span> <span class="o">=</span> <span class="n">script_found</span>
|
|
|
|
<span class="k">return</span> <span class="n">out_value</span></div>
|
|
|
|
<div class="viewcode-block" id="GlobalScriptContainer.all"><a class="viewcode-back" href="../../../api/evennia.utils.containers.html#evennia.utils.containers.GlobalScriptContainer.all">[docs]</a> <span class="k">def</span> <span class="nf">all</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Get all global scripts. Note that this will not auto-start</span>
|
|
<span class="sd"> scripts defined in settings.</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
<span class="sd"> scripts (list): All global script objects stored on the container.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">loaded</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">load_data</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">scripts</span><span class="o">.</span><span class="n">values</span><span class="p">()</span></div></div>
|
|
|
|
|
|
<span class="c1"># Create all singletons</span>
|
|
|
|
<span class="n">GLOBAL_SCRIPTS</span> <span class="o">=</span> <span class="n">GlobalScriptContainer</span><span class="p">()</span>
|
|
<span class="n">OPTION_CLASSES</span> <span class="o">=</span> <span class="n">OptionContainer</span><span class="p">()</span>
|
|
</pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="related navigation">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../../../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../../../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../../../index.html">Evennia latest</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="../../index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-2"><a href="../../evennia.html" >evennia</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">evennia.utils.containers</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
<div class="admonition important">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
|
|
</div>
|
|
|
|
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2023, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
|
|
</div>
|
|
</body>
|
|
</html> |